usb: dwc3-meson-g12a: add power-on/off of the PHYs
authorNeil Armstrong <narmstrong@baylibre.com>
Tue, 21 Apr 2020 08:17:42 +0000 (10:17 +0200)
committerNeil Armstrong <narmstrong@baylibre.com>
Tue, 28 Apr 2020 08:23:10 +0000 (10:23 +0200)
Power on/off the PHYs to enable power to the USB ports, fixing USB support
on Khadas VIM3/VIM3L boards.

The G12A USB complex has at least 2 USB2 PHYs, but one is muxed between the
DWC2 and DWC3 controller and the other one directly connected to the DWC3
controller. The USB3+PCIe combo PHY is muxed between the DWC3 controller
and a DW-PCIE controller.
All PHYs are optional, but it's type (usb2/usb3) and position are important
to determine it's capabilities, thus they are stored in a fixed size
array and the phy-name determines it's position, it's position determining
it's type and functionnalities.
This is why we need to loop over the array to power on all the DT provided
PHYs.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Reviewed-by: Marek Vasut <marex@denx.de>
drivers/usb/dwc3/dwc3-meson-g12a.c

index d4453f8784cbfdaa38196d57b6dc0bce7674c4ef..de964d6c10eacb778ccf984d8fd59c01a4d15620 100644 (file)
@@ -408,6 +408,15 @@ static int dwc3_meson_g12a_probe(struct udevice *dev)
                        goto err_phy_init;
        }
 
+       for (i = 0; i < PHY_COUNT; ++i) {
+               if (!priv->phys[i].dev)
+                       continue;
+
+               ret = generic_phy_power_on(&priv->phys[i]);
+               if (ret)
+                       goto err_phy_init;
+       }
+
        return 0;
 
 err_phy_init:
@@ -430,6 +439,13 @@ static int dwc3_meson_g12a_remove(struct udevice *dev)
 
        clk_release_all(&priv->clk, 1);
 
+       for (i = 0; i < PHY_COUNT; ++i) {
+               if (!priv->phys[i].dev)
+                       continue;
+
+                generic_phy_power_off(&priv->phys[i]);
+       }
+
        for (i = 0 ; i < PHY_COUNT ; ++i) {
                if (!priv->phys[i].dev)
                        continue;