sound:starfive:spdif:Use extrenal mclk
authorXingyu Wu <xingyu.wu@starfivetech.com>
Thu, 8 Sep 2022 08:40:21 +0000 (16:40 +0800)
committerXingyu Wu <xingyu.wu@starfivetech.com>
Thu, 15 Sep 2022 08:37:15 +0000 (16:37 +0800)
Use extrenal mclk_ext instead of mclk_inner.

Signed-off-by: Xingyu Wu <xingyu.wu@starfivetech.com>
arch/riscv/boot/dts/starfive/jh7110-common.dtsi
arch/riscv/boot/dts/starfive/jh7110.dtsi [changed mode: 0644->0755]
sound/soc/starfive/starfive_spdif.c
sound/soc/starfive/starfive_spdif.h

index dcd0ffc..47ca5ea 100755 (executable)
 
 &spdif0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&spdif0_pins>;
+       pinctrl-0 = <&spdif0_pins &mclk_ext_pins>;
        status = "disabled";
 };
 
old mode 100644 (file)
new mode 100755 (executable)
index 2519b04..2fdfac1
                        clocks = <&clkgen JH7110_SPDIF_CLK_APB>,
                                 <&clkgen JH7110_SPDIF_CLK_CORE>,
                                 <&clkgen JH7110_AUDIO_ROOT>,
-                                <&clkgen JH7110_MCLK_INNER>;
+                                <&clkgen JH7110_MCLK_INNER>,
+                                <&mclk_ext>, <&clkgen JH7110_MCLK>;
                        clock-names = "spdif-apb", "spdif-core",
-                                     "audroot", "mclk_inner";
+                                     "audroot", "mclk_inner",
+                                     "mclk_ext", "mclk";
                        resets = <&rstgen RSTN_U0_CDNS_SPDIF_APB>;
                        reset-names = "rst_apb";
                        interrupts = <84>;
index aff3de1..5d6be27 100755 (executable)
@@ -194,22 +194,9 @@ static int sf_spdif_hw_params(struct snd_pcm_substream *substream,
                return -EINVAL;
        }
 
-       ret = clk_set_rate(spdif->audio_root, audio_root);
-       if (ret) {
-               dev_err(dai->dev, "failed to set audio_root rate :%d\n", ret);
-               return ret;
-       }
-       dev_dbg(dai->dev, "audio_root get rate:%ld\n",
-                       clk_get_rate(spdif->audio_root));
-
-       ret = clk_set_rate(spdif->mclk_inner, mclk);
-       if (ret) {
-               dev_err(dai->dev, "failed to set mclk_inner rate :%d\n", ret);
-               return ret;
-       }
+       mclk = clk_get_rate(spdif->mclk_ext);
+       dev_dbg(dai->dev, "mclk_ext get rate:%d\n", mclk);
 
-       mclk = clk_get_rate(spdif->mclk_inner);
-       dev_dbg(dai->dev, "mclk_inner get rate:%d\n", mclk);
        /* (FCLK)4096000/128=32000 */
        tsamplerate = (mclk / 128 + rate / 2) / rate - 1;
        if (tsamplerate < 3)
@@ -229,6 +216,8 @@ static int sf_spdif_clks_get(struct platform_device *pdev,
                { .id = "spdif-core" },
                { .id = "audroot" },
                { .id = "mclk_inner"},
+               { .id = "mclk_ext"},
+               { .id = "mclk"},
        };
        int ret = devm_clk_bulk_get(&pdev->dev, ARRAY_SIZE(clks), clks);
 
@@ -236,6 +225,9 @@ static int sf_spdif_clks_get(struct platform_device *pdev,
        spdif->spdif_core = clks[1].clk;
        spdif->audio_root = clks[2].clk;
        spdif->mclk_inner = clks[3].clk;
+       spdif->mclk_ext = clks[4].clk;
+       spdif->mclk = clks[5].clk;
+
        return ret;
 }
 
@@ -287,6 +279,12 @@ static int sf_spdif_clk_init(struct platform_device *pdev,
        dev_dbg(&pdev->dev, "spdif->spdif_apb = %lu\n", clk_get_rate(spdif->spdif_apb));
        dev_dbg(&pdev->dev, "spdif->spdif_core = %lu\n", clk_get_rate(spdif->spdif_core));
 
+       ret = clk_set_parent(spdif->mclk, spdif->mclk_ext);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to set parent for mclk to mclk_ext ret=%d\n", ret);
+               goto disable_core_clk;
+       }
+
        ret = reset_control_deassert(spdif->rst_apb);
        if (ret) {
                dev_err(&pdev->dev, "failed to deassert apb\n");
index 2a86fde..bc1cc96 100755 (executable)
@@ -153,6 +153,8 @@ struct sf_spdif_dev {
        struct clk *spdif_core;
        struct clk *audio_root;
        struct clk *mclk_inner;
+       struct clk *mclk;
+       struct clk *mclk_ext;
        struct reset_control *rst_apb;
 
        struct snd_dmaengine_dai_dma_data dma_data;