[PATCH v4 02/39] usb: dwc3-generic: support external vbus regulator

Jonas Karlman jonas at kwiboo.se
Sat Feb 17 11:58:36 CET 2024


On 2024-02-15 21:52, Caleb Connolly wrote:
> Add support for a vbus-supply regulator specified in devicetree. This
> provides generic support to avoid hardcoded GPIO configuration in board
> init code.
> 
> Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
> ---
> This patch has no dependencies
> 
> Cc: Marek Vasut <marex at denx.de>
> ---
>  drivers/usb/dwc3/dwc3-generic.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
> index 6fb2de8a5ace..48da621ba966 100644
> --- a/drivers/usb/dwc3/dwc3-generic.c
> +++ b/drivers/usb/dwc3/dwc3-generic.c
> @@ -21,6 +21,7 @@
>  #include <linux/usb/ch9.h>
>  #include <linux/usb/gadget.h>
>  #include <malloc.h>
> +#include <power/regulator.h>
>  #include <usb.h>
>  #include "core.h"
>  #include "gadget.h"
> @@ -47,6 +48,7 @@ struct dwc3_generic_priv {
>  struct dwc3_generic_host_priv {
>  	struct xhci_ctrl xhci_ctrl;
>  	struct dwc3_generic_priv gen_priv;
> +	struct udevice *vbus_dev;

vbus_supply may be a better name, it is a name used by other drivers.

>  };
>  
>  static int dwc3_generic_probe(struct udevice *dev,
> @@ -240,6 +242,13 @@ static int dwc3_generic_host_probe(struct udevice *dev)
>  	if (rc)
>  		return rc;
>  
> +	rc = device_get_supply_regulator(dev, "vbus-supply", &priv->vbus_dev);
> +	if (rc)
> +		debug("%s: No vbus regulator found: %d\n", dev->name, rc);
> +
> +	if (priv->vbus_dev)
> +		regulator_set_enable(priv->vbus_dev, true);

This should use the following form:

	rc = regulator_set_enable_if_allowed(priv->vbus_supply, true);
	if (rc && rc != -ENOSYS)
		return rc;

That should only report an error if there is an error enabling the
regulator, or -ENOSYS if regulator support has been disabled.

Because fixed and gpio regulators now are referenced counted you will
need to clean up and disable the supply if the call to xhci_register()
fails, something like following should probably work:

	rc = xhci_register(dev, hccr, hcor);
	if (rc)
		regulator_set_enable_if_allowed(priv->vbus_supply, false);

	return rc;

> +
>  	hccr = (struct xhci_hccr *)priv->gen_priv.base;
>  	hcor = (struct xhci_hcor *)(priv->gen_priv.base +
>  			HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
> @@ -256,6 +265,9 @@ static int dwc3_generic_host_remove(struct udevice *dev)
>  	if (rc)
>  		return rc;
>  
> +	if (priv->vbus_dev)
> +		regulator_set_enable(priv->vbus_dev, false);

This can safely use the following without any if check:

	regulator_set_enable_if_allowed(priv->vbus_supply, false);

Regards,
Jonas

> +
>  	return dwc3_generic_remove(dev, &priv->gen_priv);
>  }
>  
> 



More information about the U-Boot mailing list