diff mbox series

leds: pwm-multicolor: Disable PWM when going to suspend

Message ID d7d930bc-4c82-4272-b2c6-88f7cac5a3e1@chaosfield.at
State Superseded
Headers show
Series leds: pwm-multicolor: Disable PWM when going to suspend | expand

Commit Message

Jakob Riepler Dec. 2, 2024, 9:33 a.m. UTC
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@chaosfield.at>
---
  drivers/leds/rgb/leds-pwm-multicolor.c | 8 +++++++-
  1 file changed, 7 insertions(+), 1 deletion(-)

          ret = pwm_apply_might_sleep(priv->leds[i].pwm,
                          &priv->leds[i].state);
          if (ret)
diff mbox series

Patch

diff --git a/drivers/leds/rgb/leds-pwm-multicolor.c 
b/drivers/leds/rgb/leds-pwm-multicolor.c
index e1a81e0109e8..f80a06cc31f8 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);