usb: ehci-mx6: Fix bus enumeration for iMX7 SoCs
authorIgor Opaniuk <igor.opaniuk@toradex.com>
Thu, 10 Oct 2019 13:09:35 +0000 (16:09 +0300)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Thu, 24 Oct 2019 13:31:13 +0000 (15:31 +0200)
This fixes the issues with calculation of controller indexes in
ehci_usb_bind() for iMX7, as USB controllers on iMX7 SoCs aren't
placed next to each other, and their addresses incremented by 0x10000.

Example of USB nodes for iMX7S/D:

usbotg1: usb@30b10000 {
    compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
    reg = <0x30b10000 0x200>;
           ^^^^^^^^^^
....
usbotg2: usb@30b20000 {
    compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
    reg = <0x30b20000 0x200>;
           ^^^^^^^^^^
....

usbh: usb@30b30000 {
    compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
    reg = <0x30b30000 0x200>;
           ^^^^^^^^^^
....

Which was leading to usb enumeration issues:
Colibri iMX7 # usb start
starting USB...
Bus usb@30b10000: USB EHCI 1.00
Bus usb@30b20000: probe failed, error -22
scanning bus usb@30b10000 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found

Fixes: 501547cec1("usb: ehci-mx6: Fix bus enumeration for DM case")
Signed-off-by: Igor Opaniuk <igor.opaniuk@toradex.com>
drivers/usb/host/ehci-mx6.c

index e9e6ed5..7d46091 100644 (file)
@@ -513,10 +513,11 @@ static int ehci_usb_bind(struct udevice *dev)
         * 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.
+        * well as we can. The USB controllers on all existing iMX6 SoCs
+        * are placed next to each other, at addresses incremented by 0x200,
+        * and iMX7 their addresses are shifted by 0x10000.
+        * Thus, the index is derived from the multiple of 0x200 (0x10000 for
+        * iMX7) offset from the first controller address.
         *
         * However, to complete conversion of this driver to DT probing, the
         * following has to be done:
@@ -531,10 +532,10 @@ static int ehci_usb_bind(struct udevice *dev)
         * 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);
+       u32 controller_spacing = is_mx7() ? 0x10000 : 0x200;
+       fdt_addr_t addr = devfdt_get_addr_index(dev, 0);
 
-       dev->req_seq = (addr - USB_BASE_ADDR) / size;
+       dev->req_seq = (addr - USB_BASE_ADDR) / controller_spacing;
 
        return 0;
 }