powerpc: Migrate SYS_L3_SIZE to Kconfig
[platform/kernel/u-boot.git] / drivers / led / led-uclass.c
index 2f4aa18..68ca3c2 100644 (file)
@@ -66,42 +66,44 @@ int led_set_period(struct udevice *dev, int period_ms)
 }
 #endif
 
-int led_default_state(void)
+static int led_post_bind(struct udevice *dev)
 {
-       struct udevice *dev;
-       struct uclass *uc;
+       struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev);
        const char *default_state;
-       int ret;
 
-       ret = uclass_get(UCLASS_LED, &uc);
-       if (ret)
-               return ret;
-       for (uclass_find_first_device(UCLASS_LED, &dev);
-            dev;
-            uclass_find_next_device(&dev)) {
-               default_state = dev_read_string(dev, "default-state");
-               if (!default_state)
-                       continue;
-               ret = device_probe(dev);
-               if (ret)
-                       return ret;
-               if (!strncmp(default_state, "on", 2))
-                       led_set_state(dev, LEDST_ON);
-               else if (!strncmp(default_state, "off", 3))
-                       led_set_state(dev, LEDST_OFF);
-               /* default-state = "keep" : device is only probed */
-       }
+       uc_plat->label = dev_read_string(dev, "label");
+       if (!uc_plat->label)
+               uc_plat->label = ofnode_get_name(dev_ofnode(dev));
+
+       uc_plat->default_state = LEDST_COUNT;
+
+       default_state = dev_read_string(dev, "default-state");
+       if (!default_state)
+               return 0;
+
+       if (!strncmp(default_state, "on", 2))
+               uc_plat->default_state = LEDST_ON;
+       else if (!strncmp(default_state, "off", 3))
+               uc_plat->default_state = LEDST_OFF;
+       else
+               return 0;
+
+       /*
+        * In case the LED has default-state DT property, trigger
+        * probe() to configure its default state during startup.
+        */
+       dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
 
-       return ret;
+       return 0;
 }
 
-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);
 
-       uc_plat->label = dev_read_string(dev, "label");
-       if (!uc_plat->label)
-               uc_plat->label = ofnode_get_name(dev_ofnode(dev));
+       if (uc_plat->default_state == LEDST_ON ||
+           uc_plat->default_state == LEDST_OFF)
+               led_set_state(dev, uc_plat->default_state);
 
        return 0;
 }
@@ -111,4 +113,5 @@ UCLASS_DRIVER(led) = {
        .name           = "led",
        .per_device_plat_auto   = sizeof(struct led_uc_plat),
        .post_bind      = led_post_bind,
+       .post_probe     = led_post_probe,
 };