diff options
author | Michael Polyntsov <michael.polyntsov@iopsys.eu> | 2024-07-19 13:12:12 +0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2024-07-30 12:35:23 -0600 |
commit | b557f55e90f087ec310592b833441cd326206f61 (patch) | |
tree | a7d3ee88851b7f242eb24dedfe2115e5fe7a395b /drivers/led/led-uclass.c | |
parent | 2a15c676fa3413e7995e2a8b47e8932300e9e70b (diff) |
led: Implement software led blinking
If hardware (or driver) doesn't support leds blinking, it's
now possible to use software implementation of blinking instead.
This relies on cyclic functions.
Signed-off-by: Michael Polyntsov <michael.polyntsov@iopsys.eu>
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/led/led-uclass.c')
-rw-r--r-- | drivers/led/led-uclass.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c index 4932b901142..e6312d1dc41 100644 --- a/drivers/led/led-uclass.c +++ b/drivers/led/led-uclass.c @@ -58,6 +58,10 @@ int led_set_state(struct udevice *dev, enum led_state_t state) if (!ops->set_state) return -ENOSYS; + if (IS_ENABLED(CONFIG_LED_SW_BLINK) && + led_sw_on_state_change(dev, state)) + return 0; + return ops->set_state(dev, state); } @@ -68,6 +72,10 @@ enum led_state_t led_get_state(struct udevice *dev) if (!ops->get_state) return -ENOSYS; + if (IS_ENABLED(CONFIG_LED_SW_BLINK) && + led_sw_is_blinking(dev)) + return LEDST_BLINK; + return ops->get_state(dev); } @@ -80,6 +88,9 @@ int led_set_period(struct udevice *dev, int period_ms) return ops->set_period(dev, period_ms); #endif + if (IS_ENABLED(CONFIG_LED_SW_BLINK)) + return led_sw_set_period(dev, period_ms); + return -ENOSYS; } |