]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
usb: dwc3: Add support to reset usb ULPI phy
authorT Karthik Reddy <t.karthik.reddy@xilinx.com>
Tue, 2 Nov 2021 11:46:28 +0000 (05:46 -0600)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 3 Nov 2021 10:34:55 +0000 (11:34 +0100)
When usb PHY initialization is done, the PHY need to be reset. In
dwc3-generic driver we are requesting for corresponding modepin gpio
and toggle it to reset the PHY using modepin gpio driver.

Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
drivers/usb/dwc3/dwc3-generic.c

index c80eebe9b3bf6a2756920f51df4c83fd74a37e06..95baa067eff7a985bede68297eda4ad515343090 100644 (file)
@@ -25,6 +25,7 @@
 #include <reset.h>
 #include <clk.h>
 #include <usb/xhci.h>
+#include <asm/gpio.h>
 
 struct dwc3_glue_data {
        struct clk_bulk         clks;
@@ -86,10 +87,11 @@ static void dwc3_frame_length_adjustment(struct udevice *dev, struct dwc3 *dwc)
 static int dwc3_generic_probe(struct udevice *dev,
                              struct dwc3_generic_priv *priv)
 {
-       int rc;
+       int rc, ret;
        struct dwc3_generic_plat *plat = dev_get_platdata(dev);
        struct dwc3 *dwc3 = &priv->dwc3;
        struct dwc3_glue_data *glue = dev_get_platdata(dev->parent);
+       struct gpio_desc reset_gpio;
 
        dwc3->dev = dev;
        dwc3->maximum_speed = plat->maximum_speed;
@@ -111,6 +113,19 @@ static int dwc3_generic_probe(struct udevice *dev,
        if (rc && rc != -ENOTSUPP)
                return rc;
 
+       if (device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3")) {
+               ret = gpio_request_by_name(dev->parent, "reset-gpios", 0,
+                                          &reset_gpio, GPIOD_ACTIVE_LOW);
+               if (ret != -EBUSY && ret)
+                       return ret;
+
+               /* Toggle ulpi to reset the phy. */
+               dm_gpio_set_value(&reset_gpio, 1);
+               mdelay(5);
+               dm_gpio_set_value(&reset_gpio, 0);
+               mdelay(5);
+       }
+
        if (device_is_compatible(dev->parent, "rockchip,rk3399-dwc3"))
                reset_deassert_bulk(&glue->resets);