diff options
Diffstat (limited to 'drivers/pwm/pwm-img.c')
| -rw-r--r-- | drivers/pwm/pwm-img.c | 35 | 
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c index f97f82548293..5996049f66ec 100644 --- a/drivers/pwm/pwm-img.c +++ b/drivers/pwm/pwm-img.c @@ -128,11 +128,9 @@ static int img_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,  	duty = DIV_ROUND_UP(timebase * duty_ns, period_ns); -	ret = pm_runtime_get_sync(chip->dev); -	if (ret < 0) { -		pm_runtime_put_autosuspend(chip->dev); +	ret = pm_runtime_resume_and_get(chip->dev); +	if (ret < 0)  		return ret; -	}  	val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG);  	val &= ~(PWM_CTRL_CFG_DIV_MASK << PWM_CTRL_CFG_DIV_SHIFT(pwm->hwpwm)); @@ -184,10 +182,33 @@ static void img_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)  	pm_runtime_put_autosuspend(chip->dev);  } +static int img_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, +			 const struct pwm_state *state) +{ +	int err; + +	if (state->polarity != PWM_POLARITY_NORMAL) +		return -EINVAL; + +	if (!state->enabled) { +		if (pwm->state.enabled) +			img_pwm_disable(chip, pwm); + +		return 0; +	} + +	err = img_pwm_config(pwm->chip, pwm, state->duty_cycle, state->period); +	if (err) +		return err; + +	if (!pwm->state.enabled) +		err = img_pwm_enable(chip, pwm); + +	return err; +} +  static const struct pwm_ops img_pwm_ops = { -	.config = img_pwm_config, -	.enable = img_pwm_enable, -	.disable = img_pwm_disable, +	.apply = img_pwm_apply,  	.owner = THIS_MODULE,  };  | 
