Message ID | 20240215-b4-qcom-common-target-v4-2-ed06355c634a@linaro.org |
---|---|
State | New |
Headers | show |
Series | Qualcomm generic board support | expand |
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@linaro.org> > Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org> > --- > This patch has no dependencies > > Cc: Marek Vasut <marex@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); > } > >
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; }; 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); + 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); + return dwc3_generic_remove(dev, &priv->gen_priv); }