From: Michael Polyntsov <michael.polynt...@iopsys.eu>

The standard property

    linux,default-trigger = "pattern";

used to get an effect. No blinking parameters can be set yet.

Signed-off-by: Michael Polyntsov <michael.polynt...@iopsys.eu>
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
---
 drivers/led/led-uclass.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
index 37dc99cecdc..7d4db9f9c32 100644
--- a/drivers/led/led-uclass.c
+++ b/drivers/led/led-uclass.c
@@ -99,6 +99,9 @@ static int led_post_bind(struct udevice *dev)
 {
        struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev);
        const char *default_state;
+#ifdef CONFIG_LED_BLINK
+       const char *trigger;
+#endif
 
        if (!uc_plat->label)
                uc_plat->label = dev_read_string(dev, "label");
@@ -119,6 +122,13 @@ static int led_post_bind(struct udevice *dev)
        else
                return 0;
 
+#ifdef CONFIG_LED_BLINK
+       trigger = dev_read_string(dev, "linux,default-trigger");
+       if (trigger && !strncmp(trigger, "pattern", 7)) {
+               uc_plat->default_state = LEDST_BLINK;
+       }
+#endif
+
        /*
         * In case the LED has default-state DT property, trigger
         * probe() to configure its default state during startup.
@@ -131,12 +141,28 @@ static int led_post_bind(struct udevice *dev)
 static int led_post_probe(struct udevice *dev)
 {
        struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev);
+       int rc = 0;
 
-       if (uc_plat->default_state == LEDST_ON ||
-           uc_plat->default_state == LEDST_OFF)
-               led_set_state(dev, uc_plat->default_state);
+       switch (uc_plat->default_state) {
+       case LEDST_ON:
+       case LEDST_OFF:
+               rc = led_set_state(dev, uc_plat->default_state);
+               break;
+#ifdef CONFIG_LED_BLINK
+       case LEDST_BLINK: {
+               const int default_period_ms = 1000;
 
-       return 0;
+               rc = led_set_period(dev, default_period_ms);
+               if (rc == 0)
+                       rc = led_set_state(dev, uc_plat->default_state);
+               break;
+       }
+#endif
+       default:
+               break;
+       }
+
+       return rc;
 }
 
 UCLASS_DRIVER(led) = {
-- 
2.39.2

Reply via email to