Loading Documentation/devicetree/bindings/usb/msm-phy.txt +5 −1 Original line number Diff line number Diff line Loading @@ -91,6 +91,10 @@ Required properties: "vdd" : vdd supply for digital circuit operation "vdda18" : 1.8v high-voltage analog supply "vdda33" : 3.3v high-voltage analog supply - clocks: a list of phandles to the PHY clocks. Use as per Documentation/devicetree/bindings/clock/clock-bindings.txt - clock-names: Names of the clocks in 1-1 correspondence with the "clocks" property. "ref_clk_src" is a mandatory clock. - 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 Loading @@ -109,7 +113,7 @@ Optional properties: - clocks: a list of phandles to the PHY clocks. Use as per Documentation/devicetree/bindings/clock/clock-bindings.txt - clock-names: Names of the clocks in 1-1 correspondence with the "clocks" property. "cfg_ahb_clk", "ref_clk_src" and "ref_clk" are optional clocks. property. "cfg_ahb_clk" and "ref_clk" are optional clocks. - qcom,qusb-phy-init-seq: QUSB PHY initialization sequence with value,reg pair. - qcom,qusb-phy-host-init-seq: QUSB PHY initialization sequence for host mode with value,reg pair. Loading drivers/usb/phy/phy-msm-qusb-v2.c +32 −18 Original line number Diff line number Diff line /* * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -118,15 +118,23 @@ static void qusb_phy_enable_clocks(struct qusb_phy *qphy, bool on) if (!qphy->clocks_enabled && on) { clk_prepare_enable(qphy->ref_clk_src); if (qphy->ref_clk) clk_prepare_enable(qphy->ref_clk); if (qphy->cfg_ahb_clk) clk_prepare_enable(qphy->cfg_ahb_clk); qphy->clocks_enabled = true; } if (qphy->clocks_enabled && !on) { if (qphy->cfg_ahb_clk) clk_disable_unprepare(qphy->cfg_ahb_clk); if (qphy->ref_clk) clk_disable_unprepare(qphy->ref_clk); clk_disable_unprepare(qphy->ref_clk_src); clk_disable_unprepare(qphy->cfg_ahb_clk); qphy->clocks_enabled = false; } Loading Loading @@ -744,15 +752,28 @@ static int qusb_phy_probe(struct platform_device *pdev) } } /* ref_clk_src is needed irrespective of SE_CLK or DIFF_CLK usage */ qphy->ref_clk_src = devm_clk_get(dev, "ref_clk_src"); if (IS_ERR(qphy->ref_clk_src)) if (IS_ERR(qphy->ref_clk_src)) { dev_dbg(dev, "clk get failed for ref_clk_src\n"); ret = PTR_ERR(qphy->ref_clk_src); return ret; } /* ref_clk is needed only for DIFF_CLK case, hence make it optional. */ if (of_property_match_string(pdev->dev.of_node, "clock-names", "ref_clk") >= 0) { qphy->ref_clk = devm_clk_get(dev, "ref_clk"); if (IS_ERR(qphy->ref_clk)) dev_dbg(dev, "clk get failed for ref_clk\n"); else if (IS_ERR(qphy->ref_clk)) { ret = PTR_ERR(qphy->ref_clk); if (ret != -EPROBE_DEFER) dev_dbg(dev, "clk get failed for ref_clk\n"); return ret; } clk_set_rate(qphy->ref_clk, 19200000); } if (of_property_match_string(pdev->dev.of_node, "clock-names", "cfg_ahb_clk") >= 0) { Loading Loading @@ -933,14 +954,7 @@ static int qusb_phy_remove(struct platform_device *pdev) struct qusb_phy *qphy = platform_get_drvdata(pdev); usb_remove_phy(&qphy->phy); if (qphy->clocks_enabled) { clk_disable_unprepare(qphy->cfg_ahb_clk); clk_disable_unprepare(qphy->ref_clk); clk_disable_unprepare(qphy->ref_clk_src); qphy->clocks_enabled = false; } qusb_phy_enable_clocks(qphy, false); qusb_phy_enable_power(qphy, false, true); return 0; Loading Loading
Documentation/devicetree/bindings/usb/msm-phy.txt +5 −1 Original line number Diff line number Diff line Loading @@ -91,6 +91,10 @@ Required properties: "vdd" : vdd supply for digital circuit operation "vdda18" : 1.8v high-voltage analog supply "vdda33" : 3.3v high-voltage analog supply - clocks: a list of phandles to the PHY clocks. Use as per Documentation/devicetree/bindings/clock/clock-bindings.txt - clock-names: Names of the clocks in 1-1 correspondence with the "clocks" property. "ref_clk_src" is a mandatory clock. - 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 Loading @@ -109,7 +113,7 @@ Optional properties: - clocks: a list of phandles to the PHY clocks. Use as per Documentation/devicetree/bindings/clock/clock-bindings.txt - clock-names: Names of the clocks in 1-1 correspondence with the "clocks" property. "cfg_ahb_clk", "ref_clk_src" and "ref_clk" are optional clocks. property. "cfg_ahb_clk" and "ref_clk" are optional clocks. - qcom,qusb-phy-init-seq: QUSB PHY initialization sequence with value,reg pair. - qcom,qusb-phy-host-init-seq: QUSB PHY initialization sequence for host mode with value,reg pair. Loading
drivers/usb/phy/phy-msm-qusb-v2.c +32 −18 Original line number Diff line number Diff line /* * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -118,15 +118,23 @@ static void qusb_phy_enable_clocks(struct qusb_phy *qphy, bool on) if (!qphy->clocks_enabled && on) { clk_prepare_enable(qphy->ref_clk_src); if (qphy->ref_clk) clk_prepare_enable(qphy->ref_clk); if (qphy->cfg_ahb_clk) clk_prepare_enable(qphy->cfg_ahb_clk); qphy->clocks_enabled = true; } if (qphy->clocks_enabled && !on) { if (qphy->cfg_ahb_clk) clk_disable_unprepare(qphy->cfg_ahb_clk); if (qphy->ref_clk) clk_disable_unprepare(qphy->ref_clk); clk_disable_unprepare(qphy->ref_clk_src); clk_disable_unprepare(qphy->cfg_ahb_clk); qphy->clocks_enabled = false; } Loading Loading @@ -744,15 +752,28 @@ static int qusb_phy_probe(struct platform_device *pdev) } } /* ref_clk_src is needed irrespective of SE_CLK or DIFF_CLK usage */ qphy->ref_clk_src = devm_clk_get(dev, "ref_clk_src"); if (IS_ERR(qphy->ref_clk_src)) if (IS_ERR(qphy->ref_clk_src)) { dev_dbg(dev, "clk get failed for ref_clk_src\n"); ret = PTR_ERR(qphy->ref_clk_src); return ret; } /* ref_clk is needed only for DIFF_CLK case, hence make it optional. */ if (of_property_match_string(pdev->dev.of_node, "clock-names", "ref_clk") >= 0) { qphy->ref_clk = devm_clk_get(dev, "ref_clk"); if (IS_ERR(qphy->ref_clk)) dev_dbg(dev, "clk get failed for ref_clk\n"); else if (IS_ERR(qphy->ref_clk)) { ret = PTR_ERR(qphy->ref_clk); if (ret != -EPROBE_DEFER) dev_dbg(dev, "clk get failed for ref_clk\n"); return ret; } clk_set_rate(qphy->ref_clk, 19200000); } if (of_property_match_string(pdev->dev.of_node, "clock-names", "cfg_ahb_clk") >= 0) { Loading Loading @@ -933,14 +954,7 @@ static int qusb_phy_remove(struct platform_device *pdev) struct qusb_phy *qphy = platform_get_drvdata(pdev); usb_remove_phy(&qphy->phy); if (qphy->clocks_enabled) { clk_disable_unprepare(qphy->cfg_ahb_clk); clk_disable_unprepare(qphy->ref_clk); clk_disable_unprepare(qphy->ref_clk_src); qphy->clocks_enabled = false; } qusb_phy_enable_clocks(qphy, false); qusb_phy_enable_power(qphy, false, true); return 0; Loading