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 | ||||
-rw-r--r-- | drivers/power/acpi_pmc/pmc_emul.c | 1 | ||||
-rw-r--r-- | drivers/sound/sound.c | 6 | ||||
-rw-r--r-- | drivers/usb/emul/sandbox_flash.c | 2 | ||||
-rw-r--r-- | drivers/usb/emul/usb-emul-uclass.c | 5 |
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; |