Loading Documentation/devicetree/bindings/usb/qcom,msm-phy.txt +4 −0 Original line number Diff line number Diff line Loading @@ -110,8 +110,12 @@ Optional properties: - qcom,vbus-valid-override: If present, indicates VBUS pin is not connected to the USB PHY and the controller must rely on external VBUS notification in order to manually relay the notification to the SSPHY. - qcom,vdd-max-load-uA: If present, indicates the maximum current (in uA) the PHY is expected to draw from the vdd power supply. - qcom,core-voltage-level: This property must be a list of three integer values (no, min, max) where each value represents either a voltage in - qcom,core-max-load-uA: If present, indicates the maximum current (in uA) the PHY is expected to draw from the core power supply. microvolts or a value corresponding to voltage corner. - qcom,link-training-reset: This property indicates to start link training timer to reset the elastic buffer based on rx equalization value. Loading drivers/usb/phy/phy-msm-ssusb-qmp.c +36 −16 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ enum core_ldo_levels { /* default CORE votlage and load values */ #define USB_SSPHY_1P2_VOL_MIN 1200000 /* uV */ #define USB_SSPHY_1P2_VOL_MAX 1200000 /* uV */ #define USB_SSPHY_HPM_LOAD 23000 /* uA */ #define USB_SSPHY_HPM_LOAD 30000 /* uA */ /* USB3PHY_PCIE_USB3_PCS_PCS_STATUS bit */ #define PHYSTATUS BIT(6) Loading Loading @@ -118,8 +118,10 @@ struct msm_ssphy_qmp { struct regulator *vdd; int vdd_levels[3]; /* none, low, high */ int vdd_max_uA; struct regulator *core_ldo; int core_voltage_levels[3]; int core_max_uA; struct clk *ref_clk_src; struct clk *ref_clk; struct clk *aux_clk; Loading Loading @@ -248,11 +250,17 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) if (!on) goto disable_regulators; rc = regulator_set_load(phy->vdd, phy->vdd_max_uA); if (rc < 0) { dev_err(phy->phy.dev, "Unable to set HPM of %s\n", "vdd"); return rc; } rc = regulator_set_voltage(phy->vdd, phy->vdd_levels[min], phy->vdd_levels[2]); if (rc) { dev_err(phy->phy.dev, "unable to set voltage for ssusb vdd\n"); return rc; dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "vdd"); goto put_vdd_lpm; } dev_dbg(phy->phy.dev, "min_vol:%d max_vol:%d\n", Loading @@ -260,15 +268,13 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) rc = regulator_enable(phy->vdd); if (rc) { dev_err(phy->phy.dev, "regulator_enable(phy->vdd) failed, ret=%d", rc); dev_err(phy->phy.dev, "Unable to enable %s\n", "vdd"); goto unconfig_vdd; } rc = regulator_set_load(phy->core_ldo, USB_SSPHY_HPM_LOAD); rc = regulator_set_load(phy->core_ldo, phy->core_max_uA); if (rc < 0) { dev_err(phy->phy.dev, "Unable to set HPM of core_ldo\n"); dev_err(phy->phy.dev, "Unable to set HPM of %s\n", "core_ldo"); goto disable_vdd; } Loading @@ -276,13 +282,14 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) phy->core_voltage_levels[CORE_LEVEL_MIN], phy->core_voltage_levels[CORE_LEVEL_MAX]); if (rc) { dev_err(phy->phy.dev, "unable to set voltage for core_ldo\n"); dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "core_ldo"); goto put_core_ldo_lpm; } rc = regulator_enable(phy->core_ldo); if (rc) { dev_err(phy->phy.dev, "Unable to enable core_ldo\n"); dev_err(phy->phy.dev, "Unable to enable %s\n", "core_ldo"); goto unset_core_ldo; } Loading @@ -291,31 +298,36 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) disable_regulators: rc = regulator_disable(phy->core_ldo); if (rc) dev_err(phy->phy.dev, "Unable to disable core_ldo\n"); dev_err(phy->phy.dev, "Unable to disable %s\n", "core_ldo"); unset_core_ldo: rc = regulator_set_voltage(phy->core_ldo, phy->core_voltage_levels[CORE_LEVEL_NONE], phy->core_voltage_levels[CORE_LEVEL_MAX]); if (rc) dev_err(phy->phy.dev, "unable to set voltage for core_ldo\n"); dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "core_ldo"); put_core_ldo_lpm: rc = regulator_set_load(phy->core_ldo, 0); if (rc < 0) dev_err(phy->phy.dev, "Unable to set LPM of core_ldo\n"); dev_err(phy->phy.dev, "Unable to set LPM of %s\n", "core_ldo"); disable_vdd: rc = regulator_disable(phy->vdd); if (rc) dev_err(phy->phy.dev, "regulator_disable(phy->vdd) failed, ret=%d", rc); dev_err(phy->phy.dev, "Unable to disable %s\n", "vdd"); unconfig_vdd: rc = regulator_set_voltage(phy->vdd, phy->vdd_levels[min], phy->vdd_levels[2]); if (rc) dev_err(phy->phy.dev, "unable to set voltage for ssusb vdd\n"); dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "vdd"); put_vdd_lpm: rc = regulator_set_load(phy->vdd, 0); if (rc < 0) dev_err(phy->phy.dev, "Unable to set LPM of %s\n", "vdd"); return rc < 0 ? rc : 0; } Loading Loading @@ -1109,6 +1121,10 @@ static int msm_ssphy_qmp_probe(struct platform_device *pdev) } } if (of_property_read_s32(dev->of_node, "qcom,core-max-load-uA", &phy->core_max_uA) || !phy->core_max_uA) phy->core_max_uA = USB_SSPHY_HPM_LOAD; if (of_get_property(dev->of_node, "qcom,vdd-voltage-level", &len) && len == sizeof(phy->vdd_levels)) { ret = of_property_read_u32_array(dev->of_node, Loading @@ -1125,6 +1141,10 @@ static int msm_ssphy_qmp_probe(struct platform_device *pdev) goto err; } if (of_property_read_s32(dev->of_node, "qcom,vdd-max-load-uA", &phy->vdd_max_uA) || !phy->vdd_max_uA) phy->vdd_max_uA = USB_SSPHY_HPM_LOAD; phy->vdd = devm_regulator_get(dev, "vdd"); if (IS_ERR(phy->vdd)) { dev_err(dev, "unable to get vdd supply\n"); Loading Loading
Documentation/devicetree/bindings/usb/qcom,msm-phy.txt +4 −0 Original line number Diff line number Diff line Loading @@ -110,8 +110,12 @@ Optional properties: - qcom,vbus-valid-override: If present, indicates VBUS pin is not connected to the USB PHY and the controller must rely on external VBUS notification in order to manually relay the notification to the SSPHY. - qcom,vdd-max-load-uA: If present, indicates the maximum current (in uA) the PHY is expected to draw from the vdd power supply. - qcom,core-voltage-level: This property must be a list of three integer values (no, min, max) where each value represents either a voltage in - qcom,core-max-load-uA: If present, indicates the maximum current (in uA) the PHY is expected to draw from the core power supply. microvolts or a value corresponding to voltage corner. - qcom,link-training-reset: This property indicates to start link training timer to reset the elastic buffer based on rx equalization value. Loading
drivers/usb/phy/phy-msm-ssusb-qmp.c +36 −16 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ enum core_ldo_levels { /* default CORE votlage and load values */ #define USB_SSPHY_1P2_VOL_MIN 1200000 /* uV */ #define USB_SSPHY_1P2_VOL_MAX 1200000 /* uV */ #define USB_SSPHY_HPM_LOAD 23000 /* uA */ #define USB_SSPHY_HPM_LOAD 30000 /* uA */ /* USB3PHY_PCIE_USB3_PCS_PCS_STATUS bit */ #define PHYSTATUS BIT(6) Loading Loading @@ -118,8 +118,10 @@ struct msm_ssphy_qmp { struct regulator *vdd; int vdd_levels[3]; /* none, low, high */ int vdd_max_uA; struct regulator *core_ldo; int core_voltage_levels[3]; int core_max_uA; struct clk *ref_clk_src; struct clk *ref_clk; struct clk *aux_clk; Loading Loading @@ -248,11 +250,17 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) if (!on) goto disable_regulators; rc = regulator_set_load(phy->vdd, phy->vdd_max_uA); if (rc < 0) { dev_err(phy->phy.dev, "Unable to set HPM of %s\n", "vdd"); return rc; } rc = regulator_set_voltage(phy->vdd, phy->vdd_levels[min], phy->vdd_levels[2]); if (rc) { dev_err(phy->phy.dev, "unable to set voltage for ssusb vdd\n"); return rc; dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "vdd"); goto put_vdd_lpm; } dev_dbg(phy->phy.dev, "min_vol:%d max_vol:%d\n", Loading @@ -260,15 +268,13 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) rc = regulator_enable(phy->vdd); if (rc) { dev_err(phy->phy.dev, "regulator_enable(phy->vdd) failed, ret=%d", rc); dev_err(phy->phy.dev, "Unable to enable %s\n", "vdd"); goto unconfig_vdd; } rc = regulator_set_load(phy->core_ldo, USB_SSPHY_HPM_LOAD); rc = regulator_set_load(phy->core_ldo, phy->core_max_uA); if (rc < 0) { dev_err(phy->phy.dev, "Unable to set HPM of core_ldo\n"); dev_err(phy->phy.dev, "Unable to set HPM of %s\n", "core_ldo"); goto disable_vdd; } Loading @@ -276,13 +282,14 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) phy->core_voltage_levels[CORE_LEVEL_MIN], phy->core_voltage_levels[CORE_LEVEL_MAX]); if (rc) { dev_err(phy->phy.dev, "unable to set voltage for core_ldo\n"); dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "core_ldo"); goto put_core_ldo_lpm; } rc = regulator_enable(phy->core_ldo); if (rc) { dev_err(phy->phy.dev, "Unable to enable core_ldo\n"); dev_err(phy->phy.dev, "Unable to enable %s\n", "core_ldo"); goto unset_core_ldo; } Loading @@ -291,31 +298,36 @@ static int msm_ssusb_qmp_ldo_enable(struct msm_ssphy_qmp *phy, int on) disable_regulators: rc = regulator_disable(phy->core_ldo); if (rc) dev_err(phy->phy.dev, "Unable to disable core_ldo\n"); dev_err(phy->phy.dev, "Unable to disable %s\n", "core_ldo"); unset_core_ldo: rc = regulator_set_voltage(phy->core_ldo, phy->core_voltage_levels[CORE_LEVEL_NONE], phy->core_voltage_levels[CORE_LEVEL_MAX]); if (rc) dev_err(phy->phy.dev, "unable to set voltage for core_ldo\n"); dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "core_ldo"); put_core_ldo_lpm: rc = regulator_set_load(phy->core_ldo, 0); if (rc < 0) dev_err(phy->phy.dev, "Unable to set LPM of core_ldo\n"); dev_err(phy->phy.dev, "Unable to set LPM of %s\n", "core_ldo"); disable_vdd: rc = regulator_disable(phy->vdd); if (rc) dev_err(phy->phy.dev, "regulator_disable(phy->vdd) failed, ret=%d", rc); dev_err(phy->phy.dev, "Unable to disable %s\n", "vdd"); unconfig_vdd: rc = regulator_set_voltage(phy->vdd, phy->vdd_levels[min], phy->vdd_levels[2]); if (rc) dev_err(phy->phy.dev, "unable to set voltage for ssusb vdd\n"); dev_err(phy->phy.dev, "Unable to set voltage for %s\n", "vdd"); put_vdd_lpm: rc = regulator_set_load(phy->vdd, 0); if (rc < 0) dev_err(phy->phy.dev, "Unable to set LPM of %s\n", "vdd"); return rc < 0 ? rc : 0; } Loading Loading @@ -1109,6 +1121,10 @@ static int msm_ssphy_qmp_probe(struct platform_device *pdev) } } if (of_property_read_s32(dev->of_node, "qcom,core-max-load-uA", &phy->core_max_uA) || !phy->core_max_uA) phy->core_max_uA = USB_SSPHY_HPM_LOAD; if (of_get_property(dev->of_node, "qcom,vdd-voltage-level", &len) && len == sizeof(phy->vdd_levels)) { ret = of_property_read_u32_array(dev->of_node, Loading @@ -1125,6 +1141,10 @@ static int msm_ssphy_qmp_probe(struct platform_device *pdev) goto err; } if (of_property_read_s32(dev->of_node, "qcom,vdd-max-load-uA", &phy->vdd_max_uA) || !phy->vdd_max_uA) phy->vdd_max_uA = USB_SSPHY_HPM_LOAD; phy->vdd = devm_regulator_get(dev, "vdd"); if (IS_ERR(phy->vdd)) { dev_err(dev, "unable to get vdd supply\n"); Loading