From 6040daab70d5cb5bc2f69155ff3fd4432c984efa Mon Sep 17 00:00:00 2001 From: Shuai Li Date: Tue, 19 Sep 2017 20:56:11 +0800 Subject: [PATCH] audio: enable continuous clks PD#150879: if continuous-clock is configed, the audio clock don't gate off when there is audio stream. Also, this commit could simply set the same MPLL source to make PDM-in and TDM-out work synchronously. Change-Id: Iac488b4d4813f758f0bc1ebd8bb5f35f9a8dfff1 Signed-off-by: Shuai Li --- arch/arm64/boot/dts/amlogic/axg_a113d_skt.dts | 40 ++++--- arch/arm64/boot/dts/amlogic/axg_a113x_skt.dts | 40 ++++--- arch/arm64/boot/dts/amlogic/axg_s400.dts | 41 ++++--- arch/arm64/boot/dts/amlogic/axg_s400_v03.dts | 41 ++++--- arch/arm64/boot/dts/amlogic/axg_s420.dts | 38 +++--- arch/arm64/boot/dts/amlogic/axg_s420_128m.dts | 38 +++--- arch/arm64/boot/dts/amlogic/axg_s420_v03.dts | 35 +++--- sound/soc/amlogic/auge/card.c | 49 ++++---- sound/soc/amlogic/auge/card_utils.c | 24 ++-- sound/soc/amlogic/auge/pdm.c | 35 +++--- sound/soc/amlogic/auge/pdm.h | 1 + sound/soc/amlogic/auge/pdm_hw.c | 2 +- sound/soc/amlogic/auge/tdm.c | 108 ++++++------------ 13 files changed, 259 insertions(+), 233 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/axg_a113d_skt.dts b/arch/arm64/boot/dts/amlogic/axg_a113d_skt.dts index 2cc5e3830400..9f0d059145e1 100644 --- a/arch/arm64/boot/dts/amlogic/axg_a113d_skt.dts +++ b/arch/arm64/boot/dts/amlogic/axg_a113d_skt.dts @@ -426,12 +426,11 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; //bitclock-master = <&tdmacodec>; @@ -454,7 +453,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; //bitclock-master = <&aml_tdmb>; @@ -475,7 +474,7 @@ aml-audio-card,dai-link@2 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; //bitclock-master = <&aml_tdmc>; @@ -494,7 +493,7 @@ }; aml-audio-card,dai-link@3 { - mclk-fs = <256>; + mclk-fs = <64>; cpu { sound-dai = <&aml_pdm>; }; @@ -507,6 +506,7 @@ mclk-fs = <128>; cpu { sound-dai = <&aml_spdif>; + system-clock-frequency = <6144000>; }; codec { sound-dai = <&dummy_codec>; @@ -762,10 +762,9 @@ #sound-dai-cells = <0>; dai-tdm-lane-slot-mask = <1>; dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_a &tdmin_a>; }; @@ -775,8 +774,9 @@ #sound-dai-cells = <0>; dai-tdm-lane-slot-mask = <1 1 1 1>; dai-tdm-clk-sel = <1>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b>; }; @@ -787,8 +787,9 @@ dai-tdm-lane-slot-mask-in = <0 1 0 0>; dai-tdm-lane-slot-mask-out = <1 0 1 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c>;// &tdmin_c>; }; @@ -816,10 +817,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/arch/arm64/boot/dts/amlogic/axg_a113x_skt.dts b/arch/arm64/boot/dts/amlogic/axg_a113x_skt.dts index 3f7bb3883860..9d60b133cf0f 100644 --- a/arch/arm64/boot/dts/amlogic/axg_a113x_skt.dts +++ b/arch/arm64/boot/dts/amlogic/axg_a113x_skt.dts @@ -342,12 +342,11 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 - continuous-clock; + //continuous-clock; bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdma>; @@ -358,6 +357,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&dummy_codec &dummy_codec>; @@ -367,7 +367,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdmb>; @@ -378,6 +378,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&tas5707_36 &tlv320adc3101_32>; @@ -387,7 +388,7 @@ aml-audio-card,dai-link@2 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; /* tdmb clk using tdmc so no bclk-inv */ //bitclock-inversion; //frame-inversion; @@ -399,6 +400,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&dummy_codec>; @@ -761,10 +763,9 @@ dai-tdm-lane-slot-mask = <1 1 1 1>; /* select tdm lr/bclk src, see aml_axg_tdm.c */ dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmin_a &tdmout_a>; }; @@ -775,8 +776,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; }; @@ -787,8 +789,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; @@ -817,10 +820,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/arch/arm64/boot/dts/amlogic/axg_s400.dts b/arch/arm64/boot/dts/amlogic/axg_s400.dts index 358b342ff531..6c15054b0965 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400.dts @@ -463,14 +463,13 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; //bitclock-master = <&tdmacodec>; @@ -483,6 +482,7 @@ <1 1 1 1 1 1 1 1>; dai-tdm-slot-num = <8>; dai-tdm-slot-width = <32>; + system-clock-frequency = <24576000>; }; tdmacodec: codec { sound-dai = <&dummy_codec &dummy_codec>; @@ -492,7 +492,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdmb>; @@ -503,6 +503,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { /* @@ -531,6 +532,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { prefix-names = "5707_A", "5707_B"; @@ -540,7 +542,7 @@ }; aml-audio-card,dai-link@3 { - mclk-fs = <256>; + mclk-fs = <64>; cpu { sound-dai = <&aml_pdm>; }; @@ -553,6 +555,7 @@ mclk-fs = <128>; cpu { sound-dai = <&aml_spdif>; + system-clock-frequency = <6144000>; }; codec { sound-dai = <&dummy_codec>; @@ -934,10 +937,9 @@ dai-tdm-lane-slot-mask-in = <1 0>; dai-tdm-lane-slot-mask-out = <0 1>; dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_a &tdmin_a &tdmout_a_data>; }; @@ -947,8 +949,9 @@ #sound-dai-cells = <0>; dai-tdm-lane-slot-mask-in = <1 1 1 1>; dai-tdm-clk-sel = <1>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; }; @@ -959,8 +962,9 @@ dai-tdm-lane-slot-mask-in = <0 1 0 0>; dai-tdm-lane-slot-mask-out = <1 0 1 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; @@ -988,10 +992,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts b/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts index db41bb164391..3dbc9a98777d 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts @@ -463,14 +463,13 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; //bitclock-master = <&tdmacodec>; @@ -483,6 +482,7 @@ <1 1 1 1 1 1 1 1>; dai-tdm-slot-num = <8>; dai-tdm-slot-width = <32>; + system-clock-frequency = <24576000>; }; tdmacodec: codec { sound-dai = <&dummy_codec &dummy_codec>; @@ -492,7 +492,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdmb>; @@ -503,6 +503,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { /* @@ -520,7 +521,7 @@ aml-audio-card,dai-link@2 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; //bitclock-master = <&aml_tdmc>; @@ -531,6 +532,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { prefix-names = "5707_A", "5707_B"; @@ -553,6 +555,7 @@ mclk-fs = <128>; cpu { sound-dai = <&aml_spdif>; + system-clock-frequency = <6144000>; }; codec { sound-dai = <&dummy_codec>; @@ -935,10 +938,9 @@ dai-tdm-lane-slot-mask-in = <1 0>; dai-tdm-lane-slot-mask-out = <0 1>; dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_a &tdmin_a &tdmout_a_data>; }; @@ -949,8 +951,9 @@ /*dai-tdm-lane-slot-mask-in = <1 1 1 1>;*/ dai-tdm-lane-slot-mask-in = <0 0 0 1>; dai-tdm-clk-sel = <1>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; }; @@ -961,8 +964,9 @@ dai-tdm-lane-slot-mask-in = <0 1 0 0>; dai-tdm-lane-slot-mask-out = <0 0 1 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; @@ -990,10 +994,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/arch/arm64/boot/dts/amlogic/axg_s420.dts b/arch/arm64/boot/dts/amlogic/axg_s420.dts index dea777b3e1c5..41418dc1f85c 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420.dts @@ -342,14 +342,13 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 - continuous-clock; + //continuous-clock; bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdma>; @@ -360,6 +359,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&dummy_codec &dummy_codec>; @@ -369,7 +369,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdmb>; @@ -380,6 +380,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&tas5707_36 &tlv320adc3101_32>; @@ -401,6 +402,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&dummy_codec>; @@ -765,10 +767,9 @@ dai-tdm-lane-slot-mask-in = <1 0>; dai-tdm-lane-slot-mask-out = <0 1>; dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmin_a &tdmout_a &tdmout_a_data>; }; @@ -779,8 +780,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; }; @@ -791,8 +793,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; @@ -823,10 +826,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts b/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts index cee60f9d7c52..868c48a299f4 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts @@ -340,14 +340,13 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 - continuous-clock; + //continuous-clock; bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdma>; @@ -358,6 +357,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&dummy_codec &dummy_codec>; @@ -367,7 +367,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdmb>; @@ -378,6 +378,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&tlv320adc3101_32>; @@ -400,6 +401,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&tas5707_36 &dummy_codec>; @@ -765,10 +767,9 @@ dai-tdm-lane-slot-mask-out = <0 1>; /* select tdm lr/bclk src, see aml_axg_tdm.c */ dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmin_a &tdmout_a &tdmout_a_data>; }; @@ -779,8 +780,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <1>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; }; @@ -791,8 +793,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; @@ -821,10 +824,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts b/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts index 8594dba11ce0..540e8e5dc636 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts @@ -342,7 +342,6 @@ meson_sound { compatible = "amlogic, sound-card"; aml-audio-card,name = "AML-AXGSOUND"; - //aml-audio-card,mclk-fs = <256>; aml-audio-card,loopback = <&aml_loopback>; @@ -360,6 +359,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&dummy_codec &dummy_codec>; @@ -369,7 +369,7 @@ aml-audio-card,dai-link@1 { format = "i2s"; mclk-fs = <256>; - continuous-clock; + //continuous-clock; //bitclock-inversion; //frame-inversion; bitclock-master = <&aml_tdmb>; @@ -402,6 +402,7 @@ dai-tdm-slot-rx-mask = <1 1>; dai-tdm-slot-num = <2>; dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; }; codec { sound-dai = <&tas5707_36 &dummy_codec>; @@ -767,10 +768,9 @@ dai-tdm-lane-slot-mask-out = <0 1>; /* select tdm lr/bclk src, see aml_axg_tdm.c */ dai-tdm-clk-sel = <0>; - clocks = <&clkc CLKID_MPLL0>; - //&clkaudio CLKID_AUDIO_TDMOUTA - //&clkaudio CLKID_AUDIO_MCLK_A>; - clock-names = "mpll0", "gate", "mclk"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_A + &clkc CLKID_MPLL0>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmin_a &tdmout_a &tdmout_a_data>; }; @@ -781,8 +781,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <1>; - clocks = <&clkc CLKID_MPLL1>; - clock-names = "mpll1"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; }; @@ -793,8 +794,9 @@ dai-tdm-lane-slot-mask-out = <1 0>; dai-tdm-lane-slot-mask-in = <0 1>; dai-tdm-clk-sel = <2>; - clocks = <&clkc CLKID_MPLL2>; - clock-names = "mpll2"; + clocks = <&clkaudio CLKID_AUDIO_MCLK_C + &clkc CLKID_MPLL2>; + clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; @@ -825,10 +827,15 @@ compatible = "amlogic, snd-pdm"; #sound-dai-cells = <0>; clocks = <&clkaudio CLKID_AUDIO_PDM - &clkc CLKID_MPLL3 - &clkaudio CLKID_AUDIO_PDMIN0 - &clkaudio CLKID_AUDIO_PDMIN1>; - clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk"; + &clkc CLKID_FCLK_DIV4 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "src_sysclk", + "src_dclk", + "pdm_dclk", + "pdm_sysclk"; pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; filter_mode = <1>; /* mode 0~4, defalut:1 */ diff --git a/sound/soc/amlogic/auge/card.c b/sound/soc/amlogic/auge/card.c index 6af38e975aae..754d08f0b75c 100644 --- a/sound/soc/amlogic/auge/card.c +++ b/sound/soc/amlogic/auge/card.c @@ -171,8 +171,6 @@ static int aml_card_hw_params(struct snd_pcm_substream *substream, mclk_fs = dai_props->mclk_fs; if (mclk_fs) { - struct aml_dai *aml_codec_dai = &dai_props->codec_dai; - struct aml_dai *aml_cpu_dai = &dai_props->cpu_dai; mclk = params_rate(params) * mclk_fs; for (i = 0; i < rtd->num_codecs; i++) { @@ -183,15 +181,6 @@ static int aml_card_hw_params(struct snd_pcm_substream *substream, if (ret && ret != -ENOTSUPP) goto err; - ret = snd_soc_dai_set_tdm_slot(codec_dai, - aml_codec_dai->tx_slot_mask, - aml_codec_dai->rx_slot_mask, - aml_codec_dai->slots, - aml_codec_dai->slot_width); - if (ret && ret != -ENOTSUPP) { - pr_err("aml-card: set_tdm_slot error\n"); - goto err; - } } ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk, @@ -202,16 +191,6 @@ static int aml_card_hw_params(struct snd_pcm_substream *substream, ret = snd_soc_dai_set_fmt(cpu_dai, dai_link->dai_fmt); if (ret && ret != -ENOTSUPP) goto err; - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, - aml_cpu_dai->tx_slot_mask, - aml_cpu_dai->rx_slot_mask, - aml_cpu_dai->slots, - aml_cpu_dai->slot_width); - if (ret && ret != -ENOTSUPP) { - pr_err("aml-card: set_tdm_slot error\n"); - goto err; - } } return 0; err: @@ -239,7 +218,24 @@ static struct snd_soc_ops aml_card_ops = { static int aml_card_dai_init(struct snd_soc_pcm_runtime *rtd) { struct aml_card_data *priv = snd_soc_card_get_drvdata(rtd->card); - int ret; + struct snd_soc_dai *codec = rtd->codec_dai; + struct snd_soc_dai *cpu = rtd->cpu_dai; + struct aml_dai_props *dai_props = + aml_priv_to_props(priv, rtd->num); + bool idle_clk = false; + int ret, i; + + for (i = 0; i < rtd->num_codecs; i++) { + codec = rtd->codec_dais[i]; + + ret = aml_card_init_dai(codec, &dai_props->codec_dai); + if (ret < 0) + return ret; + } + + ret = aml_card_init_dai(cpu, &dai_props->cpu_dai); + if (ret < 0) + return ret; ret = aml_card_init_hp(rtd->card, &priv->hp_jack, PREFIX); if (ret < 0) @@ -249,6 +245,15 @@ static int aml_card_dai_init(struct snd_soc_pcm_runtime *rtd) if (ret < 0) return ret; + /* enable dai-link mclk when CONTINUOUS clk setted */ + idle_clk = !!(rtd->dai_link->dai_fmt & SND_SOC_DAIFMT_CONT); + if (idle_clk && dai_props->cpu_dai.clk) { + clk_set_rate(dai_props->cpu_dai.clk, dai_props->cpu_dai.sysclk); + ret = clk_prepare_enable(dai_props->cpu_dai.clk); + if (ret) + return ret; + } + return 0; } diff --git a/sound/soc/amlogic/auge/card_utils.c b/sound/soc/amlogic/auge/card_utils.c index 6f0ca91d7982..d0c842af94b6 100644 --- a/sound/soc/amlogic/auge/card_utils.c +++ b/sound/soc/amlogic/auge/card_utils.c @@ -110,25 +110,25 @@ int aml_card_parse_clk(struct device_node *node, struct aml_dai *aml_dai) { struct clk *clk; - u32 val; + u32 val = 0; /* * Parse dai->sysclk come from "clocks = <&xxx>" * (if system has common clock) - * or "system-clock-frequency = " - * or device's module clock. + * and "system-clock-frequency = ". */ clk = of_clk_get(node, 0); - if (!IS_ERR(clk)) { - aml_dai->sysclk = clk_get_rate(clk); - aml_dai->clk = clk; - } else if (!of_property_read_u32(node, - "system-clock-frequency", &val)) { - aml_dai->sysclk = val; - } else { + if (IS_ERR(clk)) clk = of_clk_get(dai_of_node, 0); - if (!IS_ERR(clk)) - aml_dai->sysclk = clk_get_rate(clk); + + if (!IS_ERR(clk)) { + of_property_read_u32(node, + "system-clock-frequency", &val); + if (val == 0) + val = clk_get_rate(clk); + + aml_dai->clk = clk; + aml_dai->sysclk = val; } return 0; diff --git a/sound/soc/amlogic/auge/pdm.c b/sound/soc/amlogic/auge/pdm.c index 1433edefa806..16e776663cdc 100644 --- a/sound/soc/amlogic/auge/pdm.c +++ b/sound/soc/amlogic/auge/pdm.c @@ -566,24 +566,23 @@ static int aml_pdm_dai_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { struct aml_pdm *p_pdm = snd_soc_dai_get_drvdata(cpu_dai); - unsigned int pll_freq = 0; + unsigned int pll_freq = 0, src_dclk_freq = 0; - pll_freq = freq * 50; - if (pll_freq > 196608000) - pll_freq = 196608000; + pll_freq = clk_get_rate(p_pdm->clk_pll); + src_dclk_freq = clk_get_rate(p_pdm->src_dclk); + pr_info("%s freq:%d, pll_freq:%d, src_dclk_freq=%d\n", + __func__, freq, pll_freq, src_dclk_freq); + if (src_dclk_freq == 0) + clk_set_rate(p_pdm->src_dclk, 24576000); - pr_info("%s freq:%d, pll_freq:%d\n", - __func__, freq, pll_freq); - - clk_set_rate(p_pdm->clk_pll, pll_freq); - clk_set_rate(p_pdm->clk_pdm_sysclk, pll_freq); + clk_set_rate(p_pdm->clk_pdm_sysclk, pll_freq/3); if (pdm_dclk == 1) - clk_set_rate(p_pdm->clk_pdm_dclk, pll_freq / (64 * 3)); + clk_set_rate(p_pdm->clk_pdm_dclk, 1024000); else if (pdm_dclk == 2) - clk_set_rate(p_pdm->clk_pdm_dclk, pll_freq / (64 * 4)); + clk_set_rate(p_pdm->clk_pdm_dclk, 768000); else - clk_set_rate(p_pdm->clk_pdm_dclk, pll_freq / 64); + clk_set_rate(p_pdm->clk_pdm_dclk, 3072000); return 0; } @@ -729,7 +728,7 @@ static int aml_pdm_platform_probe(struct platform_device *pdev) return PTR_ERR(p_pdm->pdm_pins); } - p_pdm->clk_pll = devm_clk_get(&pdev->dev, "pll_clk"); + p_pdm->clk_pll = devm_clk_get(&pdev->dev, "src_sysclk"); if (IS_ERR(p_pdm->clk_pll)) { dev_err(&pdev->dev, "Can't retrieve pll clock\n"); @@ -745,6 +744,14 @@ static int aml_pdm_platform_probe(struct platform_device *pdev) goto err; } + p_pdm->src_dclk = devm_clk_get(&pdev->dev, "src_dclk"); + if (IS_ERR(p_pdm->src_dclk)) { + dev_err(&pdev->dev, + "Can't retrieve data src clock\n"); + ret = PTR_ERR(p_pdm->src_dclk); + goto err; + } + p_pdm->clk_pdm_dclk = devm_clk_get(&pdev->dev, "pdm_dclk"); if (IS_ERR(p_pdm->clk_pdm_dclk)) { dev_err(&pdev->dev, @@ -761,7 +768,7 @@ static int aml_pdm_platform_probe(struct platform_device *pdev) goto err; } - ret = clk_set_parent(p_pdm->clk_pdm_dclk, p_pdm->clk_pll); + ret = clk_set_parent(p_pdm->clk_pdm_dclk, p_pdm->src_dclk); if (ret) { dev_err(&pdev->dev, "Can't set clk_pdm_dclk parent clock\n"); diff --git a/sound/soc/amlogic/auge/pdm.h b/sound/soc/amlogic/auge/pdm.h index a3b191664e1a..e2aae3f367e2 100644 --- a/sound/soc/amlogic/auge/pdm.h +++ b/sound/soc/amlogic/auge/pdm.h @@ -45,6 +45,7 @@ struct aml_pdm { struct pinctrl *pdm_pins; struct clk *clk_gate; struct clk *clk_pll; + struct clk *src_dclk; struct clk *clk_pdm_sysclk; struct clk *clk_pdm_dclk; struct toddr *tddr; diff --git a/sound/soc/amlogic/auge/pdm_hw.c b/sound/soc/amlogic/auge/pdm_hw.c index 27059cf9b95e..188f85b4660a 100644 --- a/sound/soc/amlogic/auge/pdm_hw.c +++ b/sound/soc/amlogic/auge/pdm_hw.c @@ -31,7 +31,7 @@ void aml_pdm_ctrl( struct aml_audio_controller *actrl, int bitdepth, int channels) { - int mode, i, ch_mask = 0, sample_count = 28; + int mode, i, ch_mask = 0, sample_count = 23; if (bitdepth == 32) mode = 0; diff --git a/sound/soc/amlogic/auge/tdm.c b/sound/soc/amlogic/auge/tdm.c index 8a4dafab08e3..d235a8df239d 100644 --- a/sound/soc/amlogic/auge/tdm.c +++ b/sound/soc/amlogic/auge/tdm.c @@ -72,6 +72,7 @@ struct aml_tdm { struct clk *clk; struct clk *clk_gate; struct clk *mclk; + bool contns_clk; unsigned int id; /* bclk src selection */ unsigned int clk_sel; @@ -297,9 +298,9 @@ static int aml_dai_tdm_startup(struct snd_pcm_substream *substream, struct aml_tdm *p_tdm = snd_soc_dai_get_drvdata(cpu_dai); int ret; - ret = clk_prepare_enable(p_tdm->clk); + ret = clk_prepare_enable(p_tdm->mclk); if (ret) { - pr_err("Can't enable mpll clock: %d\n", ret); + pr_err("Can't enable mclk: %d\n", ret); goto err; } @@ -315,8 +316,7 @@ static void aml_dai_tdm_shutdown(struct snd_pcm_substream *substream, struct aml_tdm *p_tdm = snd_soc_dai_get_drvdata(cpu_dai); /* disable clock and gate */ - clk_disable_unprepare(p_tdm->clk); - + clk_disable_unprepare(p_tdm->mclk); } static int aml_dai_tdm_prepare(struct snd_pcm_substream *substream, @@ -535,7 +535,6 @@ static int aml_dai_tdm_hw_params(struct snd_pcm_substream *substream, unsigned int channels = params_channels(params); int ret; - ret = pcm_setting_init(setting, rate, channels); if (ret) return ret; @@ -580,6 +579,16 @@ static int aml_dai_set_tdm_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) pr_info("asoc aml_dai_set_tdm_fmt, %#x, %p, id(%d), clksel(%d)\n", fmt, p_tdm, p_tdm->id, p_tdm->clk_sel); + switch (fmt & SND_SOC_DAIFMT_CLOCK_MASK) { + case SND_SOC_DAIFMT_CONT: + p_tdm->contns_clk = true; + break; + case SND_SOC_DAIFMT_GATED: + p_tdm->contns_clk = false; + break; + default: + return -EINVAL; + } aml_tdm_set_format(p_tdm->actrl, &(p_tdm->setting), p_tdm->clk_sel, p_tdm->id, fmt, @@ -604,47 +613,21 @@ static unsigned int aml_mpll_mclk_ratio(unsigned int freq) break; } - pr_info("TDM mpll/mclk = %d\n", ratio); - return ratio; } -static void aml_tdm_set_mclk(struct aml_tdm *p_tdm) -{ - struct aml_audio_controller *actrl = p_tdm->actrl; - unsigned int clk_id, offset; - unsigned int mpll_freq = 0, sysclk_freq = 0; - - offset = p_tdm->clk_sel; - - /* slave mode */ - if (offset > MASTER_F) - return; - - clk_id = p_tdm->id; - sysclk_freq = p_tdm->setting.sysclk; - - if (sysclk_freq) { - unsigned int mul = aml_mpll_mclk_ratio(sysclk_freq); - - mpll_freq = sysclk_freq * mul; - clk_set_rate(p_tdm->clk, mpll_freq); - aml_audiobus_write(actrl, EE_AUDIO_MCLK_A_CTRL + offset, - 1 << 31 | //clk enable - clk_id << 24 | // clk src - (mul - 1)); //clk_div mclk - } -} - static int aml_dai_set_tdm_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { struct aml_tdm *p_tdm = snd_soc_dai_get_drvdata(cpu_dai); + unsigned int ratio = aml_mpll_mclk_ratio(freq); + + pr_info("aml_dai_set_tdm_sysclk freq(%d), mpll/mclk(%d)\n", + freq, ratio); p_tdm->setting.sysclk = freq; - pr_info("aml_dai_set_tdm_sysclk, %d, %d, %d\n", - clk_id, freq, dir); - aml_tdm_set_mclk(p_tdm); + clk_set_rate(p_tdm->clk, freq * ratio); + clk_set_rate(p_tdm->mclk, freq); return 0; } @@ -837,12 +820,11 @@ static int aml_tdm_platform_probe(struct platform_device *pdev) if (!p_tdm) return -ENOMEM; - /* get tdm device id */ id = of_match_device(of_match_ptr(aml_tdm_device_id), dev); - pr_info("id = %lu\n", (unsigned long)id->data); iddata = (unsigned long)id->data; p_tdm->id = (unsigned int)iddata; + pr_info("%s, tdm ID = %u\n", __func__, p_tdm->id); /* get audio controller */ node_prt = of_get_parent(node); @@ -874,42 +856,20 @@ static int aml_tdm_platform_probe(struct platform_device *pdev) if (ret < 0) p_tdm->setting.lane_mask_out = 0x1; - /* get sysclk source */ - if (iddata == TDM_A) { - p_tdm->clk = devm_clk_get(&pdev->dev, "mpll0"); - if (IS_ERR(p_tdm->clk)) { - dev_err(&pdev->dev, "Can't retrieve mpll0 clock\n"); - return PTR_ERR(p_tdm->clk); - } -#if 0 - p_tdm->clk_gate = devm_clk_get(&pdev->dev, "gate"); - if (IS_ERR(p_tdm->clk_gate)) { - dev_err(&pdev->dev, "Can't retrieve clockgate\n"); - return PTR_ERR(p_tdm->clk_gate); - } - - p_tdm->mclk = devm_clk_get(&pdev->dev, "mclk"); - if (IS_ERR(p_tdm->mclk)) { - dev_err(&pdev->dev, "Can't retrieve mclk\n"); - return PTR_ERR(p_tdm->mclk); - } -#endif - } else if (iddata == TDM_B) { - p_tdm->clk = devm_clk_get(&pdev->dev, "mpll1"); - if (IS_ERR(p_tdm->clk)) { - dev_err(&pdev->dev, "Can't retrieve mpll1 clock\n"); - return PTR_ERR(p_tdm->clk); - } - } else if (iddata == TDM_C) { - p_tdm->clk = devm_clk_get(&pdev->dev, "mpll2"); - if (IS_ERR(p_tdm->clk)) { - dev_err(&pdev->dev, "Can't retrieve mpll2 clock\n"); - return PTR_ERR(p_tdm->clk); - } - } else { - return -EINVAL; + p_tdm->clk = devm_clk_get(&pdev->dev, "clk_srcpll"); + if (IS_ERR(p_tdm->clk)) { + dev_err(&pdev->dev, "Can't retrieve mpll2 clock\n"); + return PTR_ERR(p_tdm->clk); } + p_tdm->mclk = devm_clk_get(&pdev->dev, "mclk"); + if (IS_ERR(p_tdm->mclk)) { + dev_err(&pdev->dev, "Can't retrieve mclk\n"); + return PTR_ERR(p_tdm->mclk); + } + + clk_set_parent(p_tdm->mclk, p_tdm->clk); + /* complete mclk for tdm */ if (get_meson_cpu_version(MESON_CPU_VERSION_LVL_MINOR) == 0xa) meson_clk_measure((1<<16) | 0x67); @@ -930,8 +890,6 @@ static int aml_tdm_platform_probe(struct platform_device *pdev) return ret; } - pr_info("%s, try register soc platform\n", __func__); - return devm_snd_soc_register_platform(dev, &aml_tdm_platform); }