Ahbix clock is optional clock and not needed for all platforms.
Move it to lpass-apq8016/ipq806x as it is not needed for sc7180.

Signed-off-by: Rohit kumar <rohi...@codeaurora.org>
---
 sound/soc/qcom/lpass-apq8016.c | 27 ++++++++++++++++++++++++++
 sound/soc/qcom/lpass-cpu.c     | 40 ++++++++++-----------------------------
 sound/soc/qcom/lpass-ipq806x.c | 43 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 30 deletions(-)

diff --git a/sound/soc/qcom/lpass-apq8016.c b/sound/soc/qcom/lpass-apq8016.c
index 8210e37..fe4c258 100644
--- a/sound/soc/qcom/lpass-apq8016.c
+++ b/sound/soc/qcom/lpass-apq8016.c
@@ -185,7 +185,33 @@ static int apq8016_lpass_init(struct platform_device *pdev)
                return ret;
        }
 
+       drvdata->ahbix_clk = devm_clk_get(dev, "ahbix-clk");
+       if (IS_ERR(drvdata->ahbix_clk)) {
+               dev_err(dev, "error getting ahbix-clk: %ld\n",
+                               PTR_ERR(drvdata->ahbix_clk));
+               ret = PTR_ERR(drvdata->ahbix_clk);
+               goto err_ahbix_clk;
+       }
+
+       ret = clk_set_rate(drvdata->ahbix_clk, LPASS_AHBIX_CLOCK_FREQUENCY);
+       if (ret) {
+               dev_err(dev, "error setting rate on ahbix_clk: %d\n", ret);
+               goto err_ahbix_clk;
+       }
+       dev_dbg(dev, "set ahbix_clk rate to %lu\n",
+                       clk_get_rate(drvdata->ahbix_clk));
+
+       ret = clk_prepare_enable(drvdata->ahbix_clk);
+       if (ret) {
+               dev_err(dev, "error enabling ahbix_clk: %d\n", ret);
+               goto err_ahbix_clk;
+       }
+
        return 0;
+
+err_ahbix_clk:
+       clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks);
+       return ret;
 }
 
 static int apq8016_lpass_exit(struct platform_device *pdev)
@@ -193,6 +219,7 @@ static int apq8016_lpass_exit(struct platform_device *pdev)
        struct lpass_data *drvdata = platform_get_drvdata(pdev);
 
        clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks);
+       clk_disable_unprepare(drvdata->ahbix_clk);
 
        return 0;
 }
diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c
index e00a4af..f0c7e93 100644
--- a/sound/soc/qcom/lpass-cpu.c
+++ b/sound/soc/qcom/lpass-cpu.c
@@ -566,8 +566,13 @@ int asoc_qcom_lpass_cpu_platform_probe(struct 
platform_device *pdev)
                return PTR_ERR(drvdata->lpaif_map);
        }
 
-       if (variant->init)
-               variant->init(pdev);
+       if (variant->init) {
+               ret = variant->init(pdev);
+               if (ret) {
+                       dev_err(dev, "error initializing variant: %d\n", ret);
+                       return ret;
+               }
+       }
 
        for (i = 0; i < variant->num_dai; i++) {
                dai_id = variant->dai_driver[i].id;
@@ -594,46 +599,22 @@ int asoc_qcom_lpass_cpu_platform_probe(struct 
platform_device *pdev)
                }
        }
 
