]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
phy: sun4i-usb: Support VBUS detection via power supply
authorSamuel Holland <samuel@sholland.org>
Sun, 12 Sep 2021 14:22:42 +0000 (09:22 -0500)
committerAndre Przywara <andre.przywara@arm.com>
Mon, 25 Oct 2021 13:49:28 +0000 (14:49 +0100)
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>
Acked-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
drivers/phy/allwinner/Kconfig
drivers/phy/allwinner/phy-sun4i-usb.c

index 6bfb79cbcad36395cd4d0eda6cde3fe5adcd14bf..d3ff82f73a0041feb64964b9d17c46377f4db60f 100644 (file)
@@ -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
index 827ecd70f276890e3521f765d6d4874a3fdcd795..ab2a5d17fcff15700a944ae0fa17271f8741f35a 100644 (file)
@@ -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];