diff options
-rw-r--r-- | target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064.dtsi | 5 | ||||
-rw-r--r-- | target/linux/ipq806x/patches-4.9/0072-ipq-scm-TZ-don-t-need-clock-to-be-enabled-disabled-for-ipq.patch | 166 |
2 files changed, 167 insertions, 4 deletions
diff --git a/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064.dtsi b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064.dtsi index 4fc9f9f0fe..3893f45637 100644 --- a/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064.dtsi +++ b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064.dtsi @@ -206,10 +206,7 @@ firmware { scm { - compatible = "qcom,scm-apq8064"; - - clocks = <&rpmcc RPM_DAYTONA_FABRIC_CLK>; - clock-names = "core"; + compatible = "qcom,scm-ipq806x"; }; }; diff --git a/target/linux/ipq806x/patches-4.9/0072-ipq-scm-TZ-don-t-need-clock-to-be-enabled-disabled-for-ipq.patch b/target/linux/ipq806x/patches-4.9/0072-ipq-scm-TZ-don-t-need-clock-to-be-enabled-disabled-for-ipq.patch new file mode 100644 index 0000000000..4f0e544ab6 --- /dev/null +++ b/target/linux/ipq806x/patches-4.9/0072-ipq-scm-TZ-don-t-need-clock-to-be-enabled-disabled-for-ipq.patch @@ -0,0 +1,166 @@ +From 0fb08a02baf5114fd3bdbc5aa92d6a6cd6d5ef3f Mon Sep 17 00:00:00 2001 +From: Manoharan Vijaya Raghavan <mraghava@codeaurora.org> +Date: Tue, 24 Jan 2017 20:58:46 +0530 +Subject: ipq: scm: TZ don't need clock to be enabled/disabled for ipq + +When SCM was made as a platform driver, clock management was +addedfor firmware calls. This is not required for IPQ. + +Change-Id: I3d29fafe0266e51f708f2718bab03907078b0f4d +Signed-off-by: Manoharan Vijaya Raghavan <mraghava@codeaurora.org> +--- + drivers/firmware/qcom_scm.c | 87 +++++++++++++++++++++++++++++---------------- + 1 file changed, 57 insertions(+), 30 deletions(-) + +(limited to 'drivers/firmware/qcom_scm.c') + +--- a/drivers/firmware/qcom_scm.c ++++ b/drivers/firmware/qcom_scm.c +@@ -28,12 +28,15 @@ + + #include "qcom_scm.h" + ++#define SCM_NOCLK 1 ++ + struct qcom_scm { + struct device *dev; + struct clk *core_clk; + struct clk *iface_clk; + struct clk *bus_clk; + struct reset_controller_dev reset; ++ int is_clkdisabled; + }; + + static struct qcom_scm *__scm; +@@ -42,6 +45,9 @@ static int qcom_scm_clk_enable(void) + { + int ret; + ++ if (__scm->is_clkdisabled) ++ return 0; ++ + ret = clk_prepare_enable(__scm->core_clk); + if (ret) + goto bail; +@@ -66,6 +72,9 @@ bail: + + static void qcom_scm_clk_disable(void) + { ++ if (__scm->is_clkdisabled) ++ return; ++ + clk_disable_unprepare(__scm->core_clk); + clk_disable_unprepare(__scm->iface_clk); + clk_disable_unprepare(__scm->bus_clk); +@@ -320,37 +329,61 @@ bool qcom_scm_is_available(void) + } + EXPORT_SYMBOL(qcom_scm_is_available); + ++static const struct of_device_id qcom_scm_dt_match[] = { ++ { .compatible = "qcom,scm-apq8064",}, ++ { .compatible = "qcom,scm-msm8660",}, ++ { .compatible = "qcom,scm-msm8960",}, ++ { .compatible = "qcom,scm-ipq807x", .data = (void *)SCM_NOCLK }, ++ { .compatible = "qcom,scm-ipq806x", .data = (void *)SCM_NOCLK }, ++ { .compatible = "qcom,scm-ipq40xx", .data = (void *)SCM_NOCLK }, ++ { .compatible = "qcom,scm-msm8960",}, ++ { .compatible = "qcom,scm-msm8960",}, ++ { .compatible = "qcom,scm",}, ++ {} ++}; ++ + static int qcom_scm_probe(struct platform_device *pdev) + { + struct qcom_scm *scm; ++ const struct of_device_id *id; + int ret; + + scm = devm_kzalloc(&pdev->dev, sizeof(*scm), GFP_KERNEL); + if (!scm) + return -ENOMEM; + +- scm->core_clk = devm_clk_get(&pdev->dev, "core"); +- if (IS_ERR(scm->core_clk)) { +- if (PTR_ERR(scm->core_clk) == -EPROBE_DEFER) +- return PTR_ERR(scm->core_clk); ++ id = of_match_device(qcom_scm_dt_match, &pdev->dev); ++ if (id) ++ scm->is_clkdisabled = (unsigned int)id->data; ++ else ++ scm->is_clkdisabled = 0; ++ ++ if (!(scm->is_clkdisabled)) { ++ ++ scm->core_clk = devm_clk_get(&pdev->dev, "core"); ++ if (IS_ERR(scm->core_clk)) { ++ if (PTR_ERR(scm->core_clk) == -EPROBE_DEFER) ++ return PTR_ERR(scm->core_clk); + +- scm->core_clk = NULL; +- } +- +- if (of_device_is_compatible(pdev->dev.of_node, "qcom,scm")) { +- scm->iface_clk = devm_clk_get(&pdev->dev, "iface"); +- if (IS_ERR(scm->iface_clk)) { +- if (PTR_ERR(scm->iface_clk) != -EPROBE_DEFER) +- dev_err(&pdev->dev, "failed to acquire iface clk\n"); +- return PTR_ERR(scm->iface_clk); ++ scm->core_clk = NULL; + } + +- scm->bus_clk = devm_clk_get(&pdev->dev, "bus"); +- if (IS_ERR(scm->bus_clk)) { +- if (PTR_ERR(scm->bus_clk) != -EPROBE_DEFER) +- dev_err(&pdev->dev, "failed to acquire bus clk\n"); +- return PTR_ERR(scm->bus_clk); ++ if (of_device_is_compatible(pdev->dev.of_node, "qcom,scm")) { ++ scm->iface_clk = devm_clk_get(&pdev->dev, "iface"); ++ if (IS_ERR(scm->iface_clk)) { ++ if (PTR_ERR(scm->iface_clk) != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "failed to acquire iface clk\n"); ++ return PTR_ERR(scm->iface_clk); ++ } ++ ++ scm->bus_clk = devm_clk_get(&pdev->dev, "bus"); ++ if (IS_ERR(scm->bus_clk)) { ++ if (PTR_ERR(scm->bus_clk) != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "failed to acquire bus clk\n"); ++ return PTR_ERR(scm->bus_clk); ++ } + } ++ + } + + scm->reset.ops = &qcom_scm_pas_reset_ops; +@@ -358,10 +391,12 @@ static int qcom_scm_probe(struct platfor + scm->reset.of_node = pdev->dev.of_node; + reset_controller_register(&scm->reset); + +- /* vote for max clk rate for highest performance */ +- ret = clk_set_rate(scm->core_clk, INT_MAX); +- if (ret) +- return ret; ++ if (!(scm->is_clkdisabled)) { ++ /* vote for max clk rate for highest performance */ ++ ret = clk_set_rate(scm->core_clk, INT_MAX); ++ if (ret) ++ return ret; ++ } + + __scm = scm; + __scm->dev = &pdev->dev; +@@ -371,14 +406,6 @@ static int qcom_scm_probe(struct platfor + return 0; + } + +-static const struct of_device_id qcom_scm_dt_match[] = { +- { .compatible = "qcom,scm-apq8064",}, +- { .compatible = "qcom,scm-msm8660",}, +- { .compatible = "qcom,scm-msm8960",}, +- { .compatible = "qcom,scm",}, +- {} +-}; +- + static struct platform_driver qcom_scm_driver = { + .driver = { + .name = "qcom_scm", |