-       drvdata->ahbix_clk = devm_clk_get(dev, "ahbix-clk");
-       if (IS_ERR(drvdata->ahbix_clk)) {
-               dev_err(dev, "error getting ahbix-clk: %ld\n",
-                       PTR_ERR(drvdata->ahbix_clk));
-               return PTR_ERR(drvdata->ahbix_clk);
-       }
-
-       ret = clk_set_rate(drvdata->ahbix_clk, LPASS_AHBIX_CLOCK_FREQUENCY);
-       if (ret) {
-               dev_err(dev, "error setting rate on ahbix_clk: %d\n", ret);
-               return ret;
-       }
-       dev_dbg(dev, "set ahbix_clk rate to %lu\n",
-               clk_get_rate(drvdata->ahbix_clk));
-
-       ret = clk_prepare_enable(drvdata->ahbix_clk);
-       if (ret) {
-               dev_err(dev, "error enabling ahbix_clk: %d\n", ret);
-               return ret;
-       }
-
        ret = devm_snd_soc_register_component(dev,
                                              &lpass_cpu_comp_driver,
                                              variant->dai_driver,
                                              variant->num_dai);
        if (ret) {
                dev_err(dev, "error registering cpu driver: %d\n", ret);
-               goto err_clk;
+               goto err;
        }
 
        ret = asoc_qcom_lpass_platform_register(pdev);
        if (ret) {
                dev_err(dev, "error registering platform driver: %d\n", ret);
-               goto err_clk;
+               goto err;
        }
 
-       return 0;
-
-err_clk:
-       clk_disable_unprepare(drvdata->ahbix_clk);
+err:
        return ret;
 }
 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_probe);
@@ -645,7 +626,6 @@ int asoc_qcom_lpass_cpu_platform_remove(struct 
platform_device *pdev)
        if (drvdata->variant->exit)
                drvdata->variant->exit(pdev);
 
-       clk_disable_unprepare(drvdata->ahbix_clk);
 
        return 0;
 }
diff --git a/sound/soc/qcom/lpass-ipq806x.c b/sound/soc/qcom/lpass-ipq806x.c
index 1987605..b7c0586 100644
--- a/sound/soc/qcom/lpass-ipq806x.c
+++ b/sound/soc/qcom/lpass-ipq806x.c
@@ -55,6 +55,47 @@ static struct snd_soc_dai_driver 
ipq806x_lpass_cpu_dai_driver = {
        .ops    = &asoc_qcom_lpass_cpu_dai_ops,
 };
 
+static int ipq806x_lpass_init(struct platform_device *pdev)
+{
+       struct lpass_data *drvdata = platform_get_drvdata(pdev);
+       struct device *dev = &pdev->dev;
+       int ret;
+
+       drvdata->ahbix_clk = devm_clk_get(dev, "ahbix-clk");
+       if (IS_ERR(drvdata->ahbix_clk)) {
+               dev_err(dev, "error getting ahbix-clk: %ld\n",
+                               PTR_ERR(drvdata->ahbix_clk));
+               ret = PTR_ERR(drvdata->ahbix_clk);
+               goto err_ahbix_clk;
+       }
+
+       ret = clk_set_rate(drvdata->ahbix_clk, LPASS_AHBIX_CLOCK_FREQUENCY);
+       if (ret) {
+               dev_err(dev, "error setting rate on ahbix_clk: %d\n", ret);
+               goto err_ahbix_clk;
+       }
+       dev_dbg(dev, "set ahbix_clk rate to %lu\n",
+                       clk_get_rate(drvdata->ahbix_clk));
+
+       ret = clk_prepare_enable(drvdata->ahbix_clk);
+       if (ret) {
+               dev_err(dev, "error enabling ahbix_clk: %d\n", ret);
+               goto err_ahbix_clk;
+       }
+
+err_ahbix_clk:
+       return ret;
+}
+
+static int ipq806x_lpass_exit(struct platform_device *pdev)
+{
+       struct lpass_data *drvdata = platform_get_drvdata(pdev);
+
+       clk_disable_unprepare(drvdata->ahbix_clk);
+
+       return 0;
+}
+
 static int ipq806x_lpass_alloc_dma_channel(struct lpass_data *drvdata, int dir)
 {
        if (dir == SNDRV_PCM_STREAM_PLAYBACK)
@@ -90,6 +131,8 @@ static struct lpass_variant ipq806x_data = {
        .dai_bit_clk_names      = (const char *[]) {
                                "mi2s-bit-clk",
                                },
+       .init                   = ipq806x_lpass_init,
+       .exit                   = ipq806x_lpass_exit,
        .alloc_dma_channel      = ipq806x_lpass_alloc_dma_channel,
        .free_dma_channel       = ipq806x_lpass_free_dma_channel,
 };
-- 
Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc.,
is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.

Reply via email to