diff options
Diffstat (limited to 'drivers/pwm/pwm-ab8500.c')
| -rw-r--r-- | drivers/pwm/pwm-ab8500.c | 54 | 
1 files changed, 25 insertions, 29 deletions
| diff --git a/drivers/pwm/pwm-ab8500.c b/drivers/pwm/pwm-ab8500.c index 58c6c0f5b0ec..e2a26d9da25b 100644 --- a/drivers/pwm/pwm-ab8500.c +++ b/drivers/pwm/pwm-ab8500.c @@ -24,23 +24,37 @@ struct ab8500_pwm_chip {  	struct pwm_chip chip;  }; -static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, -			     int duty_ns, int period_ns) +static int ab8500_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, +			    const struct pwm_state *state)  { -	int ret = 0; -	unsigned int higher_val, lower_val; +	int ret;  	u8 reg; +	unsigned int higher_val, lower_val; + +	if (state->polarity != PWM_POLARITY_NORMAL) +		return -EINVAL; + +	if (!state->enabled) { +		ret = abx500_mask_and_set_register_interruptible(chip->dev, +					AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG, +					1 << (chip->base - 1), 0); + +		if (ret < 0) +			dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n", +								pwm->label, ret); +		return ret; +	}  	/*  	 * get the first 8 bits that are be written to  	 * AB8500_PWM_OUT_CTRL1_REG[0:7]  	 */ -	lower_val = duty_ns & 0x00FF; +	lower_val = state->duty_cycle & 0x00FF;  	/*  	 * get bits [9:10] that are to be written to  	 * AB8500_PWM_OUT_CTRL2_REG[0:1]  	 */ -	higher_val = ((duty_ns & 0x0300) >> 8); +	higher_val = ((state->duty_cycle & 0x0300) >> 8);  	reg = AB8500_PWM_OUT_CTRL1_REG + ((chip->base - 1) * 2); @@ -48,15 +62,11 @@ static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,  			reg, (u8)lower_val);  	if (ret < 0)  		return ret; +  	ret = abx500_set_register_interruptible(chip->dev, AB8500_MISC,  			(reg + 1), (u8)higher_val); - -	return ret; -} - -static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) -{ -	int ret; +	if (ret < 0) +		return ret;  	ret = abx500_mask_and_set_register_interruptible(chip->dev,  				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG, @@ -64,25 +74,12 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)  	if (ret < 0)  		dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",  							pwm->label, ret); -	return ret; -} -static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) -{ -	int ret; - -	ret = abx500_mask_and_set_register_interruptible(chip->dev, -				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG, -				1 << (chip->base - 1), 0); -	if (ret < 0) -		dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n", -							pwm->label, ret); +	return ret;  }  static const struct pwm_ops ab8500_pwm_ops = { -	.config = ab8500_pwm_config, -	.enable = ab8500_pwm_enable, -	.disable = ab8500_pwm_disable, +	.apply = ab8500_pwm_apply,  	.owner = THIS_MODULE,  }; @@ -101,7 +98,6 @@ static int ab8500_pwm_probe(struct platform_device *pdev)  	ab8500->chip.dev = &pdev->dev;  	ab8500->chip.ops = &ab8500_pwm_ops; -	ab8500->chip.base = -1;  	ab8500->chip.npwm = 1;  	err = pwmchip_add(&ab8500->chip); | 
