diff options
Diffstat (limited to 'drivers/led')
-rw-r--r-- | drivers/led/led-uclass.c | 63 | ||||
-rw-r--r-- | drivers/led/led_bcm6328.c | 12 | ||||
-rw-r--r-- | drivers/led/led_bcm6358.c | 12 | ||||
-rw-r--r-- | drivers/led/led_bcm6753.c | 12 | ||||
-rw-r--r-- | drivers/led/led_bcm6858.c | 12 | ||||
-rw-r--r-- | drivers/led/led_cortina.c | 11 | ||||
-rw-r--r-- | drivers/led/led_gpio.c | 8 | ||||
-rw-r--r-- | drivers/led/led_pwm.c | 10 |
8 files changed, 41 insertions, 99 deletions
diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c index 7e298dbb06f..5d7bf40896b 100644 --- a/drivers/led/led-uclass.c +++ b/drivers/led/led-uclass.c @@ -66,37 +66,56 @@ int led_set_period(struct udevice *dev, int period_ms) } #endif +/* This is superseded by led_post_bind()/led_post_probe() below. */ int led_default_state(void) { - struct udevice *dev; - struct uclass *uc; + return 0; +} + +static int led_post_bind(struct udevice *dev) +{ + 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. + */ + return device_probe(dev); +} + +static int led_post_probe(struct udevice *dev) +{ + struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev); + + if (uc_plat->default_state == LEDST_ON || + uc_plat->default_state == LEDST_OFF) + led_set_state(dev, uc_plat->default_state); - return ret; + return 0; } UCLASS_DRIVER(led) = { .id = UCLASS_LED, .name = "led", .per_device_plat_auto = sizeof(struct led_uc_plat), + .post_bind = led_post_bind, + .post_probe = led_post_probe, }; diff --git a/drivers/led/led_bcm6328.c b/drivers/led/led_bcm6328.c index bf8207d638d..f59a92fb1fd 100644 --- a/drivers/led/led_bcm6328.c +++ b/drivers/led/led_bcm6328.c @@ -204,26 +204,14 @@ static int bcm6328_led_bind(struct udevice *parent) ofnode node; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; struct udevice *dev; - const char *label; int ret; - label = ofnode_read_string(node, "label"); - if (!label) { - debug("%s: node %s has no label\n", __func__, - ofnode_get_name(node)); - return -EINVAL; - } - ret = device_bind_driver_to_node(parent, "bcm6328-led", ofnode_get_name(node), node, &dev); if (ret) return ret; - - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; diff --git a/drivers/led/led_bcm6358.c b/drivers/led/led_bcm6358.c index 3e57cdfd17d..25aa3994d0e 100644 --- a/drivers/led/led_bcm6358.c +++ b/drivers/led/led_bcm6358.c @@ -174,26 +174,14 @@ static int bcm6358_led_bind(struct udevice *parent) ofnode node; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; struct udevice *dev; - const char *label; int ret; - label = ofnode_read_string(node, "label"); - if (!label) { - debug("%s: node %s has no label\n", __func__, - ofnode_get_name(node)); - return -EINVAL; - } - ret = device_bind_driver_to_node(parent, "bcm6358-led", ofnode_get_name(node), node, &dev); if (ret) return ret; - - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; diff --git a/drivers/led/led_bcm6753.c b/drivers/led/led_bcm6753.c index a32bd8204fa..88b650cbfca 100644 --- a/drivers/led/led_bcm6753.c +++ b/drivers/led/led_bcm6753.c @@ -229,26 +229,14 @@ static int bcm6753_led_bind(struct udevice *parent) ofnode node; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; struct udevice *dev; - const char *label; int ret; - label = ofnode_read_string(node, "label"); - if (!label) { - debug("%s: node %s has no label\n", __func__, - ofnode_get_name(node)); - return -EINVAL; - } - ret = device_bind_driver_to_node(parent, "bcm6753-led", ofnode_get_name(node), node, &dev); if (ret) return ret; - - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; diff --git a/drivers/led/led_bcm6858.c b/drivers/led/led_bcm6858.c index 3ca6c5b8a9e..6b3698674b9 100644 --- a/drivers/led/led_bcm6858.c +++ b/drivers/led/led_bcm6858.c @@ -241,26 +241,14 @@ static int bcm6858_led_bind(struct udevice *parent) ofnode node; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; struct udevice *dev; - const char *label; int ret; - label = ofnode_read_string(node, "label"); - if (!label) { - debug("%s: node %s has no label\n", __func__, - ofnode_get_name(node)); - return -EINVAL; - } - ret = device_bind_driver_to_node(parent, "bcm6858-led", ofnode_get_name(node), node, &dev); if (ret) return ret; - - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; diff --git a/drivers/led/led_cortina.c b/drivers/led/led_cortina.c index 598c0a03db5..bcbe78d632a 100644 --- a/drivers/led/led_cortina.c +++ b/drivers/led/led_cortina.c @@ -256,25 +256,14 @@ static int cortina_led_bind(struct udevice *parent) ofnode node; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; struct udevice *dev; - const char *label; int ret; - label = ofnode_read_string(node, "label"); - if (!label) { - debug("%s: node %s has no label\n", __func__, - ofnode_get_name(node)); - return -EINVAL; - } - ret = device_bind_driver_to_node(parent, "ca-leds", ofnode_get_name(node), node, &dev); if (ret) return ret; - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c index 67ece3cbcd0..958dbd31e77 100644 --- a/drivers/led/led_gpio.c +++ b/drivers/led/led_gpio.c @@ -95,19 +95,11 @@ static int led_gpio_bind(struct udevice *parent) int ret; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; - const char *label; - - label = ofnode_read_string(node, "label"); - if (!label) - label = ofnode_get_name(node); ret = device_bind_driver_to_node(parent, "gpio_led", ofnode_get_name(node), node, &dev); if (ret) return ret; - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; diff --git a/drivers/led/led_pwm.c b/drivers/led/led_pwm.c index 4e502722587..10bd1636c38 100644 --- a/drivers/led/led_pwm.c +++ b/drivers/led/led_pwm.c @@ -151,21 +151,11 @@ static int led_pwm_bind(struct udevice *parent) int ret; dev_for_each_subnode(node, parent) { - struct led_uc_plat *uc_plat; - const char *label; - - label = ofnode_read_string(node, "label"); - if (!label) - label = ofnode_get_name(node); - ret = device_bind_driver_to_node(parent, LEDS_PWM_DRIVER_NAME, ofnode_get_name(node), node, &dev); if (ret) return ret; - - uc_plat = dev_get_uclass_plat(dev); - uc_plat->label = label; } return 0; } |