diff mbox series

pwm: stm32: Always do lazy disabling

Message ID 20240703110010.672654-2-u.kleine-koenig@baylibre.com
State Accepted
Headers show
Series pwm: stm32: Always do lazy disabling | expand

Commit Message

Uwe Kleine-König July 3, 2024, 11 a.m. UTC
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

Comments

Uwe Kleine-König July 5, 2024, 10:42 p.m. UTC | #1
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 mbox series

Patch

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;
 	}