Commit fd1bd21b authored by Hans de Goede's avatar Hans de Goede Committed by Simon Glass
Browse files

dm: usb: Do not assume that first child is always a hub

On some single port (otg) controllers there is no emulated root hub, so
the first child (if any) may be one of: UCLASS_MASS_STORAGE,

All three of these (and in the future others) are suitable for our
purposes, remove the check for the device being a hub, and add a check to
deal with the fact that there may be no child-dev.
Signed-off-by: default avatarHans de Goede <>
Acked-by: default avatarSimon Glass <>
parent b2f219b0
......@@ -630,12 +630,11 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
uclass_next_device(&bus)) {
struct usb_device *udev;
struct udevice *hub;
struct udevice *dev;
device_find_first_child(bus, &hub);
if (device_get_uclass_id(hub) == UCLASS_USB_HUB &&
device_active(hub)) {
udev = dev_get_parentdata(hub);
device_find_first_child(bus, &dev);
if (dev && device_active(dev)) {
udev = dev_get_parentdata(dev);
......@@ -303,14 +303,14 @@ static struct usb_device *find_child_devnum(struct udevice *parent, int devnum)
struct usb_device *usb_get_dev_index(struct udevice *bus, int index)
struct udevice *hub;
struct udevice *dev;
int devnum = index + 1; /* Addresses are allocated from 1 on USB */
device_find_first_child(bus, &hub);
if (device_get_uclass_id(hub) == UCLASS_USB_HUB)
return find_child_devnum(hub, devnum);
device_find_first_child(bus, &dev);
if (!dev)
return NULL;
return NULL;
return find_child_devnum(dev, devnum);
int usb_post_bind(struct udevice *dev)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment