diff options
author | Stefan Brüns <stefan.bruens@rwth-aachen.de> | 2015-12-22 01:21:03 +0100 |
---|---|---|
committer | Marek Vasut <marex@denx.de> | 2015-12-31 16:16:29 +0100 |
commit | faa7db24a4b6c1b645dec312a16574442d5adde2 (patch) | |
tree | 7e555277a389ebc566622c0a9910d0513b261b57 /common/usb.c | |
parent | 5253aded464f99734698bffd33c662f1ac071fd0 (diff) | |
download | u-boot-faa7db24a4b6c1b645dec312a16574442d5adde2.tar.gz u-boot-faa7db24a4b6c1b645dec312a16574442d5adde2.tar.bz2 u-boot-faa7db24a4b6c1b645dec312a16574442d5adde2.zip |
usb: Move determination of TT hub address/port into separate function
Start split and complete split tokens need the hub address and the
downstream port of the first HS hub (device view).
The core of the function was duplicated in both host/ehci_hcd and
musb-new/usb-compat.h.
Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Reviewed-by: Marek Vasut <marex@denx.de>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'common/usb.c')
-rw-r--r-- | common/usb.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/common/usb.c b/common/usb.c index b1773914cf..9f67cc1e8e 100644 --- a/common/usb.c +++ b/common/usb.c @@ -1214,4 +1214,60 @@ bool usb_device_has_child_on_port(struct usb_device *parent, int port) #endif } +#ifdef CONFIG_DM_USB +void usb_find_usb2_hub_address_port(struct usb_device *udev, + uint8_t *hub_address, uint8_t *hub_port) +{ + struct udevice *parent; + struct usb_device *uparent, *ttdev; + + /* + * When called from usb-uclass.c: usb_scan_device() udev->dev points + * to the parent udevice, not the actual udevice belonging to the + * udev as the device is not instantiated yet. So when searching + * for the first usb-2 parent start with udev->dev not + * udev->dev->parent . + */ + ttdev = udev; + parent = udev->dev; + uparent = dev_get_parent_priv(parent); + + while (uparent->speed != USB_SPEED_HIGH) { + struct udevice *dev = parent; + + if (device_get_uclass_id(dev->parent) != UCLASS_USB_HUB) { + printf("Error: Cannot find high speed parent of usb-1 device\n"); + *hub_address = 0; + *hub_port = 0; + return; + } + + ttdev = dev_get_parent_priv(dev); + parent = dev->parent; + uparent = dev_get_parent_priv(parent); + } + *hub_address = uparent->devnum; + *hub_port = ttdev->portnr; +} +#else +void usb_find_usb2_hub_address_port(struct usb_device *udev, + uint8_t *hub_address, uint8_t *hub_port) +{ + /* Find out the nearest parent which is high speed */ + while (udev->parent->parent != NULL) + if (udev->parent->speed != USB_SPEED_HIGH) { + udev = udev->parent; + } else { + *hub_address = udev->parent->devnum; + *hub_port = udev->portnr; + return; + } + + printf("Error: Cannot find high speed parent of usb-1 device\n"); + *hub_address = 0; + *hub_port = 0; +} +#endif + + /* EOF */ |