diff options
author | Tom Rini <trini@konsulko.com> | 2019-07-07 07:06:03 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-07-07 07:06:03 -0400 |
commit | e597e5b6bca03dfbcd1d78c98ada335fd940e6ea (patch) | |
tree | 761d334c9c466bbcbf92488743a22e9b999b8d5f /drivers | |
parent | ace0d2ef2bc1e55aa3b90dd2882f9a474a09d0a6 (diff) | |
parent | 3b83829ed63fabe460592395571c1d8fd9b861c8 (diff) |
Merge https://gitlab.denx.de/u-boot/custodians/u-boot-usb
- DWC and i.MX6 fixes
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/core/uclass.c | 5 | ||||
-rw-r--r-- | drivers/usb/dwc3/dwc3-generic.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/ehci-mx6.c | 37 |
3 files changed, 44 insertions, 2 deletions
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c index fc3157de39c..dc9eb62893e 100644 --- a/drivers/core/uclass.c +++ b/drivers/core/uclass.c @@ -757,3 +757,8 @@ int uclass_pre_remove_device(struct udevice *dev) return 0; } #endif + +UCLASS_DRIVER(nop) = { + .id = UCLASS_NOP, + .name = "nop", +}; diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c index 3e6c494dc62..406bf0b3628 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -337,7 +337,7 @@ static int dwc3_glue_remove(struct udevice *dev) clk_release_bulk(&glue->clks); - return dm_scan_fdt_dev(dev); + return 0; } static const struct udevice_id dwc3_glue_ids[] = { @@ -350,7 +350,7 @@ static const struct udevice_id dwc3_glue_ids[] = { U_BOOT_DRIVER(dwc3_generic_wrapper) = { .name = "dwc3-generic-wrapper", - .id = UCLASS_MISC, + .id = UCLASS_NOP, .of_match = dwc3_glue_ids, .bind = dwc3_glue_bind, .probe = dwc3_glue_probe, diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c index 33abfeada07..e9e6ed596d5 100644 --- a/drivers/usb/host/ehci-mx6.c +++ b/drivers/usb/host/ehci-mx6.c @@ -503,6 +503,42 @@ static int ehci_usb_ofdata_to_platdata(struct udevice *dev) return 0; } +static int ehci_usb_bind(struct udevice *dev) +{ + /* + * TODO: + * This driver is only partly converted to DT probing and still uses + * a tremendous amount of hard-coded addresses. To make things worse, + * the driver depends on specific sequential indexing of controllers, + * from which it derives offsets in the PHY and ANATOP register sets. + * + * Here we attempt to calculate these indexes from DT information as + * well as we can. The USB controllers on all existing iMX6/iMX7 SoCs + * are placed next to each other, at addresses incremented by 0x200. + * Thus, the index is derived from the multiple of 0x200 offset from + * the first controller address. + * + * However, to complete conversion of this driver to DT probing, the + * following has to be done: + * - DM clock framework support for iMX must be implemented + * - usb_power_config() has to be converted to clock framework + * -> Thus, the ad-hoc "index" variable goes away. + * - USB PHY handling has to be factored out into separate driver + * -> Thus, the ad-hoc "index" variable goes away from the PHY + * code, the PHY driver must parse it's address from DT. This + * USB driver must find the PHY driver via DT phandle. + * -> usb_power_config() shall be moved to PHY driver + * With these changes in place, the ad-hoc indexing goes away and + * the driver is fully converted to DT probing. + */ + fdt_size_t size; + fdt_addr_t addr = devfdt_get_addr_size_index(dev, 0, &size); + + dev->req_seq = (addr - USB_BASE_ADDR) / size; + + return 0; +} + static int ehci_usb_probe(struct udevice *dev) { struct usb_platdata *plat = dev_get_platdata(dev); @@ -564,6 +600,7 @@ U_BOOT_DRIVER(usb_mx6) = { .id = UCLASS_USB, .of_match = mx6_usb_ids, .ofdata_to_platdata = ehci_usb_ofdata_to_platdata, + .bind = ehci_usb_bind, .probe = ehci_usb_probe, .remove = ehci_deregister, .ops = &ehci_usb_ops, |