mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 14:41:31 +00:00
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: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
e8ea5e8c85
commit
eae11bece6
1 changed files with 23 additions and 0 deletions
|
@ -202,6 +202,20 @@ static void usb_scan_bus(struct udevice *bus, bool recurse)
|
|||
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 controllers_initialized = 0;
|
||||
|
@ -270,6 +284,15 @@ int usb_init(void)
|
|||
}
|
||||
|
||||
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 (!count)
|
||||
printf("No controllers found\n");
|
||||
|
|
Loading…
Add table
Reference in a new issue