From 2153d184f2ce81c1d3c095049957cad5f007977f Mon Sep 17 00:00:00 2001 From: T Karthik Reddy Date: Tue, 7 Dec 2021 03:36:40 -0700 Subject: [PATCH] usb: dwc3: Fix ULPI reset when resetting usb In the current ULPI reset implementation, when a usb reset is issued gpio_request_by_name() returns -EBUSY as the gpio is already requested and failing to set gpio descriptor flags(active low) and failing to bring the ULPI out of reset. Fix this issue by freeing the gpio when a usb reset is issued and request gpio again when usb starts. Signed-off-by: T Karthik Reddy --- drivers/usb/dwc3/dwc3-generic.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c index 0a8a776b1b8..ce4fe0f246d 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -43,6 +43,7 @@ struct dwc3_generic_priv { void *base; struct dwc3 dwc3; struct phy_bulk phys; + struct gpio_desc ulpi_reset; }; struct dwc3_generic_host_priv { @@ -86,7 +87,6 @@ static int dwc3_generic_probe(struct udevice *dev, struct dwc3_generic_plat *plat = dev_get_plat(dev); struct dwc3 *dwc3 = &priv->dwc3; struct dwc3_glue_data *glue = dev_get_plat(dev->parent); - struct gpio_desc reset_gpio; dwc3->dev = dev; dwc3->maximum_speed = plat->maximum_speed; @@ -110,14 +110,14 @@ static int dwc3_generic_probe(struct udevice *dev, if (device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3")) { ret = gpio_request_by_name(dev->parent, "reset-gpios", 0, - &reset_gpio, GPIOD_ACTIVE_LOW); + &priv->ulpi_reset, GPIOD_ACTIVE_LOW); if (ret != -EBUSY && ret) return ret; /* Toggle ulpi to reset the phy. */ - dm_gpio_set_value(&reset_gpio, 1); + dm_gpio_set_value(&priv->ulpi_reset, 1); mdelay(5); - dm_gpio_set_value(&reset_gpio, 0); + dm_gpio_set_value(&priv->ulpi_reset, 0); mdelay(5); } @@ -146,6 +146,11 @@ static int dwc3_generic_remove(struct udevice *dev, { struct dwc3 *dwc3 = &priv->dwc3; + if (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); -- 2.47.2