aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb/dwc3/dwc3-generic.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-07-14 11:10:49 -0400
committerTom Rini <trini@konsulko.com>2022-07-14 11:10:49 -0400
commit54f683dbfb8b0777ee4d0ba00872da33e54c98fa (patch)
tree2bf9b2cb071abd2a9a80a252fc0126f1df46cfec /drivers/usb/dwc3/dwc3-generic.c
parent58f3dc5c4eac9c6050edda6af2e37d20a2f9586d (diff)
parent16aabfe2f29d4682b2176095029fa307caccaced (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.c30
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);