phy: rockchip-usb: Add vbus regulator support.
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Wed, 5 Apr 2017 14:06:10 +0000 (16:06 +0200)
committerKishon Vijay Abraham I <kishon@ti.com>
Mon, 10 Apr 2017 11:13:41 +0000 (16:43 +0530)
On rockchip devices vbus is supplied by a separate power supply, often
through a regulator. Add support for describing the the regulator in
device-tree following the same convention as several other usb phy's.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
drivers/phy/phy-rockchip-usb.c

index 57dc388e2fa2fe7086b2abe186b46ef2703d7112..4ed569046daf919e487d0147b47720cdd44817aa 100644 (file)
@@ -30,6 +30,7 @@ Optional Properties:
 - reset-names: Only allow the following entries:
  - phy-reset
 - resets: Must contain an entry for each entry in reset-names.
+- vbus-supply: power-supply phandle for vbus power source
 
 Example:
 
index 734987fa0ad780ef1c3bd9a77684bab9ec7783ea..3378eeb7a562f196145f3a013f44ac701193f229 100644 (file)
@@ -66,6 +66,7 @@ struct rockchip_usb_phy {
        struct phy      *phy;
        bool            uart_enabled;
        struct reset_control *reset;
+       struct regulator *vbus;
 };
 
 static int rockchip_usb_phy_power(struct rockchip_usb_phy *phy,
@@ -88,6 +89,9 @@ static void rockchip_usb_phy480m_disable(struct clk_hw *hw)
                                                    struct rockchip_usb_phy,
                                                    clk480m_hw);
 
+       if (phy->vbus)
+               regulator_disable(phy->vbus);
+
        /* Power down usb phy analog blocks by set siddq 1 */
        rockchip_usb_phy_power(phy, 1);
 }
@@ -143,6 +147,14 @@ static int rockchip_usb_phy_power_on(struct phy *_phy)
        if (phy->uart_enabled)
                return -EBUSY;
 
+       if (phy->vbus) {
+               int ret;
+
+               ret = regulator_enable(phy->vbus);
+               if (ret)
+                       return ret;
+       }
+
        return clk_prepare_enable(phy->clk480m);
 }
 
@@ -268,6 +280,13 @@ static int rockchip_usb_phy_init(struct rockchip_usb_phy_base *base,
        }
        phy_set_drvdata(rk_phy->phy, rk_phy);
 
+       rk_phy->vbus = devm_regulator_get_optional(&rk_phy->phy->dev, "vbus");
+       if (IS_ERR(rk_phy->vbus)) {
+               if (PTR_ERR(rk_phy->vbus) == -EPROBE_DEFER)
+                       return PTR_ERR(rk_phy->vbus);
+               rk_phy->vbus = NULL;
+       }
+
        /*
         * When acting as uart-pipe, just keep clock on otherwise
         * only power up usb phy when it use, so disable it when init