aboutsummaryrefslogtreecommitdiff
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
-rw-r--r--drivers/power/acpi_pmc/pmc_emul.c1
-rw-r--r--drivers/sound/sound.c6
-rw-r--r--drivers/usb/emul/sandbox_flash.c2
-rw-r--r--drivers/usb/emul/usb-emul-uclass.c5
7 files changed, 46 insertions, 33 deletions
diff --git a/drivers/core/root.c b/drivers/core/root.c
index e09c12f4d6..17dd1205a3 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 5d7bf40896..68ca3c2970 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 958dbd31e7..fbed151b5d 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,
+};
diff --git a/drivers/power/acpi_pmc/pmc_emul.c b/drivers/power/acpi_pmc/pmc_emul.c
index a61eb5bd85..8015031da8 100644
--- a/drivers/power/acpi_pmc/pmc_emul.c
+++ b/drivers/power/acpi_pmc/pmc_emul.c
@@ -37,6 +37,7 @@ static struct pci_bar {
{ 0, 0 },
{ 0, 0 },
{ PCI_BASE_ADDRESS_SPACE_IO, 256 },
+ { 0, 0 },
};
struct pmc_emul_priv {
diff --git a/drivers/sound/sound.c b/drivers/sound/sound.c
index b0eab23391..041dfdccfe 100644
--- a/drivers/sound/sound.c
+++ b/drivers/sound/sound.c
@@ -25,13 +25,11 @@ void sound_create_square_wave(uint sample_rate, unsigned short *data, int size,
int i, j;
for (i = 0; size && i < half; i++) {
- size -= 2;
- for (j = 0; j < channels; j++)
+ for (j = 0; size && j < channels; j++, size -= 2)
*data++ = amplitude;
}
for (i = 0; size && i < period - half; i++) {
- size -= 2;
- for (j = 0; j < channels; j++)
+ for (j = 0; size && j < channels; j++, size -= 2)
*data++ = -amplitude;
}
}
diff --git a/drivers/usb/emul/sandbox_flash.c b/drivers/usb/emul/sandbox_flash.c
index edabc1b3a7..cc80f67133 100644
--- a/drivers/usb/emul/sandbox_flash.c
+++ b/drivers/usb/emul/sandbox_flash.c
@@ -345,6 +345,8 @@ static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
} else {
if (priv->alloc_len && len > priv->alloc_len)
len = priv->alloc_len;
+ if (len > sizeof(priv->buff))
+ len = sizeof(priv->buff);
memcpy(buff, priv->buff, len);
priv->phase = PHASE_STATUS;
}
diff --git a/drivers/usb/emul/usb-emul-uclass.c b/drivers/usb/emul/usb-emul-uclass.c
index 05f6d3d9e2..b31dc950e3 100644
--- a/drivers/usb/emul/usb-emul-uclass.c
+++ b/drivers/usb/emul/usb-emul-uclass.c
@@ -15,13 +15,12 @@
static int copy_to_unicode(char *buff, int length, const char *str)
{
int ptr;
- int i;
if (length < 2)
return 0;
buff[1] = USB_DT_STRING;
- for (ptr = 2, i = 0; ptr + 1 < length && *str; i++, ptr += 2) {
- buff[ptr] = str[i];
+ for (ptr = 2; ptr + 1 < length && *str; str++, ptr += 2) {
+ buff[ptr] = *str;
buff[ptr + 1] = 0;
}
buff[0] = ptr;