OSDN Git Service

usb: phy: qusb2: Add support to vote for regulator L2a
authorHemant Kumar <hemantk@codeaurora.org>
Fri, 2 Dec 2016 03:56:10 +0000 (19:56 -0800)
committerHemant Kumar <hemantk@codeaurora.org>
Thu, 8 Dec 2016 21:54:27 +0000 (13:54 -0800)
L2a is required to lock the phy PLL upon bus resume when
exiting from XO shutdown. This LDO powers REFGEN block
which is required to be powered on so that phy PLL gets
locked as part of wakeup from XO shutdown.

Change-Id: Ia0e3d574de7c78534832e4f8749672eb6fcde1f0
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
Documentation/devicetree/bindings/usb/msm-phy.txt
arch/arm/boot/dts/qcom/msm8998.dtsi
drivers/usb/phy/phy-msm-qusb-v2.c

index b45ee91..032f075 100644 (file)
@@ -178,6 +178,7 @@ Required properties:
        "vdd" : vdd supply for digital circuit operation
        "vdda18" : 1.8v high-voltage analog supply
        "vdda33" : 3.3v high-voltage analog supply
+       "vdda12" : 1.2v high-voltage analog supply
  - qcom,vdd-voltage-level: This property must be a list of three integer
    values (no, min, max) where each value represents either a voltage in
    microvolts or a value corresponding to voltage corner
index 0b54647..c265eaf 100644 (file)
                reg-names = "qusb_phy_base",
                                "tcsr_clamp_dig_n_1p8";
                vdd-supply = <&pm8998_l1>;
+               vdda12-supply = <&pm8998_l2>;
                vdda18-supply = <&pm8998_l12>;
                vdda33-supply = <&pm8998_l24>;
                qcom,vdd-voltage-level = <0 880000 880000>;
index 5a768ee..86908d2 100644 (file)
 
 #define QUSB2PHY_PORT_TUNE1            0x23c
 
+#define QUSB2PHY_1P2_VOL_MIN           1200000 /* uV */
+#define QUSB2PHY_1P2_VOL_MAX           1200000 /* uV */
+#define QUSB2PHY_1P2_HPM_LOAD          23000
+
 #define QUSB2PHY_1P8_VOL_MIN           1800000 /* uV */
 #define QUSB2PHY_1P8_VOL_MAX           1800000 /* uV */
 #define QUSB2PHY_1P8_HPM_LOAD          30000   /* uA */
@@ -83,6 +87,7 @@ struct qusb_phy {
        struct regulator        *vdd;
        struct regulator        *vdda33;
        struct regulator        *vdda18;
+       struct regulator        *vdda12;
        int                     vdd_levels[3]; /* none, low, high */
        int                     init_seq_len;
        int                     *qusb_phy_init_seq;
@@ -184,10 +189,30 @@ static int qusb_phy_enable_power(struct qusb_phy *qphy, bool on,
                }
        }
 
+       ret = regulator_set_load(qphy->vdda12, QUSB2PHY_1P2_HPM_LOAD);
+       if (ret < 0) {
+               dev_err(qphy->phy.dev, "Unable to set HPM of vdda12:%d\n", ret);
+               goto disable_vdd;
+       }
+
+       ret = regulator_set_voltage(qphy->vdda12, QUSB2PHY_1P2_VOL_MIN,
+                                               QUSB2PHY_1P2_VOL_MAX);
+       if (ret) {
+               dev_err(qphy->phy.dev,
+                               "Unable to set voltage for vdda12:%d\n", ret);
+               goto put_vdda12_lpm;
+       }
+
+       ret = regulator_enable(qphy->vdda12);
+       if (ret) {
+               dev_err(qphy->phy.dev, "Unable to enable vdda12:%d\n", ret);
+               goto unset_vdda12;
+       }
+
        ret = regulator_set_load(qphy->vdda18, QUSB2PHY_1P8_HPM_LOAD);
        if (ret < 0) {
                dev_err(qphy->phy.dev, "Unable to set HPM of vdda18:%d\n", ret);
-               goto disable_vdd;
+               goto disable_vdda12;
        }
 
        ret = regulator_set_voltage(qphy->vdda18, QUSB2PHY_1P8_VOL_MIN,
@@ -262,6 +287,20 @@ put_vdda18_lpm:
        if (ret < 0)
                dev_err(qphy->phy.dev, "Unable to set LPM of vdda18\n");
 
+disable_vdda12:
+       ret = regulator_disable(qphy->vdda12);
+       if (ret)
+               dev_err(qphy->phy.dev, "Unable to disable vdda12:%d\n", ret);
+unset_vdda12:
+       ret = regulator_set_voltage(qphy->vdda12, 0, QUSB2PHY_1P2_VOL_MAX);
+       if (ret)
+               dev_err(qphy->phy.dev,
+                       "Unable to set (0) voltage for vdda12:%d\n", ret);
+put_vdda12_lpm:
+       ret = regulator_set_load(qphy->vdda12, 0);
+       if (ret < 0)
+               dev_err(qphy->phy.dev, "Unable to set LPM of vdda12\n");
+
 disable_vdd:
        if (toggle_vdd) {
                ret = regulator_disable(qphy->vdd);
@@ -985,6 +1024,12 @@ static int qusb_phy_probe(struct platform_device *pdev)
                return PTR_ERR(qphy->vdda18);
        }
 
+       qphy->vdda12 = devm_regulator_get(dev, "vdda12");
+       if (IS_ERR(qphy->vdda12)) {
+               dev_err(dev, "unable to get vdda12 supply\n");
+               return PTR_ERR(qphy->vdda12);
+       }
+
        platform_set_drvdata(pdev, qphy);
 
        qphy->phy.label                 = "msm-qusb-phy-v2";