[PATCH] usb: dwc3: Add support to reset usb ULPI phy

Marek Vasut marex at denx.de
Wed Feb 23 18:31:35 CET 2022


On 2/23/22 16:06, Michal Simek wrote:
> From: T Karthik Reddy <t.karthik.reddy at xilinx.com>
> 
> When usb PHY initialization is done, the PHY need to be reset.
> 
> Signed-off-by: T Karthik Reddy <t.karthik.reddy at xilinx.com>
> Signed-off-by: Michal Simek <michal.simek at 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;
> +
> +		/* 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);

CC Bin please.


More information about the U-Boot mailing list