diff options
author | Tom Rini <trini@konsulko.com> | 2022-07-14 11:10:49 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-07-14 11:10:49 -0400 |
commit | 54f683dbfb8b0777ee4d0ba00872da33e54c98fa (patch) | |
tree | 2bf9b2cb071abd2a9a80a252fc0126f1df46cfec /drivers/usb/dwc3/dwc3-generic.c | |
parent | 58f3dc5c4eac9c6050edda6af2e37d20a2f9586d (diff) | |
parent | 16aabfe2f29d4682b2176095029fa307caccaced (diff) |
Merge https://source.denx.de/u-boot/custodians/u-boot-usb
Diffstat (limited to 'drivers/usb/dwc3/dwc3-generic.c')
-rw-r--r-- | drivers/usb/dwc3/dwc3-generic.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c index c5310e465c..466b25a0c3 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -26,6 +26,7 @@ #include <reset.h> #include <clk.h> #include <usb/xhci.h> +#include <asm/gpio.h> struct dwc3_glue_data { struct clk_bulk clks; @@ -43,6 +44,7 @@ struct dwc3_generic_priv { void *base; struct dwc3 dwc3; struct phy_bulk phys; + struct gpio_desc ulpi_reset; }; struct dwc3_generic_host_priv { @@ -78,6 +80,27 @@ static int dwc3_generic_probe(struct udevice *dev, if (rc && rc != -ENOTSUPP) return rc; + if (CONFIG_IS_ENABLED(DM_GPIO) && + device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3")) { + rc = gpio_request_by_name(dev->parent, "reset-gpios", 0, + &priv->ulpi_reset, GPIOD_ACTIVE_LOW); + if (rc) + return rc; + + /* Toggle ulpi to reset the phy. */ + rc = dm_gpio_set_value(&priv->ulpi_reset, 1); + if (rc) + return rc; + + mdelay(5); + + rc = dm_gpio_set_value(&priv->ulpi_reset, 0); + if (rc) + return rc; + + mdelay(5); + } + if (device_is_compatible(dev->parent, "rockchip,rk3399-dwc3")) reset_deassert_bulk(&glue->resets); @@ -99,6 +122,13 @@ static int dwc3_generic_remove(struct udevice *dev, { struct dwc3 *dwc3 = &priv->dwc3; + if (CONFIG_IS_ENABLED(DM_GPIO) && + device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3")) { + struct gpio_desc *ulpi_reset = &priv->ulpi_reset; + + dm_gpio_free(ulpi_reset->dev, ulpi_reset); + } + dwc3_remove(dwc3); dwc3_shutdown_phy(dev, &priv->phys); unmap_physmem(dwc3->regs, MAP_NOCACHE); |