]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
firmware: qcom: scm: Remove core, iface and bus clocks dependency
authorspjoshi@codeaurora.org <spjoshi@codeaurora.org>
Wed, 16 Nov 2016 01:19:24 +0000 (17:19 -0800)
committerAndy Gross <andy.gross@linaro.org>
Wed, 23 Nov 2016 17:02:51 +0000 (11:02 -0600)
Core, iface and bus clocks are not required to be voted from SCM
driver for some of the Qualcomm chipsets. Remove dependency on
these clocks from driver.

Suggested-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Sarangdhar Joshi <spjoshi@codeaurora.org>
Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Andy Gross <andy.gross@linaro.org>
drivers/firmware/qcom_scm.c

index 9bf66aefdbd08b286535c7926c1ffb6bcab8b57f..7a104d31ef0f682319175cb047b4f1eaf3d5cc44 100644 (file)
 
 #include "qcom_scm.h"
 
+#define SCM_HAS_CORE_CLK       BIT(0)
+#define SCM_HAS_IFACE_CLK      BIT(1)
+#define SCM_HAS_BUS_CLK                BIT(2)
+
 struct qcom_scm {
        struct device *dev;
        struct clk *core_clk;
@@ -323,32 +327,40 @@ EXPORT_SYMBOL(qcom_scm_is_available);
 static int qcom_scm_probe(struct platform_device *pdev)
 {
        struct qcom_scm *scm;
+       unsigned long clks;
        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);
+       clks = (unsigned long)of_device_get_match_data(&pdev->dev);
+       if (clks & SCM_HAS_CORE_CLK) {
+               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;
+                       scm->core_clk = NULL;
+               }
        }
 
-       if (of_device_is_compatible(pdev->dev.of_node, "qcom,scm")) {
+       if (clks & SCM_HAS_IFACE_CLK) {
                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");
+                               dev_err(&pdev->dev,
+                                       "failed to acquire iface clk\n");
                        return PTR_ERR(scm->iface_clk);
                }
+       }
 
+       if (clks & SCM_HAS_BUS_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");
+                               dev_err(&pdev->dev,
+                                       "failed to acquire bus clk\n");
                        return PTR_ERR(scm->bus_clk);
                }
        }
@@ -374,10 +386,23 @@ static int qcom_scm_probe(struct platform_device *pdev)
 }
 
 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",},
+       { .compatible = "qcom,scm-apq8064",
+         .data = (void *) SCM_HAS_CORE_CLK,
+       },
+       { .compatible = "qcom,scm-msm8660",
+         .data = (void *) SCM_HAS_CORE_CLK,
+       },
+       { .compatible = "qcom,scm-msm8960",
+         .data = (void *) SCM_HAS_CORE_CLK,
+       },
+       { .compatible = "qcom,scm-msm8996",
+         .data = NULL, /* no clocks */
+       },
+       { .compatible = "qcom,scm",
+         .data = (void *)(SCM_HAS_CORE_CLK
+                          | SCM_HAS_IFACE_CLK
+                          | SCM_HAS_BUS_CLK),
+       },
        {}
 };