From f8c7f6105f325650b0bdd70765b244c5dbc83b4b Mon Sep 17 00:00:00 2001 From: Xingyu Wu Date: Thu, 8 Sep 2022 16:40:21 +0800 Subject: [PATCH] sound:starfive:spdif:Use extrenal mclk Use extrenal mclk_ext instead of mclk_inner. Signed-off-by: Xingyu Wu --- arch/riscv/boot/dts/starfive/jh7110-common.dtsi | 2 +- arch/riscv/boot/dts/starfive/jh7110.dtsi | 6 ++++-- sound/soc/starfive/starfive_spdif.c | 28 ++++++++++++------------- sound/soc/starfive/starfive_spdif.h | 2 ++ 4 files changed, 20 insertions(+), 18 deletions(-) mode change 100644 => 100755 arch/riscv/boot/dts/starfive/jh7110.dtsi diff --git a/arch/riscv/boot/dts/starfive/jh7110-common.dtsi b/arch/riscv/boot/dts/starfive/jh7110-common.dtsi index dcd0ffc..47ca5ea 100755 --- a/arch/riscv/boot/dts/starfive/jh7110-common.dtsi +++ b/arch/riscv/boot/dts/starfive/jh7110-common.dtsi @@ -430,7 +430,7 @@ &spdif0 { pinctrl-names = "default"; - pinctrl-0 = <&spdif0_pins>; + pinctrl-0 = <&spdif0_pins &mclk_ext_pins>; status = "disabled"; }; diff --git a/arch/riscv/boot/dts/starfive/jh7110.dtsi b/arch/riscv/boot/dts/starfive/jh7110.dtsi old mode 100644 new mode 100755 index 2519b04..2fdfac1 --- a/arch/riscv/boot/dts/starfive/jh7110.dtsi +++ b/arch/riscv/boot/dts/starfive/jh7110.dtsi @@ -1183,9 +1183,11 @@ 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>; diff --git a/sound/soc/starfive/starfive_spdif.c b/sound/soc/starfive/starfive_spdif.c index aff3de1..5d6be27 100755 --- a/sound/soc/starfive/starfive_spdif.c +++ b/sound/soc/starfive/starfive_spdif.c @@ -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"); diff --git a/sound/soc/starfive/starfive_spdif.h b/sound/soc/starfive/starfive_spdif.h index 2a86fde..bc1cc96 100755 --- a/sound/soc/starfive/starfive_spdif.h +++ b/sound/soc/starfive/starfive_spdif.h @@ -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; -- 2.7.4