diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/core/root.c | 24 | ||||
| -rw-r--r-- | drivers/led/led-uclass.c | 10 | ||||
| -rw-r--r-- | drivers/led/led_gpio.c | 31 |
3 files changed, 39 insertions, 26 deletions
diff --git a/drivers/core/root.c b/drivers/core/root.c index e09c12f4d6e..17dd1205a32 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -361,6 +361,28 @@ void *dm_priv_to_rw(void *priv) } #endif +static int dm_probe_devices(struct udevice *dev, bool pre_reloc_only) +{ + u32 mask = DM_FLAG_PROBE_AFTER_BIND; + u32 flags = dev_get_flags(dev); + struct udevice *child; + int ret; + + if (pre_reloc_only) + mask |= DM_FLAG_PRE_RELOC; + + if ((flags & mask) == mask) { + ret = device_probe(dev); + if (ret) + return ret; + } + + list_for_each_entry(child, &dev->child_head, sibling_node) + dm_probe_devices(child, pre_reloc_only); + + return 0; +} + /** * dm_scan() - Scan tables to bind devices * @@ -393,7 +415,7 @@ static int dm_scan(bool pre_reloc_only) if (ret) return ret; - return 0; + return dm_probe_devices(gd->dm_root, pre_reloc_only); } int dm_init_and_scan(bool pre_reloc_only) diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c index 5d7bf40896b..68ca3c29702 100644 --- a/drivers/led/led-uclass.c +++ b/drivers/led/led-uclass.c @@ -66,12 +66,6 @@ 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) -{ - return 0; -} - static int led_post_bind(struct udevice *dev) { struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev); @@ -98,7 +92,9 @@ static int led_post_bind(struct udevice *dev) * In case the LED has default-state DT property, trigger * probe() to configure its default state during startup. */ - return device_probe(dev); + dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND); + + return 0; } static int led_post_probe(struct udevice *dev) diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c index 958dbd31e77..fbed151b5d9 100644 --- a/drivers/led/led_gpio.c +++ b/drivers/led/led_gpio.c @@ -57,19 +57,9 @@ static enum led_state_t gpio_led_get_state(struct udevice *dev) static int led_gpio_probe(struct udevice *dev) { - struct led_uc_plat *uc_plat = dev_get_uclass_plat(dev); struct led_gpio_priv *priv = dev_get_priv(dev); - int ret; - - /* Ignore the top-level LED node */ - if (!uc_plat->label) - return 0; - - ret = gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT); - if (ret) - return ret; - return 0; + return gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT); } static int led_gpio_remove(struct udevice *dev) @@ -110,18 +100,23 @@ static const struct led_ops gpio_led_ops = { .get_state = gpio_led_get_state, }; -static const struct udevice_id led_gpio_ids[] = { - { .compatible = "gpio-leds" }, - { } -}; - U_BOOT_DRIVER(led_gpio) = { .name = "gpio_led", .id = UCLASS_LED, - .of_match = led_gpio_ids, .ops = &gpio_led_ops, .priv_auto = sizeof(struct led_gpio_priv), - .bind = led_gpio_bind, .probe = led_gpio_probe, .remove = led_gpio_remove, }; + +static const struct udevice_id led_gpio_ids[] = { + { .compatible = "gpio-leds" }, + { } +}; + +U_BOOT_DRIVER(led_gpio_wrap) = { + .name = "gpio_led_wrap", + .id = UCLASS_NOP, + .of_match = led_gpio_ids, + .bind = led_gpio_bind, +}; |
