diff mbox series

[3/3] phy: sun4i-usb: Support VBUS detection via power supply

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

Commit Message

Samuel Holland Sept. 12, 2021, 2:22 p.m. UTC
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(+)

Comments

Andre Przywara Oct. 25, 2021, 2:08 p.m. UTC | #1
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 mbox series

Patch

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];