summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/core/root.c24
-rw-r--r--drivers/led/led-uclass.c10
-rw-r--r--drivers/led/led_gpio.c31
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,
+};