summaryrefslogtreecommitdiff
path: root/drivers/led/led-uclass.c
diff options
context:
space:
mode:
authorMichael Polyntsov <michael.polyntsov@iopsys.eu>2024-07-19 13:12:12 +0400
committerTom Rini <trini@konsulko.com>2024-07-30 12:35:23 -0600
commitb557f55e90f087ec310592b833441cd326206f61 (patch)
treea7d3ee88851b7f242eb24dedfe2115e5fe7a395b /drivers/led/led-uclass.c
parent2a15c676fa3413e7995e2a8b47e8932300e9e70b (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.c11
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;
}