openwrt-owl/target/linux/ipq806x/patches-4.9/0072-ipq-scm-TZ-don-t-need-...

167 lines
4.7 KiB
Diff

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",