Message ID | 20210912142243.9912-4-samuel@sholland.org |
---|---|
State | Accepted |
Commit | 6fa41cdd19b93b27483f071f96da8b66bebd7a37 |
Delegated to: | Andre Przywara |
Headers | show |
Series | phy: sun4i-usb: Support VBUS detection via power supply | expand |
On Sun, 12 Sep 2021 09:22:42 -0500 Samuel Holland <samuel@sholland.org> wrote: > The device tree binding provides for getting VBUS state from a device > referenced by phandle, as an optional alternative to using a GPIO. In > U-Boot, where there is no power supply class, this VBUS detection will > be implemented using a regulator device and its get_enable method. > Let's hook this up to the PHY driver. > > Signed-off-by: Samuel Holland <samuel@sholland.org> Looks good, but curious if that works on all those boards ... Acked-by: Andre Przywara <andre.przywara@arm.com> Cheers, Andre > --- > > drivers/phy/allwinner/Kconfig | 1 + > drivers/phy/allwinner/phy-sun4i-usb.c | 7 +++++++ > 2 files changed, 8 insertions(+) > > diff --git a/drivers/phy/allwinner/Kconfig b/drivers/phy/allwinner/Kconfig > index dba3bae61c4..aa9d0e7e6a5 100644 > --- a/drivers/phy/allwinner/Kconfig > +++ b/drivers/phy/allwinner/Kconfig > @@ -4,6 +4,7 @@ > config PHY_SUN4I_USB > bool "Allwinner Sun4I USB PHY driver" > depends on ARCH_SUNXI > + select DM_REGULATOR > select PHY > help > Enable this to support the transceiver that is part of Allwinner > diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c > index 827ecd70f27..ab2a5d17fcf 100644 > --- a/drivers/phy/allwinner/phy-sun4i-usb.c > +++ b/drivers/phy/allwinner/phy-sun4i-usb.c > @@ -26,6 +26,7 @@ > #include <linux/bitops.h> > #include <linux/delay.h> > #include <linux/err.h> > +#include <power/regulator.h> > > #define REG_ISCR 0x00 > #define REG_PHYCTL_A10 0x04 > @@ -137,6 +138,7 @@ struct sun4i_usb_phy_data { > void __iomem *base; > const struct sun4i_usb_phy_cfg *cfg; > struct sun4i_usb_phy_plat *usb_phy; > + struct udevice *vbus_power_supply; > }; > > static int initial_usb_scan_delay = CONFIG_INITIAL_USB_SCAN_DELAY; > @@ -404,6 +406,8 @@ int sun4i_usb_phy_vbus_detect(struct phy *phy) > mdelay(100); > err = gpio_get_value(usb_phy->gpio_vbus_det); > } > + } else if (data->vbus_power_supply) { > + err = regulator_get_enable(data->vbus_power_supply); > } > > return err; > @@ -447,6 +451,9 @@ static int sun4i_usb_phy_probe(struct udevice *dev) > if (IS_ERR(data->base)) > return PTR_ERR(data->base); > > + device_get_supply_regulator(dev, "usb0_vbus_power-supply", > + &data->vbus_power_supply); > + > data->usb_phy = plat; > for (i = 0; i < data->cfg->num_phys; i++) { > struct sun4i_usb_phy_plat *phy = &plat[i];
diff --git a/drivers/phy/allwinner/Kconfig b/drivers/phy/allwinner/Kconfig index dba3bae61c4..aa9d0e7e6a5 100644 --- a/drivers/phy/allwinner/Kconfig +++ b/drivers/phy/allwinner/Kconfig @@ -4,6 +4,7 @@ config PHY_SUN4I_USB bool "Allwinner Sun4I USB PHY driver" depends on ARCH_SUNXI + select DM_REGULATOR select PHY help Enable this to support the transceiver that is part of Allwinner diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c index 827ecd70f27..ab2a5d17fcf 100644 --- a/drivers/phy/allwinner/phy-sun4i-usb.c +++ b/drivers/phy/allwinner/phy-sun4i-usb.c @@ -26,6 +26,7 @@ #include <linux/bitops.h> #include <linux/delay.h> #include <linux/err.h> +#include <power/regulator.h> #define REG_ISCR 0x00 #define REG_PHYCTL_A10 0x04 @@ -137,6 +138,7 @@ struct sun4i_usb_phy_data { void __iomem *base; const struct sun4i_usb_phy_cfg *cfg; struct sun4i_usb_phy_plat *usb_phy; + struct udevice *vbus_power_supply; }; static int initial_usb_scan_delay = CONFIG_INITIAL_USB_SCAN_DELAY; @@ -404,6 +406,8 @@ int sun4i_usb_phy_vbus_detect(struct phy *phy) mdelay(100); err = gpio_get_value(usb_phy->gpio_vbus_det); } + } else if (data->vbus_power_supply) { + err = regulator_get_enable(data->vbus_power_supply); } return err; @@ -447,6 +451,9 @@ static int sun4i_usb_phy_probe(struct udevice *dev) if (IS_ERR(data->base)) return PTR_ERR(data->base); + device_get_supply_regulator(dev, "usb0_vbus_power-supply", + &data->vbus_power_supply); + data->usb_phy = plat; for (i = 0; i < data->cfg->num_phys; i++) { struct sun4i_usb_phy_plat *phy = &plat[i];
The device tree binding provides for getting VBUS state from a device referenced by phandle, as an optional alternative to using a GPIO. In U-Boot, where there is no power supply class, this VBUS detection will be implemented using a regulator device and its get_enable method. Let's hook this up to the PHY driver. Signed-off-by: Samuel Holland <samuel@sholland.org> --- drivers/phy/allwinner/Kconfig | 1 + drivers/phy/allwinner/phy-sun4i-usb.c | 7 +++++++ 2 files changed, 8 insertions(+)