aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds
diff options
authorJakob Riepler <jakob+lkml@paranoidlabs.org>2024-12-16 22:37:55 +0100
committerLee Jones <lee@kernel.org>2024-12-17 15:04:46 +0000
commit29df7025cff00dd9fa7cacbec979ede97ee775eb (patch)
tree53952fa72ec2984079e11a59631c7a93d5ec5906 /drivers/leds
parent0508316be63bb735f59bdc8fe4527cadb62210ca (diff)
downloadath-29df7025cff00dd9fa7cacbec979ede97ee775eb.tar.gz
leds: pwm-multicolor: Disable PWM when going to suspend
This fixes suspend on platforms like stm32mp1xx, where the PWM consumer has to be disabled for the PWM to enter suspend. Another positive side effect is that active-low LEDs now properly turn off instead of going back to full brightness when they are set to 0. Link: https://lore.kernel.org/all/20240417153846.271751-2-u.kleine-koenig@pengutronix.de/ Signed-off-by: Jakob Riepler <jakob+lkml@paranoidlabs.org> Acked-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com> Link: https://lore.kernel.org/r/20241216213754.18374-2-jakob+lkml@paranoidlabs.org Signed-off-by: Lee Jones <lee@kernel.org>
Diffstat (limited to 'drivers/leds')
-rw-r--r--drivers/leds/rgb/leds-pwm-multicolor.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/leds/rgb/leds-pwm-multicolor.c b/drivers/leds/rgb/leds-pwm-multicolor.c
index e1a81e0109e8a..f80a06cc31f8a 100644
--- a/drivers/leds/rgb/leds-pwm-multicolor.c
+++ b/drivers/leds/rgb/leds-pwm-multicolor.c
@@ -50,7 +50,13 @@ static int led_pwm_mc_set(struct led_classdev *cdev,
duty = priv->leds[i].state.period - duty;
priv->leds[i].state.duty_cycle = duty;
- priv->leds[i].state.enabled = duty > 0;
+ /*
+ * Disabling a PWM doesn't guarantee that it emits the inactive level.
+ * So keep it on. Only for suspending the PWM should be disabled because
+ * otherwise it refuses to suspend. The possible downside is that the
+ * LED might stay (or even go) on.
+ */
+ priv->leds[i].state.enabled = !(cdev->flags & LED_SUSPENDED);
ret = pwm_apply_might_sleep(priv->leds[i].pwm,
&priv->leds[i].state);
if (ret)