diff options
Diffstat (limited to 'include/linux/pwm.h')
| -rw-r--r-- | include/linux/pwm.h | 19 | 
1 files changed, 13 insertions, 6 deletions
| diff --git a/include/linux/pwm.h b/include/linux/pwm.h index 17018f3c066e..c038ae36b10e 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -235,6 +235,9 @@ static inline int pwm_config(struct pwm_device *pwm, int duty_ns,  	if (!pwm)  		return -EINVAL; +	if (duty_ns < 0 || period_ns < 0) +		return -EINVAL; +  	pwm_get_state(pwm, &state);  	if (state.duty_cycle == duty_ns && state.period == period_ns)  		return 0; @@ -461,6 +464,8 @@ static inline bool pwm_can_sleep(struct pwm_device *pwm)  static inline void pwm_apply_args(struct pwm_device *pwm)  { +	struct pwm_state state = { }; +  	/*  	 * PWM users calling pwm_apply_args() expect to have a fresh config  	 * where the polarity and period are set according to pwm_args info. @@ -473,18 +478,20 @@ static inline void pwm_apply_args(struct pwm_device *pwm)  	 * at startup (even if they are actually enabled), thus authorizing  	 * polarity setting.  	 * -	 * Instead of setting ->enabled to false, we call pwm_disable() -	 * before pwm_set_polarity() to ensure that everything is configured -	 * as expected, and the PWM is really disabled when the user request -	 * it. +	 * To fulfill this requirement, we apply a new state which disables +	 * the PWM device and set the reference period and polarity config.  	 *  	 * Note that PWM users requiring a smooth handover between the  	 * bootloader and the kernel (like critical regulators controlled by  	 * PWM devices) will have to switch to the atomic API and avoid calling  	 * pwm_apply_args().  	 */ -	pwm_disable(pwm); -	pwm_set_polarity(pwm, pwm->args.polarity); + +	state.enabled = false; +	state.polarity = pwm->args.polarity; +	state.period = pwm->args.period; + +	pwm_apply_state(pwm, &state);  }  struct pwm_lookup { |