On Wed, Feb 23, 2022 at 11:07 PM Michal Simek <michal.si...@xilinx.com> wrote: > > From: T Karthik Reddy <t.karthik.re...@xilinx.com> > > When usb PHY initialization is done, the PHY need to be reset. > > Signed-off-by: T Karthik Reddy <t.karthik.re...@xilinx.com> > Signed-off-by: Michal Simek <michal.si...@xilinx.com> > --- > > drivers/usb/dwc3/Kconfig | 2 +- > drivers/usb/dwc3/dwc3-generic.c | 28 ++++++++++++++++++++++++++++ > 2 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig > index 62aa65bf0cd2..685bda3729e5 100644 > --- a/drivers/usb/dwc3/Kconfig > +++ b/drivers/usb/dwc3/Kconfig > @@ -25,7 +25,7 @@ config USB_DWC3_OMAP > > config USB_DWC3_GENERIC > bool "Generic implementation of a DWC3 wrapper (aka dwc3 glue)" > - depends on DM_USB && USB_DWC3 && MISC > + depends on DM_USB && USB_DWC3 && MISC && DM_GPIO > help > Select this for Xilinx ZynqMP and similar Platforms. > This wrapper supports Host and Peripheral operation modes. > diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c > index b1e019b5b91a..17d35a6dc60c 100644 > --- a/drivers/usb/dwc3/dwc3-generic.c > +++ b/drivers/usb/dwc3/dwc3-generic.c > @@ -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; > @@ -42,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 { > @@ -77,6 +79,26 @@ static int dwc3_generic_probe(struct udevice *dev, > if (rc && rc != -ENOTSUPP) > return rc; > > + if (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 != -EBUSY && rc) > + return rc;
What happens if rc == -EBUSY? > + > + /* 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); > > @@ -98,6 +120,12 @@ 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); > Regards, Bin