Message ID | 20240703110010.672654-2-u.kleine-koenig@baylibre.com |
---|---|
State | Accepted |
Headers | show |
Series | pwm: stm32: Always do lazy disabling | expand |
Hello, [Updated Benjamin's email address] On Wed, Jul 03, 2024 at 01:00:06PM +0200, Uwe Kleine-König wrote: > When the state changes from enabled to disabled, polarity, duty_cycle > and period are not configured in hardware and TIM_CCER_CCxE is just > cleared. However if the state changes from one disabled state to > another, all parameters are written to hardware because the early exit > from stm32_pwm_apply() is only taken if the pwm is currently enabled. > > This yields surprises like: Applying > > { .period = 1, .duty_cycle = 0, .enabled = false } > > succeeds if the pwm is initially on, but fails if it's already off > because 1 is a too small period. > > Update the check for lazy disable to always exit early if the target > state is disabled, no matter what is currently configured. > > Fixes: 7edf7369205b ("pwm: Add driver for STM32 plaftorm") > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com> I applied this to my pwm/for-next branch. I applied it directly on top of my last PR to Linus and rebased pwm/for-next on top of it, as it's a fix that should come early. I won't send it for inclusion before 6.10, but if another PR will become necessary before 6.10, I'll include this patch. Best regards Uwe
diff --git a/drivers/pwm/pwm-stm32.c b/drivers/pwm/pwm-stm32.c index fba080daf445..fd754a99cf2e 100644 --- a/drivers/pwm/pwm-stm32.c +++ b/drivers/pwm/pwm-stm32.c @@ -452,8 +452,9 @@ static int stm32_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, enabled = pwm->state.enabled; - if (enabled && !state->enabled) { - stm32_pwm_disable(priv, pwm->hwpwm); + if (!state->enabled) { + if (enabled) + stm32_pwm_disable(priv, pwm->hwpwm); return 0; }
When the state changes from enabled to disabled, polarity, duty_cycle and period are not configured in hardware and TIM_CCER_CCxE is just cleared. However if the state changes from one disabled state to another, all parameters are written to hardware because the early exit from stm32_pwm_apply() is only taken if the pwm is currently enabled. This yields surprises like: Applying { .period = 1, .duty_cycle = 0, .enabled = false } succeeds if the pwm is initially on, but fails if it's already off because 1 is a too small period. Update the check for lazy disable to always exit early if the target state is disabled, no matter what is currently configured. Fixes: 7edf7369205b ("pwm: Add driver for STM32 plaftorm") Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com> --- drivers/pwm/pwm-stm32.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) base-commit: b8689bb9b901e5e2bc0f0905320b32e8c898a58b