]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pwm: stm32: Always do lazy disabling
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Wed, 3 Jul 2024 11:00:06 +0000 (13:00 +0200)
committerUwe Kleine-König <ukleinek@kernel.org>
Fri, 5 Jul 2024 21:21:56 +0000 (23:21 +0200)
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>
Link: https://lore.kernel.org/r/20240703110010.672654-2-u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/pwm-stm32.c

index 8bae3fd2b33065997901b61f4ce2a8cda09a6e6b..c586029caf2337ee24610d3bc2538ed5ee958a7d 100644 (file)
@@ -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;
        }