From 90b9c442487c0af90e67c3fd362d58b2d989f543 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Thu, 8 Nov 2018 17:37:32 +0800 Subject: [PATCH] audio: auge: add loopback driver [1/1] PD#SWPL-7240 Problem: limit of current loopback add loopback b for tl1 add tdmin_lb Solution: optimize loopback driver Verify: s400, u200, x301, ac200, ab301 Change-Id: I9dd4c7ad041231bb2c49513e354cfb4fb92131c4 Signed-off-by: Xing Wang --- MAINTAINERS | 8 + arch/arm/boot/dts/amlogic/axg_s400.dts | 132 +- arch/arm/boot/dts/amlogic/axg_s400_v03.dts | 131 +- arch/arm/boot/dts/amlogic/axg_s400_v03gva.dts | 130 +- arch/arm/boot/dts/amlogic/axg_s400_v03gva_sbr.dts | 131 +- arch/arm/boot/dts/amlogic/axg_s400_v03sbr.dts | 131 +- arch/arm/boot/dts/amlogic/axg_s400emmc_512m.dts | 128 +- arch/arm/boot/dts/amlogic/axg_s420.dts | 130 +- arch/arm/boot/dts/amlogic/axg_s420_128m.dts | 129 +- arch/arm/boot/dts/amlogic/axg_s420_v03.dts | 129 +- arch/arm/boot/dts/amlogic/axg_s420_v03gva.dts | 127 +- arch/arm/boot/dts/amlogic/g12a_s905d2_skt.dts | 107 +- .../boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts | 107 +- arch/arm/boot/dts/amlogic/g12a_s905d2_u200.dts | 90 +- arch/arm/boot/dts/amlogic/g12a_s905d2_u200_1g.dts | 90 +- .../dts/amlogic/g12a_s905d2_u200_buildroot.dts | 87 +- .../g12a_s905d2_u200_buildroot_vccktest.dts | 87 +- .../dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts | 87 +- arch/arm/boot/dts/amlogic/g12a_s905x2_u211.dts | 90 +- arch/arm/boot/dts/amlogic/g12a_s905x2_u211_1g.dts | 90 +- .../arm/boot/dts/amlogic/g12a_s905x2_u211_512m.dts | 90 +- .../dts/amlogic/g12a_s905x2_u211_buildroot.dts | 88 +- arch/arm/boot/dts/amlogic/g12a_s905x2_u212.dts | 90 +- arch/arm/boot/dts/amlogic/g12a_s905x2_u212_1g.dts | 90 +- .../dts/amlogic/g12a_s905x2_u212_buildroot.dts | 88 +- .../dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts | 88 +- arch/arm/boot/dts/amlogic/g12a_s905y2_u220.dts | 90 +- arch/arm/boot/dts/amlogic/g12a_s905y2_u221.dts | 89 +- arch/arm/boot/dts/amlogic/g12b_a311d_skt.dts | 112 +- arch/arm/boot/dts/amlogic/g12b_a311d_skt_a.dts | 112 +- arch/arm/boot/dts/amlogic/g12b_a311d_w400.dts | 95 +- arch/arm/boot/dts/amlogic/g12b_a311d_w400_a.dts | 95 +- .../boot/dts/amlogic/g12b_a311d_w400_buildroot.dts | 95 +- .../dts/amlogic/g12b_a311d_w400_buildroot_a.dts | 94 +- .../amlogic/g12b_a311d_w400_buildroot_vccktest.dts | 94 +- .../g12b_a311d_w400_buildroot_vccktest_a.dts | 94 +- .../dts/amlogic/g12b_a311d_w400_drm_buildroot.dts | 94 +- arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts | 173 +++ arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts | 200 +++ arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts | 204 ++- arch/arm/boot/dts/amlogic/tl1_pxp.dts | 209 ++- arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts | 212 ++- arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts | 222 +++ arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts | 176 +++ arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts | 176 +++ arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts | 181 ++- arch/arm/boot/dts/amlogic/tm2_t962e2_ab319.dts | 201 ++- arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts | 182 ++- arch/arm/boot/dts/amlogic/tm2_t962x3_ab309.dts | 201 ++- arch/arm64/boot/dts/amlogic/axg_s400.dts | 132 +- arch/arm64/boot/dts/amlogic/axg_s400_v03.dts | 131 +- arch/arm64/boot/dts/amlogic/axg_s400_v03gva.dts | 129 +- .../arm64/boot/dts/amlogic/axg_s400_v03gva_sbr.dts | 132 +- arch/arm64/boot/dts/amlogic/axg_s400_v03sbr.dts | 131 +- arch/arm64/boot/dts/amlogic/axg_s400emmc_512m.dts | 128 +- arch/arm64/boot/dts/amlogic/axg_s410.dts | 131 +- arch/arm64/boot/dts/amlogic/axg_s410_v03.dts | 132 +- arch/arm64/boot/dts/amlogic/axg_s420.dts | 130 +- arch/arm64/boot/dts/amlogic/axg_s420_128m.dts | 129 +- arch/arm64/boot/dts/amlogic/axg_s420_v03.dts | 129 +- arch/arm64/boot/dts/amlogic/axg_s420_v03gva.dts | 126 +- arch/arm64/boot/dts/amlogic/g12a_s905d2_skt.dts | 107 +- .../boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts | 108 +- arch/arm64/boot/dts/amlogic/g12a_s905d2_u200.dts | 91 +- .../arm64/boot/dts/amlogic/g12a_s905d2_u200_1g.dts | 90 +- .../dts/amlogic/g12a_s905d2_u200_buildroot.dts | 87 +- .../g12a_s905d2_u200_buildroot_vccktest.dts | 87 +- .../dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts | 87 +- arch/arm64/boot/dts/amlogic/g12a_s905x2_u211.dts | 90 +- .../arm64/boot/dts/amlogic/g12a_s905x2_u211_1g.dts | 90 +- .../boot/dts/amlogic/g12a_s905x2_u211_512m.dts | 90 +- .../dts/amlogic/g12a_s905x2_u211_buildroot.dts | 87 +- arch/arm64/boot/dts/amlogic/g12a_s905x2_u212.dts | 89 +- .../arm64/boot/dts/amlogic/g12a_s905x2_u212_1g.dts | 89 +- .../dts/amlogic/g12a_s905x2_u212_buildroot.dts | 87 +- .../dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts | 87 +- arch/arm64/boot/dts/amlogic/g12a_s905y2_u220.dts | 89 +- arch/arm64/boot/dts/amlogic/g12a_s905y2_u221.dts | 88 +- arch/arm64/boot/dts/amlogic/g12b_a311d_skt.dts | 114 +- arch/arm64/boot/dts/amlogic/g12b_a311d_skt_a.dts | 114 +- arch/arm64/boot/dts/amlogic/g12b_a311d_w400.dts | 94 +- arch/arm64/boot/dts/amlogic/g12b_a311d_w400_a.dts | 94 +- .../boot/dts/amlogic/g12b_a311d_w400_buildroot.dts | 94 +- .../dts/amlogic/g12b_a311d_w400_buildroot_a.dts | 94 +- .../amlogic/g12b_a311d_w400_buildroot_vccktest.dts | 94 +- .../g12b_a311d_w400_buildroot_vccktest_a.dts | 94 +- .../dts/amlogic/g12b_a311d_w400_drm_buildroot.dts | 94 +- .../boot/dts/amlogic/g12b_a311x_w411_buildroot.dts | 94 +- .../dts/amlogic/g12b_a311x_w411_buildroot_a.dts | 94 +- arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts | 173 +++ arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts | 200 +++ arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts | 172 +++ arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts | 222 +++ arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts | 211 +++ arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts | 211 +++ arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts | 177 +++ arch/arm64/boot/dts/amlogic/tm2_t962e2_ab319.dts | 199 +++ arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts | 182 ++- arch/arm64/boot/dts/amlogic/tm2_t962x3_ab309.dts | 201 ++- sound/soc/amlogic/auge/Makefile | 1 + sound/soc/amlogic/auge/audio_utils.c | 666 +-------- sound/soc/amlogic/auge/audio_utils.h | 134 -- sound/soc/amlogic/auge/card.c | 40 +- sound/soc/amlogic/auge/ddr_mngr.c | 37 +- sound/soc/amlogic/auge/ddr_mngr.h | 37 +- sound/soc/amlogic/auge/loopback.c | 1433 ++++++++++++++++++++ sound/soc/amlogic/auge/loopback.h | 61 + sound/soc/amlogic/auge/loopback_hw.c | 333 +++-- sound/soc/amlogic/auge/loopback_hw.h | 57 +- sound/soc/amlogic/auge/loopback_match_table.c | 104 ++ sound/soc/amlogic/auge/pdm.c | 250 ++-- sound/soc/amlogic/auge/pdm.h | 6 +- sound/soc/amlogic/auge/pdm_hw.c | 112 +- sound/soc/amlogic/auge/pdm_hw.h | 9 +- sound/soc/amlogic/auge/regs.h | 53 +- sound/soc/amlogic/auge/spdif.c | 65 +- sound/soc/amlogic/auge/tdm.c | 165 ++- sound/soc/amlogic/auge/tdm_hw.h | 1 + sound/soc/amlogic/auge/tdm_match_table.c | 69 +- sound/soc/codecs/amlogic/ad82584f.c | 21 +- 120 files changed, 12673 insertions(+), 3182 deletions(-) create mode 100644 sound/soc/amlogic/auge/loopback.c create mode 100644 sound/soc/amlogic/auge/loopback.h create mode 100644 sound/soc/amlogic/auge/loopback_match_table.c diff --git a/MAINTAINERS b/MAINTAINERS index 2ed50ff..c024b0d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -14702,6 +14702,14 @@ F: include/linux/amlogic/media/sound/misc.h F: include/linux/amlogic/major.h F: sound/soc/amlogic/auge/* +AMLOGIC TL1 AUDIO EXTERANL INPUT/OUTPUT DRIVERS +AMLOGIC AUDIO New LOOPBACK DRIVERS +M: Xing Wang F: arch\arm\boot\dts\amlogic\mesontl1_pxp-panel.dtsi diff --git a/arch/arm/boot/dts/amlogic/axg_s400.dts b/arch/arm/boot/dts/amlogic/axg_s400.dts index 06011db..9241015 100644 --- a/arch/arm/boot/dts/amlogic/axg_s400.dts +++ b/arch/arm/boot/dts/amlogic/axg_s400.dts @@ -481,8 +481,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; @@ -564,15 +562,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - * enable external loopback - * and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -587,7 +576,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; + audiolocker: locker { compatible = "amlogic, audiolocker"; clocks = <&clkaudio CLKID_AUDIO_LOCKER_OUT @@ -1140,6 +1143,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1192,21 +1244,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1216,25 +1271,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; - + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s400_v03.dts b/arch/arm/boot/dts/amlogic/axg_s400_v03.dts index 8fe15ed..b520693 100644 --- a/arch/arm/boot/dts/amlogic/axg_s400_v03.dts +++ b/arch/arm/boot/dts/amlogic/axg_s400_v03.dts @@ -477,8 +477,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -562,15 +560,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -585,6 +574,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1122,6 +1124,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1174,22 +1225,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1199,24 +1252,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s400_v03gva.dts b/arch/arm/boot/dts/amlogic/axg_s400_v03gva.dts index 8ebaddc..88cb98e 100644 --- a/arch/arm/boot/dts/amlogic/axg_s400_v03gva.dts +++ b/arch/arm/boot/dts/amlogic/axg_s400_v03gva.dts @@ -473,8 +473,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -558,15 +556,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -581,6 +570,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1078,6 +1080,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1116,22 +1167,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1141,27 +1194,34 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <4>; - datain_chmask = <0x3>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; + }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/axg_s400_v03gva_sbr.dts b/arch/arm/boot/dts/amlogic/axg_s400_v03gva_sbr.dts index b8df36e..4941ba9 100644 --- a/arch/arm/boot/dts/amlogic/axg_s400_v03gva_sbr.dts +++ b/arch/arm/boot/dts/amlogic/axg_s400_v03gva_sbr.dts @@ -473,8 +473,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -576,15 +574,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -599,6 +588,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1175,6 +1177,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1227,22 +1278,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1252,24 +1305,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s400_v03sbr.dts b/arch/arm/boot/dts/amlogic/axg_s400_v03sbr.dts index 7727ce8..954301f 100644 --- a/arch/arm/boot/dts/amlogic/axg_s400_v03sbr.dts +++ b/arch/arm/boot/dts/amlogic/axg_s400_v03sbr.dts @@ -477,8 +477,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -580,15 +578,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -603,6 +592,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1218,6 +1220,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1270,22 +1321,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1295,24 +1348,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s400emmc_512m.dts b/arch/arm/boot/dts/amlogic/axg_s400emmc_512m.dts index 892b556..a0a8614 100644 --- a/arch/arm/boot/dts/amlogic/axg_s400emmc_512m.dts +++ b/arch/arm/boot/dts/amlogic/axg_s400emmc_512m.dts @@ -486,8 +486,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; @@ -587,15 +585,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -614,6 +603,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1042,6 +1044,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1094,20 +1145,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1117,23 +1172,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s420.dts b/arch/arm/boot/dts/amlogic/axg_s420.dts index fda588b..a91dd38 100644 --- a/arch/arm/boot/dts/amlogic/axg_s420.dts +++ b/arch/arm/boot/dts/amlogic/axg_s420.dts @@ -347,8 +347,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 @@ -419,15 +417,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -441,6 +430,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -935,6 +937,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -988,20 +1039,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1011,23 +1066,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - /*if tdmin_lb >= 3, use external loopback*/ - datalb_src = <1>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s420_128m.dts b/arch/arm/boot/dts/amlogic/axg_s420_128m.dts index 440bff0..ea797b9 100644 --- a/arch/arm/boot/dts/amlogic/axg_s420_128m.dts +++ b/arch/arm/boot/dts/amlogic/axg_s420_128m.dts @@ -340,8 +340,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 @@ -412,15 +410,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -434,6 +423,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -804,6 +806,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -857,19 +908,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -879,23 +935,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s420_v03.dts b/arch/arm/boot/dts/amlogic/axg_s420_v03.dts index 05ab48d..e1808c1 100644 --- a/arch/arm/boot/dts/amlogic/axg_s420_v03.dts +++ b/arch/arm/boot/dts/amlogic/axg_s420_v03.dts @@ -348,8 +348,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -423,15 +421,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -445,6 +434,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -941,6 +943,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -994,20 +1045,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1017,24 +1072,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/axg_s420_v03gva.dts b/arch/arm/boot/dts/amlogic/axg_s420_v03gva.dts index 83595b3..5855faf 100644 --- a/arch/arm/boot/dts/amlogic/axg_s420_v03gva.dts +++ b/arch/arm/boot/dts/amlogic/axg_s420_v03gva.dts @@ -344,8 +344,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -419,15 +417,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -442,6 +431,18 @@ * }; *}; */ + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -900,6 +901,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -939,20 +989,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -962,27 +1016,34 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <4>; - datain_chmask = <0x3>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; + }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_skt.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_skt.dts index 3ce2558..714281a 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_skt.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_skt.dts @@ -476,7 +476,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -614,6 +613,39 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -813,6 +845,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -836,8 +869,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "okay"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -888,13 +943,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -904,20 +971,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts index b412fe1..06193c8 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts @@ -463,7 +463,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -575,6 +574,38 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -759,6 +790,7 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -782,6 +814,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "okay"; }; aml_spdif: spdif { @@ -833,13 +888,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -849,20 +916,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200.dts index b8be699..b4cd599 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200.dts @@ -573,7 +573,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -712,6 +711,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -1090,6 +1103,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -1113,6 +1127,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -1179,13 +1217,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1195,20 +1245,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_1g.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_1g.dts index bf7e8f3..20507f7 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_1g.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_1g.dts @@ -577,7 +577,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -716,6 +715,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -934,6 +947,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -957,6 +971,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -1023,13 +1061,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1039,20 +1089,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts index e5202d8..4d0fb03 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts @@ -579,7 +579,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -717,6 +716,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -902,6 +913,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -925,9 +937,32 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; #sound-dai-cells = <0>; @@ -977,13 +1012,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -993,20 +1040,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts index 7204b6f..56bfe78 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts @@ -565,7 +565,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -703,6 +702,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -906,6 +917,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -929,9 +941,32 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; #sound-dai-cells = <0>; @@ -981,13 +1016,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -997,20 +1044,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts index bb768ee..7b40c1c 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts @@ -579,7 +579,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -717,6 +716,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -916,6 +927,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -939,9 +951,32 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; #sound-dai-cells = <0>; @@ -991,13 +1026,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1007,20 +1054,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211.dts index e15e712..cc6325d 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211.dts @@ -518,7 +518,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -657,6 +656,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -860,6 +873,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -883,6 +897,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -949,13 +987,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -965,20 +1015,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_1g.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_1g.dts index b38fec0..b540af3 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_1g.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_1g.dts @@ -510,7 +510,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -649,6 +648,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -851,6 +864,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -874,6 +888,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -940,13 +978,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -956,20 +1006,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_512m.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_512m.dts index ef84c49..a1bb0c1 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_512m.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_512m.dts @@ -505,7 +505,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -644,6 +643,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -847,6 +860,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -870,6 +884,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -936,13 +974,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -952,20 +1002,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts index d2909ab..84d437e 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts @@ -598,7 +598,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -736,6 +735,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -904,6 +916,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -927,9 +940,32 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; #sound-dai-cells = <0>; @@ -979,13 +1015,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -995,20 +1043,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212.dts index fb6030ca..679313d 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212.dts @@ -549,7 +549,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -688,6 +687,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -904,6 +917,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -927,6 +941,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -993,13 +1031,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1009,20 +1059,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_1g.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_1g.dts index 58e31cb..66231ed 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_1g.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_1g.dts @@ -546,7 +546,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -685,6 +684,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -900,6 +913,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -923,6 +937,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -989,13 +1027,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1005,20 +1055,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts index 0baccdd..48978674 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts @@ -597,7 +597,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -735,6 +734,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -903,6 +915,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -926,9 +939,32 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; #sound-dai-cells = <0>; @@ -978,13 +1014,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -994,20 +1042,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts index 730acc8..f961eb2 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts @@ -582,7 +582,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -720,6 +719,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -888,6 +900,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -911,9 +924,32 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; #sound-dai-cells = <0>; @@ -963,13 +999,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -979,20 +1027,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905y2_u220.dts b/arch/arm/boot/dts/amlogic/g12a_s905y2_u220.dts index 631b434..8f3390d 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905y2_u220.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905y2_u220.dts @@ -493,7 +493,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -632,6 +631,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -843,6 +856,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -866,6 +880,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -932,13 +970,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -948,20 +998,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12a_s905y2_u221.dts b/arch/arm/boot/dts/amlogic/g12a_s905y2_u221.dts index 572147a..40d8376 100644 --- a/arch/arm/boot/dts/amlogic/g12a_s905y2_u221.dts +++ b/arch/arm/boot/dts/amlogic/g12a_s905y2_u221.dts @@ -463,7 +463,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -628,6 +627,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -807,6 +819,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -830,6 +843,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -896,13 +933,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -912,20 +961,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_skt.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_skt.dts index 6982519..499d159 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_skt.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_skt.dts @@ -509,7 +509,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -624,6 +623,38 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -919,6 +950,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -942,19 +974,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1008,13 +1048,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1024,22 +1076,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_skt_a.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_skt_a.dts index d6044c9..3b8edc2 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_skt_a.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_skt_a.dts @@ -509,7 +509,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -624,6 +623,38 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -899,6 +930,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -922,19 +954,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -988,13 +1028,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1004,22 +1056,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400.dts index e5b28ec..133db08 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400.dts @@ -515,7 +515,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -631,7 +630,20 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; + audiolocker: locker { compatible = "amlogic, audiolocker"; clocks = <&clkaudio CLKID_AUDIO_LOCKER_OUT @@ -898,6 +910,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -921,21 +934,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -987,13 +1008,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1003,22 +1036,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_a.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_a.dts index 4b2d544..3eed3bd 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_a.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_a.dts @@ -515,7 +515,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -631,7 +630,20 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; + audiolocker: locker { compatible = "amlogic, audiolocker"; clocks = <&clkaudio CLKID_AUDIO_LOCKER_OUT @@ -878,6 +890,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -901,21 +914,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -967,13 +988,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -983,22 +1016,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts index c1b36a4..2d97205 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts @@ -586,7 +586,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -702,7 +701,20 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; + audiolocker: locker { compatible = "amlogic, audiolocker"; clocks = <&clkaudio CLKID_AUDIO_LOCKER_OUT @@ -991,6 +1003,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -1014,21 +1027,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -1080,13 +1101,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1096,22 +1129,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts index c972c12c..4439114 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts @@ -573,7 +573,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -689,6 +688,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -958,6 +969,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -981,21 +993,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -1047,13 +1067,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1063,22 +1095,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts index 8e469c0..96ac027 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts @@ -551,7 +551,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -666,6 +665,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -882,6 +893,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -905,21 +917,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -971,13 +991,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -987,22 +1019,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts index 7edfad7..29d4347 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts @@ -539,7 +539,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -654,6 +653,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -870,6 +881,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -893,21 +905,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -959,13 +979,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -975,22 +1007,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts index 10b88c0..312d845 100644 --- a/arch/arm/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts +++ b/arch/arm/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts @@ -574,7 +574,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -690,6 +689,18 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -950,6 +961,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -973,21 +985,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; - i2s2hdmi = <1>; - - status = "okay"; + status = "disabled"; }; aml_spdif: spdif { @@ -1039,13 +1059,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1055,22 +1087,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts index 99a899e..98e2fa0 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts @@ -721,6 +721,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -732,6 +733,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1162,6 +1176,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, sm1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa: spdif@0 { compatible = "amlogic, sm1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1297,6 +1360,116 @@ status = "okay"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, sm1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, sm1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts index b767122..2fc59d6 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts @@ -704,6 +704,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -715,6 +716,46 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@8 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + /* master mode */ + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + /* slave mode */ + //bitclock-master = <&tdmlbcodec>; + //frame-master = <&tdmlbcodec>; + /* suffix-name, sync with android audio hal used for */ + //suffix-name = "alsaPORT-tdmlb"; + cpu { + sound-dai = <&tdmlb>; + dai-tdm-slot-tx-mask = <1 1>; + dai-tdm-slot-rx-mask = <1 1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; + }; + tdmlbcodec: codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1143,6 +1184,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, sm1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "okay"; + }; + spdifa: spdif@0 { compatible = "amlogic, sm1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1278,6 +1368,116 @@ status = "okay"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, sm1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, sm1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts b/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts index d4a0ccb..bd8773b2 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts @@ -717,6 +717,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1102,6 +1115,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, sm1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa: spdif@0 { compatible = "amlogic, sm1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1155,39 +1217,7 @@ filter_mode = <1>; status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; - - /* datain src - * 0: tdmin_a; - * 1: tdmin_b; - * 2: tdmin_c; - * 3: spdifin; - * 4: pdmin; - */ - datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; - - /* tdmin_lb src - * 0: tdmoutA - * 1: tdmoutB - * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC - */ - datalb_src = <2>; - datalb_chnum = <8>; - datalb_chmask = <0x3>; - status = "okay"; - }; earc:earc { compatible = "amlogic, sm1-snd-earc"; #sound-dai-cells = <0>; @@ -1268,6 +1298,116 @@ status = "okay"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, sm1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, sm1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tl1_pxp.dts b/arch/arm/boot/dts/amlogic/tl1_pxp.dts index 2f14806..6592a47 100644 --- a/arch/arm/boot/dts/amlogic/tl1_pxp.dts +++ b/arch/arm/boot/dts/amlogic/tl1_pxp.dts @@ -386,6 +386,49 @@ }; }; +#if 0 + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; +#endif + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + aml-audio-card,dai-link@9 { + mclk-fs = <256>; + continuous-clock; + cpu { + sound-dai = <&loopbackb>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -744,6 +787,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -762,6 +807,57 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + + status = "okay"; + }; + + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + status = "okay"; }; @@ -858,7 +954,7 @@ clocks = <&clkaudio CLKID_AUDIO_GATE_EQDRC &clkc CLKID_FCLK_DIV5 &clkaudio CLKID_AUDIO_EQDRC>; - clock-names = "gate", "clk_srcpll", "eqdrc"; + clock-names = "gate", "srcpll", "eqdrc"; eq_enable = <1>; multiband_drc_enable = <0>; @@ -923,6 +1019,117 @@ status = "disabled"; }; + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "sysclk_srcpll", + "dclk_srcpll", + "pdm_dclk", + "pdm_sysclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* + * 0: out rate = in data rate; + * 1: out rate = loopback data rate; + */ + lb_mode = <0>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <8>; + datain_chmask = <0x3f>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1>; + clock-names = "gate", + "sysclk_srcpll", + "dclk_srcpll", + "pdm_dclk", + "pdm_sysclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* + * 0: out rate = in data rate; + * 1: out rate = loopback data rate; + */ + lb_mode = <0>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <8>; + datain_chmask = <0x3f>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts index 6ea7d95..b806b70 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts @@ -425,6 +425,51 @@ sound-dai = <&dummy_codec>; }; }; + +#if 0 + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; +#endif + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + aml-audio-card,dai-link@9 { + mclk-fs = <256>; + suffix-name = "alsaPORT-loopbackb"; + cpu { + sound-dai = <&loopbackb>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1244,6 +1289,8 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1265,6 +1312,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1283,6 +1332,57 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + + status = "okay"; + }; + + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + status = "okay"; }; @@ -1478,10 +1578,120 @@ * 0: in user space * 1: in kernel space */ - level = <0>; + level = <1>; status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts index 40a8bae..b0db115 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts @@ -437,6 +437,29 @@ }; }; + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + suffix-name = "alsaPORT-loopbackb"; + cpu { + sound-dai = <&loopbackb>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1287,6 +1310,7 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ status = "okay"; @@ -1309,6 +1333,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1327,9 +1353,60 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa:spdif@0 { compatible = "amlogic, tl1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1489,6 +1566,151 @@ status = "disabled"; }; + vad:vad { + compatible = "amlogic, snd-vad"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_TOVAD + &clkc CLKID_FCLK_DIV5 + &clkaudio CLKID_AUDIO_VAD>; + clock-names = "gate", "pll", "clk"; + + interrupts = ; + interrupt-names = "irq_wakeup", "irq_frame_sync"; + + /* + * Data src sel: + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + * 5: loopback_b; + * 6: tdmin_lb; + * 7: loopback_a; + */ + src = <4>; + + /* + * deal with hot word in user space or kernel space + * 0: in user space + * 1: in kernel space + */ + level = <1>; + + status = "disabled"; + }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index 18ac07e..f21e445 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -445,6 +445,18 @@ }; }; + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1352,6 +1364,7 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ status = "okay"; @@ -1374,6 +1387,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1392,9 +1407,60 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa:spdif@0 { compatible = "amlogic, tl1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1587,6 +1653,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts index bef9f9f..3a38a32 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts @@ -440,6 +440,18 @@ }; }; + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1347,6 +1359,7 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ status = "okay"; @@ -1369,6 +1382,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1387,9 +1402,60 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa:spdif@0 { compatible = "amlogic, tl1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1583,6 +1649,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts b/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts index 35e5b73..fe3ce16 100644 --- a/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts +++ b/arch/arm/boot/dts/amlogic/tm2_t962e2_ab311.dts @@ -326,7 +326,6 @@ }; aml-audio-card,dai-link@1 { - format = "i2s"; mclk-fs = <256>; //continuous-clock; @@ -361,7 +360,6 @@ }; aml-audio-card,dai-link@2 { - format = "i2s"; mclk-fs = <256>; //continuous-clock; @@ -449,6 +447,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1407,9 +1418,59 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM &clkc CLKID_FCLK_DIV3 &clkc CLKID_MPLL3 @@ -1420,12 +1481,16 @@ "dclk_srcpll", "pdm_dclk", "pdm_sysclk"; + pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; + /* mode 0~4, defalut:1 */ filter_mode = <1>; + status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1483,7 +1548,6 @@ compatible = "amlogic, snd-extn"; #sound-dai-cells = <0>; - interrupts = ; interrupt-names = "irq_frhdmirx"; @@ -1513,6 +1577,7 @@ "tx_dmac", "tx_cmdc_srcpll", "tx_dmac_srcpll"; + interrupts = < GIC_SPI 88 IRQ_TYPE_EDGE_RISING GIC_SPI 87 IRQ_TYPE_EDGE_RISING @@ -1626,6 +1691,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tm2_t962e2_ab319.dts b/arch/arm/boot/dts/amlogic/tm2_t962e2_ab319.dts index 22a37c5..66c2ebf 100644 --- a/arch/arm/boot/dts/amlogic/tm2_t962e2_ab319.dts +++ b/arch/arm/boot/dts/amlogic/tm2_t962e2_ab319.dts @@ -434,6 +434,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@7 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -445,9 +446,47 @@ sound-dai = <&dummy_codec>; }; }; - }; + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* aml-audio-card,dai-link@9 { + * format = "i2s"; + * mclk-fs = <256>; + * //continuous-clock; + * //bitclock-inversion; + * //frame-inversion; + * bitclock-master = <&tdmlb>; + * frame-master = <&tdmlb>; + * //bitclock-master = <&tdmlbcodec>; + * //frame-master = <&tdmlbcodec>; + * //suffix-name = "alsaPORT-tdmlb"; + * cpu { + * sound-dai = <&tdmlb>; + * dai-tdm-slot-tx-mask = <1 1>; + * dai-tdm-slot-rx-mask = <1 1>; + * dai-tdm-slot-num = <2>; + * dai-tdm-slot-width = <32>; + * system-clock-frequency = <12288000>; + * }; + * tdmlbcodec: codec { + * sound-dai = <&dummy_codec>; + * }; + *}; + */ + }; /* Audio Related end */ + dvb { compatible = "amlogic, dvb"; status = "okay"; @@ -1316,6 +1355,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; @@ -1335,6 +1423,7 @@ filter_mode = <1>; status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1536,6 +1625,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts b/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts index 26be6a5..1636afc 100644 --- a/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts +++ b/arch/arm/boot/dts/amlogic/tm2_t962x3_ab301.dts @@ -327,7 +327,6 @@ }; aml-audio-card,dai-link@1 { - format = "i2s"; mclk-fs = <256>; //continuous-clock; @@ -362,7 +361,6 @@ }; aml-audio-card,dai-link@2 { - format = "i2s"; mclk-fs = <256>; //continuous-clock; @@ -450,6 +448,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1411,9 +1422,59 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM &clkc CLKID_FCLK_DIV3 &clkc CLKID_MPLL3 @@ -1424,12 +1485,16 @@ "dclk_srcpll", "pdm_dclk", "pdm_sysclk"; + pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; + /* mode 0~4, defalut:1 */ filter_mode = <1>; + status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1449,6 +1514,7 @@ pinctrl-names = "spdif_pins", "spdif_pins_mute"; + pinctrl-0 = <&spdifout_a>; pinctrl-1 = <&spdifout_a_mute>; @@ -1487,7 +1553,6 @@ compatible = "amlogic, snd-extn"; #sound-dai-cells = <0>; - interrupts = ; interrupt-names = "irq_frhdmirx"; @@ -1517,6 +1582,7 @@ "tx_dmac", "tx_cmdc_srcpll", "tx_dmac_srcpll"; + interrupts = < GIC_SPI 88 IRQ_TYPE_EDGE_RISING GIC_SPI 87 IRQ_TYPE_EDGE_RISING @@ -1630,6 +1696,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm/boot/dts/amlogic/tm2_t962x3_ab309.dts b/arch/arm/boot/dts/amlogic/tm2_t962x3_ab309.dts index 0b4b057..0700b70 100644 --- a/arch/arm/boot/dts/amlogic/tm2_t962x3_ab309.dts +++ b/arch/arm/boot/dts/amlogic/tm2_t962x3_ab309.dts @@ -435,6 +435,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@7 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -446,9 +447,47 @@ sound-dai = <&dummy_codec>; }; }; - }; + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* aml-audio-card,dai-link@9 { + * format = "i2s"; + * mclk-fs = <256>; + * //continuous-clock; + * //bitclock-inversion; + * //frame-inversion; + * bitclock-master = <&tdmlb>; + * frame-master = <&tdmlb>; + * //bitclock-master = <&tdmlbcodec>; + * //frame-master = <&tdmlbcodec>; + * //suffix-name = "alsaPORT-tdmlb"; + * cpu { + * sound-dai = <&tdmlb>; + * dai-tdm-slot-tx-mask = <1 1>; + * dai-tdm-slot-rx-mask = <1 1>; + * dai-tdm-slot-num = <2>; + * dai-tdm-slot-width = <32>; + * system-clock-frequency = <12288000>; + * }; + * tdmlbcodec: codec { + * sound-dai = <&dummy_codec>; + * }; + *}; + */ + }; /* Audio Related end */ + dvb { compatible = "amlogic, dvb"; status = "okay"; @@ -1317,6 +1356,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; @@ -1336,6 +1424,7 @@ filter_mode = <1>; status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1537,6 +1626,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/axg_s400.dts b/arch/arm64/boot/dts/amlogic/axg_s400.dts index 58383ab..d75eddb 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400.dts @@ -481,8 +481,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; @@ -564,15 +562,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - * enable external loopback - * and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -587,7 +576,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; + audiolocker: locker { compatible = "amlogic, audiolocker"; clocks = <&clkaudio CLKID_AUDIO_LOCKER_OUT @@ -1140,6 +1143,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1192,21 +1244,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1216,25 +1271,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; - + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts b/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts index ee09047..d7ca51b 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400_v03.dts @@ -477,8 +477,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -562,15 +560,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -585,6 +574,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1122,6 +1124,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1174,22 +1225,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1199,24 +1252,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s400_v03gva.dts b/arch/arm64/boot/dts/amlogic/axg_s400_v03gva.dts index 63336e7..4ead864 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400_v03gva.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400_v03gva.dts @@ -473,8 +473,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -558,15 +556,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -581,6 +570,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1084,6 +1086,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1122,22 +1173,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1147,24 +1200,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <4>; - datain_chmask = <0x3>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s400_v03gva_sbr.dts b/arch/arm64/boot/dts/amlogic/axg_s400_v03gva_sbr.dts index c91bc36..201c8c9 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400_v03gva_sbr.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400_v03gva_sbr.dts @@ -473,8 +473,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -576,15 +574,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -599,6 +588,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1162,6 +1164,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1214,22 +1265,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1239,28 +1292,35 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; + audioresample: resample { compatible = "amlogic, axg-resample"; clocks = <&clkc CLKID_MPLL3 diff --git a/arch/arm64/boot/dts/amlogic/axg_s400_v03sbr.dts b/arch/arm64/boot/dts/amlogic/axg_s400_v03sbr.dts index 6f86df4..84eaca4 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400_v03sbr.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400_v03sbr.dts @@ -477,8 +477,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -580,15 +578,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -603,6 +592,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1218,6 +1220,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1270,22 +1321,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1295,24 +1348,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s400emmc_512m.dts b/arch/arm64/boot/dts/amlogic/axg_s400emmc_512m.dts index 445b849..b68fbcc 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s400emmc_512m.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s400emmc_512m.dts @@ -486,8 +486,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <512>; @@ -587,15 +585,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -614,6 +603,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1042,6 +1044,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1094,20 +1145,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1117,23 +1172,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s410.dts b/arch/arm64/boot/dts/amlogic/axg_s410.dts index 0e16ced..00da043 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s410.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s410.dts @@ -471,8 +471,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "i2s"; mclk-fs = <256>; @@ -555,15 +553,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - * enable external loopback - * and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -579,6 +568,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1133,6 +1135,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1185,21 +1236,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1209,25 +1263,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; - + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s410_v03.dts b/arch/arm64/boot/dts/amlogic/axg_s410_v03.dts index 933bf73..4ddfb1a 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s410_v03.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s410_v03.dts @@ -469,8 +469,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -554,15 +552,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -577,6 +566,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -1114,6 +1116,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -1152,22 +1203,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - - /* - * external loopback clock config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1177,27 +1230,34 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 0 0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; + }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/axg_s420.dts b/arch/arm64/boot/dts/amlogic/axg_s420.dts index 6f1c708..4e9e0a2 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420.dts @@ -348,8 +348,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 @@ -420,15 +418,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -442,6 +431,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -936,6 +938,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -989,20 +1040,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1012,23 +1067,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - /*if tdmin_lb >= 3, use external loopback*/ - datalb_src = <1>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts b/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts index c5232e1..59892ab 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420_128m.dts @@ -340,8 +340,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,dai-link@0 { format = "dsp_a"; mclk-fs = <256>;//512 @@ -412,15 +410,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -434,6 +423,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -804,6 +806,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -857,19 +908,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -879,23 +935,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts b/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts index 6033259..a74b896 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420_v03.dts @@ -348,8 +348,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -423,15 +421,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -445,6 +434,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -941,6 +943,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -994,20 +1045,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1017,24 +1072,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x7f>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ - datalb_chmask = <0x1>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/axg_s420_v03gva.dts b/arch/arm64/boot/dts/amlogic/axg_s420_v03gva.dts index b01bb73..ad0eb7c 100644 --- a/arch/arm64/boot/dts/amlogic/axg_s420_v03gva.dts +++ b/arch/arm64/boot/dts/amlogic/axg_s420_v03gva.dts @@ -344,8 +344,6 @@ compatible = "amlogic, axg-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; - aml-audio-card,hp-det-gpio = <&gpio GPIOZ_7 GPIO_ACTIVE_LOW>; aml-audio-card,dai-link@0 { @@ -419,15 +417,6 @@ sound-dai = <&aml_pdm>; }; codec { - /* - *enable external loopback - *and tlv320adc3101 as loopback - */ - /*sound-dai = <&pdm_codec &tlv320adc3101_32>;*/ - /* - * enable internal loopback - * or disable loopback - */ sound-dai = <&pdm_codec>; }; }; @@ -442,6 +431,18 @@ }; }; + aml-audio-card,dai-link@5 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; bt-dev{ @@ -906,6 +907,55 @@ pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; }; + tdmlb:tdm@3 { + compatible = "amlogic, axg-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + aml_spdif: spdif { compatible = "amlogic, axg-snd-spdif"; #sound-dai-cells = <0>; @@ -945,20 +995,24 @@ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * external loopback clk config - * enable clk while pdm record data - */ - /*clocks = <&clkc CLKID_MPLL1>;*/ - /*clock-names = "datalb_mpll";*/ + loopback:loopback@0 { + compatible = "amlogic, axg-loopback"; + #sound-dai-cells = <0>; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -968,24 +1022,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <4>; - datain_chmask = <0x3>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - - /*if tdmin_lb >= 3, use external loopback*/ + /* if tdmin_lb >= 3, use external loopback */ datalb_src = <2>; datalb_chnum = <2>; - /*config which data pin as loopback*/ - /*datalb-lane-mask-in = <0 1>;*/ datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt.dts index 76eb019..998a34e 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt.dts @@ -476,7 +476,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -614,6 +613,39 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -813,6 +845,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -836,8 +869,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "okay"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -888,13 +943,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -904,20 +971,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts index 8b3e7a3..af188c7 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_skt_buildroot.dts @@ -463,7 +463,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -575,6 +574,39 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -759,6 +791,7 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -782,6 +815,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "okay"; }; aml_spdif: spdif { @@ -833,13 +889,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -849,20 +917,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200.dts index 868907f..efda8a3 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200.dts @@ -572,7 +572,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -695,6 +694,7 @@ sound-dai = <&dummy_codec>; }; }; + /* spdif_b to hdmi, only playback */ aml-audio-card,dai-link@5 { mclk-fs = <128>; @@ -711,6 +711,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -1089,6 +1104,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -1112,6 +1128,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -1178,13 +1217,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1194,20 +1245,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_1g.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_1g.dts index 07b6741..4193aff 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_1g.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_1g.dts @@ -571,7 +571,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -710,6 +709,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -928,6 +942,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -951,6 +966,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -1017,13 +1055,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1033,20 +1083,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts index 08970fe..679bea7 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot.dts @@ -579,7 +579,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -717,6 +716,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -902,6 +914,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -925,8 +938,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -977,13 +1012,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -993,20 +1040,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts index e92bf36..6442003 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_buildroot_vccktest.dts @@ -564,7 +564,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -702,6 +701,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -905,6 +917,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -928,8 +941,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -980,13 +1015,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -996,20 +1043,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts index 9d35b05..380ba94 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905d2_u200_drm_buildroot.dts @@ -579,7 +579,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -717,6 +716,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -916,6 +928,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -939,8 +952,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -991,13 +1026,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1007,20 +1054,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211.dts index 08d52a0..68cf950 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211.dts @@ -518,7 +518,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -657,6 +656,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -860,6 +874,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -883,6 +898,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -949,13 +987,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -965,20 +1015,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_1g.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_1g.dts index 1dce4d3..ce79f0e 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_1g.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_1g.dts @@ -510,7 +510,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -649,6 +648,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -851,6 +865,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -874,6 +889,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -940,13 +978,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -956,20 +1006,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_512m.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_512m.dts index 7e8d963..e8e9153 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_512m.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_512m.dts @@ -505,7 +505,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -644,6 +643,21 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -847,6 +861,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -870,6 +885,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -936,13 +974,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -952,20 +1002,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts index 981f395..8b2babc 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u211_buildroot.dts @@ -598,7 +598,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -736,6 +735,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -904,6 +916,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -927,8 +940,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -979,13 +1014,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -995,20 +1042,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212.dts index 23ed588..898f0d3 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212.dts @@ -549,7 +549,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -688,6 +687,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -904,6 +917,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -927,6 +941,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -993,13 +1030,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1009,20 +1058,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_1g.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_1g.dts index b742fe8..6325200 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_1g.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_1g.dts @@ -542,7 +542,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -681,6 +680,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -896,6 +909,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -919,6 +933,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -985,13 +1022,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1001,20 +1050,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts index fa91c38..ed3bb61 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_buildroot.dts @@ -597,7 +597,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -735,6 +734,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -903,6 +915,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -926,8 +939,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -978,13 +1013,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -994,20 +1041,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts index cebebe0..bf0654d 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905x2_u212_drm_buildroot.dts @@ -584,7 +584,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -722,6 +721,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -903,6 +915,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -926,8 +939,30 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; aml_spdif: spdif { compatible = "amlogic, g12a-snd-spdif-a"; @@ -978,13 +1013,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -994,20 +1041,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905y2_u220.dts b/arch/arm64/boot/dts/amlogic/g12a_s905y2_u220.dts index 738792d..094a569 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905y2_u220.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905y2_u220.dts @@ -493,7 +493,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -632,6 +631,20 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -843,6 +856,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -866,6 +880,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -932,13 +969,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -948,20 +997,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12a_s905y2_u221.dts b/arch/arm64/boot/dts/amlogic/g12a_s905y2_u221.dts index 2ae7ce4..87e704d 100644 --- a/arch/arm64/boot/dts/amlogic/g12a_s905y2_u221.dts +++ b/arch/arm64/boot/dts/amlogic/g12a_s905y2_u221.dts @@ -461,7 +461,6 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - aml-audio-card,loopback = <&aml_loopback>; aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -599,6 +598,7 @@ sound-dai = <&dummy_codec>; }; }; + /* * dai link for i2s to hdmix, * Notice to select a tdm lane not used by hw @@ -626,6 +626,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -805,6 +818,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -828,6 +842,29 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ + }; + + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; + #sound-dai-cells = <0>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; + + status = "disabled"; }; /* copy a useless tdm to output for hdmi, no pinmux */ @@ -894,13 +931,24 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -910,20 +958,30 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_skt.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_skt.dts index 171aec3..30a43ea 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_skt.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_skt.dts @@ -509,7 +509,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -624,6 +624,39 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -919,6 +952,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -942,19 +976,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1008,13 +1050,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1024,22 +1078,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_skt_a.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_skt_a.dts index f20a7b7..2455013 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_skt_a.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_skt_a.dts @@ -509,7 +509,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -624,6 +624,39 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@7 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + cpu { + sound-dai = <&tdmlb>; + 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>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -899,6 +932,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -922,19 +956,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -988,13 +1030,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1004,22 +1058,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400.dts index 304ceee..44bc11f 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400.dts @@ -516,7 +516,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -631,6 +631,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -898,6 +911,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -921,19 +935,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -987,13 +1009,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1003,22 +1037,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_a.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_a.dts index 36c3170..5f1dbe1 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_a.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_a.dts @@ -516,7 +516,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -631,6 +631,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -878,6 +891,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -901,19 +915,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -967,13 +989,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -983,22 +1017,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts index 2ffeeab..99fcdd2 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot.dts @@ -586,7 +586,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -701,6 +701,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -990,6 +1003,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -1013,19 +1027,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1079,13 +1101,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1095,22 +1129,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts index e86e010..60535b9 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_a.dts @@ -573,7 +573,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -688,6 +688,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -957,6 +970,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -980,19 +994,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1046,13 +1068,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1062,22 +1096,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts index 280a07a..5ceb254 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest.dts @@ -552,7 +552,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -667,6 +667,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -883,6 +896,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -906,19 +920,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -972,13 +994,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -988,22 +1022,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts index ac5ca36..63527bf 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_buildroot_vccktest_a.dts @@ -539,7 +539,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -654,6 +654,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -870,6 +883,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -893,19 +907,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -959,13 +981,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -975,22 +1009,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts index f22c04a..836a441 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311d_w400_drm_buildroot.dts @@ -574,7 +574,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>; @@ -689,6 +689,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -973,6 +986,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -996,19 +1010,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1062,13 +1084,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1078,22 +1112,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot.dts b/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot.dts index 63f6b0d..742c0a9 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot.dts @@ -564,7 +564,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; @@ -679,6 +679,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -963,6 +976,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -986,19 +1000,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1051,13 +1073,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1067,22 +1101,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot_a.dts b/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot_a.dts index a37936e..e9b692d 100644 --- a/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot_a.dts +++ b/arch/arm64/boot/dts/amlogic/g12b_a311x_w411_buildroot_a.dts @@ -566,7 +566,7 @@ compatible = "amlogic, g12a-sound-card"; aml-audio-card,name = "AML-AUGESOUND"; - //aml-audio-card,loopback = <&aml_loopback>; + //aml-audio-card,aux-devs = <&amlogic_codec>; /*avout mute gpio*/ avout_mute-gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>; @@ -681,6 +681,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@6 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopback>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -932,6 +945,7 @@ "samesource_srcpll", "samesource_clk"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ /* * 0: tdmout_a; * 1: tdmout_b; @@ -955,19 +969,27 @@ clock-names = "mclk", "clk_srcpll"; pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>; + mclk_pad = <1>; /* 0: mclk_0; 1: mclk_1 */ }; - /* copy a useless tdm to output for hdmi, no pinmux */ - aml_i2s2hdmi: i2s2hdmi { - compatible = "amlogic, g12a-snd-tdmc"; + tdmlb: tdm@3 { + compatible = "amlogic, g12a-snd-tdmlb"; #sound-dai-cells = <0>; - dai-tdm-lane-slot-mask-out = <1 1 1 1>; - dai-tdm-clk-sel = <2>; - clocks = <&clkaudio CLKID_AUDIO_MCLK_C - &clkc CLKID_MPLL2>; + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; - - i2s2hdmi = <1>; + /* + * select tdmin_lb src; + *0: TDMOUTA + *1: TDMOUTB + *2: TDMOUTC + *3: PAD_TDMINA + *4: PAD_TDMINB + *5: PAD_TDMINC + */ + lb-src-sel = <1>; status = "okay"; }; @@ -1020,13 +1042,25 @@ filter_mode = <1>; /* mode 0~4, defalut:1 */ status = "okay"; }; - aml_loopback: loopback { - compatible = "amlogic, snd-loopback"; - /* - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - lb_mode = <0>; + + loopback:loopback@0 { + compatible = "amlogic, g12a-loopback"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; /* datain src * 0: tdmin_a; @@ -1036,22 +1070,32 @@ * 4: pdmin; */ datain_src = <4>; - datain_chnum = <8>; - datain_chmask = <0x3f>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; /* tdmin_lb src * 0: tdmoutA * 1: tdmoutB * 2: tdmoutC - * 3: PAD_tdminA - * 4: PAD_tdminB - * 5: PAD_tdminC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux */ - datalb_src = <2>; - datalb_chnum = <8>; + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; - status = "disabled"; + status = "okay"; }; audioresample: resample { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts index f61aefe..9609a03 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts @@ -719,6 +719,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -730,6 +731,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1159,6 +1173,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, sm1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa: spdif@0 { compatible = "amlogic, sm1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1294,6 +1357,116 @@ status = "okay"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, sm1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, sm1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts index d3dd356..73f3343 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts @@ -702,6 +702,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@6 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -713,6 +714,46 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + aml-audio-card,dai-link@8 { + format = "i2s"; + mclk-fs = <256>; + //continuous-clock; + //bitclock-inversion; + //frame-inversion; + /* master mode */ + bitclock-master = <&tdmlb>; + frame-master = <&tdmlb>; + /* slave mode */ + //bitclock-master = <&tdmlbcodec>; + //frame-master = <&tdmlbcodec>; + /* suffix-name, sync with android audio hal used for */ + //suffix-name = "alsaPORT-tdmlb"; + cpu { + sound-dai = <&tdmlb>; + dai-tdm-slot-tx-mask = <1 1>; + dai-tdm-slot-rx-mask = <1 1>; + dai-tdm-slot-num = <2>; + dai-tdm-slot-width = <32>; + system-clock-frequency = <12288000>; + }; + tdmlbcodec: codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1141,6 +1182,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, sm1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "okay"; + }; + spdifa: spdif@0 { compatible = "amlogic, sm1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1276,6 +1366,116 @@ status = "okay"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, sm1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, sm1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts b/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts index f038414..dc7a63c 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts @@ -795,6 +795,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; audiolocker: locker { compatible = "amlogic, audiolocker"; @@ -1179,6 +1192,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, sm1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa: spdif@0 { compatible = "amlogic, sm1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1314,6 +1376,116 @@ status = "okay"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, sm1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <6>; + datain_chmask = <0x3f>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 1 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, sm1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts index a171e51..921aa1c 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts @@ -435,6 +435,29 @@ }; }; + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + suffix-name = "alsaPORT-loopbackb"; + cpu { + sound-dai = <&loopbackb>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1285,6 +1308,7 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ status = "okay"; @@ -1307,6 +1331,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1325,9 +1351,60 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa:spdif@0 { compatible = "amlogic, tl1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1486,6 +1563,151 @@ status = "disabled"; }; + vad:vad { + compatible = "amlogic, snd-vad"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_TOVAD + &clkc CLKID_FCLK_DIV5 + &clkaudio CLKID_AUDIO_VAD>; + clock-names = "gate", "pll", "clk"; + + interrupts = ; + interrupt-names = "irq_wakeup", "irq_frame_sync"; + + /* + * Data src sel: + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + * 5: loopback_b; + * 6: tdmin_lb; + * 7: loopback_a; + */ + src = <4>; + + /* + * deal with hot word in user space or kernel space + * 0: in user space + * 1: in kernel space + */ + level = <1>; + + status = "disabled"; + }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index 335a3f3..cf97a08 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -441,6 +441,18 @@ }; }; + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1347,6 +1359,7 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ status = "okay"; @@ -1369,6 +1382,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1387,9 +1402,60 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa:spdif@0 { compatible = "amlogic, tl1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1547,6 +1613,151 @@ status = "disabled"; }; + vad:vad { + compatible = "amlogic, snd-vad"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_TOVAD + &clkc CLKID_FCLK_DIV5 + &clkaudio CLKID_AUDIO_VAD>; + clock-names = "gate", "pll", "clk"; + + interrupts = ; + interrupt-names = "irq_wakeup", "irq_frame_sync"; + + /* + * Data src sel: + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + * 5: loopback_b; + * 6: tdmin_lb; + * 7: loopback_a; + */ + src = <4>; + + /* + * deal with hot word in user space or kernel space + * 0: in user space + * 1: in kernel space + */ + level = <1>; + + status = "disabled"; + }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts index e2f6af2..d7e8e2f 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts @@ -435,6 +435,18 @@ }; }; + aml-audio-card,dai-link@7 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1341,6 +1353,7 @@ /* In for ACODEC_ADC */ acodec_adc = <1>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ status = "okay"; @@ -1363,6 +1376,8 @@ &clkc CLKID_MPLL1>; clock-names = "mclk", "clk_srcpll"; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; @@ -1381,9 +1396,60 @@ pinctrl-names = "tdm_pins"; pinctrl-0 = <&tdmout_c &tdmin_c>; + mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tl1-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + spdifa:spdif@0 { compatible = "amlogic, tl1-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1542,6 +1608,151 @@ status = "disabled"; }; + vad:vad { + compatible = "amlogic, snd-vad"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_TOVAD + &clkc CLKID_FCLK_DIV5 + &clkaudio CLKID_AUDIO_VAD>; + clock-names = "gate", "pll", "clk"; + + interrupts = ; + interrupt-names = "irq_wakeup", "irq_frame_sync"; + + /* + * Data src sel: + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + * 5: loopback_b; + * 6: tdmin_lb; + * 7: loopback_a; + */ + src = <4>; + + /* + * deal with hot word in user space or kernel space + * 0: in user space + * 1: in kernel space + */ + level = <1>; + + status = "disabled"; + }; + + loopbacka:loopback@0 { + compatible = "amlogic, tl1-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tl1-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts b/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts index ca5511b..2d1982c 100644 --- a/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts +++ b/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab311.dts @@ -443,6 +443,19 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ @@ -1400,6 +1413,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; @@ -1592,13 +1654,16 @@ vad:vad { compatible = "amlogic, snd-vad"; #sound-dai-cells = <0>; + clocks = <&clkaudio CLKID_AUDIO_GATE_TOVAD &clkc CLKID_FCLK_DIV5 &clkaudio CLKID_AUDIO_VAD>; clock-names = "gate", "pll", "clk"; + interrupts = ; interrupt-names = "irq_wakeup", "irq_frame_sync"; + /* * Data src sel: * 0: tdmin_a; @@ -1611,12 +1676,124 @@ * 7: loopback_a; */ src = <4>; + /* * deal with hot word in user space or kernel space * 0: in user space * 1: in kernel space */ level = <1>; + + status = "disabled"; + }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + status = "disabled"; }; }; /* end of audiobus */ diff --git a/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab319.dts b/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab319.dts index ff1b559..d3c5a7a 100644 --- a/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab319.dts +++ b/arch/arm64/boot/dts/amlogic/tm2_t962e2_ab319.dts @@ -433,6 +433,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@7 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -444,6 +445,44 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* aml-audio-card,dai-link@9 { + * format = "i2s"; + * mclk-fs = <256>; + * //continuous-clock; + * //bitclock-inversion; + * //frame-inversion; + * bitclock-master = <&tdmlb>; + * frame-master = <&tdmlb>; + * //bitclock-master = <&tdmlbcodec>; + * //frame-master = <&tdmlbcodec>; + * //suffix-name = "alsaPORT-tdmlb"; + * cpu { + * sound-dai = <&tdmlb>; + * dai-tdm-slot-tx-mask = <1 1>; + * dai-tdm-slot-rx-mask = <1 1>; + * dai-tdm-slot-num = <2>; + * dai-tdm-slot-width = <32>; + * system-clock-frequency = <12288000>; + * }; + * tdmlbcodec: codec { + * sound-dai = <&dummy_codec>; + * }; + *}; + */ }; /* Audio Related end */ @@ -1315,6 +1354,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; @@ -1334,6 +1422,7 @@ filter_mode = <1>; status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1535,6 +1624,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts b/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts index 4c072ba..1856f8f 100644 --- a/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts +++ b/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab301.dts @@ -324,7 +324,6 @@ }; aml-audio-card,dai-link@1 { - format = "i2s"; mclk-fs = <256>; //continuous-clock; @@ -359,7 +358,6 @@ }; aml-audio-card,dai-link@2 { - format = "i2s"; mclk-fs = <256>; //continuous-clock; @@ -447,8 +445,22 @@ sound-dai = <&dummy_codec>; }; }; + + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; }; /* Audio Related end */ + dvb { compatible = "amlogic, dvb"; status = "okay"; @@ -1406,9 +1418,59 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM &clkc CLKID_FCLK_DIV3 &clkc CLKID_MPLL3 @@ -1419,12 +1481,16 @@ "dclk_srcpll", "pdm_dclk", "pdm_sysclk"; + pinctrl-names = "pdm_pins"; pinctrl-0 = <&pdmin>; + /* mode 0~4, defalut:1 */ filter_mode = <1>; + status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1483,7 +1549,6 @@ compatible = "amlogic, snd-extn"; #sound-dai-cells = <0>; - interrupts = ; interrupt-names = "irq_frhdmirx"; @@ -1513,6 +1578,7 @@ "tx_dmac", "tx_cmdc_srcpll", "tx_dmac_srcpll"; + interrupts = < GIC_SPI 88 IRQ_TYPE_EDGE_RISING GIC_SPI 87 IRQ_TYPE_EDGE_RISING @@ -1626,6 +1692,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab309.dts b/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab309.dts index 299cba2..3fb9d6e 100644 --- a/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab309.dts +++ b/arch/arm64/boot/dts/amlogic/tm2_t962x3_ab309.dts @@ -434,6 +434,7 @@ sound-dai = <&dummy_codec>; }; }; + aml-audio-card,dai-link@7 { mclk-fs = <256>; suffix-name = "alsaPORT-earc"; @@ -445,9 +446,47 @@ sound-dai = <&dummy_codec>; }; }; - }; + aml-audio-card,dai-link@8 { + mclk-fs = <256>; + continuous-clock; + suffix-name = "alsaPORT-loopback"; + cpu { + sound-dai = <&loopbacka>; + system-clock-frequency = <12288000>; + }; + codec { + sound-dai = <&dummy_codec>; + }; + }; + + /* aml-audio-card,dai-link@9 { + * format = "i2s"; + * mclk-fs = <256>; + * //continuous-clock; + * //bitclock-inversion; + * //frame-inversion; + * bitclock-master = <&tdmlb>; + * frame-master = <&tdmlb>; + * //bitclock-master = <&tdmlbcodec>; + * //frame-master = <&tdmlbcodec>; + * //suffix-name = "alsaPORT-tdmlb"; + * cpu { + * sound-dai = <&tdmlb>; + * dai-tdm-slot-tx-mask = <1 1>; + * dai-tdm-slot-rx-mask = <1 1>; + * dai-tdm-slot-num = <2>; + * dai-tdm-slot-width = <32>; + * system-clock-frequency = <12288000>; + * }; + * tdmlbcodec: codec { + * sound-dai = <&dummy_codec>; + * }; + *}; + */ + }; /* Audio Related end */ + dvb { compatible = "amlogic, dvb"; status = "okay"; @@ -1316,6 +1355,55 @@ status = "okay"; }; + tdmlb:tdm@3 { + compatible = "amlogic, tm2-snd-tdmlb"; + #sound-dai-cells = <0>; + + dai-tdm-lane-lb-slot-mask-in = <1 0 0 0>; + dai-tdm-clk-sel = <1>; + + clocks = <&clkaudio CLKID_AUDIO_MCLK_B + &clkc CLKID_MPLL1>; + clock-names = "mclk", "clk_srcpll"; + + /* + * select tdmin_lb src; + * AXG + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA + * 4: PAD_TDMINB + * 5: PAD_TDMINC + * + * G12A/G12B + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D*, oe pin + * 7: PAD_TDMINB_D*, oe pin + * + * TL1/SM1 + * 0: TDMOUTA + * 1: TDMOUTB + * 2: TDMOUTC + * 3: PAD_TDMINA_DIN* + * 4: PAD_TDMINB_DIN* + * 5: PAD_TDMINC_DIN* + * 6: PAD_TDMINA_D* + * 7: PAD_TDMINB_D* + * 8: PAD_TDMINC_D* + * 9: HDMIRX_I2S + * 10: ACODEC_ADC + */ + lb-src-sel = <1>; + + status = "disabled"; + }; + pdm:pdm { compatible = "amlogic, tm2-snd-pdm"; #sound-dai-cells = <0>; @@ -1335,6 +1423,7 @@ filter_mode = <1>; status = "okay"; }; + spdifa:spdif@0 { compatible = "amlogic, tm2-snd-spdif-a"; #sound-dai-cells = <0>; @@ -1536,6 +1625,116 @@ status = "disabled"; }; + + loopbacka:loopback@0 { + compatible = "amlogic, tm2-loopbacka"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* calc mclk for datalb */ + mclk-fs = <256>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <0>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "okay"; + }; + + loopbackb:loopback@1 { + compatible = "amlogic, tm2-loopbackb"; + #sound-dai-cells = <0>; + + clocks = <&clkaudio CLKID_AUDIO_GATE_PDM + &clkc CLKID_FCLK_DIV3 + &clkc CLKID_MPLL3 + &clkaudio CLKID_AUDIO_PDMIN0 + &clkaudio CLKID_AUDIO_PDMIN1 + &clkc CLKID_MPLL0 + &clkaudio CLKID_AUDIO_MCLK_A>; + clock-names = "pdm_gate", + "pdm_sysclk_srcpll", + "pdm_dclk_srcpll", + "pdm_dclk", + "pdm_sysclk", + "tdminlb_mpll", + "tdminlb_mclk"; + + /* calc mclk for datain_lb */ + mclk-fs = <256>; + + /* datain src + * 0: tdmin_a; + * 1: tdmin_b; + * 2: tdmin_c; + * 3: spdifin; + * 4: pdmin; + */ + datain_src = <4>; + datain_chnum = <4>; + datain_chmask = <0xf>; + /* config which data pin for loopback */ + datain-lane-mask-in = <1 0 1 0>; + + /* tdmin_lb src + * 0: tdmoutA + * 1: tdmoutB + * 2: tdmoutC + * 3: PAD_TDMINA_DIN*, refer to core pinmux + * 4: PAD_TDMINB_DIN*, refer to core pinmux + * 5: PAD_TDMINC_DIN*, refer to core pinmux + * 6: PAD_TDMINA_D*, oe, refer to core pinmux + * 7: PAD_TDMINB_D*, oe, refer to core pinmux + */ + /* if tdmin_lb >= 3, use external loopback */ + datalb_src = <1>; + datalb_chnum = <2>; + datalb_chmask = <0x3>; + /* config which data pin as loopback */ + datalb-lane-mask-in = <1 0 0 0>; + + status = "disabled"; + }; }; /* end of audiobus */ &pinctrl_periphs { diff --git a/sound/soc/amlogic/auge/Makefile b/sound/soc/amlogic/auge/Makefile index b8d6cc8..fb7a973 100644 --- a/sound/soc/amlogic/auge/Makefile +++ b/sound/soc/amlogic/auge/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_AMLOGIC_SND_SOC_AUGE) += audio_controller.o \ pdm_hw_coeff.o \ iomap.o \ ddr_mngr.o \ + loopback.o \ loopback_hw.o \ audio_utils.o \ locker.o \ diff --git a/sound/soc/amlogic/auge/audio_utils.c b/sound/soc/amlogic/auge/audio_utils.c index 505f994..f5205a1 100644 --- a/sound/soc/amlogic/auge/audio_utils.c +++ b/sound/soc/amlogic/auge/audio_utils.c @@ -14,24 +14,18 @@ * more details. * */ - #include "audio_utils.h" #include "regs.h" #include "iomap.h" -#include "loopback_hw.h" #include "spdif_hw.h" -#include "pdm_hw.h" -#include "tdm_hw.h" -#include "ddr_mngr.h" #include "resample.h" #include "effects_v2.h" #include "vad.h" +#include "ddr_mngr.h" #include #include -#include - struct snd_elem_info { struct soc_enum *ee; int reg; @@ -39,132 +33,8 @@ struct snd_elem_info { u32 mask; }; -static unsigned int loopback_enable; -static unsigned int loopback_is_running; -static unsigned int datain_datalb_total; static unsigned int audio_inskew; -static const char *const loopback_enable_texts[] = { - "Disable", - "Enable", -}; - -static const struct soc_enum loopback_enable_enum = - SOC_ENUM_SINGLE(EE_AUDIO_LB_CTRL0, - 31, - ARRAY_SIZE(loopback_enable_texts), - loopback_enable_texts); - - -static int loopback_enable_get_enum( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.enumerated.item[0] = loopback_enable; - - return 0; -} - -static int loopback_enable_set_enum( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - loopback_enable = ucontrol->value.enumerated.item[0]; - - return 0; -} - -static int datain_datalb_total_get_param( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.bytes.data[0] = datain_datalb_total; - - return 0; -} - -static int datain_datalb_total_set_param( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - datain_datalb_total = ucontrol->value.bytes.data[0]; - - return 0; -} - -static unsigned int loopback_datain; - -static const char *const loopback_datain_texts[] = { - "TDMIN_A", - "TDMIN_B", - "TDMIN_C", - "SPDIFIN", - "PDMIN", -}; - -static const struct soc_enum loopback_datain_enum = - SOC_ENUM_SINGLE(EE_AUDIO_LB_CTRL0, 0, ARRAY_SIZE(loopback_datain_texts), - loopback_datain_texts); - - -static int loopback_datain_get_enum( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.enumerated.item[0] = loopback_datain; - - return 0; -} - -static int loopback_datain_set_enum( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - loopback_datain = ucontrol->value.enumerated.item[0]; - audiobus_update_bits(EE_AUDIO_LB_CTRL0, 0, loopback_datain); - - return 0; -} - -static unsigned int loopback_tdminlb; - -static const char *const loopback_tdminlb_texts[] = { - "TDMOUT_A", - "TDMOUT_B", - "TDMOUT_C", - "TDMIN_A", - "TDMIN_B", - "TDMIN_C", -}; - -static const struct soc_enum loopback_tdminlb_enum = - SOC_ENUM_SINGLE(EE_AUDIO_TDMIN_LB_CTRL, - 20, - ARRAY_SIZE(loopback_tdminlb_texts), - loopback_tdminlb_texts); - - -static int loopback_tdminlb_get_enum( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.enumerated.item[0] = loopback_tdminlb; - - return 0; -} - -static int loopback_tdminlb_set_enum( - struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - loopback_tdminlb = ucontrol->value.enumerated.item[0]; - audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, - 0xf << 20, - loopback_datain); - - return 0; -} - #if 0 static int snd_int_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) @@ -726,27 +596,6 @@ static int tdmout_c_binv_set_enum( SND_BYTE(xname, type, func, xshift, xmask) static const struct snd_kcontrol_new snd_auge_controls[] = { - /* loopback enable */ - SOC_ENUM_EXT("Loopback Enable", - loopback_enable_enum, - loopback_enable_get_enum, - loopback_enable_set_enum), - - SND_SOC_BYTES_EXT("datain_datalb_total", 1, - datain_datalb_total_get_param, - datain_datalb_total_set_param), - - /* loopback data in source */ - SOC_ENUM_EXT("Loopback datain source", - loopback_datain_enum, - loopback_datain_get_enum, - loopback_datain_set_enum), - - /* loopback data tdmin lb */ - SOC_ENUM_EXT("Loopback tmdin lb source", - loopback_tdminlb_enum, - loopback_tdminlb_get_enum, - loopback_tdminlb_set_enum), #if 0 /*TDMIN_A swap*/ SND_SWAP("TDMIN_A Ch0 Swap", TDMIN_A, in_swap_channel_enum, 0, 0x7), @@ -1058,519 +907,6 @@ int snd_card_add_kcontrols(struct snd_soc_card *card) } -int loopback_parse_of(struct device_node *node, - struct loopback_cfg *lb_cfg) -{ - struct platform_device *pdev; - const __be32 *of_slot_mask; - unsigned int lane_mask = 0; - int i, ret, set_num = 0; - u32 val; - - pdev = of_find_device_by_node(node); - if (!pdev) { - dev_err(&pdev->dev, "failed to find platform device\n"); - ret = -EINVAL; - goto fail; - } - - /*mpll used for tdmin*/ - lb_cfg->tdmin_mpll = devm_clk_get(&pdev->dev, "datalb_mpll"); - if (IS_ERR(lb_cfg->tdmin_mpll)) { - dev_err(&pdev->dev, - "Can't retrieve tdmin_mpll clock\n"); - lb_cfg->tdmin_mpll = NULL; - } - - ret = of_property_read_u32(node, "lb_mode", - &lb_cfg->lb_mode); - if (ret) { - pr_err("failed to get lb_mode, set it default\n"); - lb_cfg->lb_mode = 0; - ret = 0; - } - - ret = of_property_read_u32(node, "datain_src", - &lb_cfg->datain_src); - if (ret) { - pr_err("failed to get datain_src\n"); - ret = -EINVAL; - goto fail; - } - ret = of_property_read_u32(node, "datain_chnum", - &lb_cfg->datain_chnum); - if (ret) { - pr_err("failed to get datain_chnum\n"); - ret = -EINVAL; - goto fail; - } - ret = of_property_read_u32(node, "datain_chmask", - &lb_cfg->datain_chmask); - if (ret) { - pr_err("failed to get datain_chmask\n"); - ret = -EINVAL; - goto fail; - } - - ret = of_property_read_u32(node, "datalb_src", - &lb_cfg->datalb_src); - if (ret) { - pr_err("failed to get datalb_src\n"); - ret = -EINVAL; - goto fail; - } - ret = of_property_read_u32(node, "datalb_chnum", - &lb_cfg->datalb_chnum); - if (ret) { - pr_err("failed to get datalb_chnum\n"); - ret = -EINVAL; - goto fail; - } - ret = of_property_read_u32(node, "datalb_chmask", - &lb_cfg->datalb_chmask); - if (ret) { - pr_err("failed to get datalb_chmask\n"); - ret = -EINVAL; - goto fail; - } - - of_slot_mask = of_get_property(node, "datalb-lane-mask-in", &val); - if (!of_slot_mask) { - pr_err("if use extern loopback, pls set datalb-lane-mask-in\n"); - } else { - val /= sizeof(u32); - for (i = 0; i < val; i++) - if (be32_to_cpup(&of_slot_mask[i])) - lane_mask |= (1 << i); - for (i = 0; i < 4; i++) { - if ((1 << i) & lane_mask) { - /*each lane only L/R masked*/ - lb_cfg->datalb_chswap |= - (i * 2) << (set_num++ * 4); - lb_cfg->datalb_chswap |= - (i * 2 + 1) << (set_num++ * 4); - } - } - } - ret = of_property_read_u32(node, "datalb_clk", - &lb_cfg->datalb_clk); - if (ret) { - pr_err("if no datalb_clk on dts, it equal is datalb_src\n"); - lb_cfg->datalb_clk = lb_cfg->datalb_src; - } - - ret = of_property_read_u32(node, "datain_datalb_total", - &lb_cfg->datain_datalb_total); - if (ret) { - pr_err("no register datain_datalb_total,it also can work\n"); - lb_cfg->datain_datalb_total = 0; - } else { - if (lb_cfg->datain_datalb_total > 8) { - lb_cfg->datain_chnum = 8; - lb_cfg->datain_chmask = 0xff; - lb_cfg->datalb_chnum = 8; - lb_cfg->datalb_chmask = 0xff; - lb_cfg->datalb_chswap = 0x76543210; - } - } - datain_datalb_total = lb_cfg->datain_datalb_total; - - loopback_datain = lb_cfg->datain_src; - loopback_tdminlb = lb_cfg->datalb_src; - - pr_info("parse loopback:, \tlb mode:%d\n", - lb_cfg->lb_mode); - pr_info("\tdatain_src:%d, datain_chnum:%d, datain_chumask:%x\n", - lb_cfg->datain_src, - lb_cfg->datain_chnum, - lb_cfg->datain_chmask); - pr_info("\tdatalb_src:%d, datalb_chnum:%d\n", - lb_cfg->datalb_src, - lb_cfg->datalb_chnum); - pr_info("\tdatalb_chswap:0x%x,datalb_chmask:%x\n", - lb_cfg->datalb_chswap, - lb_cfg->datalb_chmask); - -fail: - return ret; -} - -int loopback_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct loopback_cfg *lb_cfg, - unsigned int mclk) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - unsigned int bclk_sel, fsclk_sel; - int bit_depth; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - return 0; - bit_depth = snd_pcm_format_width(runtime->format); - - if (lb_cfg->datalb_src >= 3) { - /*tdm in*/ - /*for i2s mode*/ - unsigned int sclk_div = 4 - 1; - unsigned int ratio = params_channels(params) * bit_depth - 1; - unsigned int fsclk_hi; - unsigned int clk_id = lb_cfg->datalb_src - 3; - unsigned int mul = 2; - unsigned int mpll_freq, offset, reg; - - /*lrclk sclk depend on default 8ch setting,*/ - /* so if num of channels is 4, to change ratio*/ - if (params_channels(params) == 4) - ratio = ratio*2; - - fsclk_hi = ratio/2; - - pr_info("%s, channels:%d, format:%d, ratio:%d\n", - __func__, - params_channels(params), - bit_depth, - ratio); - - bclk_sel = clk_id; - fsclk_sel = clk_id; - - /*mclk*/ - mpll_freq = mclk * mul; - clk_set_rate(lb_cfg->tdmin_mpll, mpll_freq); - pr_info("mpll freq:%d, %lu\n", mpll_freq, - clk_get_rate(lb_cfg->tdmin_mpll)); - offset = EE_AUDIO_MCLK_B_CTRL(0) - EE_AUDIO_MCLK_A_CTRL(0); - reg = EE_AUDIO_MCLK_A_CTRL(0) + offset * clk_id; - audiobus_write(reg, - 1 << 31 | /*clk enable*/ - clk_id << 24 | /*clk src*/ - (mul - 1)); /*clk_div mclk*/ - - /*sclk, lrclk*/ - offset = EE_AUDIO_MST_B_SCLK_CTRL0 - EE_AUDIO_MST_A_SCLK_CTRL0; - reg = EE_AUDIO_MST_A_SCLK_CTRL0 + offset * clk_id; - audiobus_update_bits(reg, - 0x3 << 30 | 0x3ff << 20 | 0x3ff<<10 | 0x3ff, - 0x3 << 30 | sclk_div << 20 | fsclk_hi << 10 - | ratio); - - audiobus_update_bits( - EE_AUDIO_CLK_TDMIN_LB_CTRL, - 0x3 << 30 | 1 << 29 | 0xf << 24 | 0xf << 20, - 0x3 << 30 | 1 << 29 | bclk_sel << 24 | fsclk_sel << 20); - } - return 0; -} - -int loopback_prepare( - struct snd_pcm_substream *substream, - struct loopback_cfg *lb_cfg) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - unsigned int bitwidth; - unsigned int datain_toddr_type, datalb_toddr_type; - unsigned int datain_msb, datain_lsb, datalb_msb, datalb_lsb; - struct lb_cfg datain_cfg; - struct lb_cfg datalb_cfg; - struct audio_data ddrdata; - struct data_in datain; - struct data_lb datalb; - - if (!lb_cfg) - return -EINVAL; - - pr_info("%s\n", __func__); - - bitwidth = snd_pcm_format_width(runtime->format); - switch (lb_cfg->datain_src) { - case DATAIN_TDMA: - case DATAIN_TDMB: - case DATAIN_TDMC: - case DATAIN_PDM: - datain_toddr_type = 0; - datain_msb = 32 - 1; - datain_lsb = 0; - break; - case DATAIN_SPDIF: - datain_toddr_type = 3; - datain_msb = 27; - datain_lsb = 4; - if (bitwidth <= 24) - datain_lsb = 28 - bitwidth; - else - datain_lsb = 4; - break; - default: - pr_err("unsupport data in source:%d\n", - lb_cfg->datain_src); - return -EINVAL; - } - - switch (lb_cfg->datalb_src) { - case TDMINLB_TDMOUTA: - case TDMINLB_TDMOUTB: - case TDMINLB_TDMOUTC: - case TDMINLB_PAD_TDMINA: - case TDMINLB_PAD_TDMINB: - case TDMINLB_PAD_TDMINC: - if (bitwidth == 24) { - datalb_toddr_type = 4; - datalb_msb = 32 - 1; - datalb_lsb = 32 - bitwidth; - } else { - datalb_toddr_type = 0; - datalb_msb = 32 - 1; - datalb_lsb = 0; - } - break; - default: - pr_err("unsupport data lb source:%d\n", - lb_cfg->datalb_src); - return -EINVAL; - } - - datain_cfg.ext_signed = 0; - datain_cfg.chnum = lb_cfg->datain_chnum; - datain_cfg.chmask = lb_cfg->datain_chmask; - ddrdata.combined_type = datain_toddr_type; - ddrdata.msb = datain_msb; - ddrdata.lsb = datain_lsb; - ddrdata.src = lb_cfg->datain_src; - datain.config = &datain_cfg; - datain.ddrdata = &ddrdata; - - datalb_cfg.ext_signed = 0; - datalb_cfg.chnum = lb_cfg->datalb_chnum; - datalb_cfg.chmask = lb_cfg->datalb_chmask; - datalb.config = &datalb_cfg; - datalb.ddr_type = datalb_toddr_type; - datalb.msb = datalb_msb; - datalb.lsb = datalb_lsb; - - datain_config(&datain); - datalb_config(&datalb); - - lb_cfg->datain_datalb_total = datain_datalb_total; - - if (lb_cfg->datain_datalb_total > 8) { - lb_cfg->datain_chnum = 8; - lb_cfg->datain_chmask = 0xff; - lb_cfg->datalb_chnum = 8; - lb_cfg->datalb_chmask = 0xff; - lb_cfg->datalb_chswap = 0x76543210; - } - datalb_ctrl(lb_cfg); - lb_mode(lb_cfg->lb_mode); - - return 0; -} - -void toddr_enable(int is_enable, int toddr_index) -{ - int offset = EE_AUDIO_TODDR_B_CTRL0 - EE_AUDIO_TODDR_A_CTRL0; - int reg = EE_AUDIO_TODDR_A_CTRL0 + offset * toddr_index; - - audiobus_update_bits( - reg, - 0x1 << 31, - is_enable << 31); -} - -void frddr_enable(int is_enable, int frddr_index) -{ - int offset = EE_AUDIO_FRDDR_B_CTRL0 - EE_AUDIO_FRDDR_A_CTRL0; - int reg = EE_AUDIO_FRDDR_A_CTRL0 + offset * frddr_index; - - audiobus_update_bits( - reg, - 0x1 << 31, - is_enable << 31); -} - -static void loopback_modules_disable( - struct loopback_cfg *lb_cfg, - int tdm_index, - int frddr_index, int toddr_index) -{ - /* tdminLB */ - tdmin_lb_fifo_enable(0); - tdmin_lb_enable(tdm_index, 0); - - /* datain src */ - switch (lb_cfg->datain_src) { - case 0: - case 1: - case 2: - /*tdm in*/ - break; - case 3: - /*spdif in*/ - break; - case 4: - /*pdm in*/ - pdm_enable(0); - break; - default: - pr_err("unsupport datain source!!\n"); - return; - } - /* loopback */ - lb_enable(0); - - /* toddr */ - if (toddr_index >= 0) - toddr_enable(0, toddr_index); - - /* frddr */ - if (frddr_index >= 3) - toddr_enable(0, frddr_index - 3); - else if (frddr_index >= 0) - frddr_enable(0, frddr_index); - - /* tdmout */ - if (frddr_index >= 0) { - tdm_fifo_enable(tdm_index, 0); - tdm_enable(tdm_index, 0); - } -} - -static void loopback_modules_enable( - struct loopback_cfg *lb_cfg, - int tdm_index, - int frddr_index, int toddr_index) -{ - /* - * Loopback enable in sequence: - * tdmout->frddr->toddr->loopback->pdmin->tdminLB - */ - - /* tdmout */ - if (frddr_index >= 0) { - tdm_fifo_enable(tdm_index, 1); - tdm_enable(tdm_index, 1); - } - - /* frddr */ - if (frddr_index >= 3) - toddr_enable(1, frddr_index - 3); - else if (frddr_index >= 0) - frddr_enable(1, frddr_index); - - tdm_fifo_enable(tdm_index, 1); - tdm_enable(tdm_index, 1); - frddr_enable(1, frddr_index); - /* toddr */ - if (toddr_index >= 0) - toddr_enable(1, toddr_index); - - /* loopback */ - lb_enable(1); - - /* datain src */ - switch (lb_cfg->datain_src) { - case 0: - case 1: - case 2: - /*tdm in*/ - break; - case 3: - /*spdif in*/ - break; - case 4: - /*pdm in*/ - pdm_enable(1); - break; - default: - pr_err("unsupport datain source!!\n"); - return; - } - /*tdminLB*/ - tdmin_lb_fifo_enable(1); - tdmin_lb_enable(tdm_index, 1); -} - -int loopback_trigger( - struct snd_pcm_substream *substream, - int cmd, - struct loopback_cfg *lb_cfg) -{ - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - if (loopback_enable && loopback_is_running) { - pr_info("loopback enable\n"); - - /* - * toddr/frdd is selected in dai_prepare already. - * check toddr index of datain - * check frddr index of datalb - */ - lb_cfg->toddr_index = fetch_toddr_index_by_src( - lb_cfg->datain_src); - /* check datalb is from tdmout or tdmin */ - if (lb_cfg->datalb_src >= 3) - lb_cfg->frddr_index = fetch_toddr_index_by_src( - lb_cfg->datalb_src - 3); - else - lb_cfg->frddr_index = fetch_frddr_index_by_src( - lb_cfg->datalb_src); - - pr_info("loopback toddr index:%d, frddr index:%d\n", - lb_cfg->toddr_index, - lb_cfg->frddr_index); - - pr_info("loopback modules in sequence!\n"); - /*if pdm overrun, re-set up the sequence*/ - if (lb_cfg->frddr_index >= 0) - loopback_modules_disable( - lb_cfg, - lb_cfg->datalb_src, - lb_cfg->frddr_index, - lb_cfg->toddr_index); - - loopback_modules_enable( - lb_cfg, - lb_cfg->datalb_src, - lb_cfg->frddr_index, - lb_cfg->toddr_index); - } - break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (loopback_enable) { - pr_info("loopback disable\n"); - lb_enable(0); - tdmin_lb_enable(lb_cfg->datalb_src, 0); - } - } - break; - default: - return -EINVAL; - } - - return 0; -} - -void loopback_set_status(int is_running) -{ - loopback_is_running = is_running; -} - -int loopback_is_enable(void) -{ - return (loopback_enable == 1); -} - -int loopback_check_enable(int src) -{ - return (src <= PDMIN) - && (loopback_datain == src) - && (loopback_enable == 1); -} - void auge_acodec_reset(void) { audioreset_update_bits(EE_RESET1, 1 << 29, 1 << 29); diff --git a/sound/soc/amlogic/auge/audio_utils.h b/sound/soc/amlogic/auge/audio_utils.h index d044447..2698181 100644 --- a/sound/soc/amlogic/auge/audio_utils.h +++ b/sound/soc/amlogic/auge/audio_utils.h @@ -18,144 +18,10 @@ #ifndef __AML_AUDIO_UTILS_H__ #define __AML_AUDIO_UTILS_H__ -#include -#include #include -#include - -/* datain src - * [4]: pdmin; - * [3]: spdifin; - * [2]: tdmin_c; - * [1]: tdmin_b; - * [0]: tdmin_a; - */ -enum datain_src { - DATAIN_TDMA = 0, - DATAIN_TDMB, - DATAIN_TDMC, - DATAIN_SPDIF, - DATAIN_PDM, -}; - -/* datalb src/tdmlb src - * [0]: tdmoutA - * [1]: tdmoutB - * [2]: tdmoutC - * [3]: PAD_tdminA - * [4]: PAD_tdminB - * [5]: PAD_tdminC - */ -enum tdmin_lb_src { - TDMINLB_TDMOUTA = 0, - TDMINLB_TDMOUTB, - TDMINLB_TDMOUTC, - TDMINLB_PAD_TDMINA, - TDMINLB_PAD_TDMINB, - TDMINLB_PAD_TDMINC, -}; - -/* toddr_src_sel - * [7]: loopback; - * [6]: tdmin_lb; - * [5]: reserved; - * [4]: pdmin; - * [3]: spdifin; - * [2]: tdmin_c; - * [1]: tdmin_b; - * [0]: tdmin_a; - */ -enum fifoin_src { - FIFOIN_TDMINA = 0, - FIFOIN_TDMINB = 1, - FIFOIN_TDMINC = 2, - FIFOIN_SPDIF = 3, - FIFOIN_PDM = 4, - FIFOIN_TDMINLB = 6, - FIFOIN_LOOPBACK = 7 -}; - -/* audio data selected to ddr */ -struct audio_data { - unsigned int resample; - /* reg_dat_sel - * 0: combined data[m:n] without gap; - * like S0[m:n],S1[m:n],S2[m:n], - * 1: combined data[m:n] as 16bits; - * like {S0[11:0],4'd0},{S1[11:0],4'd0} - * 2: combined data[m:n] as 16bits; - * like {4'd0,S0[11:0]},{4'd0,{S1[11:0]} - * 3: combined data[m:n] as 32bits; - * like {S0[27:4],8'd0},{S1[27:4],8'd0} - * 4: combined data[m:n] as 32bits; - * like {8'd0,S0[27:4]},{8'd0,{S1[27:4]} - */ - unsigned int combined_type; - /* the msb positioin in data */ - unsigned int msb; - /* the lsb position in data */ - unsigned int lsb; - /* toddr_src_sel - * [7]: loopback; - * [6]: tdmin_lb; - * [5]: reserved; - * [4]: pdmin; - * [3]: spdifin; - * [2]: tdmin_c; - * [1]: tdmin_b; - * [0]: tdmin_a; - */ - unsigned int src; -}; - -/**/ -struct loopback_cfg { - struct clk *tdmin_mpll; - /* lb_mode - * 0: out rate = in data rate; - * 1: out rate = loopback data rate; - */ - unsigned int lb_mode; - - enum datain_src datain_src; - unsigned int datain_chnum; - unsigned int datain_chmask; - int toddr_index; - - enum tdmin_lb_src datalb_src; - enum tdmin_lb_src datalb_clk; - unsigned int datalb_chnum; - unsigned int datalb_chswap; - unsigned int datalb_chmask; - int frddr_index; - unsigned int datain_datalb_total; -}; - -extern void loopback_set_status(int is_running); - -extern int loopback_is_enable(void); - -extern int loopback_check_enable(int src); extern int snd_card_add_kcontrols(struct snd_soc_card *card); -extern int loopback_parse_of(struct device_node *node, - struct loopback_cfg *lb_cfg); - -extern int loopback_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct loopback_cfg *lb_cfg, - unsigned int mclk); - -extern int loopback_prepare( - struct snd_pcm_substream *substream, - struct loopback_cfg *lb_cfg); - -extern int loopback_trigger( - struct snd_pcm_substream *substream, - int cmd, - struct loopback_cfg *lb_cfg); - extern void audio_locker_set(int enable); extern int audio_locker_get(void); diff --git a/sound/soc/amlogic/auge/card.c b/sound/soc/amlogic/auge/card.c index 047f412..4002587 100644 --- a/sound/soc/amlogic/auge/card.c +++ b/sound/soc/amlogic/auge/card.c @@ -69,7 +69,6 @@ struct aml_card_data { int spk_mute_gpio; bool spk_mute_active_low; struct gpio_desc *avout_mute_desc; - struct loopback_cfg lb_cfg; struct timer_list timer; struct work_struct work; bool hp_last_state; @@ -462,8 +461,6 @@ static int aml_card_hw_params(struct snd_pcm_substream *substream, goto err; } - if (loopback_is_enable() && mclk) - loopback_hw_params(substream, params, &priv->lb_cfg, mclk); return 0; err: return ret; @@ -471,23 +468,11 @@ err: int aml_card_prepare(struct snd_pcm_substream *substream) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct aml_card_data *priv = snd_soc_card_get_drvdata(rtd->card); - - if (loopback_is_enable()) - loopback_prepare(substream, &priv->lb_cfg); - return 0; } int aml_card_trigger(struct snd_pcm_substream *substream, int cmd) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct aml_card_data *priv = snd_soc_card_get_drvdata(rtd->card); - - if (loopback_is_enable()) - loopback_trigger(substream, cmd, &priv->lb_cfg); - return 0; } @@ -779,7 +764,6 @@ static int aml_card_parse_of(struct device_node *node, { struct device *dev = aml_priv_to_dev(priv); struct device_node *dai_link; - struct device_node *lb_link; int ret; if (!node) @@ -806,14 +790,6 @@ static int aml_card_parse_of(struct device_node *node, /* Factor to mclk, used in hw_params() */ of_property_read_u32(node, PREFIX "mclk-fs", &priv->mclk_fs); - /* Loopback */ - lb_link = of_parse_phandle(node, PREFIX "loopback", 0); - if (lb_link) { - ret = loopback_parse_of(lb_link, &priv->lb_cfg); - if (ret < 0) - pr_err("failed parse loopback, ignore it\n"); - } - /* Single/Muti DAI link(s) & New style of DT node */ if (dai_link) { struct device_node *np = NULL; @@ -844,12 +820,10 @@ static int aml_card_parse_of(struct device_node *node, card_parse_end: of_node_put(dai_link); - of_node_put(lb_link); return ret; } - static struct aml_chipset_info g12a_chipset_info = { .spdif_b = true, .eqdrc_fn = true, @@ -899,6 +873,13 @@ static int aml_card_probe(struct platform_device *pdev) if (!priv) return -ENOMEM; + /* chipset related */ + priv->chipinfo = (struct aml_chipset_info *) + of_device_get_match_data(&pdev->dev); + + if (!priv->chipinfo) + pr_warn_once("check whether to update sound card init data\n"); + dai_props = devm_kzalloc(dev, sizeof(*dai_props) * num, GFP_KERNEL); dai_link = devm_kzalloc(dev, sizeof(*dai_link) * num, GFP_KERNEL); if (!dai_props || !dai_link) @@ -956,13 +937,6 @@ static int aml_card_probe(struct platform_device *pdev) sizeof(priv->dai_props->codec_dai)); } - - priv->chipinfo = (struct aml_chipset_info *) - of_device_get_match_data(&pdev->dev); - - if (!priv->chipinfo) - pr_warn_once("check whether to update sound card init data\n"); - snd_soc_card_set_drvdata(&priv->snd_card, priv); ret = devm_snd_soc_register_card(&pdev->dev, &priv->snd_card); diff --git a/sound/soc/amlogic/auge/ddr_mngr.c b/sound/soc/amlogic/auge/ddr_mngr.c index 8cd7392..5d20f72 100644 --- a/sound/soc/amlogic/auge/ddr_mngr.c +++ b/sound/soc/amlogic/auge/ddr_mngr.c @@ -29,7 +29,6 @@ #include "regs.h" #include "ddr_mngr.h" -#include "audio_utils.h" #include "resample.h" #include "resample_hw.h" @@ -134,12 +133,6 @@ static int unregister_toddr_l(struct device *dev, void *data) to = &toddrs[i]; - /* check for loopback */ - if (to->is_lb) { - loopback_set_status(0); - to->is_lb = 0; - } - /* disable audio ddr arb */ mask_bit = i; actrl = to->actrl; @@ -366,13 +359,6 @@ void aml_toddr_select_src(struct toddr *to, enum toddr_src src) /* store to check toddr num */ to->src = src; - /* check whether loopback enable */ - if (loopback_check_enable(src)) { - loopback_set_status(1); - to->is_lb = 1; /* in loopback */ - src = LOOPBACK_A; - } - if (to->chipinfo && to->chipinfo->src_sel_ctrl) { reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL1, reg_base); @@ -456,6 +442,29 @@ void aml_toddr_set_format(struct toddr *to, struct toddr_fmt *fmt) fmt->msb << 8 | fmt->lsb << 3); } +unsigned int aml_toddr_get_status(struct toddr *to) +{ + struct aml_audio_controller *actrl = to->actrl; + unsigned int reg_base = to->reg_base; + unsigned int reg; + + reg = calc_toddr_address(EE_AUDIO_TODDR_A_STATUS1, reg_base); + + return aml_audiobus_read(actrl, reg); +} + +void aml_toddr_ack_irq(struct toddr *to, int status) +{ + struct aml_audio_controller *actrl = to->actrl; + unsigned int reg_base = to->reg_base; + unsigned int reg; + + reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL1, reg_base); + + aml_audiobus_update_bits(actrl, reg, MEMIF_INT_MASK, status); + aml_audiobus_update_bits(actrl, reg, MEMIF_INT_MASK, 0); +} + void aml_toddr_insert_chanum(struct toddr *to) { struct aml_audio_controller *actrl = to->actrl; diff --git a/sound/soc/amlogic/auge/ddr_mngr.h b/sound/soc/amlogic/auge/ddr_mngr.h index c787662..dc7dca2 100644 --- a/sound/soc/amlogic/auge/ddr_mngr.h +++ b/sound/soc/amlogic/auge/ddr_mngr.h @@ -23,6 +23,14 @@ #include #include "audio_io.h" +#define MEMIF_INT_ADDR_FINISH BIT(0) +#define MEMIF_INT_ADDR_INT BIT(1) +#define MEMIF_INT_COUNT_REPEAT BIT(2) +#define MEMIF_INT_COUNT_ONCE BIT(3) +#define MEMIF_INT_FIFO_ZERO BIT(4) +#define MEMIF_INT_FIFO_DEPTH BIT(5) +#define MEMIF_INT_MASK GENMASK(7, 0) + enum ddr_num { DDR_A, DDR_B, @@ -104,27 +112,6 @@ struct toddr_fmt { unsigned int rate; }; -#if 0 -struct ddr_desc { - /* start address of DDR */ - unsigned int start; - /* finish address of DDR */ - unsigned int finish; - /* interrupt address or counts of DDR blocks */ - unsigned int intrpt; - /* fifo total counts */ - unsigned int fifo_depth; - /* fifo start threshold */ - unsigned int fifo_thr; - enum ddr_types data_type; - unsigned int edian; - unsigned int pp_mode; - //unsigned int reg_base; - struct clk *ddr; - struct clk *ddr_arb; -}; -#endif - struct ddr_chipinfo { /* INT and Start address is same or separated */ bool int_start_same_addr; @@ -170,7 +157,6 @@ struct ddr_chipinfo { }; struct toddr { - //struct ddr_desc dscrpt; struct device *dev; unsigned int resample: 1; unsigned int ext_signed: 1; @@ -222,7 +208,6 @@ struct frddr_attach { }; struct frddr { - //struct ddr_desc dscrpt; struct device *dev; enum frddr_dest dest; @@ -244,7 +229,6 @@ struct frddr { }; /* to ddrs */ -int fetch_toddr_index_by_src(int toddr_src); struct toddr *fetch_toddr_by_src(int toddr_src); struct toddr *aml_audio_register_toddr(struct device *dev, struct aml_audio_controller *actrl, @@ -264,6 +248,10 @@ void aml_toddr_set_fifos(struct toddr *to, unsigned int thresh); void aml_toddr_update_fifos_rd_th(struct toddr *to, int th); void aml_toddr_force_finish(struct toddr *to); void aml_toddr_set_format(struct toddr *to, struct toddr_fmt *fmt); + +unsigned int aml_toddr_get_status(struct toddr *to); +void aml_toddr_ack_irq(struct toddr *to, int status); + void aml_toddr_insert_chanum(struct toddr *to); unsigned int aml_toddr_read(struct toddr *to); void aml_toddr_write(struct toddr *to, unsigned int val); @@ -280,7 +268,6 @@ void aml_pwrdet_enable(bool enable, int pwrdet_module); void aml_set_vad(bool enable, int module); /* from ddrs */ -int fetch_frddr_index_by_src(int frddr_src); struct frddr *fetch_frddr_by_src(int frddr_src); struct frddr *aml_audio_register_frddr(struct device *dev, diff --git a/sound/soc/amlogic/auge/loopback.c b/sound/soc/amlogic/auge/loopback.c new file mode 100644 index 0000000..95178bd --- /dev/null +++ b/sound/soc/amlogic/auge/loopback.c @@ -0,0 +1,1433 @@ +/* + * sound/soc/amlogic/auge/loopback.c + * + * Copyright (C) 2018 Amlogic, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ +#include +#include +#include +#include +#include +#include + +#include + +#include "loopback.h" +#include "loopback_hw.h" +#include "loopback_match_table.c" +#include "ddr_mngr.h" +#include "tdm_hw.h" +#include "pdm_hw.h" + +#define DRV_NAME "loopback" + +/*#define __PTM_PDM_CLK__*/ +/*#define __PTM_TDM_CLK__*/ + +struct loopback { + struct device *dev; + struct aml_audio_controller *actrl; + unsigned int id; + + /* + * datain + */ + + /* PDM clocks */ + struct clk *pdm_clk_gate; + struct clk *pdm_sysclk_srcpll; + struct clk *pdm_dclk_srcpll; + struct clk *pdm_sysclk; + struct clk *pdm_dclk; + unsigned int dclk_idx; + /* TDM clocks */ + struct clk *tdmin_mpll; + struct clk *tdmin_mclk; + + /* datain info */ + enum datain_src datain_src; + unsigned int datain_chnum; + unsigned int datain_chmask; + unsigned int datain_lane_mask; /* related with data lane */ + + /* + * datalb + */ + + /* TDMIN_LB clocks */ + struct clk *tdminlb_mpll; + struct clk *tdminlb_mclk; + unsigned int mclk_fs_ratio; + + /* datalb info */ + enum datalb_src datalb_src; + unsigned int datalb_chnum; + unsigned int datalb_chmask; + unsigned int datalb_lane_mask; /* related with data lane */ + + unsigned int sysclk_freq; + + struct toddr *tddr; + + struct loopback_chipinfo *chipinfo; +}; + +#define LOOPBACK_RATES (SNDRV_PCM_RATE_8000_192000) +#define LOOPBACK_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ + SNDRV_PCM_FMTBIT_S24_LE |\ + SNDRV_PCM_FMTBIT_S32_LE) + +static const struct snd_pcm_hardware loopback_hardware = { + .info = + SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_PAUSE, + + .formats = LOOPBACK_FORMATS, + + .period_bytes_max = 256 * 64, + .buffer_bytes_max = 512 * 1024, + .period_bytes_min = 64, + .periods_min = 1, + .periods_max = 1024, + + .rate_min = 8000, + .rate_max = 192000, + .channels_min = 1, + .channels_max = 32, +}; + +static irqreturn_t loopback_ddr_isr(int irq, void *data) +{ + struct snd_pcm_substream *ss = (struct snd_pcm_substream *)data; + struct snd_soc_pcm_runtime *rtd = ss->private_data; + struct device *dev = rtd->platform->dev; + struct loopback *p_loopback = (struct loopback *)dev_get_drvdata(dev); + unsigned int status; + + if (!snd_pcm_running(ss)) + return IRQ_NONE; + + status = aml_toddr_get_status(p_loopback->tddr) & MEMIF_INT_MASK; + if (status & MEMIF_INT_COUNT_REPEAT) { + snd_pcm_period_elapsed(ss); + + aml_toddr_ack_irq(p_loopback->tddr, MEMIF_INT_COUNT_REPEAT); + } else + dev_dbg(dev, "unexpected irq - STS 0x%02x\n", + status); + + return !status ? IRQ_NONE : IRQ_HANDLED; +} + +static int loopback_open(struct snd_pcm_substream *ss) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct snd_soc_pcm_runtime *rtd = ss->private_data; + struct device *dev = rtd->platform->dev; + struct loopback *p_loopback = (struct loopback *)dev_get_drvdata(dev); + + snd_soc_set_runtime_hwparams(ss, &loopback_hardware); + + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) { + p_loopback->tddr = aml_audio_register_toddr(dev, + p_loopback->actrl, + loopback_ddr_isr, ss); + if (p_loopback->tddr == NULL) { + dev_err(dev, "failed to claim to ddr\n"); + return -ENXIO; + } + } + + runtime->private_data = p_loopback; + + return 0; +} + +static int loopback_close(struct snd_pcm_substream *ss) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct loopback *p_loopback = runtime->private_data; + + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) + aml_audio_unregister_toddr(p_loopback->dev, ss); + + runtime->private_data = NULL; + + return 0; +} + +static int loopback_hw_params( + struct snd_pcm_substream *ss, + struct snd_pcm_hw_params *hw_params) +{ + return snd_pcm_lib_malloc_pages(ss, params_buffer_bytes(hw_params)); +} + +static int loopback_hw_free(struct snd_pcm_substream *ss) +{ + snd_pcm_lib_free_pages(ss); + + return 0; +} + +static int loopback_trigger( + struct snd_pcm_substream *ss, + int cmd) +{ + return 0; +} + +static int loopback_prepare(struct snd_pcm_substream *ss) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct loopback *p_loopback = runtime->private_data; + unsigned int start_addr, end_addr, int_addr; + + start_addr = runtime->dma_addr; + end_addr = start_addr + runtime->dma_bytes - 8; + int_addr = frames_to_bytes(runtime, runtime->period_size) / 8; + + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) { + struct toddr *to = p_loopback->tddr; + + aml_toddr_set_buf(to, start_addr, end_addr); + aml_toddr_set_intrpt(to, int_addr); + } + + return 0; +} + +static snd_pcm_uframes_t loopback_pointer( + struct snd_pcm_substream *ss) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct loopback *p_loopback = runtime->private_data; + unsigned int addr, start_addr; + snd_pcm_uframes_t frames = 0; + + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) { + start_addr = runtime->dma_addr; + addr = aml_toddr_get_position(p_loopback->tddr); + + frames = bytes_to_frames(runtime, addr - start_addr); + } + if (frames > runtime->buffer_size) + frames = 0; + + return frames; +} + +int loopback_silence( + struct snd_pcm_substream *ss, + int channel, + snd_pcm_uframes_t pos, + snd_pcm_uframes_t count) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + char *ppos; + int n; + + n = frames_to_bytes(runtime, count); + ppos = runtime->dma_area + frames_to_bytes(runtime, pos); + memset(ppos, 0, n); + + return 0; +} + +static int loopback_mmap(struct snd_pcm_substream *ss, + struct vm_area_struct *vma) +{ + return snd_pcm_lib_default_mmap(ss, vma); +} + +static struct snd_pcm_ops loopback_ops = { + .open = loopback_open, + .close = loopback_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = loopback_hw_params, + .hw_free = loopback_hw_free, + .prepare = loopback_prepare, + .trigger = loopback_trigger, + .pointer = loopback_pointer, + .silence = loopback_silence, + .mmap = loopback_mmap, +}; + +static int loopback_pcm_new(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_pcm *pcm = rtd->pcm; + struct snd_pcm_substream *ss; + int size = loopback_hardware.buffer_bytes_max; + int ret = -EINVAL; + + /* only capture */ + ss = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; + if (ss) { + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, + rtd->platform->dev, + size, &ss->dma_buffer); + if (ret) { + dev_err(rtd->dev, "Cannot allocate buffer(s)\n"); + return ret; + } + } + + return ret; +} + +static void loopback_pcm_free(struct snd_pcm *pcm) +{ + struct snd_pcm_substream *ss; + + ss = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; + if (ss) { + snd_dma_free_pages(&ss->dma_buffer); + ss->dma_buffer.area = NULL; + ss->dma_buffer.addr = 0; + } +} + +struct snd_soc_platform_driver loopback_platform_drv = { + .pcm_new = loopback_pcm_new, + .pcm_free = loopback_pcm_free, + .ops = &loopback_ops, +}; + +static int loopback_dai_probe(struct snd_soc_dai *dai) +{ + return 0; +} + +static int loopback_dai_remove(struct snd_soc_dai *dai) +{ + return 0; +} + +static int datain_pdm_startup(struct loopback *p_loopback) +{ + int ret; + + /* enable clock gate */ + ret = clk_prepare_enable(p_loopback->pdm_clk_gate); + + /* enable clock */ + ret = clk_prepare_enable(p_loopback->pdm_sysclk_srcpll); + if (ret) { + pr_err("Can't enable pcm pdm_sysclk_srcpll clock: %d\n", ret); + goto err; + } + + ret = clk_prepare_enable(p_loopback->pdm_dclk_srcpll); + if (ret) { + pr_err("Can't enable pcm pdm_dclk_srcpll clock: %d\n", ret); + goto err; + } + + ret = clk_prepare_enable(p_loopback->pdm_sysclk); + if (ret) { + pr_err("Can't enable pcm pdm_sysclk clock: %d\n", ret); + goto err; + } + + ret = clk_prepare_enable(p_loopback->pdm_dclk); + if (ret) { + pr_err("Can't enable pcm pdm_dclk clock: %d\n", ret); + goto err; + } + + return 0; +err: + pr_err("failed enable pdm clock\n"); + return -EINVAL; +} + +static void datain_pdm_shutdown(struct loopback *p_loopback) +{ + /* disable clock and gate */ + clk_disable_unprepare(p_loopback->pdm_dclk); + clk_disable_unprepare(p_loopback->pdm_sysclk); + clk_disable_unprepare(p_loopback->pdm_sysclk_srcpll); + clk_disable_unprepare(p_loopback->pdm_dclk_srcpll); + clk_disable_unprepare(p_loopback->pdm_clk_gate); +} + +static int tdminlb_startup(struct loopback *p_loopback) +{ + int ret; + + /* enable clock */ + ret = clk_prepare_enable(p_loopback->tdminlb_mpll); + if (ret) { + pr_err("Can't enable tdminlb_mpll clock: %d\n", ret); + goto err; + } + + ret = clk_prepare_enable(p_loopback->tdminlb_mclk); + if (ret) { + pr_err("Can't enable tdminlb_mclk clock: %d\n", ret); + goto err; + } + + return 0; +err: + pr_err("failed enable pdm clock\n"); + return -EINVAL; +} + +static void tdminlb_shutdown(struct loopback *p_loopback) +{ + /* disable clock and gate */ + clk_disable_unprepare(p_loopback->tdminlb_mclk); + clk_disable_unprepare(p_loopback->tdminlb_mpll); +} + +static int loopback_dai_startup( + struct snd_pcm_substream *ss, + struct snd_soc_dai *dai) +{ + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + int ret = 0; + + if (ss->stream != SNDRV_PCM_STREAM_CAPTURE) { + ret = -EINVAL; + goto err; + } + + pr_info("%s\n", __func__); + + /* datain */ + switch (p_loopback->datain_src) { + case DATAIN_TDMA: + case DATAIN_TDMB: + case DATAIN_TDMC: + break; + case DATAIN_SPDIF: + break; + case DATAIN_PDM: + ret = datain_pdm_startup(p_loopback); + if (ret < 0) + goto err; + break; + case DATAIN_LOOPBACK: + break; + default: + break; + } + + /* datalb */ + switch (p_loopback->datalb_src) { + case TDMINLB_TDMOUTA ... TDMINLB_PAD_TDMINC: + tdminlb_startup(p_loopback); + break; + case SPDIFINLB_SPDIFOUTA ... SPDIFINLB_SPDIFOUTB: + break; + default: + break; + } + + return ret; +err: + pr_err("Failed to enable datain clock\n"); + return ret; +} + +static void loopback_dai_shutdown( + struct snd_pcm_substream *ss, + struct snd_soc_dai *dai) +{ + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + + pr_info("%s\n", __func__); + + /* datain */ + switch (p_loopback->datain_src) { + case DATAIN_TDMA: + case DATAIN_TDMB: + case DATAIN_TDMC: + break; + case DATAIN_SPDIF: + break; + case DATAIN_PDM: + datain_pdm_shutdown(p_loopback); + break; + case DATAIN_LOOPBACK: + break; + default: + break; + } + + /* datalb */ + switch (p_loopback->datalb_src) { + case TDMINLB_TDMOUTA ... TDMINLB_PAD_TDMINC: + tdminlb_shutdown(p_loopback); + break; + case SPDIFINLB_SPDIFOUTA ... SPDIFINLB_SPDIFOUTB: + break; + default: + break; + } + +} + +static void loopback_set_clk(struct loopback *p_loopback, + int rate, bool enable) +{ + unsigned int mul = 2; + unsigned int mpll_freq, mclk_freq; + /* assume datain_lb in i2s format, 2ch, 32bit */ + unsigned int bit_depth = 32, i2s_ch = 2; + unsigned int sclk_div = 4 - 1; + unsigned int ratio = i2s_ch * bit_depth - 1; + + /* lb_datain clk is set + * prepare clocks for tdmin_lb + */ + + /* mpll, mclk */ + if (p_loopback->datalb_src >= 3) { + mclk_freq = rate * p_loopback->mclk_fs_ratio; + mpll_freq = mclk_freq * mul; + clk_set_rate(p_loopback->tdminlb_mpll, mpll_freq); + clk_set_rate(p_loopback->tdminlb_mclk, mclk_freq); + pr_info("%s, rate:%d mclk:%d, mpll:%d, get mclk:%lu mpll:%lu\n", + __func__, + rate, + mclk_freq, + mpll_freq, + clk_get_rate(p_loopback->tdminlb_mclk), + clk_get_rate(p_loopback->tdminlb_mpll)); + } + +#ifdef __PTM_TDM_CLK__ + ratio = 18 * 2; +#endif + + tdminlb_set_clk(p_loopback->datalb_src, sclk_div, ratio, enable); +} + +static int loopback_set_ctrl(struct loopback *p_loopback, int bitwidth) +{ + unsigned int datain_toddr_type, datalb_toddr_type; + unsigned int datain_msb, datain_lsb, datalb_msb, datalb_lsb; + struct data_cfg datain_cfg; + struct data_cfg datalb_cfg; + + if (!p_loopback) + return -EINVAL; + + switch (p_loopback->datain_src) { + case DATAIN_TDMA: + case DATAIN_TDMB: + case DATAIN_TDMC: + case DATAIN_PDM: + datain_toddr_type = 0; + datain_msb = 32 - 1; + datain_lsb = 0; + break; + case DATAIN_SPDIF: + datain_toddr_type = 3; + datain_msb = 27; + datain_lsb = 4; + if (bitwidth <= 24) + datain_lsb = 28 - bitwidth; + else + datain_lsb = 4; + break; + default: + pr_err("unsupport data in source:%d\n", + p_loopback->datain_src); + return -EINVAL; + } + + switch (p_loopback->datalb_src) { + case TDMINLB_TDMOUTA: + case TDMINLB_TDMOUTB: + case TDMINLB_TDMOUTC: + case TDMINLB_PAD_TDMINA: + case TDMINLB_PAD_TDMINB: + case TDMINLB_PAD_TDMINC: + if (bitwidth == 24) { + datalb_toddr_type = 4; + datalb_msb = 32 - 1; + datalb_lsb = 32 - bitwidth; + } else { + datalb_toddr_type = 0; + datalb_msb = 32 - 1; + datalb_lsb = 0; + } + break; + default: + pr_err("unsupport data lb source:%d\n", + p_loopback->datalb_src); + return -EINVAL; + } + + datain_cfg.ext_signed = 0; + datain_cfg.chnum = p_loopback->datain_chnum; + datain_cfg.chmask = p_loopback->datain_chmask; + datain_cfg.type = datain_toddr_type; + datain_cfg.m = datain_msb; + datain_cfg.n = datain_lsb; + datain_cfg.src = p_loopback->datain_src; + + datalb_cfg.ext_signed = 0; + datalb_cfg.chnum = p_loopback->datalb_chnum; + datalb_cfg.chmask = p_loopback->datalb_chmask; + datalb_cfg.type = datalb_toddr_type; + datalb_cfg.m = datalb_msb; + datalb_cfg.n = datalb_lsb; + datalb_cfg.datalb_src = p_loopback->datalb_src; + + if (p_loopback->chipinfo) { + datain_cfg.ch_ctrl_switch = p_loopback->chipinfo->ch_ctrl; + datalb_cfg.ch_ctrl_switch = p_loopback->chipinfo->ch_ctrl; + } else { + datain_cfg.ch_ctrl_switch = 0; + datalb_cfg.ch_ctrl_switch = 0; + } + + lb_set_datain_cfg(p_loopback->id, &datain_cfg); + lb_set_datalb_cfg(p_loopback->id, &datalb_cfg); + + tdminlb_set_format(1); /* tdmin_lb i2s mode */ + tdminlb_set_lanemask_and_chswap(0x76543210, + p_loopback->datalb_lane_mask); + tdminlb_set_ctrl(p_loopback->datalb_src); + + return 0; +} + +static void datatin_pdm_cfg( + struct snd_pcm_runtime *runtime, + struct loopback *p_loopback) +{ + unsigned int bit_depth = snd_pcm_format_width(runtime->format); + unsigned int osr; + struct pdm_info info; + + info.bitdepth = bit_depth; + info.channels = p_loopback->datain_chnum; + info.lane_masks = p_loopback->datain_lane_mask; + info.dclk_idx = p_loopback->dclk_idx; + info.bypass = 0; + info.sample_count = pdm_get_sample_count(0, p_loopback->dclk_idx); + aml_pdm_ctrl(&info); + + /* filter for pdm */ + osr = pdm_get_ors(p_loopback->dclk_idx, runtime->rate); + + aml_pdm_filter_ctrl(osr, 1); +} + +static int loopback_dai_prepare( + struct snd_pcm_substream *ss, + struct snd_soc_dai *dai) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + unsigned int bit_depth = snd_pcm_format_width(runtime->format); + + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) { + struct toddr *to = p_loopback->tddr; + unsigned int msb = 32 - 1; + unsigned int lsb = 32 - bit_depth; + unsigned int toddr_type; + struct toddr_fmt fmt; + unsigned int src; + + if (p_loopback->id == 0) + src = LOOPBACK_A; + else + src = LOOPBACK_B; + + pr_info("%s Expected toddr src:%s\n", + __func__, + toddr_src_get_str(src)); + + switch (bit_depth) { + case 8: + case 16: + case 32: + toddr_type = 0; + break; + case 24: + toddr_type = 4; + break; + default: + dev_err(p_loopback->dev, + "invalid bit_depth: %d\n", + bit_depth); + return -EINVAL; + } + + fmt.type = toddr_type; + fmt.msb = msb; + fmt.lsb = lsb; + fmt.endian = 0; + fmt.bit_depth = bit_depth; + fmt.ch_num = runtime->channels; + fmt.rate = runtime->rate; + + aml_toddr_select_src(to, src); + aml_toddr_set_format(to, &fmt); + aml_toddr_set_fifos(to, 0x40); + + switch (p_loopback->datain_src) { + case DATAIN_TDMA: + case DATAIN_TDMB: + case DATAIN_TDMC: + break; + case DATAIN_SPDIF: + break; + case DATAIN_PDM: + datatin_pdm_cfg(runtime, p_loopback); + break; + case DATAIN_LOOPBACK: + break; + default: + dev_err(p_loopback->dev, + "unexpected datain src 0x%02x\n", + p_loopback->datain_src); + return -EINVAL; + } + + switch (p_loopback->datalb_src) { + case TDMINLB_TDMOUTA: + case TDMINLB_TDMOUTB: + case TDMINLB_TDMOUTC: + break; + case TDMINLB_PAD_TDMINA: + case TDMINLB_PAD_TDMINB: + case TDMINLB_PAD_TDMINC: + break; + case SPDIFINLB_SPDIFOUTA: + case SPDIFINLB_SPDIFOUTB: + break; + default: + dev_err(p_loopback->dev, + "unexpected datalb src 0x%02x\n", + p_loopback->datalb_src); + return -EINVAL; + } + + /* config for loopback, datain, datalb */ + loopback_set_ctrl(p_loopback, bit_depth); + } + + return 0; +} + +static int loopback_dai_trigger( + struct snd_pcm_substream *ss, + int cmd, + struct snd_soc_dai *dai) +{ + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + + pr_info("%s\n", __func__); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) { + dev_info(ss->pcm->card->dev, "Loopback Capture enable\n"); + + pdm_fifo_reset(); + tdminlb_fifo_enable(true); + + aml_toddr_enable(p_loopback->tddr, true); + /* loopback */ + lb_enable(p_loopback->id, true); + /* tdminLB */ + tdminlb_enable(p_loopback->datalb_src, true); + /* pdm */ + pdm_enable(1); + } + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + if (ss->stream == SNDRV_PCM_STREAM_CAPTURE) { + dev_info(ss->pcm->card->dev, "Loopback Capture disable\n"); + pdm_enable(0); + + /* loopback */ + lb_enable(p_loopback->id, false); + /* tdminLB */ + tdminlb_fifo_enable(false); + tdminlb_enable(p_loopback->datalb_src, false); + + aml_toddr_enable(p_loopback->tddr, false); + } + break; + default: + return -EINVAL; + } + + return 0; +} + +static void datain_pdm_set_clk(struct loopback *p_loopback) +{ + unsigned int pdm_sysclk_srcpll_freq, pdm_dclk_srcpll_freq; + + pdm_sysclk_srcpll_freq = clk_get_rate(p_loopback->pdm_sysclk_srcpll); + pdm_dclk_srcpll_freq = clk_get_rate(p_loopback->pdm_dclk_srcpll); + +#ifdef __PTM_PDM_CLK__ + clk_set_rate(p_loopback->pdm_sysclk, 133333351); + clk_set_rate(p_loopback->pdm_dclk_srcpll, 24576000 * 15); /* 350m */ + clk_set_rate(p_loopback->pdm_dclk, 3072000); +#else + clk_set_rate(p_loopback->pdm_sysclk, 133333351); + + if (pdm_dclk_srcpll_freq == 0) + clk_set_rate(p_loopback->pdm_dclk_srcpll, 24576000); + else + pr_info("pdm pdm_dclk_srcpll:%lu\n", + clk_get_rate(p_loopback->pdm_dclk_srcpll)); +#endif + + clk_set_rate(p_loopback->pdm_dclk, + pdm_dclkidx2rate(p_loopback->dclk_idx)); + + pr_info("pdm pdm_sysclk:%lu pdm_dclk:%lu\n", + clk_get_rate(p_loopback->pdm_sysclk), + clk_get_rate(p_loopback->pdm_dclk)); +} + +static void datalb_tdminlb_set_clk(struct loopback *p_loopback) +{ + int mpll_freq = p_loopback->sysclk_freq * 2; + + clk_set_rate(p_loopback->tdminlb_mpll, mpll_freq); + clk_set_rate(p_loopback->tdminlb_mclk, p_loopback->sysclk_freq); + + pr_info("tdmin lb mpll:%lu mclk:%lu\n", + clk_get_rate(p_loopback->tdminlb_mpll), + clk_get_rate(p_loopback->tdminlb_mclk)); +} + +static int loopback_dai_hw_params( + struct snd_pcm_substream *ss, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + unsigned int rate, channels; + snd_pcm_format_t format; + int ret = 0; + + rate = params_rate(params); + channels = params_channels(params); + format = params_format(params); + + pr_info("%s:rate:%d, sysclk:%d\n", + __func__, + rate, + p_loopback->sysclk_freq); + + switch (p_loopback->datain_src) { + case DATAIN_TDMA: + case DATAIN_TDMB: + case DATAIN_TDMC: + break; + case DATAIN_SPDIF: + break; + case DATAIN_PDM: + datain_pdm_set_clk(p_loopback); + break; + case DATAIN_LOOPBACK: + break; + default: + break; + } + + /* datalb */ + switch (p_loopback->datalb_src) { + case TDMINLB_TDMOUTA ... TDMINLB_PAD_TDMINC: + datalb_tdminlb_set_clk(p_loopback); + break; + case SPDIFINLB_SPDIFOUTA ... SPDIFINLB_SPDIFOUTB: + break; + default: + break; + } + + loopback_set_clk(p_loopback, runtime->rate, true); + + return ret; +} + +int loopback_dai_hw_free( + struct snd_pcm_substream *ss, + struct snd_soc_dai *dai) +{ + struct snd_pcm_runtime *runtime = ss->runtime; + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + + pr_info("%s\n", __func__); + + if (0) + loopback_set_clk(p_loopback, runtime->rate, false); + + return 0; +} + +static int loopback_dai_set_fmt( + struct snd_soc_dai *dai, + unsigned int fmt) +{ + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + + pr_info("asoc loopback_dai_set_fmt, %#x, %p\n", fmt, p_loopback); + + return 0; +} + +static int loopback_dai_set_sysclk( + struct snd_soc_dai *dai, + int clk_id, unsigned int freq, int dir) +{ + struct loopback *p_loopback = snd_soc_dai_get_drvdata(dai); + + p_loopback->sysclk_freq = freq; + pr_info("\n%s, %d, %d, %d\n", + __func__, + clk_id, freq, dir); + + return 0; +} + +static struct snd_soc_dai_ops loopback_dai_ops = { + .startup = loopback_dai_startup, + .shutdown = loopback_dai_shutdown, + .prepare = loopback_dai_prepare, + .trigger = loopback_dai_trigger, + .hw_params = loopback_dai_hw_params, + .hw_free = loopback_dai_hw_free, + .set_fmt = loopback_dai_set_fmt, + .set_sysclk = loopback_dai_set_sysclk, +}; + +static struct snd_soc_dai_driver loopback_dai[] = { + { + .name = "LOOPBACK-A", + .id = 0, + .probe = loopback_dai_probe, + .remove = loopback_dai_remove, + + .capture = { + .channels_min = 1, + .channels_max = 32, + .rates = LOOPBACK_RATES, + .formats = LOOPBACK_FORMATS, + }, + .ops = &loopback_dai_ops, + }, + { + .name = "LOOPBACK-B", + .id = 1, + .probe = loopback_dai_probe, + .remove = loopback_dai_remove, + + .capture = { + .channels_min = 1, + .channels_max = 32, + .rates = LOOPBACK_RATES, + .formats = LOOPBACK_FORMATS, + }, + .ops = &loopback_dai_ops, + }, +}; + +static const char *const datain_src_texts[] = { + "TDMIN_A", + "TDMIN_B", + "TDMIN_C", + "SPDIFIN", + "PDMIN", +}; + +static const struct soc_enum datain_src_enum = + SOC_ENUM_SINGLE(EE_AUDIO_LB_CTRL0, 0, ARRAY_SIZE(datain_src_texts), + datain_src_texts); + +static int datain_src_get_enum( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct loopback *p_loopback = dev_get_drvdata(component->dev); + + if (!p_loopback) + return 0; + + ucontrol->value.enumerated.item[0] = p_loopback->datain_src; + + return 0; +} + +static int datain_src_set_enum( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct loopback *p_loopback = dev_get_drvdata(component->dev); + + if (!p_loopback) + return 0; + + p_loopback->datain_src = ucontrol->value.enumerated.item[0]; + + lb_set_datain_src(p_loopback->id, p_loopback->datain_src); + + return 0; +} + +static const char *const datalb_tdminlb_texts[] = { + "TDMOUT_A", + "TDMOUT_B", + "TDMOUT_C", + "TDMIN_A", + "TDMIN_B", + "TDMIN_C", +}; + +static const struct soc_enum datalb_tdminlb_enum = + SOC_ENUM_SINGLE(EE_AUDIO_TDMIN_LB_CTRL, + 20, + ARRAY_SIZE(datalb_tdminlb_texts), + datalb_tdminlb_texts); + +static int datalb_tdminlb_get_enum( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct loopback *p_loopback = dev_get_drvdata(component->dev); + + if (!p_loopback) + return 0; + + ucontrol->value.enumerated.item[0] = p_loopback->datalb_src; + + return 0; +} + +static int datalb_tdminlb_set_enum( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct loopback *p_loopback = dev_get_drvdata(component->dev); + + if (!p_loopback) + return 0; + + p_loopback->datalb_src = ucontrol->value.enumerated.item[0]; + + tdminlb_set_src(p_loopback->datalb_src); + + return 0; +} + +static const struct snd_kcontrol_new snd_loopback_controls[] = { + /* loopback data in source */ + SOC_ENUM_EXT("Loopback datain source", + datain_src_enum, + datain_src_get_enum, + datain_src_set_enum), + + /* loopback data tdmin lb */ + SOC_ENUM_EXT("Loopback tdmin lb source", + datalb_tdminlb_enum, + datalb_tdminlb_get_enum, + datalb_tdminlb_set_enum), +}; + +static const struct snd_soc_component_driver loopback_component = { + .name = DRV_NAME, + .controls = snd_loopback_controls, + .num_controls = ARRAY_SIZE(snd_loopback_controls), +}; + +static int snd_soc_of_get_slot_mask( + struct device_node *np, + const char *prop_name, + unsigned int *mask) +{ + u32 val; + const __be32 *of_slot_mask = of_get_property(np, prop_name, &val); + int i; + + if (!of_slot_mask) + return -EINVAL; + + val /= sizeof(u32); + for (i = 0; i < val; i++) + if (be32_to_cpup(&of_slot_mask[i])) + *mask |= (1 << i); + + return val; +} + +static int datain_pdm_parse_of( + struct device *dev, + struct loopback *p_loopback) +{ + int ret; + + /* clock gate */ + p_loopback->pdm_clk_gate = devm_clk_get(dev, "pdm_gate"); + if (IS_ERR(p_loopback->pdm_clk_gate)) { + dev_err(dev, + "Can't get pdm gate\n"); + return PTR_ERR(p_loopback->pdm_clk_gate); + } + + p_loopback->pdm_sysclk_srcpll = devm_clk_get(dev, "pdm_sysclk_srcpll"); + if (IS_ERR(p_loopback->pdm_sysclk_srcpll)) { + dev_err(dev, + "Can't retrieve pll clock\n"); + ret = PTR_ERR(p_loopback->pdm_sysclk_srcpll); + goto err; + } + + p_loopback->pdm_dclk_srcpll = devm_clk_get(dev, "pdm_dclk_srcpll"); + if (IS_ERR(p_loopback->pdm_dclk_srcpll)) { + dev_err(dev, + "Can't retrieve data src clock\n"); + ret = PTR_ERR(p_loopback->pdm_dclk_srcpll); + goto err; + } + + p_loopback->pdm_sysclk = devm_clk_get(dev, "pdm_sysclk"); + if (IS_ERR(p_loopback->pdm_sysclk)) { + dev_err(dev, + "Can't retrieve pdm_sysclk clock\n"); + ret = PTR_ERR(p_loopback->pdm_sysclk); + goto err; + } + + p_loopback->pdm_dclk = devm_clk_get(dev, "pdm_dclk"); + if (IS_ERR(p_loopback->pdm_dclk)) { + dev_err(dev, + "Can't retrieve pdm_dclk clock\n"); + ret = PTR_ERR(p_loopback->pdm_dclk); + goto err; + } + + ret = clk_set_parent(p_loopback->pdm_sysclk, + p_loopback->pdm_sysclk_srcpll); + if (ret) { + dev_err(dev, + "Can't set pdm_sysclk parent clock\n"); + ret = PTR_ERR(p_loopback->pdm_sysclk); + goto err; + } + + ret = clk_set_parent(p_loopback->pdm_dclk, + p_loopback->pdm_dclk_srcpll); + if (ret) { + dev_err(dev, + "Can't set pdm_dclk parent clock\n"); + ret = PTR_ERR(p_loopback->pdm_dclk); + goto err; + } + + return 0; + +err: + return ret; +} + +static int datain_parse_of( + struct device_node *node, + struct loopback *p_loopback) +{ + struct platform_device *pdev; + int ret; + + pdev = of_find_device_by_node(node); + if (!pdev) { + dev_err(&pdev->dev, + "failed to find platform device\n"); + return -EINVAL; + } + + switch (p_loopback->datain_src) { + case DATAIN_TDMA: + case DATAIN_TDMB: + case DATAIN_TDMC: + break; + case DATAIN_SPDIF: + break; + case DATAIN_PDM: + ret = datain_pdm_parse_of(&pdev->dev, p_loopback); + if (ret < 0) + goto err; + break; + case DATAIN_LOOPBACK: + break; + default: + break; + } + + return 0; +err: + pr_err("%s, error:%d\n", __func__, ret); + return -EINVAL; +} + +static int datalb_tdminlb_parse_of( + struct device_node *node, + struct loopback *p_loopback) +{ + struct platform_device *pdev; + int ret; + + pdev = of_find_device_by_node(node); + if (!pdev) { + dev_err(&pdev->dev, + "failed to find platform device\n"); + return -EINVAL; + } + + /* mpll used for tdmin_lb */ + p_loopback->tdminlb_mpll = devm_clk_get(&pdev->dev, "tdminlb_mpll"); + if (IS_ERR(p_loopback->tdminlb_mpll)) { + dev_err(&pdev->dev, + "Can't retrieve tdminlb_mpll clock\n"); + return PTR_ERR(p_loopback->tdminlb_mpll); + } + p_loopback->tdminlb_mclk = devm_clk_get(&pdev->dev, "tdminlb_mclk"); + if (IS_ERR(p_loopback->tdminlb_mclk)) { + dev_err(&pdev->dev, + "Can't retrieve tdminlb_mclk clock\n"); + return PTR_ERR(p_loopback->tdminlb_mclk); + } + + ret = clk_set_parent(p_loopback->tdminlb_mclk, + p_loopback->tdminlb_mpll); + if (ret) { + dev_err(&pdev->dev, + "Can't set tdminlb_mclk parent clock\n"); + ret = PTR_ERR(p_loopback->tdminlb_mpll); + goto err; + } + + ret = of_property_read_u32(node, "mclk-fs", + &p_loopback->mclk_fs_ratio); + if (ret) { + pr_warn_once("failed to get mclk-fs node, set it default\n"); + p_loopback->mclk_fs_ratio = 256; + ret = 0; + } + + return 0; +err: + pr_err("%s, error:%d\n", __func__, ret); + return -EINVAL; +} + +static int loopback_parse_of( + struct device_node *node, + struct loopback *p_loopback) +{ + struct platform_device *pdev; + int ret; + + pdev = of_find_device_by_node(node); + if (!pdev) { + dev_err(&pdev->dev, "failed to find platform device\n"); + ret = -EINVAL; + goto fail; + } + + ret = of_property_read_u32(node, "datain_src", + &p_loopback->datain_src); + if (ret) { + pr_err("failed to get datain_src\n"); + ret = -EINVAL; + goto fail; + } + ret = of_property_read_u32(node, "datain_chnum", + &p_loopback->datain_chnum); + if (ret) { + pr_err("failed to get datain_chnum\n"); + ret = -EINVAL; + goto fail; + } + ret = of_property_read_u32(node, "datain_chmask", + &p_loopback->datain_chmask); + if (ret) { + pr_err("failed to get datain_chmask\n"); + ret = -EINVAL; + goto fail; + } + ret = snd_soc_of_get_slot_mask(node, "datain-lane-mask-in", + &p_loopback->datain_lane_mask); + if (ret < 0) { + ret = -EINVAL; + dev_err(&pdev->dev, "datain lane-slot-mask should be set\n"); + goto fail; + } + + ret = of_property_read_u32(node, "datalb_src", + &p_loopback->datalb_src); + if (ret) { + pr_err("failed to get datalb_src\n"); + ret = -EINVAL; + goto fail; + } + ret = of_property_read_u32(node, "datalb_chnum", + &p_loopback->datalb_chnum); + if (ret) { + pr_err("failed to get datalb_chnum\n"); + ret = -EINVAL; + goto fail; + } + ret = of_property_read_u32(node, "datalb_chmask", + &p_loopback->datalb_chmask); + if (ret) { + pr_err("failed to get datalb_chmask\n"); + ret = -EINVAL; + goto fail; + } + + ret = snd_soc_of_get_slot_mask(node, "datalb-lane-mask-in", + &p_loopback->datalb_lane_mask); + if (ret < 0) { + ret = -EINVAL; + pr_err("datalb lane-slot-mask should be set\n"); + goto fail; + } + + pr_info("\tdatain_src:%d, datain_chnum:%d, datain_chumask:%x\n", + p_loopback->datain_src, + p_loopback->datain_chnum, + p_loopback->datain_chmask); + pr_info("\tdatalb_src:%d, datalb_chnum:%d, datalb_chmask:%x\n", + p_loopback->datalb_src, + p_loopback->datalb_chnum, + p_loopback->datalb_chmask); + pr_info("\tdatain_lane_mask:0x%x, datalb_lane_mask:0x%x\n", + p_loopback->datain_lane_mask, + p_loopback->datalb_lane_mask); + + ret = datain_parse_of(node, p_loopback); + if (ret) { + dev_err(&pdev->dev, + "failed to parse datain\n"); + return ret; + } + ret = datalb_tdminlb_parse_of(node, p_loopback); + if (ret) { + dev_err(&pdev->dev, + "failed to parse datalb\n"); + return ret; + } + + return 0; + +fail: + return ret; +} + +static int loopback_platform_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = pdev->dev.of_node; + struct loopback *p_loopback = NULL; + struct loopback_chipinfo *p_chipinfo = NULL; + struct device_node *node_prt = NULL; + struct platform_device *pdev_parent = NULL; + struct aml_audio_controller *actrl = NULL; + int ret = 0; + + p_loopback = devm_kzalloc(&pdev->dev, + sizeof(struct loopback), + GFP_KERNEL); + if (!p_loopback) + return -ENOMEM; + + /* match data */ + p_chipinfo = (struct loopback_chipinfo *) + of_device_get_match_data(dev); + if (p_chipinfo) { + p_loopback->chipinfo = p_chipinfo; + p_loopback->id = p_chipinfo->id; + } else + dev_warn_once(dev, + "check whether to update loopback chipinfo\n"); + + /* get audio controller */ + node_prt = of_get_parent(node); + if (node_prt == NULL) + return -ENXIO; + + pdev_parent = of_find_device_by_node(node_prt); + of_node_put(node_prt); + actrl = (struct aml_audio_controller *) + platform_get_drvdata(pdev_parent); + p_loopback->actrl = actrl; + + ret = loopback_parse_of(dev->of_node, p_loopback); + if (ret) { + dev_err(&pdev->dev, + "failed to parse loopback info\n"); + return ret; + } + + p_loopback->dev = &pdev->dev; + dev_set_drvdata(&pdev->dev, p_loopback); + + ret = devm_snd_soc_register_component(&pdev->dev, + &loopback_component, + &loopback_dai[p_loopback->id], + 1); + if (ret) { + dev_err(&pdev->dev, + "snd_soc_register_component failed\n"); + return ret; + } + + pr_info("%s, p_loopback->id:%d register soc platform\n", + __func__, + p_loopback->id); + + return devm_snd_soc_register_platform(dev, + &loopback_platform_drv); +} + +static struct platform_driver loopback_platform_driver = { + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(loopback_device_id), + }, + .probe = loopback_platform_probe, +}; +module_platform_driver(loopback_platform_driver); + +MODULE_AUTHOR("AMLogic, Inc."); +MODULE_DESCRIPTION("Amlogic Loopback driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/sound/soc/amlogic/auge/loopback.h b/sound/soc/amlogic/auge/loopback.h new file mode 100644 index 0000000..bc0c075 --- /dev/null +++ b/sound/soc/amlogic/auge/loopback.h @@ -0,0 +1,61 @@ +/* + * sound/soc/amlogic/auge/loopback.h + * + * Copyright (C) 2018 Amlogic, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ +#ifndef __AML_AUDIO_LOOPBACK_H__ +#define __AML_AUDIO_LOOPBACK_H__ +#include +#include + +/* datain src + * [4]: pdmin; + * [3]: spdifin; + * [2]: tdmin_c; + * [1]: tdmin_b; + * [0]: tdmin_a; + */ +enum datain_src { + DATAIN_TDMA = 0, + DATAIN_TDMB, + DATAIN_TDMC, + DATAIN_SPDIF, + DATAIN_PDM, + DATAIN_LOOPBACK, +}; + +/* datalb src + * /tdmin_lb src + * [0]: tdmoutA + * [1]: tdmoutB + * [2]: tdmoutC + * [3]: PAD_tdminA + * [4]: PAD_tdminB + * [5]: PAD_tdminC + * /spdifin_lb src + * spdifout_a + * spdifout_b + */ +enum datalb_src { + TDMINLB_TDMOUTA = 0, + TDMINLB_TDMOUTB, + TDMINLB_TDMOUTC, + TDMINLB_PAD_TDMINA, + TDMINLB_PAD_TDMINB, + TDMINLB_PAD_TDMINC, + + SPDIFINLB_SPDIFOUTA, + SPDIFINLB_SPDIFOUTB, +}; +#endif diff --git a/sound/soc/amlogic/auge/loopback_hw.c b/sound/soc/amlogic/auge/loopback_hw.c index 15144b9..0508769 100644 --- a/sound/soc/amlogic/auge/loopback_hw.c +++ b/sound/soc/amlogic/auge/loopback_hw.c @@ -14,193 +14,80 @@ * more details. * */ -#include +#define DEBUG + +#include "linux/kernel.h" -#include "regs.h" #include "loopback_hw.h" +#include "regs.h" #include "iomap.h" -void datain_config(struct data_in *datain) -{ - audiobus_update_bits( - EE_AUDIO_LB_CTRL0, - 1 << 29 | 0x7 << 24 | 0xff << 16 | - 0x7 << 13 | 0x1f << 8 | 0x1f << 3 | - 0x7 << 0, - datain->config->ext_signed << 29 | - (datain->config->chnum - 1) << 24 | - datain->config->chmask << 16 | - datain->ddrdata->combined_type << 13 | - datain->ddrdata->msb << 8 | - datain->ddrdata->lsb << 3 | - datain->ddrdata->src << 0 - ); -} -void datalb_config(struct data_lb *datalb) +void tdminlb_set_clk(int datatlb_src, int sclk_div, int ratio, bool enable) { - audiobus_write( - EE_AUDIO_LB_CTRL1, - datalb->config->ext_signed << 29 | - (datalb->config->chnum - 1) << 24 | - datalb->config->chmask << 16 | - datalb->ddr_type << 13 | - datalb->msb << 8 | - datalb->lsb << 3 - ); -} - -void datalb_ctrl(struct loopback_cfg *lb_cfg) -{ - int id = lb_cfg->datalb_src; - int offset = 0; - int reg, reg_base; + unsigned int bclk_sel, fsclk_sel; + unsigned int tdmin_src; + + /* config for external codec */ + if (datatlb_src >= 3) { + unsigned int clk_id = datatlb_src - 3; + unsigned int offset, reg; + unsigned int fsclk_hi; + + fsclk_hi = ratio / 2; + bclk_sel = clk_id; + fsclk_sel = clk_id; + + /*sclk, lrclk*/ + offset = EE_AUDIO_MST_B_SCLK_CTRL0 - EE_AUDIO_MST_A_SCLK_CTRL0; + reg = EE_AUDIO_MST_A_SCLK_CTRL0 + offset * clk_id; + audiobus_update_bits(reg, + 0x3 << 30 | 0x3ff << 20 | 0x3ff<<10 | 0x3ff, + (enable ? 0x3 : 0x0) << 30 + | sclk_div << 20 | fsclk_hi << 10 + | ratio); + + + tdmin_src = datatlb_src - 3; + } else + tdmin_src = datatlb_src; audiobus_update_bits( - EE_AUDIO_TDMIN_LB_CTRL, - 0xf << 28 | 0xf << 20 | 0x7 << 16 | 0x1f << 0, - 1 << 31 | - /*0:tdm mode; 1: i2s mode;*/ - 1 << 30 | - 1 << 29 | - 1 << 28 | - lb_cfg->datalb_src << 20 | - 3 << 16| - 31 << 0 - ); - - if (id >= 0 && id <= 2) { - /* tdmout_a, tdmout_b, tdmout_c */ - reg_base = EE_AUDIO_TDMOUT_A_SWAP0; - offset = EE_AUDIO_TDMOUT_B_SWAP0 - EE_AUDIO_TDMOUT_A_SWAP0; - } else if (id < 6) { - /*lb_cfg->datalb_src for pad tdm in, - *pad from tdmin_a, tdmin_b, tdmin_c - */ - /* id offset from tdmin_a */ - id -= 3; - - reg_base = EE_AUDIO_TDMIN_A_CTRL; - offset = EE_AUDIO_TDMIN_B_CTRL - EE_AUDIO_TDMIN_A_CTRL; - reg = reg_base + offset * id; - audiobus_update_bits(reg, 3<<28, 0); - audiobus_update_bits(reg, 1<<29, 1<<29); - audiobus_update_bits(reg, 1<<28, 1<<28); - - /* just assume lb from tdm in is i2s mode */ - audiobus_update_bits( - reg, - 0xf << 28 | 0xf << 20 | 0x7 << 16 | 0x1f << 0, - 1 << 31 | - /* 0:tdm mode; 1: i2s mode */ - 1 << 30 | - 1 << 29 | - 1 << 28 | - id << 20 | - 3 << 16| - 31 << 0 - ); - - pr_info("reg:0x%x, EE_AUDIO_TDMIN_A_CTRL:0x%x\n", - reg, - audiobus_read(EE_AUDIO_TDMIN_A_CTRL)); - /* swap */ - reg += 1; - audiobus_write( - reg, - lb_cfg->datalb_chswap); - - /* mask 0 */ - reg += 1; - audiobus_write( - reg, - lb_cfg->datalb_chmask); - reg_base = EE_AUDIO_TDMIN_A_SWAP0; - offset = EE_AUDIO_TDMIN_B_SWAP0 - EE_AUDIO_TDMIN_A_SWAP0; - } else { - pr_err("unsupport datalb_src\n"); - return; - } - - if (lb_cfg->datain_datalb_total > 8) { - audiobus_write( - EE_AUDIO_TDMIN_LB_SWAP0, - lb_cfg->datalb_chswap); - - audiobus_write(EE_AUDIO_TDMIN_LB_MASK0, 3); - audiobus_write(EE_AUDIO_TDMIN_LB_MASK1, 3); - audiobus_write(EE_AUDIO_TDMIN_LB_MASK2, 3); - audiobus_write(EE_AUDIO_TDMIN_LB_MASK3, 3); - } else { - /*swap same as tdmout */ - reg = reg_base + offset * id; - audiobus_write(EE_AUDIO_TDMIN_LB_SWAP0, - audiobus_read(reg)); - - /*mask same as datalb*/ - /* mask 0 */ - reg += 1; - audiobus_write( - EE_AUDIO_TDMIN_LB_MASK0, - audiobus_read(reg)); - - /* mask 1 */ - reg += 1; - audiobus_write( - EE_AUDIO_TDMIN_LB_MASK1, - audiobus_read(reg)); - - /* mask 2 */ - reg += 1; - audiobus_write( - EE_AUDIO_TDMIN_LB_MASK2, - audiobus_read(reg)); - - /* mask 3 */ - reg += 1; - audiobus_write( - EE_AUDIO_TDMIN_LB_MASK3, - audiobus_read(reg)); - } + EE_AUDIO_CLK_TDMIN_LB_CTRL, + 0x3 << 30 | 1 << 29 | 0xf << 24 | 0xf << 20, + (enable ? 0x3 : 0x0) << 30 | + 1 << 29 | tdmin_src << 24 | tdmin_src << 20 + ); } -void lb_mode(int mode) +void tdminlb_enable(int tdm_index, int is_enable) { -// TODO: - return; -#if 0 audiobus_update_bits( - EE_AUDIO_LB_CTRL0, - 0x1 << 30, - mode << 30 - ); -#endif + EE_AUDIO_TDMIN_LB_CTRL, + 0x1 << 31, + is_enable << 31); } -static void tdmin_lb_clk_enalbe(int tdm_src, int is_enable) +void tdminlb_set_format(int i2s_fmt) { - if (tdm_src <= 2) - audiobus_update_bits( - EE_AUDIO_CLK_TDMIN_LB_CTRL, - 0x3 << 30 | 1 << 29 | 0xf << 24 | 0xf << 20, - 0x3 << 30 | 1 << 29 | tdm_src << 24 | tdm_src << 20 - ); - else - pr_warn_once("pad from tdmin_a, tdmin_b, tdmin_c needs clks\n"); + audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, + 0x1 << 30, + i2s_fmt << 30 /* 0:tdm mode; 1: i2s mode; */ + ); } -void tdmin_lb_enable(int tdm_index, int is_enable) +void tdminlb_set_ctrl(int src) { - if (is_enable) - tdmin_lb_clk_enalbe(tdm_index, is_enable); - audiobus_update_bits( EE_AUDIO_TDMIN_LB_CTRL, - 0x1 << 31, - is_enable << 31); + 0xf << 20 | 0x7 << 16 | 0x1f << 0, + src << 20 | /* in src */ + 3 << 16 | /* skew */ + 31 << 0 /* bit width */ + ); } -void tdmin_lb_fifo_enable(int is_enable) +void tdminlb_fifo_enable(int is_enable) { if (is_enable) { audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, 1<<29, 1<<29); @@ -209,39 +96,123 @@ void tdmin_lb_fifo_enable(int is_enable) audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, 3<<28, 0); } - -void lb_set_datain_src(int src) +static void tdminlb_set_lane_mask(int lane, int mask) { + audiobus_write(EE_AUDIO_TDMIN_LB_MASK0 + lane, mask); } -void lb_set_tdminlb_src(int src) +void tdminlb_set_lanemask_and_chswap(int swap, int lane_mask) { + unsigned int mask; + unsigned int i; + + pr_debug("tdmin_lb lane swap:0x%x mask:0x%x\n", swap, lane_mask); + + mask = 0x3; /* i2s format */ + + /* channel swap */ + audiobus_write(EE_AUDIO_TDMIN_LB_SWAP0, swap); + + /* lane mask */ + for (i = 0; i < 4; i++) + if ((1 << i) & lane_mask) + tdminlb_set_lane_mask(i, mask); } -void lb_set_tdminlb_enable(bool is_enable) +void tdminlb_set_src(int src) { + audiobus_update_bits(EE_AUDIO_TDMIN_LB_CTRL, 0xf << 20, src); } -int lb_is_enable(void) +void lb_set_datain_src(int id, int src) { - return (audiobus_read(EE_AUDIO_LB_CTRL0) & 0x80000000) >> 31; + int offset = EE_AUDIO_LB_B_CTRL0 - EE_AUDIO_LB_A_CTRL0; + int reg = EE_AUDIO_LB_A_CTRL0 + offset * id; + + audiobus_update_bits(reg, 0x7 << 0, src); } -void lb_enable(bool is_enable) +void lb_set_datain_cfg(int id, struct data_cfg *datain_cfg) { - audiobus_update_bits( - EE_AUDIO_LB_CTRL0, - 0x1 << 31, - is_enable << 31 + int offset = EE_AUDIO_LB_B_CTRL0 - EE_AUDIO_LB_A_CTRL0; + int reg = EE_AUDIO_LB_A_CTRL0 + offset * id; + + if (!datain_cfg) + return; + + if (datain_cfg->ch_ctrl_switch) { + audiobus_update_bits(reg, + 1 << 29 | 0x7 << 13 | 0x1f << 8 | 0x1f << 3 | 0x7 << 0, + datain_cfg->ext_signed << 29 | + datain_cfg->type << 13 | + datain_cfg->m << 8 | + datain_cfg->n << 3 | + datain_cfg->src << 0 + ); + + /* channel and mask */ + offset = EE_AUDIO_LB_B_CTRL2 - EE_AUDIO_LB_A_CTRL2; + reg = EE_AUDIO_LB_A_CTRL2 + offset * id; + audiobus_write(reg, + (datain_cfg->chnum - 1) << 16 | + datain_cfg->chmask << 0 + ); + } else + audiobus_update_bits(reg, + 1 << 29 | 0x7 << 24 | 0xff << 16 | + 0x7 << 13 | 0x1f << 8 | 0x1f << 3 | + 0x7 << 0, + datain_cfg->ext_signed << 29 | + (datain_cfg->chnum - 1) << 24 | + datain_cfg->chmask << 16 | + datain_cfg->type << 13 | + datain_cfg->m << 8 | + datain_cfg->n << 3 | + datain_cfg->src << 0 ); } -void lb_set_mode(int mode) +void lb_set_datalb_cfg(int id, struct data_cfg *datalb_cfg) { - audiobus_update_bits( - EE_AUDIO_LB_CTRL0, - 0x1 << 30, - mode << 30 + int offset = EE_AUDIO_LB_B_CTRL1 - EE_AUDIO_LB_A_CTRL1; + int reg = EE_AUDIO_LB_A_CTRL1 + offset * id; + + if (!datalb_cfg) + return; + + if (datalb_cfg->ch_ctrl_switch) { + audiobus_update_bits(reg, + 0x1 << 29 | 0x7 << 13 | 0x1f << 8 + | 0x1f << 3 | 0x1 << 1, + datalb_cfg->ext_signed << 29 | + datalb_cfg->type << 13 | + datalb_cfg->m << 8 | + datalb_cfg->n << 3 | + datalb_cfg->datalb_src << 0 + ); + + /* channel and mask */ + offset = EE_AUDIO_LB_B_CTRL3 - EE_AUDIO_LB_A_CTRL3; + reg = EE_AUDIO_LB_A_CTRL3 + offset * id; + audiobus_write(reg, + (datalb_cfg->chnum - 1) << 16 | + datalb_cfg->chmask << 0 + ); + } else + audiobus_write(reg, + datalb_cfg->ext_signed << 29 | + (datalb_cfg->chnum - 1) << 24 | + datalb_cfg->chmask << 16 | + datalb_cfg->type << 13 | + datalb_cfg->m << 8 | + datalb_cfg->n << 3 ); } +void lb_enable(int id, bool enable) +{ + int offset = EE_AUDIO_LB_B_CTRL0 - EE_AUDIO_LB_A_CTRL0; + int reg = EE_AUDIO_LB_A_CTRL0 + offset * id; + + audiobus_update_bits(reg, 0x1 << 31, enable << 31); +} diff --git a/sound/soc/amlogic/auge/loopback_hw.h b/sound/soc/amlogic/auge/loopback_hw.h index 13115d8..776299a 100644 --- a/sound/soc/amlogic/auge/loopback_hw.h +++ b/sound/soc/amlogic/auge/loopback_hw.h @@ -18,54 +18,55 @@ #ifndef __AML_LOOPBACK_HW_H__ #define __AML_LOOPBACK_HW_H__ -#include "audio_utils.h" +#include -struct lb_cfg { +struct data_cfg { /* * 0: extend bits as "0" * 1: extend bits as "msb" */ unsigned int ext_signed; - /* total channel number */ + /* channel number */ unsigned int chnum; - /* which channel is selected for loopback */ + /* channel selected */ unsigned int chmask; -}; + /* combined data */ + unsigned int type; + /* the msb positioin in data */ + unsigned int m; + /* the lsb position in data */ + unsigned int n; -struct data_in { - struct lb_cfg *config; - struct audio_data *ddrdata; -}; + /* loopback datalb src */ + unsigned int src; -struct data_lb { - struct lb_cfg *config; - unsigned int ddr_type; - unsigned int msb; - unsigned int lsb; + unsigned int datalb_src; + + /* channel and mask in new ctrol register */ + bool ch_ctrl_switch; }; -struct loopback { - struct device *dev; - unsigned int lb_mode; +extern void tdminlb_set_clk(int datatlb_src, + int sclk_div, int ratio, bool enable); - struct data_in *datain; - struct data_lb *datalb; -}; +extern void tdminlb_set_format(int i2s_fmt); +extern void tdminlb_set_ctrl(int src); -extern void datain_config(struct data_in *datain); +extern void tdminlb_enable(int tdm_index, int in_enable); -extern void datalb_config(struct data_lb *datalb); +extern void tdminlb_fifo_enable(int is_enable); -extern void datalb_ctrl(struct loopback_cfg *lb_cfg); +extern void tdminlb_set_format(int i2s_fmt); +extern void tdminlb_set_lanemask_and_chswap(int swap, int lane_mask); -extern int lb_is_enable(void); -extern void lb_enable(bool is_enable); +extern void tdminlb_set_src(int src); +extern void lb_set_datain_src(int id, int src); -extern void lb_mode(int mode); +extern void lb_set_datain_cfg(int id, struct data_cfg *datain_cfg); +extern void lb_set_datalb_cfg(int id, struct data_cfg *datalb_cfg); -extern void tdmin_lb_enable(int tdm_index, int in_enable); +extern void lb_enable(int id, bool enable); -extern void tdmin_lb_fifo_enable(int is_enable); #endif diff --git a/sound/soc/amlogic/auge/loopback_match_table.c b/sound/soc/amlogic/auge/loopback_match_table.c new file mode 100644 index 0000000..566e106 --- /dev/null +++ b/sound/soc/amlogic/auge/loopback_match_table.c @@ -0,0 +1,104 @@ +/* + * sound/soc/amlogic/auge/loopback_match_table.c + * + * Copyright (C) 2019 Amlogic, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +#define LOOPBACKA 0 +#define LOOPBACKB 1 + +struct loopback_chipinfo { + unsigned int id; + + /* reset all modules, after g12a + * it has reset bits control for modules + */ + bool is_reset_all; + + /* channel and mask switch to ctrl2, ctrl3 from tl1 + * for datain, 0: channel and mask is controlled by ctrl0 + * 1: channel and mask is controlled by ctrl2 + * for datalb, 0: channel and mask is controlled by ctrl1 + * 1: channel and mask is controlled by ctrl3 + */ + bool ch_ctrl; +}; + +static struct loopback_chipinfo tl1_loopbacka_chipinfo = { + .id = LOOPBACKA, + .ch_ctrl = true, +}; + +static struct loopback_chipinfo tl1_loopbackb_chipinfo = { + .id = LOOPBACKB, + .ch_ctrl = true, +}; + +static struct loopback_chipinfo sm1_loopbacka_chipinfo = { + .id = LOOPBACKA, + .ch_ctrl = true, +}; + +static struct loopback_chipinfo sm1_loopbackb_chipinfo = { + .id = LOOPBACKB, + .ch_ctrl = true, +}; + +static struct loopback_chipinfo tm2_loopbacka_chipinfo = { + .id = LOOPBACKA, + .ch_ctrl = true, +}; + +static struct loopback_chipinfo tm2_loopbackb_chipinfo = { + .id = LOOPBACKB, + .ch_ctrl = true, +}; + +static const struct of_device_id loopback_device_id[] = { + { + .compatible = "amlogic, snd-loopback", + }, + { + .compatible = "amlogic, axg-loopback", + }, + { + .compatible = "amlogic, g12a-loopback", + }, + { + .compatible = "amlogic, tl1-loopbacka", + .data = &tl1_loopbacka_chipinfo, + }, + { + .compatible = "amlogic, tl1-loopbackb", + .data = &tl1_loopbackb_chipinfo, + }, + { + .compatible = "amlogic, sm1-loopbacka", + .data = &sm1_loopbacka_chipinfo, + }, + { + .compatible = "amlogic, sm1-loopbackb", + .data = &sm1_loopbackb_chipinfo, + }, + { + .compatible = "amlogic, tm2-loopbacka", + .data = &tm2_loopbacka_chipinfo, + }, + { + .compatible = "amlogic, tm2-loopbackb", + .data = &tm2_loopbackb_chipinfo, + }, + {} +}; +MODULE_DEVICE_TABLE(of, loopback_device_id); diff --git a/sound/soc/amlogic/auge/pdm.c b/sound/soc/amlogic/auge/pdm.c index 72540b4..3debb34 100644 --- a/sound/soc/amlogic/auge/pdm.c +++ b/sound/soc/amlogic/auge/pdm.c @@ -76,8 +76,6 @@ static struct snd_pcm_hw_constraint_list hw_constraints_period_sizes = { .mask = 0 }; -static int s_pdm_filter_mode; - static const char *const pdm_filter_mode_texts[] = { "Filter Mode 0", "Filter Mode 1", @@ -94,7 +92,13 @@ static int aml_pdm_filter_mode_get_enum( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - ucontrol->value.enumerated.item[0] = s_pdm_filter_mode; + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; + + ucontrol->value.enumerated.item[0] = p_pdm->filter_mode; return 0; } @@ -103,7 +107,13 @@ static int aml_pdm_filter_mode_set_enum( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - s_pdm_filter_mode = ucontrol->value.enumerated.item[0]; + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; + + p_pdm->filter_mode = ucontrol->value.enumerated.item[0]; return 0; } @@ -137,8 +147,6 @@ static int pdm_hcic_shift_gain_set_enum( return 0; } -int pdm_dclk; - static const char *const pdm_dclk_texts[] = { "PDM Dclk 3.072m, support 8k/16k/32k/48k/64k/96k", "PDM Dclk 1.024m, support 8k/16k", @@ -153,7 +161,13 @@ static int pdm_dclk_get_enum( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - ucontrol->value.enumerated.item[0] = pdm_dclk; + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; + + ucontrol->value.enumerated.item[0] = p_pdm->dclk_idx; return 0; } @@ -162,7 +176,56 @@ static int pdm_dclk_set_enum( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - pdm_dclk = ucontrol->value.enumerated.item[0]; + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; + + p_pdm->dclk_idx = ucontrol->value.enumerated.item[0]; + + return 0; +} + + +static const char *const pdm_bypass_texts[] = { + "PCM Data", + "Raw Data/Bypass Data", +}; + +static const struct soc_enum pdm_bypass_enum = + SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(pdm_bypass_texts), + pdm_bypass_texts); + +static int pdm_bypass_get_enum( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; + + ucontrol->value.enumerated.item[0] = p_pdm->bypass; + + return 0; +} + +static int pdm_bypass_set_enum( + struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; + + p_pdm->bypass = ucontrol->value.enumerated.item[0]; + + if (p_pdm->clk_on) + pdm_set_bypass_data((bool)p_pdm->bypass); return 0; } @@ -180,8 +243,11 @@ static int pdm_train_get_enum( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol); - struct aml_pdm *p_pdm = snd_soc_dai_get_drvdata(cpu_dai); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); + + if (!p_pdm) + return 0; ucontrol->value.enumerated.item[0] = p_pdm->train_en; @@ -192,10 +258,11 @@ static int pdm_train_set_enum( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol); - struct aml_pdm *p_pdm = snd_soc_dai_get_drvdata(cpu_dai); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct aml_pdm *p_pdm = dev_get_drvdata(component->dev); - if (!p_pdm->chipinfo || + if (!p_pdm || + !p_pdm->chipinfo || !p_pdm->chipinfo->train || (p_pdm->train_en == ucontrol->value.enumerated.item[0])) return 0; @@ -230,6 +297,11 @@ static const struct snd_kcontrol_new snd_pdm_controls[] = { pdm_train_enum, pdm_train_get_enum, pdm_train_set_enum), + + SOC_ENUM_EXT("PDM Bypass", + pdm_bypass_enum, + pdm_bypass_get_enum, + pdm_bypass_set_enum), }; #if 0 @@ -252,7 +324,7 @@ static int pdm_mute_val_get(struct snd_kcontrol *kcontrol, val = pdm_get_mute_value(); ucontrol->value.integer.value[0] = val; - pr_info("%s:get mute_val:0x%x\n", + pr_info("%s, get mute_val:0x%x\n", __func__, val); @@ -264,7 +336,7 @@ static int pdm_mute_val_set(struct snd_kcontrol *kcontrol, { int val = (int)ucontrol->value.integer.value[0]; - pr_info("%s:set mute_val:0x%x\n", + pr_info("%s, set mute_val:0x%x\n", __func__, val); @@ -302,7 +374,7 @@ static int pdm_mute_chmask_get(struct snd_kcontrol *kcontrol, ucontrol->value.integer.value[0] = val; - pr_info("%s:get pdm channel mask val:0x%x\n", + pr_info("%s, get pdm channel mask val:0x%x\n", __func__, val); @@ -319,7 +391,7 @@ static int pdm_mute_chmask_set(struct snd_kcontrol *kcontrol, if (val > 255) val = 255; - pr_info("%s:set pdm channel mask val:0x%x\n", + pr_info("%s, set pdm channel mask val:0x%x\n", __func__, val); @@ -379,11 +451,25 @@ static irqreturn_t aml_pdm_isr_handler(int irq, void *data) { struct snd_pcm_substream *substream = (struct snd_pcm_substream *)data; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct device *dev = rtd->platform->dev; + struct aml_pdm *p_pdm = (struct aml_pdm *)dev_get_drvdata(dev); + unsigned int status; int train_sts = pdm_train_sts(); pr_debug("%s\n", __func__); - snd_pcm_period_elapsed(substream); + if (!snd_pcm_running(substream)) + return IRQ_NONE; + + status = aml_toddr_get_status(p_pdm->tddr) & MEMIF_INT_MASK; + if (status & MEMIF_INT_COUNT_REPEAT) { + snd_pcm_period_elapsed(substream); + + aml_toddr_ack_irq(p_pdm->tddr, MEMIF_INT_COUNT_REPEAT); + } else + dev_dbg(dev, "unexpected irq - STS 0x%02x\n", + status); if (train_sts) { pr_debug("%s train result:0x%x\n", @@ -392,7 +478,7 @@ static irqreturn_t aml_pdm_isr_handler(int irq, void *data) pdm_train_clr(); } - return IRQ_HANDLED; + return !status ? IRQ_NONE : IRQ_HANDLED; } static int aml_pdm_open(struct snd_pcm_substream *substream) @@ -404,7 +490,7 @@ static int aml_pdm_open(struct snd_pcm_substream *substream) dev_get_drvdata(dev); int ret; - pr_info("%s, stream:%d\n", + pr_debug("%s, stream:%d\n", __func__, substream->stream); snd_soc_set_runtime_hwparams(substream, &aml_pdm_hardware); @@ -453,7 +539,7 @@ static int aml_pdm_close(struct snd_pcm_substream *substream) struct device *dev = rtd->platform->dev; struct aml_pdm *p_pdm = (struct aml_pdm *)dev_get_drvdata(dev); - pr_info("enter %s type: %d\n", + pr_debug("enter %s type: %d\n", __func__, substream->stream); aml_audio_unregister_toddr(p_pdm->dev, substream); @@ -469,7 +555,7 @@ static int aml_pdm_hw_params( struct snd_pcm_runtime *runtime = substream->runtime; int ret = 0; - pr_info("enter %s\n", __func__); + pr_debug("enter %s\n", __func__); snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); runtime->dma_bytes = params_buffer_bytes(params); @@ -480,7 +566,7 @@ static int aml_pdm_hw_params( static int aml_pdm_hw_free(struct snd_pcm_substream *substream) { - pr_info("%s\n", __func__); + pr_debug("%s\n", __func__); snd_pcm_lib_free_pages(substream); return 0; @@ -547,7 +633,7 @@ static int aml_pdm_silence( unsigned char *ppos = NULL; ssize_t n; - pr_info("%s\n", __func__); + pr_debug("%s\n", __func__); n = frames_to_bytes(runtime, count); ppos = runtime->dma_area + frames_to_bytes(runtime, pos); @@ -564,7 +650,7 @@ static int aml_pdm_pcm_new(struct snd_soc_pcm_runtime *soc_runtime) int size = aml_pdm_hardware.buffer_bytes_max; int ret = -EINVAL; - pr_info("%s dai->name: %s dai->id: %d\n", + pr_debug("%s dai->name: %s dai->id: %d\n", __func__, dai->name, dai->id); /* only capture for PDM */ @@ -586,7 +672,7 @@ static void aml_pdm_pcm_free(struct snd_pcm *pcm) { struct snd_pcm_substream *substream; - pr_info("%s\n", __func__); + pr_debug("%s\n", __func__); substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; if (substream) { @@ -611,7 +697,7 @@ static struct snd_pcm_ops aml_pdm_ops = { static int aml_pdm_probe(struct snd_soc_platform *platform) { - pr_info("%s\n", __func__); + pr_debug("%s\n", __func__); return 0; } @@ -638,7 +724,6 @@ static int aml_pdm_dai_set_fmt( return 0; } - static int aml_pdm_dai_prepare( struct snd_pcm_substream *substream, struct snd_soc_dai *cpu_dai) @@ -652,6 +737,8 @@ static int aml_pdm_dai_prepare( && pm_audio_is_suspend()) return 0; + p_pdm->rate = runtime->rate; + /* set bclk */ bitwidth = snd_pcm_format_width(runtime->format); lsb = 32 - bitwidth; @@ -670,17 +757,16 @@ static int aml_pdm_dai_prepare( return -1; } - pr_info("%s rate:%d, bits:%d, channels:%d\n", + pr_debug("%s rate:%d, bits:%d, channels:%d\n", __func__, runtime->rate, bitwidth, runtime->channels); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { struct toddr *to = p_pdm->tddr; struct toddr_fmt fmt; - unsigned int osr = 192; + unsigned int osr = 192, filter_mode; struct pdm_info info; /* to ddr pdmin */ @@ -698,49 +784,27 @@ static int aml_pdm_dai_prepare( info.bitdepth = bitwidth; info.channels = runtime->channels; info.lane_masks = p_pdm->lane_mask_in; - info.dclk_idx = pdm_dclk; + info.dclk_idx = p_pdm->dclk_idx; info.bypass = p_pdm->bypass; + info.sample_count = pdm_get_sample_count(p_pdm->isLowPower, + p_pdm->dclk_idx); aml_pdm_ctrl(&info); + filter_mode = p_pdm->filter_mode; + /* filter for pdm */ - if (pdm_dclk == 1) { - if (runtime->rate == 16000) - osr = 64; - else if (runtime->rate == 8000) - osr = 128; - else { - pr_err("Not support rate:%d\n", runtime->rate); - return -EINVAL; - } - } else if (pdm_dclk == 2) { - if (runtime->rate == 16000) - osr = 48; - else if (runtime->rate == 8000) - osr = 96; - else { - pr_err("Not support rate:%d\n", runtime->rate); - return -EINVAL; - } - } else { - if (runtime->rate == 96000) - osr = 32; - else if (runtime->rate == 64000) - osr = 48; - else if (runtime->rate == 48000) - osr = 64; - else if (runtime->rate == 32000) - osr = 96; - else if (runtime->rate == 16000) - osr = 192; - else if (runtime->rate == 8000) - osr = 384; - else { - pr_err("Not support rate:%d\n", runtime->rate); - return -EINVAL; - } - } - p_pdm->filter_mode = s_pdm_filter_mode; - aml_pdm_filter_ctrl(osr, p_pdm->filter_mode); + osr = pdm_get_ors(p_pdm->dclk_idx, runtime->rate); + if (!osr) + return -EINVAL; + + pr_info("%s, pdm_dclk:%d, osr:%d, rate:%d filter mode:%d\n", + __func__, + pdm_dclkidx2rate(p_pdm->dclk_idx), + osr, + runtime->rate, + p_pdm->filter_mode); + + aml_pdm_filter_ctrl(osr, filter_mode); if (p_pdm->chipinfo && p_pdm->chipinfo->truncate_data) pdm_init_truncate_data(runtime->rate); @@ -755,7 +819,7 @@ static int aml_pdm_dai_trigger( { struct aml_pdm *p_pdm = snd_soc_dai_get_drvdata(cpu_dai); - pr_info("%s, cmd:%d\n", __func__, cmd); + pr_debug("%s\n", __func__); switch (cmd) { case SNDRV_PCM_TRIGGER_START: @@ -773,7 +837,7 @@ static int aml_pdm_dai_trigger( pdm_fifo_reset(); if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - dev_info(substream->pcm->card->dev, "pdm capture start\n"); + dev_info(substream->pcm->card->dev, "PDM Capture start\n"); aml_toddr_enable(p_pdm->tddr, 1); pdm_enable(1); } @@ -820,37 +884,21 @@ static int aml_pdm_dai_set_sysclk(struct snd_soc_dai *cpu_dai, if (dclk_srcpll_freq == 0) clk_set_rate(p_pdm->dclk_srcpll, 24576000); - else - pr_info("pdm dclk_srcpll:%lu\n", - clk_get_rate(p_pdm->dclk_srcpll)); #endif - if (pdm_dclk == 1) - clk_set_rate(p_pdm->clk_pdm_dclk, 1024000); - else if (pdm_dclk == 2) - clk_set_rate(p_pdm->clk_pdm_dclk, 768000); - else - clk_set_rate(p_pdm->clk_pdm_dclk, 3072000); - - pr_info("pdm pdm_sysclk:%lu clk_pdm_dclk:%lu\n", + clk_set_rate(p_pdm->clk_pdm_dclk, + pdm_dclkidx2rate(p_pdm->dclk_idx)); + + pr_info("\n%s, pdm_sysclk:%lu pdm_dclk:%lu, dclk_srcpll:%lu\n", + __func__, clk_get_rate(p_pdm->clk_pdm_sysclk), - clk_get_rate(p_pdm->clk_pdm_dclk)); + clk_get_rate(p_pdm->clk_pdm_dclk), + clk_get_rate(p_pdm->dclk_srcpll)); return 0; } static int aml_pdm_dai_probe(struct snd_soc_dai *cpu_dai) { - int ret = 0; - - ret = snd_soc_add_dai_controls(cpu_dai, snd_pdm_controls, - ARRAY_SIZE(snd_pdm_controls)); - if (ret < 0) { - pr_err("%s, failed add snd pdm controls\n", __func__); - return ret; - } - - pr_info("%s\n", __func__); - return 0; } @@ -919,6 +967,7 @@ void aml_pdm_dai_shutdown(struct snd_pcm_substream *substream, #endif p_pdm->clk_on = false; + p_pdm->rate = 0; /* disable clock and gate */ clk_disable_unprepare(p_pdm->clk_pdm_dclk); @@ -955,6 +1004,8 @@ EXPORT_SYMBOL_GPL(aml_pdm_dai); static const struct snd_soc_component_driver aml_pdm_component = { .name = DRV_NAME, + .controls = snd_pdm_controls, + .num_controls = ARRAY_SIZE(snd_pdm_controls), }; static int snd_soc_of_get_slot_mask( @@ -1094,9 +1145,6 @@ static int aml_pdm_platform_probe(struct platform_device *pdev) /* defulat set 1 */ p_pdm->filter_mode = 1; } - s_pdm_filter_mode = p_pdm->filter_mode; - pr_info("%s pdm filter mode from dts:%d\n", - __func__, p_pdm->filter_mode); p_pdm->dev = dev; dev_set_drvdata(&pdev->dev, p_pdm); @@ -1126,10 +1174,10 @@ err: static int aml_pdm_platform_remove(struct platform_device *pdev) { - struct aml_pdm *pdm_priv = dev_get_drvdata(&pdev->dev); + struct aml_pdm *p_pdm = dev_get_drvdata(&pdev->dev); - clk_disable_unprepare(pdm_priv->sysclk_srcpll); - clk_disable_unprepare(pdm_priv->clk_pdm_dclk); + clk_disable_unprepare(p_pdm->sysclk_srcpll); + clk_disable_unprepare(p_pdm->clk_pdm_dclk); snd_soc_unregister_component(&pdev->dev); diff --git a/sound/soc/amlogic/auge/pdm.h b/sound/soc/amlogic/auge/pdm.h index 39bf6ab..877a2fb 100644 --- a/sound/soc/amlogic/auge/pdm.h +++ b/sound/soc/amlogic/auge/pdm.h @@ -30,7 +30,6 @@ /* 8ch pdm in, 8 ch tdmin_lb */ #define PDM_CHANNELS_LB_MAX (PDM_CHANNELS_MAX + 8) - #define PDM_RATES (SNDRV_PCM_RATE_96000 |\ SNDRV_PCM_RATE_64000 |\ SNDRV_PCM_RATE_48000 |\ @@ -70,6 +69,8 @@ struct aml_pdm { struct clk *clk_pdm_sysclk; struct clk *clk_pdm_dclk; struct toddr *tddr; + /* sample rate */ + int rate; /* * filter mode:0~4, * from mode 0 to 4, the performance is from high to low, @@ -90,6 +91,9 @@ struct aml_pdm { /* train */ bool train_en; + /* low power mode, for dclk_sycpll to 24m */ + bool isLowPower; + struct pdm_chipinfo *chipinfo; struct snd_kcontrol *controls[PDM_RUN_MAX]; }; diff --git a/sound/soc/amlogic/auge/pdm_hw.c b/sound/soc/amlogic/auge/pdm_hw.c index 1b4d2e1..5b0f06b 100644 --- a/sound/soc/amlogic/auge/pdm_hw.c +++ b/sound/soc/amlogic/auge/pdm_hw.c @@ -59,22 +59,28 @@ void pdm_fifo_reset(void) 0x1 << 16); } +void pdm_set_channel_ctrl(int sample_count) +{ + aml_pdm_write(PDM_CHAN_CTRL, ((sample_count << 24) | + (sample_count << 16) | + (sample_count << 8) | + (sample_count << 0) + )); + aml_pdm_write(PDM_CHAN_CTRL1, ((sample_count << 24) | + (sample_count << 16) | + (sample_count << 8) | + (sample_count << 0) + )); +} + void aml_pdm_ctrl(struct pdm_info *info) { - int mode, i, ch_mask = 0, sample_count; + int mode, i, ch_mask = 0; int pdm_chs, lane_chs = 0; if (!info) return; - /* sameple count */ - if (info->dclk_idx == 1) - sample_count = 38; - else if (info->dclk_idx == 2) - sample_count = 48; - else - sample_count = 18; - if (info->bitdepth == 32) mode = 0; else @@ -113,7 +119,6 @@ void aml_pdm_ctrl(struct pdm_info *info) /* must be sure that clk and pdm is enable */ aml_pdm_update_bits(PDM_CTRL, (0x7 << 28 | 0xff << 8 | 0xff << 0), - /*(1 << 31) |*/ /* invert the PDM_DCLK or not */ (0 << 30) | /* output mode: 1: 24bits. 0: 32 bits */ @@ -128,16 +133,7 @@ void aml_pdm_ctrl(struct pdm_info *info) (ch_mask << 0) ); - aml_pdm_write(PDM_CHAN_CTRL, ((sample_count << 24) | - (sample_count << 16) | - (sample_count << 8) | - (sample_count << 0) - )); - aml_pdm_write(PDM_CHAN_CTRL1, ((sample_count << 24) | - (sample_count << 16) | - (sample_count << 8) | - (sample_count << 0) - )); + pdm_set_channel_ctrl(info->sample_count); } void aml_pdm_arb_config(struct aml_audio_controller *actrl) @@ -340,9 +336,6 @@ void aml_pdm_filter_ctrl(int osr, int mode) int lpf1_len, lpf2_len, lpf3_len; const int *lpf1_coeff, *lpf2_coeff, *lpf3_coeff; - pr_info("%s, osr:%d, mode:%d\n", - __func__, osr, mode); - /* select LPF coefficent * For filter 1 and filter 3, * it's only relative with coefficent mode @@ -478,6 +471,11 @@ void pdm_set_mute_channel(int mute_chmask) (mute_chmask << 20 | mute_en << 17)); } +void pdm_set_bypass_data(bool bypass) +{ + aml_pdm_update_bits(PDM_CTRL, 0x1 << 28, bypass << 28); +} + void pdm_init_truncate_data(int freq) { int mask_val; @@ -508,3 +506,71 @@ int pdm_train_sts(void) return ((val >> 4) & 0xff); } + +int pdm_dclkidx2rate(int idx) +{ + int rate; + + if (idx == 2) + rate = 768000; + else if (idx == 1) + rate = 1024000; + else + rate = 3072000; + + return rate; +} + +int pdm_get_sample_count(int isLowPower, int dclk_idx) +{ + int count = 0; + + if (isLowPower) + count = 0; + else if (dclk_idx == 1) + count = 38; + else if (dclk_idx == 2) + count = 48; + else + count = 18; + + return count; +} + +int pdm_get_ors(int dclk_idx, int sample_rate) +{ + int osr = 0; + + if (dclk_idx == 1) { + if (sample_rate == 16000) + osr = 64; + else if (sample_rate == 8000) + osr = 128; + else + pr_err("Not support rate:%d\n", sample_rate); + } else if (dclk_idx == 2) { + if (sample_rate == 16000) + osr = 48; + else if (sample_rate == 8000) + osr = 96; + else + pr_err("Not support rate:%d\n", sample_rate); + } else { + if (sample_rate == 96000) + osr = 32; + else if (sample_rate == 64000) + osr = 48; + else if (sample_rate == 48000) + osr = 64; + else if (sample_rate == 32000) + osr = 96; + else if (sample_rate == 16000) + osr = 192; + else if (sample_rate == 8000) + osr = 384; + else + pr_err("Not support rate:%d\n", sample_rate); + } + + return osr; +} diff --git a/sound/soc/amlogic/auge/pdm_hw.h b/sound/soc/amlogic/auge/pdm_hw.h index b1d8424..b3da8a7 100644 --- a/sound/soc/amlogic/auge/pdm_hw.h +++ b/sound/soc/amlogic/auge/pdm_hw.h @@ -29,6 +29,7 @@ struct pdm_info { int dclk_idx; /* mapping for dclk value */ int bypass; /* bypass all filter, capture raw data */ + int sample_count; }; extern void aml_pdm_ctrl(struct pdm_info *info); @@ -47,14 +48,16 @@ extern int pdm_get_mute_value(void); extern void pdm_set_mute_value(int val); extern int pdm_get_mute_channel(void); extern void pdm_set_mute_channel(int mute_chmask); - +extern void pdm_set_bypass_data(bool bypass); extern void pdm_init_truncate_data(int freq); - extern void pdm_train_en(bool en); extern void pdm_train_clr(void); extern int pdm_train_sts(void); +extern int pdm_dclkidx2rate(int idx); +extern int pdm_get_sample_count(int isLowPower, int dclk_idx); +extern int pdm_get_ors(int dclk_idx, int sample_rate); + extern int pdm_hcic_shift_gain; -extern int pdm_dclk; #endif /*__AML_PDM_HW_H__*/ diff --git a/sound/soc/amlogic/auge/regs.h b/sound/soc/amlogic/auge/regs.h index 2a97ec10..c6ae28f 100644 --- a/sound/soc/amlogic/auge/regs.h +++ b/sound/soc/amlogic/auge/regs.h @@ -197,16 +197,41 @@ enum clk_sel { #define EE_AUDIO_ARB_CTRL 0x0a0 /* - * AUDIO TDM + * AUDIO LOOPBACK */ #define EE_AUDIO_LB_CTRL0 0x0b0 -#define EE_AUDIO_LB_CTRL1 0x0b1 -#define EE_AUDIO_DAT_ID0 0x0b2 -#define EE_AUDIO_DAT_ID1 0x0b3 -#define EE_AUDIO_LB_ID0 0x0b4 -#define EE_AUDIO_LB_ID1 0x0b5 -#define EE_AUDIO_LB_STS 0x0b6 +#define EE_AUDIO_LB_A_CTRL0 0xb0 +#define EE_AUDIO_LB_A_CTRL1 0xb1 +#define EE_AUDIO_LB_A_CTRL2 0xb2 +#define EE_AUDIO_LB_A_CTRL3 0xb3 +#define EE_AUDIO_LB_A_DAT_CH_ID0 0xb4 +#define EE_AUDIO_LB_A_DAT_CH_ID1 0xb5 +#define EE_AUDIO_LB_A_DAT_CH_ID2 0xb6 +#define EE_AUDIO_LB_A_DAT_CH_ID3 0xb7 +#define EE_AUDIO_LB_A_LB_CH_ID0 0xb8 +#define EE_AUDIO_LB_A_LB_CH_ID1 0xb9 +#define EE_AUDIO_LB_A_LB_CH_ID2 0xba +#define EE_AUDIO_LB_A_LB_CH_ID3 0xbb +#define EE_AUDIO_LB_A_STS 0xbc + +#define EE_AUDIO_LB_B_CTRL0 0x230 +#define EE_AUDIO_LB_B_CTRL1 0x231 +#define EE_AUDIO_LB_B_CTRL2 0x232 +#define EE_AUDIO_LB_B_CTRL3 0x233 +#define EE_AUDIO_LB_B_DAT_CH_ID0 0x234 +#define EE_AUDIO_LB_B_DAT_CH_ID1 0x235 +#define EE_AUDIO_LB_B_DAT_CH_ID2 0x236 +#define EE_AUDIO_LB_B_DAT_CH_ID3 0x237 +#define EE_AUDIO_LB_B_LB_CH_ID0 0x238 +#define EE_AUDIO_LB_B_LB_CH_ID1 0x239 +#define EE_AUDIO_LB_B_LB_CH_ID2 0x23a +#define EE_AUDIO_LB_B_LB_CH_ID3 0x23b +#define EE_AUDIO_LB_B_STS 0x23c + +/* + * AUDIO TDM + */ #define EE_AUDIO_TDMIN_A_CTRL 0x0c0 #define EE_AUDIO_TDMIN_A_SWAP0 0x0c1 #define EE_AUDIO_TDMIN_A_SWAP1 0x260 @@ -544,20 +569,6 @@ enum clk_sel { #define EE_AUDIO_FRDDR_D_INIT_ADDR 0x229 #define EE_AUDIO_FRDDR_D_CTRL2 0x22a -#define EE_AUDIO_LB_B_CTRL0 0x230 -#define EE_AUDIO_LB_B_CTRL1 0x231 -#define EE_AUDIO_LB_B_CTRL2 0x232 -#define EE_AUDIO_LB_B_CTRL3 0x233 -#define EE_AUDIO_LB_B_DAT_CH_ID0 0x234 -#define EE_AUDIO_LB_B_DAT_CH_ID1 0x235 -#define EE_AUDIO_LB_B_DAT_CH_ID2 0x236 -#define EE_AUDIO_LB_B_DAT_CH_ID3 0x237 -#define EE_AUDIO_LB_B_LB_CH_ID0 0x238 -#define EE_AUDIO_LB_B_LB_CH_ID1 0x239 -#define EE_AUDIO_LB_B_LB_CH_ID2 0x23a -#define EE_AUDIO_LB_B_LB_CH_ID3 0x23b -#define EE_AUDIO_LB_B_STS 0x23c - /* * AUDIO LOCKER */ diff --git a/sound/soc/amlogic/auge/spdif.c b/sound/soc/amlogic/auge/spdif.c index ab79a49..eccb28a 100644 --- a/sound/soc/amlogic/auge/spdif.c +++ b/sound/soc/amlogic/auge/spdif.c @@ -36,7 +36,6 @@ #include "ddr_mngr.h" #include "spdif_hw.h" #include "spdif_match_table.c" -#include "audio_utils.h" #include "resample.h" #include "resample_hw.h" @@ -1152,50 +1151,30 @@ static int aml_dai_spdif_prepare( struct toddr_fmt fmt; unsigned int msb, lsb, toddr_type; - if (loopback_is_enable()) { - switch (bit_depth) { - case 8: - case 16: - case 32: - toddr_type = 0; - break; - case 24: - toddr_type = 4; - break; - default: - pr_err( - "runtime format invalid bit_depth: %d\n", - bit_depth); - return -EINVAL; - } - msb = 32 - 1; - lsb = 32 - bit_depth; - } else { - switch (bit_depth) { - case 8: - case 16: - toddr_type = 0; - break; - case 24: - toddr_type = 4; - break; - case 32: - toddr_type = 3; - break; - default: - dev_err(p_spdif->dev, - "runtime format invalid bit_depth: %d\n", - bit_depth); - return -EINVAL; - } - - msb = 28 - 1; - if (bit_depth <= 24) - lsb = 28 - bit_depth; - else - lsb = 4; + switch (bit_depth) { + case 8: + case 16: + toddr_type = 0; + break; + case 24: + toddr_type = 4; + break; + case 32: + toddr_type = 3; + break; + default: + dev_err(p_spdif->dev, + "runtime format invalid bit_depth: %d\n", + bit_depth); + return -EINVAL; } + msb = 28 - 1; + if (bit_depth <= 24) + lsb = 28 - bit_depth; + else + lsb = 4; + // to ddr spdifin fmt.type = toddr_type; fmt.msb = msb; diff --git a/sound/soc/amlogic/auge/tdm.c b/sound/soc/amlogic/auge/tdm.c index 290b00d..1495181 100644 --- a/sound/soc/amlogic/auge/tdm.c +++ b/sound/soc/amlogic/auge/tdm.c @@ -107,6 +107,9 @@ struct aml_tdm { bool en_share; unsigned int lane_cnt; + + /* tdmin_lb src sel */ + int tdmin_lb_src; }; static const struct snd_pcm_hardware aml_tdm_hardware = { @@ -537,6 +540,9 @@ static int aml_dai_tdm_prepare(struct snd_pcm_substream *substream, case 2: src = TDMIN_C; break; + case 3: + src = TDMIN_LB; + break; default: dev_err(p_tdm->dev, "invalid id: %d\n", p_tdm->id); @@ -932,7 +938,7 @@ static int aml_dai_tdm_hw_free(struct snd_pcm_substream *substream, struct frddr *fr = p_tdm->fddr; int i; - for (i = 0; i < 4; i++) + for (i = 0; i < p_tdm->lane_cnt; i++) aml_tdm_set_channel_mask(p_tdm->actrl, substream->stream, p_tdm->id, i, 0); @@ -1175,20 +1181,15 @@ static int aml_dai_set_tdm_slot(struct snd_soc_dai *cpu_dai, oe_val = p_tdm->setting.lane_oe_mask_out; } - if (lanes_lb_cnt) { - in_src = p_tdm->id + 6; - if (in_src > 7) { - pr_err("unknown src(%d) for tdmin\n", in_src); - return -EINVAL; - } - } + if (lanes_lb_cnt) + in_src = p_tdm->tdmin_lb_src; if (lanes_oe_in_cnt) in_src = p_tdm->id + 3; if (lanes_in_cnt) in_src = p_tdm->id; } else { if (lanes_lb_cnt) - in_src = p_tdm->id + 3; + in_src = p_tdm->tdmin_lb_src; if (lanes_in_cnt && lanes_in_cnt <= 4) in_src = p_tdm->id; if (in_src > 5) { @@ -1307,69 +1308,85 @@ static struct snd_soc_dai_ops aml_dai_tdm_ops = { static struct snd_soc_dai_driver aml_tdm_dai[] = { { - .name = "TDM-A", - .id = 1, - .probe = aml_dai_tdm_probe, - .remove = aml_dai_tdm_remove, - .playback = { - .channels_min = 1, - .channels_max = 32, - .rates = AML_DAI_TDM_RATES, - .formats = AML_DAI_TDM_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 32, - .rates = AML_DAI_TDM_RATES, - .formats = AML_DAI_TDM_FORMATS, - }, - .ops = &aml_dai_tdm_ops, - .symmetric_rates = 1, + .name = "TDM-A", + .id = 1, + .probe = aml_dai_tdm_probe, + .remove = aml_dai_tdm_remove, + .playback = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .capture = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .ops = &aml_dai_tdm_ops, + .symmetric_rates = 1, }, { - .name = "TDM-B", - .id = 2, - .probe = aml_dai_tdm_probe, - .remove = aml_dai_tdm_remove, - .playback = { - .channels_min = 1, - .channels_max = 32, - .rates = AML_DAI_TDM_RATES, - .formats = AML_DAI_TDM_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 32, - .rates = AML_DAI_TDM_RATES, - .formats = AML_DAI_TDM_FORMATS, - }, - .ops = &aml_dai_tdm_ops, - .symmetric_rates = 1, + + .name = "TDM-B", + .id = 2, + .probe = aml_dai_tdm_probe, + .remove = aml_dai_tdm_remove, + .playback = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .capture = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .ops = &aml_dai_tdm_ops, + .symmetric_rates = 1, }, { - .name = "TDM-C", - .id = 3, - .probe = aml_dai_tdm_probe, - .remove = aml_dai_tdm_remove, - .playback = { - .channels_min = 1, - .channels_max = 32, - .rates = AML_DAI_TDM_RATES, - .formats = AML_DAI_TDM_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 32, - .rates = AML_DAI_TDM_RATES, - .formats = AML_DAI_TDM_FORMATS, - }, - .ops = &aml_dai_tdm_ops, - .symmetric_rates = 1, + .name = "TDM-C", + .id = 3, + .probe = aml_dai_tdm_probe, + .remove = aml_dai_tdm_remove, + .playback = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .capture = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .ops = &aml_dai_tdm_ops, + .symmetric_rates = 1, }, + { + .name = "TDMIN-LB", + .id = 4, + .probe = aml_dai_tdm_probe, + .remove = aml_dai_tdm_remove, + + .capture = { + .channels_min = 1, + .channels_max = 32, + .rates = AML_DAI_TDM_RATES, + .formats = AML_DAI_TDM_FORMATS, + }, + .ops = &aml_dai_tdm_ops, + .symmetric_rates = 1, + } }; static const struct snd_soc_component_driver aml_tdm_component = { - .name = DRV_NAME, + .name = DRV_NAME, }; static int check_channel_mask(const char *str) @@ -1517,9 +1534,23 @@ static int aml_tdm_platform_probe(struct platform_device *pdev) &p_tdm->i2s2hdmitx); if (ret < 0) p_tdm->i2s2hdmitx = 0; - pr_info("TDM id %d i2s2hdmi:%d\n", - p_tdm->id, - p_tdm->i2s2hdmitx); + else + pr_info("TDM id %d i2s2hdmi:%d\n", + p_tdm->id, + p_tdm->i2s2hdmitx); + + if (p_tdm->id == TDM_LB) { + ret = of_property_read_u32(node, "lb-src-sel", + &p_tdm->tdmin_lb_src); + if (ret < 0 || (p_tdm->tdmin_lb_src > 7)) { + dev_err(&pdev->dev, "invalid lb-src-sel:%d\n", + p_tdm->tdmin_lb_src); + return -EINVAL; + } + pr_info("TDM id %d lb-src-sel:%d\n", + p_tdm->id, + p_tdm->tdmin_lb_src); + } /* get tdm lanes info. if not, set to default 0 */ ret = of_parse_tdm_lane_slot_in(node, diff --git a/sound/soc/amlogic/auge/tdm_hw.h b/sound/soc/amlogic/auge/tdm_hw.h index 9bb21ac..9d93dc3 100644 --- a/sound/soc/amlogic/auge/tdm_hw.h +++ b/sound/soc/amlogic/auge/tdm_hw.h @@ -24,6 +24,7 @@ #define TDM_A 0 #define TDM_B 1 #define TDM_C 2 +#define TDM_LB 3 #define LANE_MAX0 2 #define LANE_MAX1 4 diff --git a/sound/soc/amlogic/auge/tdm_match_table.c b/sound/soc/amlogic/auge/tdm_match_table.c index 4fb318c..7b45f00 100644 --- a/sound/soc/amlogic/auge/tdm_match_table.c +++ b/sound/soc/amlogic/auge/tdm_match_table.c @@ -60,6 +60,11 @@ struct tdm_chipinfo axg_tdmc_chipinfo = { .no_mclkpad_ctrl = true, }; +struct tdm_chipinfo axg_tdminlb_chipinfo = { + .id = TDM_LB, + .no_mclkpad_ctrl = true, +}; + struct tdm_chipinfo g12a_tdma_chipinfo = { .id = TDM_A, .sclk_ws_inv = true, @@ -84,6 +89,14 @@ struct tdm_chipinfo g12a_tdmc_chipinfo = { .mclkpad_no_offset = true, }; +struct tdm_chipinfo g12a_tdminlb_chipinfo = { + .id = TDM_LB, + .sclk_ws_inv = true, + .oe_fn = true, + .same_src_fn = true, + .mclkpad_no_offset = true, +}; + struct tdm_chipinfo tl1_tdma_chipinfo = { .id = TDM_A, .sclk_ws_inv = true, @@ -108,6 +121,14 @@ struct tdm_chipinfo tl1_tdmc_chipinfo = { .adc_fn = true, }; +struct tdm_chipinfo tl1_tdminlb_chipinfo = { + .id = TDM_LB, + .sclk_ws_inv = true, + .oe_fn = true, + .same_src_fn = true, + .adc_fn = true, +}; + struct tdm_chipinfo sm1_tdma_chipinfo = { .id = TDM_A, .sclk_ws_inv = true, @@ -132,6 +153,14 @@ struct tdm_chipinfo sm1_tdmc_chipinfo = { .lane_cnt = LANE_MAX1, }; +struct tdm_chipinfo sm1_tdminlb_chipinfo = { + .id = TDM_LB, + .sclk_ws_inv = true, + .oe_fn = true, + .same_src_fn = true, + .lane_cnt = LANE_MAX3, +}; + struct tdm_chipinfo tm2_tdma_chipinfo = { .id = TDM_A, .sclk_ws_inv = true, @@ -159,6 +188,14 @@ struct tdm_chipinfo tm2_tdmc_chipinfo = { .lane_cnt = LANE_MAX1, }; +struct tdm_chipinfo tm2_tdminlb_chipinfo = { + .id = TDM_LB, + .sclk_ws_inv = true, + .oe_fn = true, + .same_src_fn = true, + .lane_cnt = LANE_MAX3, +}; + static const struct of_device_id aml_tdm_device_id[] = { { .compatible = "amlogic, axg-snd-tdma", @@ -173,6 +210,10 @@ static const struct of_device_id aml_tdm_device_id[] = { .data = &axg_tdmc_chipinfo, }, { + .compatible = "amlogic, axg-snd-tdmlb", + .data = &axg_tdminlb_chipinfo, + }, + { .compatible = "amlogic, g12a-snd-tdma", .data = &g12a_tdma_chipinfo, }, @@ -185,6 +226,10 @@ static const struct of_device_id aml_tdm_device_id[] = { .data = &g12a_tdmc_chipinfo, }, { + .compatible = "amlogic, g12a-snd-tdmlb", + .data = &g12a_tdminlb_chipinfo, + }, + { .compatible = "amlogic, tl1-snd-tdma", .data = &tl1_tdma_chipinfo, }, @@ -197,28 +242,40 @@ static const struct of_device_id aml_tdm_device_id[] = { .data = &tl1_tdmc_chipinfo, }, { + .compatible = "amlogic, tl1-snd-tdmlb", + .data = &tl1_tdminlb_chipinfo, + }, + { .compatible = "amlogic, sm1-snd-tdma", - .data = &sm1_tdma_chipinfo, + .data = &sm1_tdma_chipinfo, }, { .compatible = "amlogic, sm1-snd-tdmb", - .data = &sm1_tdmb_chipinfo, + .data = &sm1_tdmb_chipinfo, }, { .compatible = "amlogic, sm1-snd-tdmc", - .data = &sm1_tdmc_chipinfo, + .data = &sm1_tdmc_chipinfo, + }, + { + .compatible = "amlogic, sm1-snd-tdmlb", + .data = &sm1_tdminlb_chipinfo, }, { .compatible = "amlogic, tm2-snd-tdma", - .data = &tm2_tdma_chipinfo, + .data = &tm2_tdma_chipinfo, }, { .compatible = "amlogic, tm2-snd-tdmb", - .data = &tm2_tdmb_chipinfo, + .data = &tm2_tdmb_chipinfo, }, { .compatible = "amlogic, tm2-snd-tdmc", - .data = &tm2_tdmc_chipinfo, + .data = &tm2_tdmc_chipinfo, + }, + { + .compatible = "amlogic, tm2-snd-tdmlb", + .data = &tm2_tdminlb_chipinfo, }, {}, }; diff --git a/sound/soc/codecs/amlogic/ad82584f.c b/sound/soc/codecs/amlogic/ad82584f.c index 1c03ea5..aa87176 100644 --- a/sound/soc/codecs/amlogic/ad82584f.c +++ b/sound/soc/codecs/amlogic/ad82584f.c @@ -19,18 +19,19 @@ static void ad82584f_early_suspend(struct early_suspend *h); static void ad82584f_late_resume(struct early_suspend *h); #endif -#define AD82584F_RATES (SNDRV_PCM_RATE_32000 | \ - SNDRV_PCM_RATE_44100 | \ - SNDRV_PCM_RATE_48000 | \ - SNDRV_PCM_RATE_64000 | \ - SNDRV_PCM_RATE_88200 | \ - SNDRV_PCM_RATE_96000 | \ - SNDRV_PCM_RATE_176400 | \ - SNDRV_PCM_RATE_192000) +#define AD82584F_RATES (SNDRV_PCM_RATE_16000 | \ + SNDRV_PCM_RATE_32000 | \ + SNDRV_PCM_RATE_44100 | \ + SNDRV_PCM_RATE_48000 | \ + SNDRV_PCM_RATE_64000 | \ + SNDRV_PCM_RATE_88200 | \ + SNDRV_PCM_RATE_96000 | \ + SNDRV_PCM_RATE_176400 | \ + SNDRV_PCM_RATE_192000) #define AD82584F_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) + SNDRV_PCM_FMTBIT_S24_LE | \ + SNDRV_PCM_FMTBIT_S32_LE) static const DECLARE_TLV_DB_SCALE(mvol_tlv, -10300, 50, 1); static const DECLARE_TLV_DB_SCALE(chvol_tlv, -10300, 50, 1); -- 2.7.4