Skip to content
Snippets Groups Projects
Commit eae11bec authored by Simon Glass's avatar Simon Glass
Browse files

dm: usb: Remove inactive children after a bus scan


Each scan of the USB bus may return different results. Existing driver-model
devices are reused when found, but if a device no longer exists it will stay
around, de-activated, but bound.

Detect these devices and remove them after the scan completes.

Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
parent e8ea5e8c
No related branches found
No related tags found
No related merge requests found
...@@ -202,6 +202,20 @@ static void usb_scan_bus(struct udevice *bus, bool recurse) ...@@ -202,6 +202,20 @@ static void usb_scan_bus(struct udevice *bus, bool recurse)
printf("%d USB Device(s) found\n", priv->next_addr); printf("%d USB Device(s) found\n", priv->next_addr);
} }
static void remove_inactive_children(struct uclass *uc, struct udevice *bus)
{
uclass_foreach_dev(bus, uc) {
struct udevice *dev, *next;
if (!device_active(bus))
continue;
device_foreach_child_safe(dev, next, bus) {
if (!device_active(dev))
device_unbind(dev);
}
}
}
int usb_init(void) int usb_init(void)
{ {
int controllers_initialized = 0; int controllers_initialized = 0;
...@@ -270,6 +284,15 @@ int usb_init(void) ...@@ -270,6 +284,15 @@ int usb_init(void)
} }
debug("scan end\n"); debug("scan end\n");
/* Remove any devices that were not found on this scan */
remove_inactive_children(uc, bus);
ret = uclass_get(UCLASS_USB_HUB, &uc);
if (ret)
return ret;
remove_inactive_children(uc, bus);
/* if we were not able to find at least one working bus, bail out */ /* if we were not able to find at least one working bus, bail out */
if (!count) if (!count)
printf("No controllers found\n"); printf("No controllers found\n");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment