audio: auge: add sound card support for tl1 [1/1]
authorXing Wang <xing.wang@amlogic.com>
Tue, 9 Oct 2018 11:36:05 +0000 (19:36 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Mon, 29 Oct 2018 11:19:49 +0000 (04:19 -0700)
PD#172587

Problem:
Bringup tl1 sound card.

Solution:
Add tl1 sound card.
Add external interface for audio input/output.

Verify:
Tested by PTM
Sound card is setup.
TDM and SPDIF internel loopback is ok

Change-Id: I60830ca44a62ee2a8e16343e91e7311152cab161
Signed-off-by: Xing Wang <xing.wang@amlogic.com>
29 files changed:
MAINTAINERS
arch/arm/boot/dts/amlogic/mesontl1.dtsi
arch/arm/boot/dts/amlogic/tl1_pxp.dts
include/dt-bindings/clock/amlogic,tl1-audio-clk.h [new file with mode: 0644]
sound/soc/amlogic/auge/Makefile
sound/soc/amlogic/auge/audio_clks.c
sound/soc/amlogic/auge/audio_clks.h
sound/soc/amlogic/auge/audio_controller.c
sound/soc/amlogic/auge/audio_utils.c
sound/soc/amlogic/auge/audio_utils.h
sound/soc/amlogic/auge/axg,clocks.c
sound/soc/amlogic/auge/card.c
sound/soc/amlogic/auge/ddr_mngr.c
sound/soc/amlogic/auge/ddr_mngr.h
sound/soc/amlogic/auge/effects.c
sound/soc/amlogic/auge/effects_hw.c
sound/soc/amlogic/auge/extn.c [new file with mode: 0644]
sound/soc/amlogic/auge/frhdmirx_hw.c [new file with mode: 0644]
sound/soc/amlogic/auge/frhdmirx_hw.h [new file with mode: 0644]
sound/soc/amlogic/auge/g12a,clocks.c
sound/soc/amlogic/auge/pdm.c
sound/soc/amlogic/auge/pdm.h
sound/soc/amlogic/auge/regs.h
sound/soc/amlogic/auge/spdif.c
sound/soc/amlogic/auge/spdif_hw.c
sound/soc/amlogic/auge/tdm.c
sound/soc/amlogic/auge/tdm_hw.c
sound/soc/amlogic/auge/tdm_hw.h
sound/soc/amlogic/auge/tl1,clocks.c [new file with mode: 0644]

index 8235b82..c0b9410 100644 (file)
@@ -14653,6 +14653,18 @@ AMLOGIC DTS
 M:     Luan Yuan <luan.yuan@amlogic.com>
 F:     arch/arm/boot/dts/amlogic/partition_mbox_p241_P.dtsi
 
+AMLOGIC TL1 SOUND CARD
+M:      Xing Wang <xing.wang@amlogic.com
+F:     include/dt-bindings/clock/amlogic,tl1-audio-clk.h
+F:     sound/soc/amlogic/auge/*
+
+AMLOGIC TL1 AUDIO EXTERANL INPUT/OUTPUT DRIVERS
+M:     Xing Wang <xing.wang@amlogic.com
+F:     sound/soc/amlogic/auge/extn.c
+F:     sound/soc/amlogic/auge/frhdmirx_hw.c
+F:     sound/soc/amlogic/auge/frhdmirx_hw.h
+F:     sound/soc/amlogic/auge/*
+
 AMLOGIC LCD DRIVERS
 M:     Evoke Zhang <evoke.zhang@amlogic.com>
 F:     arch\arm\boot\dts\amlogic\mesontl1_pxp-panel.dtsi
index d6a5ac7..b76711b 100644 (file)
@@ -23,6 +23,7 @@
 #include <dt-bindings/pwm/pwm.h>
 #include <dt-bindings/pwm/meson.h>
 #include <dt-bindings/clock/amlogic,tl1-clkc.h>
+#include <dt-bindings/clock/amlogic,tl1-audio-clk.h>
 #include "mesong12a-bifrost.dtsi"
 
 / {
                        };
                };/* end of hiubus*/
 
+               audiobus: audiobus@0xff600000 {
+                       compatible = "amlogic, audio-controller", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0xff600000 0x10000>;
+                       ranges = <0x0 0xff600000 0x10000>;
+
+                       clkaudio:audio_clocks {
+                               compatible = "amlogic, tl1-audio-clocks";
+                               #clock-cells = <1>;
+                               reg = <0x0 0xb0>;
+                       };
+
+                       ddr_manager {
+                               compatible = "amlogic, tl1-audio-ddr-manager";
+                               interrupts = <
+                                       GIC_SPI 148 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 149 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 150 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 48 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 152 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 153 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 154 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 49 IRQ_TYPE_EDGE_RISING
+                               >;
+                               interrupt-names =
+                                       "toddr_a", "toddr_b", "toddr_c",
+                                       "toddr_d",
+                                       "frddr_a", "frddr_b", "frddr_c",
+                                       "frddr_d";
+                       };
+               };/* end of audiobus*/
+
+               /* Sound iomap */
+               aml_snd_iomap {
+                       compatible = "amlogic, snd-iomap";
+                       status = "okay";
+                       #address-cells=<1>;
+                       #size-cells=<1>;
+                       ranges;
+                       pdm_bus {
+                               reg = <0xFF601000 0x400>;
+                       };
+                       audiobus_base {
+                               reg = <0xFF600000 0x1000>;
+                       };
+                       audiolocker_base {
+                               reg = <0xFF601400 0x400>;
+                       };
+                       eqdrc_base {
+                               reg = <0xFF602000 0x2000>;
+                       };
+                       reset_base {
+                               reg = <0xFFD01000 0x1000>;
+                       };
+                       vad_base {
+                               reg = <0xFF601800 0x800>;
+                       };
+               };
+
                cbus: cbus@ffd00000 {
                        compatible = "simple-bus";
                        reg = <0xffd00000 0x27000>;
index d95d93d..e4ff911 100644 (file)
                status = "okay";
                fr_auto_policy = <0>;
        };
+
+       /* Audio Related start */
+       pdm_codec:dummy {
+               #sound-dai-cells = <0>;
+               compatible = "amlogic, pdm_dummy_codec";
+               status = "okay";
+       };
+
+       dummy_codec:dummy {
+               #sound-dai-cells = <0>;
+               compatible = "amlogic, aml_dummy_codec";
+               status = "okay";
+       };
+
+       auge_sound {
+               compatible = "amlogic, tl1-sound-card";
+               aml-audio-card,name = "AML-AUGESOUND";
+
+               aml-audio-card,dai-link@0 {
+                       format = "dsp_a";
+                       mclk-fs = <512>;
+                       //continuous-clock;
+                       //bitclock-inversion;
+                       //frame-inversion;
+                       /* master mode */
+                       bitclock-master = <&tdma>;
+                       frame-master = <&tdma>;
+                       /* slave mode */
+                       /*
+                        * bitclock-master = <&tdmacodec>;
+                        * frame-master = <&tdmacodec>;
+                        */
+                       /* suffix-name, sync with android audio hal used for */
+                       suffix-name = "alsaPORT-pcm";
+                       tdmacpu: cpu {
+                               sound-dai = <&tdma>;
+                               dai-tdm-slot-tx-mask =
+                                                       <1 1 1 1 1 1 1 1>;
+                               dai-tdm-slot-rx-mask =
+                                                       <1 1 1 1 1 1 1 1>;
+                               dai-tdm-slot-num = <8>;
+                               dai-tdm-slot-width = <32>;
+                               system-clock-frequency = <24576000>;
+                       };
+                       tdmacodec: codec {
+                               sound-dai = <&dummy_codec>;
+                       };
+               };
+
+               aml-audio-card,dai-link@1 {
+                       format = "i2s";
+                       mclk-fs = <256>;
+                       //continuous-clock;
+                       //bitclock-inversion;
+                       //frame-inversion;
+                       /* master mode */
+                       bitclock-master = <&tdmb>;
+                       frame-master = <&tdmb>;
+                       /* slave mode */
+                       //bitclock-master = <&tdmbcodec>;
+                       //frame-master = <&tdmbcodec>;
+                       /* suffix-name, sync with android audio hal used for */
+                       suffix-name = "alsaPORT-i2s";
+                       cpu {
+                               sound-dai = <&tdmb>;
+                               dai-tdm-slot-tx-mask = <1 1>;
+                               dai-tdm-slot-rx-mask = <1 1>;
+                               dai-tdm-slot-num = <2>;
+                               /*
+                                * dai-tdm-slot-tx-mask =
+                                *      <1 1 1 1 1 1 1 1>;
+                                * dai-tdm-slot-rx-mask =
+                                *      <1 1 1 1 1 1 1 1>;
+                                * dai-tdm-slot-num = <8>;
+                                */
+                               dai-tdm-slot-width = <32>;
+                               system-clock-frequency = <12288000>;
+                       };
+                       tdmbcodec: codec {
+                               sound-dai = <&dummy_codec>;
+                       };
+               };
+
+               aml-audio-card,dai-link@2 {
+                       format = "i2s";
+                       mclk-fs = <256>;
+                       //continuous-clock;
+                       //bitclock-inversion;
+                       //frame-inversion;
+                       /* master mode */
+                       bitclock-master = <&tdmc>;
+                       frame-master = <&tdmc>;
+                       /* slave mode */
+                       //bitclock-master = <&tdmccodec>;
+                       //frame-master = <&tdmccodec>;
+                       /* suffix-name, sync with android audio hal used for */
+                       //suffix-name = "alsaPORT-tdm";
+                       cpu {
+                               sound-dai = <&tdmc>;
+                               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>;
+                       };
+                       tdmccodec: codec {
+                               sound-dai = <&dummy_codec>;
+                       };
+               };
+
+               aml-audio-card,dai-link@3 {
+                       mclk-fs = <64>;
+                       /* suffix-name, sync with android audio hal used for */
+                       suffix-name = "alsaPORT-pdm";
+                       cpu {
+                               sound-dai = <&pdm>;
+                       };
+                       codec {
+                               sound-dai = <&pdm_codec>;
+                       };
+               };
+
+               aml-audio-card,dai-link@4 {
+                       mclk-fs = <128>;
+                       /* suffix-name, sync with android audio hal used for */
+                       suffix-name = "alsaPORT-spdif";
+                       cpu {
+                               sound-dai = <&spdif_a>;
+                               system-clock-frequency = <6144000>;
+                       };
+                       codec {
+                               sound-dai = <&dummy_codec>;
+                       };
+               };
+
+               aml-audio-card,dai-link@5 {
+                       mclk-fs = <128>;
+                       cpu {
+                               sound-dai = <&spdif_b>;
+                               system-clock-frequency = <6144000>;
+                       };
+                       codec {
+                               sound-dai = <&dummy_codec>;
+                       };
+               };
+
+               aml-audio-card,dai-link@6 {
+                       mclk-fs = <256>;
+                       cpu {
+                               sound-dai = <&extn>;
+                               system-clock-frequency = <12288000>;
+                       };
+                       codec {
+                               sound-dai = <&dummy_codec>;
+                       };
+               };
+
+       };
+       /* Audio Related end */
+
 }; /* end of / */
 
+&audiobus {
+       tdma:tdm {
+               compatible = "amlogic, tl1-snd-tdma";
+               #sound-dai-cells = <0>;
+
+               dai-tdm-lane-slot-mask-in = <1 0>;
+               dai-tdm-lane-slot-mask-out = <1 0>;
+               dai-tdm-clk-sel = <0>;
+
+               clocks = <&clkaudio CLKID_AUDIO_MCLK_A
+                               &clkc CLKID_MPLL0>;
+               clock-names = "mclk", "clk_srcpll";
+
+               pinctrl-names = "tdm_pins";
+               pinctrl-0 = <&tdma_mclk &tdmout_a &tdmin_a>;
+
+               status = "okay";
+       };
+
+       tdmb:tdm {
+               compatible = "amlogic, tl1-snd-tdmb";
+               #sound-dai-cells = <0>;
+
+               dai-tdm-lane-slot-mask-in = <1 0 0 0>;
+               dai-tdm-lane-slot-mask-out = <1 0 0 0>;
+               dai-tdm-clk-sel = <1>;
+
+               clocks = <&clkaudio CLKID_AUDIO_MCLK_B
+                               &clkc CLKID_MPLL1>;
+               clock-names = "mclk", "clk_srcpll";
+
+               status = "okay";
+       };
+
+       tdmc:tdm {
+               compatible = "amlogic, tl1-snd-tdmc";
+               #sound-dai-cells = <0>;
+
+               dai-tdm-lane-slot-mask-in = <1 0 0 0>;
+               dai-tdm-lane-slot-mask-out = <1 0 0 0>;
+               dai-tdm-clk-sel = <2>;
+
+               clocks = <&clkaudio CLKID_AUDIO_MCLK_C
+                               &clkc CLKID_MPLL2>;
+               clock-names = "mclk", "clk_srcpll";
+
+               pinctrl-names = "tdm_pins";
+               pinctrl-0 = <&tdmout_c &tdmin_c>;
+
+               status = "okay";
+       };
+
+       spdif_a:spdif {
+               compatible = "amlogic, tl1-snd-spdif-a";
+               #sound-dai-cells = <0>;
+
+               clocks = <&clkc CLKID_MPLL0
+                               &clkc CLKID_FCLK_DIV4
+                               &clkaudio CLKID_AUDIO_SPDIFIN
+                               &clkaudio CLKID_AUDIO_SPDIFOUT
+                               &clkaudio CLKID_AUDIO_SPDIFIN_CTRL
+                               &clkaudio CLKID_AUDIO_SPDIFOUT_CTRL>;
+               clock-names = "sysclk", "fixed_clk", "gate_spdifin",
+                               "gate_spdifout", "clk_spdifin", "clk_spdifout";
+
+               interrupts =
+                               <GIC_SPI 151 IRQ_TYPE_EDGE_RISING>;
+               interrupt-names = "irq_spdifin";
+
+               pinctrl-names = "spdif_pins";
+               pinctrl-0 = <&spdifout_a &spdifin_a>;
+
+               status = "okay";
+       };
+
+       spdif_b:spdif {
+               compatible = "amlogic, tl1-snd-spdif-b";
+               #sound-dai-cells = <0>;
+
+               clocks = <&clkc CLKID_MPLL0 /*CLKID_HIFI_PLL*/
+                               &clkaudio CLKID_AUDIO_SPDIFOUTB
+                               &clkaudio CLKID_AUDIO_SPDIFOUTB_CTRL>;
+               clock-names = "sysclk",
+                               "gate_spdifout", "clk_spdifout";
+
+               status = "okay";
+       };
+
+       pdm:pdm {
+               compatible = "amlogic, tl1-snd-pdm";
+               #sound-dai-cells = <0>;
+
+               clocks = <&clkaudio CLKID_AUDIO_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";
+
+               pinctrl-names = "pdm_pins";
+               pinctrl-0 = <&pdmin>;
+
+               /* mode 0~4, defalut:1 */
+               filter_mode = <1>;
+
+               status = "okay";
+       };
+
+       extn:extn {
+               compatible = "amlogic, snd-extn";
+               #sound-dai-cells = <0>;
+
+               interrupts =
+                               <GIC_SPI 158 IRQ_TYPE_EDGE_RISING>;
+               interrupt-names = "irq_frhdmirx";
+
+               status = "okay";
+       };
+
+}; /* end of audiobus */
+
+&pinctrl_periphs {
+       /* audio pin mux */
+
+       tdma_mclk: tdma_mclk {
+               mux { /* GPIOZ_0 */
+                       groups = "mclk0_z";
+                       function = "mclk0";
+               };
+       };
+
+       tdmout_a: tdmout_a {
+               mux { /* GPIOZ_1, GPIOZ_2, GPIOZ_3, GPIOZ_5, GPIOZ_6 */
+                       groups = "tdma_sclk_z",
+                               "tdma_fs_z",
+                               "tdma_dout0_z",
+                               "tdma_dout2_z",
+                               "tdma_dout3_z";
+                       function = "tdma_out";
+               };
+       };
+
+       tdmin_a: tdmin_a {
+               mux { /* GPIOZ_9 */
+                       groups = "tdma_din2_z";
+                       function = "tdma_in";
+               };
+       };
+
+       tdmout_c: tdmout_c {
+               mux { /* GPIODV_7, GPIODV_8, GPIODV_9 */
+                       groups = "tdmc_sclk",
+                               "tdmc_fs",
+                               "tdmc_dout0";
+                       function = "tdmc_out";
+               };
+       };
+
+       tdmin_c: tdmin_c {
+               mux { /* GPIODV_10 */
+                       groups = "tdmc_din1";
+                       function = "tdmc_in";
+               };
+       };
+
+       spdifin_a: spdifin_a {
+               mux { /* GPIODV_5 */
+                       groups = "spdif_in";
+                       function = "spdif_in";
+               };
+       };
+
+       spdifout_a: spdifout_a {
+               mux { /* GPIODV_4 */
+                       groups = "spdif_out_dv4";
+                       function = "spdif_out";
+               };
+       };
+
+       pdmin: pdmin {
+               mux { /* GPIOZ_7, GPIOZ_8*/
+                       groups = "pdm_dclk_z",
+                               "pdm_din0_z";
+                       function = "pdm";
+               };
+       };
+
+
+}; /* end of pinctrl_periphs */
+
+&pinctrl_aobus {
+       spdifout: spdifout {
+               mux { /* gpiao_10 */
+                       groups = "spdif_out_ao";
+                       function = "spdif_out_ao";
+               };
+       };
+};  /* end of pinctrl_aobus */
+
 &sd_emmc_b {
        status = "okay";
        sd {
                caps = "MMC_CAP_4_BIT_DATA",
-                        "MMC_CAP_MMC_HIGHSPEED",
-                        "MMC_CAP_SD_HIGHSPEED",
-                        "MMC_CAP_NONREMOVABLE"; /**ptm debug */
+                       "MMC_CAP_MMC_HIGHSPEED",
+                       "MMC_CAP_SD_HIGHSPEED",
+                       "MMC_CAP_NONREMOVABLE"; /**ptm debug */
                f_min = <400000>;
                f_max = <200000000>;
        };
diff --git a/include/dt-bindings/clock/amlogic,tl1-audio-clk.h b/include/dt-bindings/clock/amlogic,tl1-audio-clk.h
new file mode 100644 (file)
index 0000000..a000dee
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * include/dt-bindings/clock/amlogic,tl1-audio-clk.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 __TL1_AUDIO_CLK_H
+#define __TL1_AUDIO_CLK_H
+
+/*
+ * CLKID audio index values
+ */
+
+#define CLKID_AUDIO_DDR_ARB                     0
+#define CLKID_AUDIO_PDM                         1
+#define CLKID_AUDIO_TDMINA                      2
+#define CLKID_AUDIO_TDMINB                      3
+#define CLKID_AUDIO_TDMINC                      4
+#define CLKID_AUDIO_TDMINLB                     5
+#define CLKID_AUDIO_TDMOUTA                     6
+#define CLKID_AUDIO_TDMOUTB                     7
+#define CLKID_AUDIO_TDMOUTC                     8
+#define CLKID_AUDIO_FRDDRA                      9
+#define CLKID_AUDIO_FRDDRB                      10
+#define CLKID_AUDIO_FRDDRC                      11
+#define CLKID_AUDIO_TODDRA                      12
+#define CLKID_AUDIO_TODDRB                      13
+#define CLKID_AUDIO_TODDRC                      14
+#define CLKID_AUDIO_LOOPBACKA                   15
+#define CLKID_AUDIO_SPDIFIN                     16
+#define CLKID_AUDIO_SPDIFOUT                    17
+#define CLKID_AUDIO_RESAMPLEA                   18
+#define CLKID_AUDIO_RESERVED0                   19
+#define CLKID_AUDIO_RESERVED1                   20
+#define CLKID_AUDIO_SPDIFOUTB                   21
+#define CLKID_AUDIO_EQDRC                       22
+#define CLKID_AUDIO_RESAMPLEB                   23
+#define CLKID_AUDIO_TOVAD                       24
+#define CLKID_AUDIO_AUDIOLOCKER                 25
+#define CLKID_AUDIO_SPDIFIN_LB                  26
+#define CLKID_AUDIO_FRATV                       27
+#define CLKID_AUDIO_FRHDMIRX                    28
+#define CLKID_AUDIO_FRDDRD                      29
+#define CLKID_AUDIO_TODDRD                      30
+#define CLKID_AUDIO_LOOPBACKB                   31
+
+#define MCLK_BASE                               32
+#define CLKID_AUDIO_MCLK_A                      (MCLK_BASE + 0)
+#define CLKID_AUDIO_MCLK_B                      (MCLK_BASE + 1)
+#define CLKID_AUDIO_MCLK_C                      (MCLK_BASE + 2)
+#define CLKID_AUDIO_MCLK_D                      (MCLK_BASE + 3)
+#define CLKID_AUDIO_MCLK_E                      (MCLK_BASE + 4)
+#define CLKID_AUDIO_MCLK_F                      (MCLK_BASE + 5)
+
+#define CLKID_AUDIO_SPDIFIN_CTRL                (MCLK_BASE + 6)
+#define CLKID_AUDIO_SPDIFOUT_CTRL               (MCLK_BASE + 7)
+#define CLKID_AUDIO_PDMIN0                      (MCLK_BASE + 8)
+#define CLKID_AUDIO_PDMIN1                      (MCLK_BASE + 9)
+#define CLKID_AUDIO_SPDIFOUTB_CTRL              (MCLK_BASE + 10)
+#define CLKID_AUDIO_LOCKER_OUT                  (MCLK_BASE + 11)
+#define CLKID_AUDIO_LOCKER_IN                   (MCLK_BASE + 12)
+#define CLKID_AUDIO_RESAMPLE_CTRL               (MCLK_BASE + 13)
+
+#define NUM_AUDIO_CLKS                          (MCLK_BASE + 14)
+#endif /* __G12A_AUDIO_CLK_H */
index aae9857..6ebfb62 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_AMLOGIC_SND_SOC_AUGE)      += audio_controller.o \
                                                audio_clks.o \
                                                axg,clocks.o \
                                                g12a,clocks.o \
+                                               tl1,clocks.o \
                                                card.o \
                                                card_utils.o \
                                                tdm.o \
@@ -24,4 +25,6 @@ obj-$(CONFIG_AMLOGIC_SND_SOC_AUGE)    += audio_controller.o \
                                                effects_hw.o \
                                                pwrdet.o \
                                                pwrdet_hw.o \
-                                               sharebuffer.o
+                                               sharebuffer.o \
+                                               extn.o \
+                                               frhdmirx_hw.o
index 71be6a4..1f0dd6f 100644 (file)
@@ -32,6 +32,10 @@ static const struct of_device_id audio_clocks_of_match[] = {
                .compatible = "amlogic, g12a-audio-clocks",
                .data       = &g12a_audio_clks_init,
        },
+       {
+               .compatible = "amlogic, tl1-audio-clocks",
+               .data       = &tl1_audio_clks_init,
+       },
        {},
 };
 MODULE_DEVICE_TABLE(of, audio_clocks_of_match);
index 06d8a3d..359fbfc 100644 (file)
@@ -92,6 +92,7 @@ struct audio_clk_init {
 
 extern struct audio_clk_init axg_audio_clks_init;
 extern struct audio_clk_init g12a_audio_clks_init;
+extern struct audio_clk_init tl1_audio_clks_init;
 
 struct clk_chipinfo {
        /* force clock source as oscin(24M) */
index b7ab682..c625269 100644 (file)
@@ -103,7 +103,7 @@ static int register_audio_controller(struct platform_device *pdev,
        platform_set_drvdata(pdev, actrl);
 
        /* gate on all clks on bringup stage, need gate separately */
-       aml_audiobus_write(actrl, EE_AUDIO_CLK_GATE_EN, 0xffffff);
+       aml_audiobus_write(actrl, EE_AUDIO_CLK_GATE_EN0, 0xffffff);
 
        return 0;
 }
index d0d5dd6..53e8fb9 100644 (file)
@@ -937,6 +937,12 @@ int snd_card_add_kcontrols(struct snd_soc_card *card)
                return ret;
        }
 
+       ret = card_add_ddr_kcontrols(card);
+       if (ret < 0) {
+               pr_err("Failed to add ddr controls\n");
+               return ret;
+       }
+
        return snd_soc_add_card_controls(card,
                snd_auge_controls, ARRAY_SIZE(snd_auge_controls));
 
@@ -1123,8 +1129,8 @@ int loopback_hw_params(struct snd_pcm_substream *substream,
                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 - EE_AUDIO_MCLK_A_CTRL;
-               reg = EE_AUDIO_MCLK_A_CTRL + offset * clk_id;
+               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*/
@@ -1472,3 +1478,30 @@ void auge_toacodec_ctrl(int tdmout_id)
                | tdmout_id << 0 /* mclk */
                );
 }
+
+void fratv_enable(bool enable)
+{
+       /* Need reset firstlry ? */
+       if (enable) {
+               audiobus_update_bits(EE_AUDIO_FRATV_CTRL0,
+                       0x1 << 29,
+                       0x1 << 29);
+               audiobus_update_bits(EE_AUDIO_FRATV_CTRL0,
+                       0x1 << 28,
+                       0x1 << 28);
+       } else
+               audiobus_update_bits(EE_AUDIO_FRATV_CTRL0,
+                       0x3 << 28,
+                       0x0 << 28);
+
+       audiobus_update_bits(EE_AUDIO_FRATV_CTRL0, 0x1 << 31, enable << 31);
+}
+
+/* source select
+ * 0: select from ATV;
+ * 1: select from ADEC;
+ */
+void fratv_src_select(int src)
+{
+       audiobus_update_bits(EE_AUDIO_FRATV_CTRL0, 0x1 << 20, (bool)src << 20);
+}
index e77a2d2..c08470f 100644 (file)
@@ -159,4 +159,7 @@ extern int loopback_trigger(
 extern void audio_locker_set(int enable);
 
 extern int audio_locker_get(void);
+
+extern void fratv_enable(bool enable);
+extern void fratv_src_select(int src);
 #endif
index 10a951d..e337ac3 100644 (file)
@@ -33,26 +33,26 @@ static const char *const audioclk_parent_names[] = {
        "i_slv_sclk_d", "i_slv_sclk_e", "i_slv_sclk_f", "i_slv_sclk_g",
        "i_slv_sclk_h", "i_slv_sclk_i", "i_slv_sclk_j"};
 
-CLOCK_GATE(audio_ddr_arb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 0);
-CLOCK_GATE(audio_pdm, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 1);
-CLOCK_GATE(audio_tdmina, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 2);
-CLOCK_GATE(audio_tdminb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 3);
-CLOCK_GATE(audio_tdminc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 4);
-CLOCK_GATE(audio_tdminlb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 5);
-CLOCK_GATE(audio_tdmouta, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 6);
-CLOCK_GATE(audio_tdmoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 7);
-CLOCK_GATE(audio_tdmoutc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 8);
-CLOCK_GATE(audio_frddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 9);
-CLOCK_GATE(audio_frddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 10);
-CLOCK_GATE(audio_frddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 11);
-CLOCK_GATE(audio_toddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 12);
-CLOCK_GATE(audio_toddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 13);
-CLOCK_GATE(audio_toddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 14);
-CLOCK_GATE(audio_loopback, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 15);
-CLOCK_GATE(audio_spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 16);
-CLOCK_GATE(audio_spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 17);
-CLOCK_GATE(audio_resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 18);
-CLOCK_GATE(audio_power_detect, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 19);
+CLOCK_GATE(audio_ddr_arb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 0);
+CLOCK_GATE(audio_pdm, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 1);
+CLOCK_GATE(audio_tdmina, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 2);
+CLOCK_GATE(audio_tdminb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 3);
+CLOCK_GATE(audio_tdminc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 4);
+CLOCK_GATE(audio_tdminlb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 5);
+CLOCK_GATE(audio_tdmouta, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 6);
+CLOCK_GATE(audio_tdmoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 7);
+CLOCK_GATE(audio_tdmoutc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 8);
+CLOCK_GATE(audio_frddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 9);
+CLOCK_GATE(audio_frddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 10);
+CLOCK_GATE(audio_frddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 11);
+CLOCK_GATE(audio_toddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 12);
+CLOCK_GATE(audio_toddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 13);
+CLOCK_GATE(audio_toddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 14);
+CLOCK_GATE(audio_loopback, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 15);
+CLOCK_GATE(audio_spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 16);
+CLOCK_GATE(audio_spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 17);
+CLOCK_GATE(audio_resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 18);
+CLOCK_GATE(audio_power_detect, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 19);
 
 static struct clk_gate *axg_audio_clk_gates[] = {
        &audio_ddr_arb,
@@ -120,29 +120,29 @@ static int axg_clk_gates_init(struct clk **clks, void __iomem *iobase)
 }
 
 /* mclk_a */
-CLOCK_COM_MUX(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL), 31);
+CLOCK_COM_MUX(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(0)), 31);
 /* mclk_b */
-CLOCK_COM_MUX(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL), 31);
+CLOCK_COM_MUX(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(0)), 31);
 /* mclk_c */
-CLOCK_COM_MUX(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL), 31);
+CLOCK_COM_MUX(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(0)), 31);
 /* mclk_d */
-CLOCK_COM_MUX(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL), 31);
+CLOCK_COM_MUX(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(0)), 31);
 /* mclk_e */
-CLOCK_COM_MUX(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL), 31);
+CLOCK_COM_MUX(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(0)), 31);
 /* mclk_f */
-CLOCK_COM_MUX(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL), 31);
+CLOCK_COM_MUX(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(0)), 31);
 /* spdifin */
 CLOCK_COM_MUX(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0x7, 24);
 CLOCK_COM_DIV(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0, 8);
@@ -168,10 +168,10 @@ CLOCK_COM_MUX(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0xf, 8);
 CLOCK_COM_DIV(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0, 8);
 CLOCK_COM_GATE(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 15);
 /* resample*/
-CLOCK_COM_MUX(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLE_CTRL), 0xf, 24);
+CLOCK_COM_MUX(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0xf, 24);
 /* div is fake */
-CLOCK_COM_DIV(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLE_CTRL), 0, 0);
-CLOCK_COM_GATE(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLE_CTRL), 31);
+CLOCK_COM_DIV(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0, 0);
+CLOCK_COM_GATE(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 31);
 
 static int axg_clks_init(struct clk **clks, void __iomem *iobase)
 {
index f916cd6..3a3d370 100644 (file)
@@ -433,12 +433,7 @@ static int aml_card_hw_params(struct snd_pcm_substream *substream,
                aml_priv_to_props(priv, rtd->num);
        unsigned int mclk = 0, mclk_fs = 0;
        int i = 0, ret = 0;
-       int clk_dir = 0;
-
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               clk_dir = SND_SOC_CLOCK_OUT;
-       else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
-               clk_dir = SND_SOC_CLOCK_IN;
+       int clk_idx = substream->stream;
 
        if (priv->mclk_fs)
                mclk_fs = priv->mclk_fs;
@@ -451,14 +446,14 @@ static int aml_card_hw_params(struct snd_pcm_substream *substream,
                for (i = 0; i < rtd->num_codecs; i++) {
                        codec_dai = rtd->codec_dais[i];
                        ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
-                               clk_dir);
+                               SND_SOC_CLOCK_IN);
 
                        if (ret && ret != -ENOTSUPP)
                                goto err;
                }
 
-               ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
-                                            clk_dir);
+               ret = snd_soc_dai_set_sysclk(cpu_dai, clk_idx, mclk,
+                                            SND_SOC_CLOCK_OUT);
                if (ret && ret != -ENOTSUPP)
                        goto err;
 
@@ -860,6 +855,10 @@ static struct aml_chipset_info g12a_chipset_info = {
        .eqdrc_fn       = true,
 };
 
+static struct aml_chipset_info tl1_chipset_info = {
+       .spdif_b        = true,
+};
+
 static const struct of_device_id auge_of_match[] = {
        {
                .compatible = "amlogic, axg-sound-card",
@@ -868,6 +867,10 @@ static const struct of_device_id auge_of_match[] = {
                .compatible = "amlogic, g12a-sound-card",
                .data       = &g12a_chipset_info,
        },
+       {
+               .compatible = "amlogic, tl1-sound-card",
+               .data       = &tl1_chipset_info,
+       },
        {},
 };
 MODULE_DEVICE_TABLE(of, auge_of_match);
@@ -988,6 +991,7 @@ static int aml_card_probe(struct platform_device *pdev)
        if (ret >= 0)
                return ret;
 err:
+       pr_err("%s error ret:%d\n", __func__, ret);
        aml_card_clean_reference(&priv->snd_card);
 
        return ret;
index 3410ed8..6d3199f 100644 (file)
@@ -56,14 +56,26 @@ struct ddr_desc {
 #endif
 
 struct ddr_chipinfo {
-       /* INT and Start address separated */
-       bool addr_separated;
+       /* INT and Start address is same or separated */
+       bool int_start_same_addr;
        /* force finished */
        bool force_finished;
        /* same source */
        bool same_src_fn;
        /* insert channel number */
        bool insert_chnum;
+       /* source sel switch to ctrl1
+        * for toddr, 0: source sel is controlled by ctrl0
+        *            1: source sel is controlled by ctrl1
+        * for frddr, 0: source sel is controlled by ctrl0
+        *            1: source sel is controlled by ctrl2
+        */
+       bool src_sel_ctrl;
+       /* toddr number max
+        * 0: default, 3 toddr, axg, g12a, g12b
+        * 4: 4 toddr, tl1
+        */
+       int fifo_num;
 };
 
 struct toddr {
@@ -123,7 +135,7 @@ struct frddr {
        struct ddr_chipinfo *chipinfo;
 };
 
-#define DDRMAX 3
+#define DDRMAX 4
 static struct frddr frddrs[DDRMAX];
 static struct toddr toddrs[DDRMAX];
 
@@ -303,7 +315,7 @@ int aml_toddr_set_buf(struct toddr *to, unsigned int start,
 
        /* int address */
        if (to->chipinfo
-               && to->chipinfo->addr_separated) {
+               && (!to->chipinfo->int_start_same_addr)) {
                reg = calc_toddr_address(EE_AUDIO_TODDR_A_INIT_ADDR, reg_base);
                aml_audiobus_write(actrl, reg, start);
        }
@@ -372,18 +384,36 @@ void aml_toddr_select_src(struct toddr *to, enum toddr_src src)
                src = LOOPBACK;
        }
 
-       reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL0, reg_base);
-       aml_audiobus_update_bits(actrl, reg, 0x7, src & 0x7);
+       if (to->chipinfo
+               && to->chipinfo->src_sel_ctrl) {
+               reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL1, reg_base);
+               aml_audiobus_update_bits(actrl, reg,
+                       0xf << 28,
+                       (src & 0xf) << 28);
+       } else {
+               reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL0, reg_base);
+               aml_audiobus_update_bits(actrl, reg, 0x7, src & 0x7);
+       }
 }
 
 void aml_toddr_set_fifos(struct toddr *to, unsigned int thresh)
 {
        struct aml_audio_controller *actrl = to->actrl;
        unsigned int reg_base = to->reg_base;
-       unsigned int reg;
+       unsigned int reg, mask, val;
 
        reg = calc_toddr_address(EE_AUDIO_TODDR_A_CTRL1, reg_base);
-       aml_audiobus_write(actrl, reg, (thresh-1)<<16|2<<8);
+
+       if (to->chipinfo
+                       && to->chipinfo->src_sel_ctrl) {
+               mask = 0xfff << 12 | 0xf << 8;
+               val = (thresh-1) << 12 | 2 << 8;
+       } else {
+               mask = 0xff << 16 | 0xf << 8;
+               val = (thresh-1) << 16 | 2 << 8;
+       }
+
+       aml_audiobus_update_bits(actrl, reg, mask, val);
 }
 
 void aml_toddr_set_format(struct toddr *to, struct toddr_fmt *fmt)
@@ -806,7 +836,7 @@ int aml_frddr_set_buf(struct frddr *fr, unsigned int start,
 
        /* int address */
        if (fr->chipinfo
-               && fr->chipinfo->addr_separated) {
+               && (!fr->chipinfo->int_start_same_addr)) {
                reg = calc_frddr_address(EE_AUDIO_FRDDR_A_INIT_ADDR, reg_base);
                aml_audiobus_write(actrl, reg, start);
        }
@@ -860,17 +890,26 @@ void aml_frddr_select_dst(struct frddr *fr, enum frddr_dest dst)
 {
        struct aml_audio_controller *actrl = fr->actrl;
        unsigned int reg_base = fr->reg_base;
-       unsigned int reg;
+       unsigned int reg, src_sel_en;
 
        fr->dest = dst;
 
-       reg = calc_frddr_address(EE_AUDIO_FRDDR_A_CTRL0, reg_base);
-       aml_audiobus_update_bits(actrl, reg, 0x7, dst & 0x7);
+       if (fr->chipinfo
+               && fr->chipinfo->src_sel_ctrl) {
+               reg = calc_frddr_address(EE_AUDIO_FRDDR_A_CTRL2, reg_base);
+               src_sel_en = 4;
+       } else {
+               reg = calc_frddr_address(EE_AUDIO_FRDDR_A_CTRL0, reg_base);
+               src_sel_en = 3;
+       }
+
+       aml_audiobus_update_bits(actrl, reg, 0x7, dst & 0x7);
 
        /* same source en */
        if (fr->chipinfo
                && fr->chipinfo->same_src_fn) {
-               aml_audiobus_update_bits(actrl, reg, 1 << 3, 1 << 3);
+               aml_audiobus_update_bits(actrl, reg,
+                       1 << src_sel_en, 1 << src_sel_en);
        }
 }
 
@@ -1057,20 +1096,142 @@ void frddr_deinit_without_mngr(unsigned int frddr_index)
        audiobus_write(reg, 0x0);
 }
 
+static int toddr_src_idx = -1;
+
+static const char *const toddr_src_sel_texts[] = {
+       "TDMIN_A", "TDMIN_B", "TDMIN_C", "SPDIFIN",
+       "PDMIN", "FRATV", "TDMIN_LB", "LOOPBACK_A",
+       "FRHDMIRX", "LOOPBACK_B", "SPDIFIN_LB",
+       "RESERVED", "RESERVED", "RESERVED", "RESERVED",
+       "VAD"
+};
+
+static const struct soc_enum toddr_input_source_enum =
+       SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(toddr_src_sel_texts),
+               toddr_src_sel_texts);
+
+int toddr_src_get(void)
+{
+       return toddr_src_idx;
+}
+
+const char *toddr_src_get_str(int idx)
+{
+       if (idx < 0 || idx > 15)
+               return NULL;
+
+       return toddr_src_sel_texts[idx];
+}
+
+static int toddr_src_enum_get(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_value *ucontrol)
+{
+       ucontrol->value.enumerated.item[0] = toddr_src_idx;
+
+       return 0;
+}
+
+static int toddr_src_enum_set(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_value *ucontrol)
+{
+       toddr_src_idx = ucontrol->value.enumerated.item[0];
+
+       return 0;
+}
+
+static int frddr_src_idx = -1;
+
+static const char *const frddr_src_sel_texts[] = {
+       "TDMOUT_A", "TDMOUT_B", "TDMOUT_C", "SPDIFOUT", "SPDIFOUT_B"
+};
+
+static const struct soc_enum frddr_output_source_enum =
+       SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(frddr_src_sel_texts),
+               frddr_src_sel_texts);
+
+int frddr_src_get(void)
+{
+       return frddr_src_idx;
+}
+
+const char *frddr_src_get_str(int idx)
+{
+       if (idx < 0 || idx > 4)
+               return NULL;
+
+       return frddr_src_sel_texts[idx];
+}
+
+static int frddr_src_enum_get(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_value *ucontrol)
+{
+       ucontrol->value.enumerated.item[0] = frddr_src_idx;
+
+       return 0;
+}
+
+static int frddr_src_enum_set(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_value *ucontrol)
+{
+       frddr_src_idx = ucontrol->value.enumerated.item[0];
+
+       return 0;
+}
+
+static const struct snd_kcontrol_new snd_ddr_controls[] = {
+       SOC_ENUM_EXT("Audio In Source",
+               toddr_input_source_enum,
+               toddr_src_enum_get,
+               toddr_src_enum_set),
+       SOC_ENUM_EXT("Audio Out Sink",
+               toddr_input_source_enum,
+               frddr_src_enum_get,
+               frddr_src_enum_set),
+};
+
+int card_add_ddr_kcontrols(struct snd_soc_card *card)
+{
+       unsigned int idx;
+       int err;
+
+       for (idx = 0; idx < ARRAY_SIZE(snd_ddr_controls); idx++) {
+               err = snd_ctl_add(card->snd_card,
+                               snd_ctl_new1(&snd_ddr_controls[idx],
+                               NULL));
+               if (err < 0)
+                       return err;
+       }
+
+       return 0;
+}
+
+static struct ddr_chipinfo axg_ddr_chipinfo = {
+       .int_start_same_addr   = true,
+};
+
 static struct ddr_chipinfo g12a_ddr_chipinfo = {
-       .addr_separated        = true,
        .same_src_fn           = true,
 };
 
+static struct ddr_chipinfo tl1_ddr_chipinfo = {
+       .same_src_fn           = true,
+       .src_sel_ctrl          = true,
+       .fifo_num              = 4,
+};
 
 static const struct of_device_id aml_ddr_mngr_device_id[] = {
        {
                .compatible = "amlogic, axg-audio-ddr-manager",
+               .data       = &axg_ddr_chipinfo,
        },
        {
                .compatible = "amlogic, g12a-audio-ddr-manager",
                .data       = &g12a_ddr_chipinfo,
        },
+       {
+               .compatible = "amlogic, tl1-audio-ddr-manager",
+               .data       = &tl1_ddr_chipinfo,
+       },
        {},
 };
 MODULE_DEVICE_TABLE(of, aml_ddr_mngr_device_id);
@@ -1078,6 +1239,7 @@ MODULE_DEVICE_TABLE(of, aml_ddr_mngr_device_id);
 static int aml_ddr_mngr_platform_probe(struct platform_device *pdev)
 {
        struct ddr_chipinfo *p_ddr_chipinfo;
+       int ddr_num = 3; /* early chipset support max 3 ddr num */
        int i;
 
        p_ddr_chipinfo = (struct ddr_chipinfo *)
@@ -1095,7 +1257,14 @@ static int aml_ddr_mngr_platform_probe(struct platform_device *pdev)
        frddrs[DDR_B].irq = platform_get_irq_byname(pdev, "frddr_b");
        frddrs[DDR_C].irq = platform_get_irq_byname(pdev, "frddr_c");
 
-       for (i = 0; i < DDRMAX; i++) {
+       if (p_ddr_chipinfo
+               && (p_ddr_chipinfo->fifo_num == 4)) {
+               toddrs[DDR_D].irq = platform_get_irq_byname(pdev, "toddr_d");
+               frddrs[DDR_D].irq = platform_get_irq_byname(pdev, "frddr_d");
+               ddr_num = p_ddr_chipinfo->fifo_num;
+       }
+
+       for (i = 0; i < ddr_num; i++) {
                pr_info("%d, irqs toddr %d, frddr %d\n",
                        i, toddrs[i].irq, frddrs[i].irq);
                if (toddrs[i].irq <= 0 || frddrs[i].irq <= 0) {
@@ -1119,13 +1288,22 @@ static int aml_ddr_mngr_platform_probe(struct platform_device *pdev)
        frddrs[DDR_B].fifo_id  = DDR_B;
        frddrs[DDR_C].fifo_id  = DDR_C;
 
-       toddrs[DDR_A].chipinfo = p_ddr_chipinfo;
-       toddrs[DDR_B].chipinfo = p_ddr_chipinfo;
-       toddrs[DDR_C].chipinfo = p_ddr_chipinfo;
-       frddrs[DDR_A].chipinfo = p_ddr_chipinfo;
-       frddrs[DDR_B].chipinfo = p_ddr_chipinfo;
-       frddrs[DDR_C].chipinfo = p_ddr_chipinfo;
+       if (p_ddr_chipinfo) {
+               toddrs[DDR_A].chipinfo = p_ddr_chipinfo;
+               toddrs[DDR_B].chipinfo = p_ddr_chipinfo;
+               toddrs[DDR_C].chipinfo = p_ddr_chipinfo;
+               frddrs[DDR_A].chipinfo = p_ddr_chipinfo;
+               frddrs[DDR_B].chipinfo = p_ddr_chipinfo;
+               frddrs[DDR_C].chipinfo = p_ddr_chipinfo;
+
+               if (p_ddr_chipinfo->fifo_num == 4) {
+                       toddrs[DDR_D].reg_base = EE_AUDIO_TODDR_D_CTRL0;
+                       toddrs[DDR_D].fifo_id  = DDR_D;
 
+                       frddrs[DDR_D].reg_base = EE_AUDIO_FRDDR_D_CTRL0;
+                       frddrs[DDR_D].fifo_id  = DDR_D;
+               }
+       }
        return 0;
 }
 
index 5d4aac8..461ee9f 100644 (file)
 
 #include <linux/device.h>
 #include <linux/interrupt.h>
+#include <sound/soc.h>
 #include "audio_io.h"
 
 enum ddr_num {
        DDR_A,
        DDR_B,
        DDR_C,
+       DDR_D,
 };
 
 enum ddr_types {
@@ -36,15 +38,22 @@ enum ddr_types {
        RJ_32BITS,
 };
 
+/*
+ * from tl1, add new source FRATV, FRHDMIRX, LOOPBACK_B, SPDIFIN_LB, VAD
+ */
 enum toddr_src {
        TDMIN_A,
        TDMIN_B,
        TDMIN_C,
        SPDIFIN,
        PDMIN,
-       NONE,
+       FRATV, /* NONE for axg, g12a, g12b */
        TDMIN_LB,
        LOOPBACK,
+       FRHDMIRX, /* from tl1 chipset*/
+       LOOPBACK_B,
+       SPDIFIN_LB,
+       VAD,
 };
 
 enum frddr_dest {
@@ -116,5 +125,13 @@ void aml_aed_enable(bool enable, int aed_module);
 
 void frddr_init_without_mngr(unsigned int frddr_index, unsigned int src0_sel);
 void frddr_deinit_without_mngr(unsigned int frddr_index);
+
+int toddr_src_get(void);
+const char *toddr_src_get_str(int idx);
+int frddr_src_get(void);
+const char *frddr_src_get_str(int idx);
+
+int card_add_ddr_kcontrols(struct snd_soc_card *card);
+
 #endif
 
index 63c95c5..5ce778d 100644 (file)
@@ -174,27 +174,27 @@ static const struct snd_kcontrol_new snd_eqdrc_controls[] = {
         * 1:multiply gain after ng
         */
        SOC_SINGLE_EXT_TLV("EQ Volume Pos",
-                        AED_EQ_VOLUME, 28, 0x1, 0,
+                        AED_EQ_VOLUME_G12X, 28, 0x1, 0,
                         mixer_eqdrc_read, mixer_eqdrc_write,
                         NULL),
 
        SOC_SINGLE_EXT_TLV("EQ master volume",
-                        AED_EQ_VOLUME, 16, 0x3FF, 1,
+                        AED_EQ_VOLUME_G12X, 16, 0x3FF, 1,
                         mixer_eqdrc_read, mixer_eqdrc_write,
                         mvol_tlv),
 
        SOC_SINGLE_EXT_TLV("EQ ch1 volume",
-                        AED_EQ_VOLUME, 8, 0xFF, 1,
+                        AED_EQ_VOLUME_G12X, 8, 0xFF, 1,
                         mixer_eqdrc_read, mixer_eqdrc_write,
                         chvol_tlv),
 
        SOC_SINGLE_EXT_TLV("EQ ch2 volume",
-                        AED_EQ_VOLUME, 0, 0xFF, 1,
+                        AED_EQ_VOLUME_G12X, 0, 0xFF, 1,
                         mixer_eqdrc_read, mixer_eqdrc_write,
                         chvol_tlv),
 
        SOC_SINGLE_EXT("EQ master volume mute",
-                        AED_MUTE, 31, 0x1, 0,
+                        AED_MUTE_G12X, 31, 0x1, 0,
                         mixer_eqdrc_read, mixer_eqdrc_write),
 
        SOC_SINGLE_EXT("EQ/DRC Channel Mask",
@@ -210,7 +210,7 @@ static const struct snd_kcontrol_new snd_eqdrc_controls[] = {
                         mixer_eqdrc_read, mixer_set_AED_req_ctrl),
 
        SOC_SINGLE_EXT("EQ enable",
-                        AED_EQ_EN, 0, 0x1, 0,
+                        AED_EQ_EN_G12X, 0, 0x1, 0,
                         mixer_eqdrc_read, mixer_set_EQ),
 
        SOC_SINGLE_EXT("DRC enable",
index 8640068..a2d2677 100644 (file)
 int DRC0_enable(int enable, int thd0, int k0)
 {
        if (enable == 1) {
-               eqdrc_write(AED_DRC_THD0, thd0/*aml_drc_tko_table[2]*/);
-               eqdrc_write(AED_DRC_K0, k0/*aml_drc_tko_table[4]*/);
+               eqdrc_write(AED_DRC_THD0_G12X, thd0/*aml_drc_tko_table[2]*/);
+               eqdrc_write(AED_DRC_K0_G12X, k0/*aml_drc_tko_table[4]*/);
        } else {
-               eqdrc_write(AED_DRC_THD0, 0xbf000000);
-               eqdrc_write(AED_DRC_K0, 0x40000);
+               eqdrc_write(AED_DRC_THD0_G12X, 0xbf000000);
+               eqdrc_write(AED_DRC_K0_G12X, 0x40000);
        }
 
        return 0;
@@ -49,13 +49,13 @@ int set_internal_EQ_volume(
        unsigned int channel_1_volume,
        unsigned int channel_2_volume)
 {
-       eqdrc_write(AED_EQ_VOLUME, (0 << 30) /* volume step: 0.125dB*/
+       eqdrc_write(AED_EQ_VOLUME_G12X, (0 << 30) /* volume step: 0.125dB*/
                        | (master_volume << 16) /* master volume: 0dB*/
                        | (channel_1_volume << 8) /* channel 1 volume: 0dB*/
                        | (channel_2_volume << 0) /* channel 2 volume: 0dB*/
                        );
-       eqdrc_write(AED_EQ_VOLUME_SLEW_CNT, 0x40);
-       eqdrc_write(AED_MUTE, 0);
+       eqdrc_write(AED_EQ_VOLUME_SLEW_CNT_G12X, 0x40);
+       eqdrc_write(AED_MUTE_G12X, 0);
 
        return 0;
 }
@@ -122,7 +122,7 @@ void aed_set_eq(int enable, int params_len, unsigned int *params)
                }
        }
 
-       eqdrc_update_bits(AED_EQ_EN, 1, enable);
+       eqdrc_update_bits(AED_EQ_EN_G12X, 1, enable);
 }
 
 void aed_set_drc(int enable, int drc_len, unsigned int *drc_params,
diff --git a/sound/soc/amlogic/auge/extn.c b/sound/soc/amlogic/auge/extn.c
new file mode 100644 (file)
index 0000000..c437e9f
--- /dev/null
@@ -0,0 +1,567 @@
+/*
+ * sound/soc/amlogic/auge/extn.c
+ *
+ * Copyright (C) 2017 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.
+ *
+ * Audio External Input/Out drirver
+ * such as fratv, frhdmirx
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/ioctl.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#include <linux/clk.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/initval.h>
+#include <sound/control.h>
+#include <sound/soc.h>
+#include <sound/pcm_params.h>
+
+#include "ddr_mngr.h"
+#include "audio_utils.h"
+#include "frhdmirx_hw.h"
+
+#define DRV_NAME "EXTN"
+
+struct extn {
+       struct aml_audio_controller *actrl;
+       struct device *dev;
+       unsigned int sysclk_freq;
+
+       int irq_frhdmirx;
+
+       struct toddr *tddr;
+       struct frddr *fddr;
+};
+
+#define PREALLOC_BUFFER                (32 * 1024)
+#define PREALLOC_BUFFER_MAX    (256 * 1024)
+
+#define EXTN_RATES      (SNDRV_PCM_RATE_8000_192000)
+#define EXTN_FORMATS    (SNDRV_PCM_FMTBIT_S16_LE |\
+                       SNDRV_PCM_FMTBIT_S24_LE |\
+                       SNDRV_PCM_FMTBIT_S32_LE)
+
+static const struct snd_pcm_hardware extn_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 = EXTN_FORMATS,
+
+       .period_bytes_min = 64,
+       .period_bytes_max = 128 * 1024,
+       .periods_min = 2,
+       .periods_max = 1024,
+       .buffer_bytes_max = 256 * 1024,
+
+       .rate_min = 8000,
+       .rate_max = 192000,
+       .channels_min = 1,
+       .channels_max = 32,
+};
+
+static irqreturn_t extn_ddr_isr(int irq, void *devid)
+{
+       struct snd_pcm_substream *substream =
+               (struct snd_pcm_substream *)devid;
+
+       if (!snd_pcm_running(substream))
+               return IRQ_HANDLED;
+
+       snd_pcm_period_elapsed(substream);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t frhdmirx_isr(int irq, void *devid)
+{
+       return IRQ_HANDLED;
+}
+
+static int extn_open(struct snd_pcm_substream *substream)
+{
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct device *dev = rtd->platform->dev;
+       struct extn *p_extn;
+
+       pr_info("asoc debug: %s-%d\n", __func__, __LINE__);
+
+       p_extn = (struct extn *)dev_get_drvdata(dev);
+
+       snd_soc_set_runtime_hwparams(substream, &extn_hardware);
+
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               p_extn->fddr = aml_audio_register_frddr(dev,
+                       p_extn->actrl,
+                       extn_ddr_isr, substream);
+               if (p_extn->fddr == NULL) {
+                       dev_err(dev, "failed to claim from ddr\n");
+                       return -ENXIO;
+               }
+       } else {
+               p_extn->tddr = aml_audio_register_toddr(dev,
+                       p_extn->actrl,
+                       extn_ddr_isr, substream);
+               if (p_extn->tddr == NULL) {
+                       dev_err(dev, "failed to claim to ddr\n");
+                       return -ENXIO;
+               }
+
+               if (toddr_src_get() == FRHDMIRX) {
+                       int ret = request_irq(p_extn->irq_frhdmirx,
+                                       frhdmirx_isr, 0, "irq_frhdmirx",
+                                       p_extn);
+                       if (ret) {
+                               dev_err(p_extn->dev, "failed to claim irq_frhdmirx %u\n",
+                                                       p_extn->irq_frhdmirx);
+                               return -ENXIO;
+                       }
+               }
+       }
+
+       runtime->private_data = p_extn;
+
+       return 0;
+}
+
+static int extn_close(struct snd_pcm_substream *substream)
+{
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct extn *p_extn = runtime->private_data;
+
+       pr_info("asoc debug: %s-%d\n", __func__, __LINE__);
+
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+               aml_audio_unregister_frddr(p_extn->dev, substream);
+       else {
+               aml_audio_unregister_toddr(p_extn->dev, substream);
+
+               if (toddr_src_get() == FRHDMIRX)
+                       free_irq(p_extn->irq_frhdmirx, p_extn);
+       }
+       runtime->private_data = NULL;
+
+       return 0;
+}
+
+static int extn_hw_params(struct snd_pcm_substream *substream,
+                        struct snd_pcm_hw_params *hw_params)
+{
+       return snd_pcm_lib_malloc_pages(substream,
+                                       params_buffer_bytes(hw_params));
+}
+
+static int extn_hw_free(struct snd_pcm_substream *substream)
+{
+       snd_pcm_lib_free_pages(substream);
+
+       return 0;
+}
+
+static int extn_trigger(struct snd_pcm_substream *substream, int cmd)
+{
+       return 0;
+}
+
+static int extn_prepare(struct snd_pcm_substream *substream)
+{
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct extn *p_extn = 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 (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               struct frddr *fr = p_extn->fddr;
+
+               aml_frddr_set_buf(fr, start_addr, end_addr);
+               aml_frddr_set_intrpt(fr, int_addr);
+       } else {
+               struct toddr *to = p_extn->tddr;
+
+               aml_toddr_set_buf(to, start_addr, end_addr);
+               aml_toddr_set_intrpt(to, int_addr);
+       }
+
+       return 0;
+}
+
+static snd_pcm_uframes_t extn_pointer(struct snd_pcm_substream *substream)
+{
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct extn *p_extn = runtime->private_data;
+       unsigned int addr, start_addr;
+       snd_pcm_uframes_t frames;
+
+       start_addr = runtime->dma_addr;
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+               addr = aml_frddr_get_position(p_extn->fddr);
+       else
+               addr = aml_toddr_get_position(p_extn->tddr);
+
+       frames = bytes_to_frames(runtime, addr - start_addr);
+       if (frames > runtime->buffer_size)
+               frames = 0;
+
+       return frames;
+}
+
+int extn_silence(struct snd_pcm_substream *substream, int channel,
+                   snd_pcm_uframes_t pos, snd_pcm_uframes_t count)
+{
+       struct snd_pcm_runtime *runtime = substream->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 extn_mmap(struct snd_pcm_substream *substream,
+                       struct vm_area_struct *vma)
+{
+       return snd_pcm_lib_default_mmap(substream, vma);
+}
+
+static struct snd_pcm_ops extn_ops = {
+       .open      = extn_open,
+       .close     = extn_close,
+       .ioctl     = snd_pcm_lib_ioctl,
+       .hw_params = extn_hw_params,
+       .hw_free   = extn_hw_free,
+       .prepare   = extn_prepare,
+       .trigger   = extn_trigger,
+       .pointer   = extn_pointer,
+       .silence   = extn_silence,
+       .mmap      = extn_mmap,
+};
+
+static int extn_new(struct snd_soc_pcm_runtime *rtd)
+{
+       return snd_pcm_lib_preallocate_pages_for_all(
+                       rtd->pcm, SNDRV_DMA_TYPE_DEV,
+                       rtd->card->snd_card->dev,
+                       PREALLOC_BUFFER, PREALLOC_BUFFER_MAX);
+}
+
+struct snd_soc_platform_driver extn_platform = {
+       .ops = &extn_ops,
+       .pcm_new = extn_new,
+};
+
+static int extn_dai_probe(struct snd_soc_dai *cpu_dai)
+{
+       pr_info("asoc debug: %s-%d\n", __func__, __LINE__);
+
+       return 0;
+}
+
+static int extn_dai_remove(struct snd_soc_dai *cpu_dai)
+{
+       return 0;
+}
+
+static int extn_dai_startup(
+       struct snd_pcm_substream *substream,
+       struct snd_soc_dai *cpu_dai)
+{
+       return 0;
+}
+
+static void extn_dai_shutdown(
+       struct snd_pcm_substream *substream,
+       struct snd_soc_dai *cpu_dai)
+{
+}
+
+static int extn_dai_prepare(
+       struct snd_pcm_substream *substream,
+       struct snd_soc_dai *cpu_dai)
+{
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct extn *p_extn = snd_soc_dai_get_drvdata(cpu_dai);
+       unsigned int bit_depth = snd_pcm_format_width(runtime->format);
+
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               struct frddr *fr = p_extn->fddr;
+               enum frddr_dest dst = frddr_src_get();
+
+               pr_info("%s Expected frddr dst:%s\n",
+                       __func__,
+                       frddr_src_get_str(dst));
+
+               aml_frddr_select_dst(fr, dst);
+               aml_frddr_set_fifos(fr, 0x40, 0x20);
+       } else {
+               struct toddr *to = p_extn->tddr;
+               unsigned int msb = 32 - 1;
+               unsigned int lsb = 32 - bit_depth;
+               unsigned int toddr_type;
+               unsigned int src = toddr_src_get();
+               struct toddr_fmt fmt;
+
+               switch (bit_depth) {
+               case 8:
+               case 16:
+               case 32:
+                       toddr_type = 0;
+                       break;
+               case 24:
+                       toddr_type = 4;
+                       break;
+               default:
+                       pr_err("invalid bit_depth: %d\n", bit_depth);
+                       return -EINVAL;
+               }
+
+               pr_info("%s Expected toddr src:%s\n",
+                       __func__,
+                       toddr_src_get_str(src));
+
+               if (src == FRATV)
+                       fratv_src_select(0);
+               else if (src == FRHDMIRX) {
+                       frhdmirx_ctrl(runtime->channels, 0);
+                       frhdmirx_src_select(0);
+               }
+
+               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);
+       }
+
+       return 0;
+}
+
+static int extn_dai_trigger(struct snd_pcm_substream *substream, int cmd,
+                              struct snd_soc_dai *cpu_dai)
+{
+       struct extn *p_extn = snd_soc_dai_get_drvdata(cpu_dai);
+       unsigned int src = toddr_src_get();
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+       case SNDRV_PCM_TRIGGER_RESUME:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+                       dev_info(substream->pcm->card->dev, "External Playback enable\n");
+
+                       aml_frddr_enable(p_extn->fddr, true);
+               } else {
+                       dev_info(substream->pcm->card->dev, "External Capture enable\n");
+
+                       if (src == FRATV)
+                               fratv_enable(true);
+                       else if (src == FRHDMIRX)
+                               frhdmirx_enable(true);
+
+                       aml_toddr_enable(p_extn->tddr, true);
+               }
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+                       dev_info(substream->pcm->card->dev, "External Playback disable\n");
+
+                       aml_frddr_enable(p_extn->fddr, false);
+               } else {
+                       dev_info(substream->pcm->card->dev, "External Capture disable\n");
+
+                       if (src == FRATV)
+                               fratv_enable(false);
+                       else if (src == FRHDMIRX)
+                               frhdmirx_enable(false);
+
+                       aml_toddr_enable(p_extn->tddr, false);
+               }
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int extn_dai_hw_params(struct snd_pcm_substream *substream,
+                               struct snd_pcm_hw_params *params,
+                               struct snd_soc_dai *cpu_dai)
+{
+       struct extn *p_extn = snd_soc_dai_get_drvdata(cpu_dai);
+       unsigned int rate = params_rate(params);
+       int ret = 0;
+
+       pr_info("%s:rate:%d, sysclk:%d\n",
+               __func__,
+               rate,
+               p_extn->sysclk_freq);
+
+       return ret;
+}
+
+static int extn_dai_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
+{
+       struct extn *p_extn = snd_soc_dai_get_drvdata(cpu_dai);
+
+       pr_info("asoc extn_dai_set_fmt, %#x, %p\n", fmt, p_extn);
+
+       return 0;
+}
+
+static int extn_dai_set_sysclk(struct snd_soc_dai *cpu_dai,
+                               int clk_id, unsigned int freq, int dir)
+{
+       struct extn *p_extn = snd_soc_dai_get_drvdata(cpu_dai);
+
+       p_extn->sysclk_freq = freq;
+       pr_info("extn_dai_set_sysclk, %d, %d, %d\n",
+                       clk_id, freq, dir);
+
+       return 0;
+}
+
+static struct snd_soc_dai_ops extn_dai_ops = {
+       .startup = extn_dai_startup,
+       .shutdown = extn_dai_shutdown,
+       .prepare = extn_dai_prepare,
+       .trigger = extn_dai_trigger,
+       .hw_params = extn_dai_hw_params,
+       .set_fmt = extn_dai_set_fmt,
+       .set_sysclk = extn_dai_set_sysclk,
+};
+
+static struct snd_soc_dai_driver extn_dai[] = {
+       {
+               .name = "EXTN",
+               .id = 0,
+               .probe = extn_dai_probe,
+               .remove = extn_dai_remove,
+               .playback = {
+                     .channels_min = 1,
+                     .channels_max = 32,
+                     .rates = EXTN_RATES,
+                     .formats = EXTN_FORMATS,
+               },
+               .capture = {
+                    .channels_min = 1,
+                    .channels_max = 32,
+                    .rates = EXTN_RATES,
+                    .formats = EXTN_FORMATS,
+               },
+               .ops = &extn_dai_ops,
+       },
+};
+
+static const struct snd_soc_component_driver extn_component = {
+       .name           = DRV_NAME,
+};
+
+static const struct of_device_id extn_device_id[] = {
+       {
+               .compatible = "amlogic, snd-extn",
+       },
+       {},
+};
+
+MODULE_DEVICE_TABLE(of, extn_device_id);
+
+static int extn_platform_probe(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct device_node *node_prt = NULL;
+       struct platform_device *pdev_parent;
+       struct device *dev = &pdev->dev;
+       struct aml_audio_controller *actrl = NULL;
+       struct extn *extn = NULL;
+       int ret = 0;
+
+
+       extn = devm_kzalloc(dev, sizeof(struct extn), GFP_KERNEL);
+       if (!extn)
+               return -ENOMEM;
+
+       extn->dev = dev;
+       dev_set_drvdata(dev, extn);
+
+       /* 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);
+       extn->actrl = actrl;
+
+       /* irqs */
+       extn->irq_frhdmirx = platform_get_irq_byname(pdev, "irq_frhdmirx");
+       if (extn->irq_frhdmirx < 0) {
+               dev_err(dev, "Failed to get irq_frhdmirx:%d\n",
+                       extn->irq_frhdmirx);
+               return -ENXIO;
+       }
+
+       ret = snd_soc_register_component(&pdev->dev,
+                               &extn_component,
+                               extn_dai,
+                               ARRAY_SIZE(extn_dai));
+       if (ret) {
+               dev_err(&pdev->dev,
+                       "snd_soc_register_component failed\n");
+               return ret;
+       }
+
+       pr_info("%s, register soc platform\n", __func__);
+
+       return devm_snd_soc_register_platform(dev, &extn_platform);
+}
+
+struct platform_driver extn_driver = {
+       .driver = {
+               .name = DRV_NAME,
+               .of_match_table = extn_device_id,
+       },
+       .probe = extn_platform_probe,
+};
+module_platform_driver(extn_driver);
+
+MODULE_AUTHOR("Amlogic, Inc.");
+MODULE_DESCRIPTION("Amlogic External Input/Output ASoc driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("Platform:" DRV_NAME);
+MODULE_DEVICE_TABLE(of, extn_device_id);
diff --git a/sound/soc/amlogic/auge/frhdmirx_hw.c b/sound/soc/amlogic/auge/frhdmirx_hw.c
new file mode 100644 (file)
index 0000000..ca24d6a
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * sound/soc/amlogic/auge/frhdmirx_hw.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 <linux/types.h>
+
+#include "frhdmirx_hw.h"
+#include "regs.h"
+#include "iomap.h"
+
+void frhdmirx_enable(bool enable)
+{
+       if (enable) {
+               audiobus_update_bits(EE_AUDIO_FRHDMIRX_CTRL0,
+                       0x1 << 29,
+                       0x1 << 29);
+               audiobus_update_bits(EE_AUDIO_FRHDMIRX_CTRL0,
+                       0x1 << 28,
+                       0x1 << 28);
+       } else
+               audiobus_update_bits(EE_AUDIO_FRHDMIRX_CTRL0,
+                       0x3 << 28,
+                       0x0 << 28);
+
+       audiobus_update_bits(EE_AUDIO_FRHDMIRX_CTRL0, 0x1 << 31, enable << 31);
+}
+
+/* source select
+ * 0: select spdif lane;
+ * 1: select PAO mode;
+ */
+void frhdmirx_src_select(int src)
+{
+       audiobus_update_bits(EE_AUDIO_FRHDMIRX_CTRL0,
+               0x1 << 23,
+               (bool)src << 23);
+}
+
+void frhdmirx_enable_irq_bits(int channels, int src)
+{
+       int lane, int_bits = 0, i;
+
+       if (channels % 2)
+               lane = channels / 2 + 1;
+       else
+               lane = channels / 2;
+
+       /* interrupt bits */
+       if (src) { /* PAO mode */
+               int_bits = (0x1 << 24 | /*  PAO data: find papb */
+                       0x1 << 16 /* PAO data: find pcpd changed */
+                       );
+       } else { /* SPDIF Lane*/
+               int lane_irq_bits = (0x1 << 7 | /* lane: find papb */
+                       0x1 << 6 | /* lane: find papb */
+                       0x1 << 5 | /* lane: find nonpcm to pcm */
+                       0x1 << 4 | /* lane: find pcpd changed */
+                       0x1 << 3 | /* lane: find ch status changed */
+                       0x1 << 1 /* lane: find parity error */
+                       );
+
+               for (i = 0; i < lane; i++)
+                       int_bits |= (lane_irq_bits << i);
+       }
+       audiobus_write(EE_AUDIO_FRHDMIRX_CTRL2, int_bits);
+}
+
+void frhdmirx_ctrl(int channels, int src)
+{
+       int lane, lane_mask = 0, i;
+
+       if (channels % 2)
+               lane = channels / 2 + 1;
+       else
+               lane = channels / 2;
+
+       for (i = 0; i < lane; i++)
+               lane_mask |= (1 << i);
+
+       audiobus_update_bits(EE_AUDIO_FRHDMIRX_CTRL0,
+               0x1 << 30 | 0xf << 24 | 0x3 << 11,
+               0x1 << 30 | /* chnum_sel */
+               lane_mask << 24 | /* chnum_sel */
+               0x0 << 11 /* req_sel, Sync 4 spdifin by which */
+               );
+
+       /* nonpcm2pcm_th */
+       audiobus_write(EE_AUDIO_FRHDMIRX_CTRL1, 0xff << 20);
+
+       /* enable irq bits */
+       frhdmirx_enable_irq_bits(channels, src);
+}
diff --git a/sound/soc/amlogic/auge/frhdmirx_hw.h b/sound/soc/amlogic/auge/frhdmirx_hw.h
new file mode 100644 (file)
index 0000000..ce51e13
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * sound/soc/amlogic/auge/frhdmirx_hw.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 __FRHDMIRX_HW_H__
+#define __FRHDMIRX_HW_H__
+
+extern void frhdmirx_enable(bool enable);
+extern void frhdmirx_src_select(int src);
+extern void frhdmirx_ctrl(int channels, int src);
+
+#endif
index d16fa08..66131cf 100644 (file)
@@ -33,29 +33,29 @@ static const char *const audioclk_parent_names[] = {
        "i_slv_sclk_d", "i_slv_sclk_e", "i_slv_sclk_f", "i_slv_sclk_g",
        "i_slv_sclk_h", "i_slv_sclk_i", "i_slv_sclk_j"};
 
-CLOCK_GATE(audio_ddr_arb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 0);
-CLOCK_GATE(audio_pdm, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 1);
-CLOCK_GATE(audio_tdmina, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 2);
-CLOCK_GATE(audio_tdminb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 3);
-CLOCK_GATE(audio_tdminc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 4);
-CLOCK_GATE(audio_tdminlb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 5);
-CLOCK_GATE(audio_tdmouta, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 6);
-CLOCK_GATE(audio_tdmoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 7);
-CLOCK_GATE(audio_tdmoutc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 8);
-CLOCK_GATE(audio_frddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 9);
-CLOCK_GATE(audio_frddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 10);
-CLOCK_GATE(audio_frddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 11);
-CLOCK_GATE(audio_toddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 12);
-CLOCK_GATE(audio_toddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 13);
-CLOCK_GATE(audio_toddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 14);
-CLOCK_GATE(audio_loopback, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 15);
-CLOCK_GATE(audio_spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 16);
-CLOCK_GATE(audio_spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 17);
-CLOCK_GATE(audio_resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 18);
-CLOCK_GATE(audio_power_detect, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 19);
-CLOCK_GATE(audio_toram, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 20);
-CLOCK_GATE(audio_spdifoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 21);
-CLOCK_GATE(audio_eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN), 22);
+CLOCK_GATE(audio_ddr_arb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 0);
+CLOCK_GATE(audio_pdm, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 1);
+CLOCK_GATE(audio_tdmina, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 2);
+CLOCK_GATE(audio_tdminb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 3);
+CLOCK_GATE(audio_tdminc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 4);
+CLOCK_GATE(audio_tdminlb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 5);
+CLOCK_GATE(audio_tdmouta, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 6);
+CLOCK_GATE(audio_tdmoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 7);
+CLOCK_GATE(audio_tdmoutc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 8);
+CLOCK_GATE(audio_frddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 9);
+CLOCK_GATE(audio_frddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 10);
+CLOCK_GATE(audio_frddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 11);
+CLOCK_GATE(audio_toddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 12);
+CLOCK_GATE(audio_toddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 13);
+CLOCK_GATE(audio_toddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 14);
+CLOCK_GATE(audio_loopback, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 15);
+CLOCK_GATE(audio_spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 16);
+CLOCK_GATE(audio_spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 17);
+CLOCK_GATE(audio_resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 18);
+CLOCK_GATE(audio_power_detect, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 19);
+CLOCK_GATE(audio_toram, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 20);
+CLOCK_GATE(audio_spdifoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 21);
+CLOCK_GATE(audio_eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 22);
 
 static struct clk_gate *g12a_audio_clk_gates[] = {
        &audio_ddr_arb,
@@ -129,29 +129,29 @@ static int g12a_clk_gates_init(struct clk **clks, void __iomem *iobase)
 }
 
 /* mclk_a */
-CLOCK_COM_MUX(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL), 31);
+CLOCK_COM_MUX(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(0)), 31);
 /* mclk_b */
-CLOCK_COM_MUX(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL), 31);
+CLOCK_COM_MUX(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(0)), 31);
 /* mclk_c */
-CLOCK_COM_MUX(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL), 31);
+CLOCK_COM_MUX(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(0)), 31);
 /* mclk_d */
-CLOCK_COM_MUX(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL), 31);
+CLOCK_COM_MUX(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(0)), 31);
 /* mclk_e */
-CLOCK_COM_MUX(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL), 31);
+CLOCK_COM_MUX(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(0)), 31);
 /* mclk_f */
-CLOCK_COM_MUX(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL), 0x7, 24);
-CLOCK_COM_DIV(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL), 0, 16);
-CLOCK_COM_GATE(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL), 31);
+CLOCK_COM_MUX(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(0)), 0x7, 24);
+CLOCK_COM_DIV(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(0)), 0, 16);
+CLOCK_COM_GATE(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(0)), 31);
 /* spdifin */
 CLOCK_COM_MUX(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0x7, 24);
 CLOCK_COM_DIV(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0, 8);
@@ -182,9 +182,9 @@ CLOCK_COM_MUX(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0xf, 8);
 CLOCK_COM_DIV(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0, 8);
 CLOCK_COM_GATE(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 15);
 /* audio resample */
-CLOCK_COM_MUX(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLE_CTRL), 0xf, 24);
-CLOCK_COM_DIV(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLE_CTRL), 0, 8);
-CLOCK_COM_GATE(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLE_CTRL), 31);
+CLOCK_COM_MUX(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0xf, 24);
+CLOCK_COM_DIV(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0, 8);
+CLOCK_COM_GATE(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 31);
 
 static int g12a_clks_init(struct clk **clks, void __iomem *iobase)
 {
index 7434b03..e05c24b 100644 (file)
@@ -35,7 +35,7 @@
 #include "regs.h"
 #include "ddr_mngr.h"
 
-/*#define G12A_PTM*/
+/*#define __PTM_PDM_CLK__*/
 
 static struct snd_pcm_hardware aml_pdm_hardware = {
        .info                   =
@@ -727,8 +727,10 @@ static int aml_pdm_dai_set_sysclk(struct snd_soc_dai *cpu_dai,
        sysclk_srcpll_freq = clk_get_rate(p_pdm->sysclk_srcpll);
        dclk_srcpll_freq = clk_get_rate(p_pdm->dclk_srcpll);
 
-#ifdef G12A_PTM
-       clk_set_rate(p_pdm->dclk_srcpll, 24576000);
+#ifdef __PTM_PDM_CLK__
+       clk_set_rate(p_pdm->clk_pdm_sysclk, 133333351);
+       clk_set_rate(p_pdm->dclk_srcpll, 24576000 * 15); /* 350m */
+       clk_set_rate(p_pdm->clk_pdm_dclk, 3072000);
 #else
        clk_set_rate(p_pdm->clk_pdm_sysclk, 133333351);
 
@@ -866,7 +868,13 @@ static const struct snd_soc_component_driver aml_pdm_component = {
 };
 
 static struct pdm_chipinfo g12a_pdm_chipinfo = {
-       .mute_fn = true,
+       .mute_fn         = true,
+       .truncate_data   = false,
+};
+
+static struct pdm_chipinfo tl1_pdm_chipinfo = {
+       .mute_fn         = true,
+       .truncate_data   = true,
 };
 
 static const struct of_device_id aml_pdm_device_id[] = {
@@ -875,7 +883,11 @@ static const struct of_device_id aml_pdm_device_id[] = {
        },
        {
                .compatible = "amlogic, g12a-snd-pdm",
-               .data = &g12a_pdm_chipinfo,
+               .data       = &g12a_pdm_chipinfo,
+       },
+       {
+               .compatible = "amlogic, tl1-snd-pdm",
+               .data       = &tl1_pdm_chipinfo,
        },
        {}
 };
index 72ff145..60a0e1e 100644 (file)
@@ -50,6 +50,8 @@ enum {
 struct pdm_chipinfo {
        /* pdm supports mute function */
        bool mute_fn;
+       /* truncate invalid data when filter init */
+       bool truncate_data;
 };
 
 struct aml_pdm {
index 5f84437..f3394be 100644 (file)
 #ifndef __AML_REGS_H_
 #define __AML_REGS_H_
 
-/*
- *  PDM - Registers
- *  PDM
- *
- *  BASE_ADR                         32'hFF632000
- */
-#define    PDM_CTRL                                            0x00
-#define    PDM_HCIC_CTRL1                                      0x01
-#define    PDM_HCIC_CTRL2                                      0x02
-#define    PDM_F1_CTRL                                         0x03
-#define    PDM_F2_CTRL                                         0x04
-#define    PDM_F3_CTRL                                         0x05
-#define    PDM_HPF_CTRL                                        0x06
-#define    PDM_CHAN_CTRL                                       0x07
-#define    PDM_CHAN_CTRL1                                      0x08
-#define    PDM_COEFF_ADDR                                      0x09
-#define    PDM_COEFF_DATA                                      0x0A
-#define    PDM_CLKG_CTRL                                       0x0B
-#define    PDM_STS                                             0x0C
-
-
-/**
- *  AUDIO - Registers
- *  AUDIO CLOCK, TODDR, FRDDR, TDM, SPDIF, LOOPBACK, RESAMPLE,
- *  POWER DETECT, SECURITY
- *
- *  BASE_ADR                         32'hFF642000
- */
-
-/**
- * AXG chipset
- */
-#define    EE_AUDIO_CLK_GATE_EN                                0x000
-#define    EE_AUDIO_MCLK_A_CTRL                                0x001
-#define    EE_AUDIO_MCLK_B_CTRL                                0x002
-#define    EE_AUDIO_MCLK_C_CTRL                                0x003
-#define    EE_AUDIO_MCLK_D_CTRL                                0x004
-#define    EE_AUDIO_MCLK_E_CTRL                                0x005
-#define    EE_AUDIO_MCLK_F_CTRL                                0x006
-#define    EE_AUDIO_MST_A_SCLK_CTRL0                           0x010
-#define    EE_AUDIO_MST_A_SCLK_CTRL1                           0x011
-#define    EE_AUDIO_MST_B_SCLK_CTRL0                           0x012
-#define    EE_AUDIO_MST_B_SCLK_CTRL1                           0x013
-#define    EE_AUDIO_MST_C_SCLK_CTRL0                           0x014
-#define    EE_AUDIO_MST_C_SCLK_CTRL1                           0x015
-#define    EE_AUDIO_MST_D_SCLK_CTRL0                           0x016
-#define    EE_AUDIO_MST_D_SCLK_CTRL1                           0x017
-#define    EE_AUDIO_MST_E_SCLK_CTRL0                           0x018
-#define    EE_AUDIO_MST_E_SCLK_CTRL1                           0x019
-#define    EE_AUDIO_MST_F_SCLK_CTRL0                           0x01a
-#define    EE_AUDIO_MST_F_SCLK_CTRL1                           0x01b
-#define    EE_AUDIO_CLK_TDMIN_A_CTRL                           0x020
-#define    EE_AUDIO_CLK_TDMIN_B_CTRL                           0x021
-#define    EE_AUDIO_CLK_TDMIN_C_CTRL                           0x022
-#define    EE_AUDIO_CLK_TDMIN_LB_CTRL                          0x023
-#define    EE_AUDIO_CLK_TDMOUT_A_CTRL                          0x024
-#define    EE_AUDIO_CLK_TDMOUT_B_CTRL                          0x025
-#define    EE_AUDIO_CLK_TDMOUT_C_CTRL                          0x026
-#define    EE_AUDIO_CLK_SPDIFIN_CTRL                           0x027
-#define    EE_AUDIO_CLK_SPDIFOUT_CTRL                          0x028
-#define    EE_AUDIO_CLK_RESAMPLE_CTRL                          0x029
-#define    EE_AUDIO_CLK_LOCKER_CTRL                            0x02a
-#define    EE_AUDIO_CLK_PDMIN_CTRL0                            0x02b
-#define    EE_AUDIO_CLK_PDMIN_CTRL1                            0x02c
-#define    EE_AUDIO_TODDR_A_CTRL0                              0x040
-#define    EE_AUDIO_TODDR_A_CTRL1                              0x041
-#define    EE_AUDIO_TODDR_A_START_ADDR                         0x042
-#define    EE_AUDIO_TODDR_A_FINISH_ADDR                        0x043
-#define    EE_AUDIO_TODDR_A_INT_ADDR                           0x044
-#define    EE_AUDIO_TODDR_A_STATUS1                            0x045
-#define    EE_AUDIO_TODDR_A_STATUS2                            0x046
-#define    EE_AUDIO_TODDR_A_START_ADDRB                        0x047
-#define    EE_AUDIO_TODDR_A_FINISH_ADDRB                       0x048
-#define    EE_AUDIO_TODDR_B_CTRL0                              0x050
-#define    EE_AUDIO_TODDR_B_CTRL1                              0x051
-#define    EE_AUDIO_TODDR_B_START_ADDR                         0x052
-#define    EE_AUDIO_TODDR_B_FINISH_ADDR                        0x053
-#define    EE_AUDIO_TODDR_B_INT_ADDR                           0x054
-#define    EE_AUDIO_TODDR_B_STATUS1                            0x055
-#define    EE_AUDIO_TODDR_B_STATUS2                            0x056
-#define    EE_AUDIO_TODDR_B_START_ADDRB                        0x057
-#define    EE_AUDIO_TODDR_B_FINISH_ADDRB                       0x058
-#define    EE_AUDIO_TODDR_C_CTRL0                              0x060
-#define    EE_AUDIO_TODDR_C_CTRL1                              0x061
-#define    EE_AUDIO_TODDR_C_START_ADDR                         0x062
-#define    EE_AUDIO_TODDR_C_FINISH_ADDR                        0x063
-#define    EE_AUDIO_TODDR_C_INT_ADDR                           0x064
-#define    EE_AUDIO_TODDR_C_STATUS1                            0x065
-#define    EE_AUDIO_TODDR_C_STATUS2                            0x066
-#define    EE_AUDIO_TODDR_C_START_ADDRB                        0x067
-#define    EE_AUDIO_TODDR_C_FINISH_ADDRB                       0x068
-#define    EE_AUDIO_FRDDR_A_CTRL0                              0x070
-#define    EE_AUDIO_FRDDR_A_CTRL1                              0x071
-#define    EE_AUDIO_FRDDR_A_START_ADDR                         0x072
-#define    EE_AUDIO_FRDDR_A_FINISH_ADDR                        0x073
-#define    EE_AUDIO_FRDDR_A_INT_ADDR                           0x074
-#define    EE_AUDIO_FRDDR_A_STATUS1                            0x075
-#define    EE_AUDIO_FRDDR_A_STATUS2                            0x076
-#define    EE_AUDIO_FRDDR_A_START_ADDRB                        0x077
-#define    EE_AUDIO_FRDDR_A_FINISH_ADDRB                       0x078
-#define    EE_AUDIO_FRDDR_B_CTRL0                              0x080
-#define    EE_AUDIO_FRDDR_B_CTRL1                              0x081
-#define    EE_AUDIO_FRDDR_B_START_ADDR                         0x082
-#define    EE_AUDIO_FRDDR_B_FINISH_ADDR                        0x083
-#define    EE_AUDIO_FRDDR_B_INT_ADDR                           0x084
-#define    EE_AUDIO_FRDDR_B_STATUS1                            0x085
-#define    EE_AUDIO_FRDDR_B_STATUS2                            0x086
-#define    EE_AUDIO_FRDDR_B_START_ADDRB                        0x087
-#define    EE_AUDIO_FRDDR_B_FINISH_ADDRB                       0x088
-#define    EE_AUDIO_FRDDR_C_CTRL0                              0x090
-#define    EE_AUDIO_FRDDR_C_CTRL1                              0x091
-#define    EE_AUDIO_FRDDR_C_START_ADDR                         0x092
-#define    EE_AUDIO_FRDDR_C_FINISH_ADDR                        0x093
-#define    EE_AUDIO_FRDDR_C_INT_ADDR                           0x094
-#define    EE_AUDIO_FRDDR_C_STATUS1                            0x095
-#define    EE_AUDIO_FRDDR_C_STATUS2                            0x096
-#define    EE_AUDIO_FRDDR_C_START_ADDRB                        0x097
-#define    EE_AUDIO_FRDDR_C_FINISH_ADDRB                       0x098
-#define    EE_AUDIO_ARB_CTRL                                   0x0a0
-#define    EE_AUDIO_LB_CTRL0                                   0x0b0
-#define    EE_AUDIO_LB_CTRL1                                   0x0b1
-#define    EE_AUDIO_TDMIN_A_CTRL                               0x0c0
-#define    EE_AUDIO_TDMIN_A_SWAP                               0x0c1
-#define    EE_AUDIO_TDMIN_A_MASK0                              0x0c2
-#define    EE_AUDIO_TDMIN_A_MASK1                              0x0c3
-#define    EE_AUDIO_TDMIN_A_MASK2                              0x0c4
-#define    EE_AUDIO_TDMIN_A_MASK3                              0x0c5
-#define    EE_AUDIO_TDMIN_A_STAT                               0x0c6
-#define    EE_AUDIO_TDMIN_A_MUTE_VAL                           0x0c7
-#define    EE_AUDIO_TDMIN_A_MUTE0                              0x0c8
-#define    EE_AUDIO_TDMIN_A_MUTE1                              0x0c9
-#define    EE_AUDIO_TDMIN_A_MUTE2                              0x0ca
-#define    EE_AUDIO_TDMIN_A_MUTE3                              0x0cb
-#define    EE_AUDIO_TDMIN_B_CTRL                               0x0d0
-#define    EE_AUDIO_TDMIN_B_SWAP                               0x0d1
-#define    EE_AUDIO_TDMIN_B_MASK0                              0x0d2
-#define    EE_AUDIO_TDMIN_B_MASK1                              0x0d3
-#define    EE_AUDIO_TDMIN_B_MASK2                              0x0d4
-#define    EE_AUDIO_TDMIN_B_MASK3                              0x0d5
-#define    EE_AUDIO_TDMIN_B_STAT                               0x0d6
-#define    EE_AUDIO_TDMIN_B_MUTE_VAL                           0x0d7
-#define    EE_AUDIO_TDMIN_B_MUTE0                              0x0d8
-#define    EE_AUDIO_TDMIN_B_MUTE1                              0x0d9
-#define    EE_AUDIO_TDMIN_B_MUTE2                              0x0da
-#define    EE_AUDIO_TDMIN_B_MUTE3                              0x0db
-#define    EE_AUDIO_TDMIN_C_CTRL                               0x0e0
-#define    EE_AUDIO_TDMIN_C_SWAP                               0x0e1
-#define    EE_AUDIO_TDMIN_C_MASK0                              0x0e2
-#define    EE_AUDIO_TDMIN_C_MASK1                              0x0e3
-#define    EE_AUDIO_TDMIN_C_MASK2                              0x0e4
-#define    EE_AUDIO_TDMIN_C_MASK3                              0x0e5
-#define    EE_AUDIO_TDMIN_C_STAT                               0x0e6
-#define    EE_AUDIO_TDMIN_C_MUTE_VAL                           0x0e7
-#define    EE_AUDIO_TDMIN_C_MUTE0                              0x0e8
-#define    EE_AUDIO_TDMIN_C_MUTE1                              0x0e9
-#define    EE_AUDIO_TDMIN_C_MUTE2                              0x0ea
-#define    EE_AUDIO_TDMIN_C_MUTE3                              0x0eb
-#define    EE_AUDIO_TDMIN_LB_CTRL                              0x0f0
-#define    EE_AUDIO_TDMIN_LB_SWAP                              0x0f1
-#define    EE_AUDIO_TDMIN_LB_MASK0                             0x0f2
-#define    EE_AUDIO_TDMIN_LB_MASK1                             0x0f3
-#define    EE_AUDIO_TDMIN_LB_MASK2                             0x0f4
-#define    EE_AUDIO_TDMIN_LB_MASK3                             0x0f5
-#define    EE_AUDIO_TDMIN_LB_STAT                              0x0f6
-#define    EE_AUDIO_TDMIN_LB_MUTE_VAL                          0x0f7
-#define    EE_AUDIO_TDMIN_LB_MUTE0                             0x0f8
-#define    EE_AUDIO_TDMIN_LB_MUTE1                             0x0f9
-#define    EE_AUDIO_TDMIN_LB_MUTE2                             0x0fa
-#define    EE_AUDIO_TDMIN_LB_MUTE3                             0x0fb
-#define    EE_AUDIO_SPDIFIN_CTRL0                              0x100
-#define    EE_AUDIO_SPDIFIN_CTRL1                              0x101
-#define    EE_AUDIO_SPDIFIN_CTRL2                              0x102
-#define    EE_AUDIO_SPDIFIN_CTRL3                              0x103
-#define    EE_AUDIO_SPDIFIN_CTRL4                              0x104
-#define    EE_AUDIO_SPDIFIN_CTRL5                              0x105
-#define    EE_AUDIO_SPDIFIN_CTRL6                              0x106
-#define    EE_AUDIO_SPDIFIN_STAT0                              0x107
-#define    EE_AUDIO_SPDIFIN_STAT1                              0x108
-#define    EE_AUDIO_SPDIFIN_STAT2                              0x109
-#define    EE_AUDIO_SPDIFIN_MUTE_VAL                           0x10a
-#define    EE_AUDIO_RESAMPLE_CTRL0                             0x110
-#define    EE_AUDIO_RESAMPLE_CTRL1                             0x111
-#define    EE_AUDIO_RESAMPLE_CTRL2                             0x112
-#define    EE_AUDIO_RESAMPLE_CTRL3                             0x113
-#define    EE_AUDIO_RESAMPLE_COEF0                             0x114
-#define    EE_AUDIO_RESAMPLE_COEF1                             0x115
-#define    EE_AUDIO_RESAMPLE_COEF2                             0x116
-#define    EE_AUDIO_RESAMPLE_COEF3                             0x117
-#define    EE_AUDIO_RESAMPLE_COEF4                             0x118
-#define    EE_AUDIO_RESAMPLE_STATUS1                           0x119
-#define    EE_AUDIO_SPDIFOUT_STAT                              0x120
-#define    EE_AUDIO_SPDIFOUT_GAIN0                             0x121
-#define    EE_AUDIO_SPDIFOUT_GAIN1                             0x122
-#define    EE_AUDIO_SPDIFOUT_CTRL0                             0x123
-#define    EE_AUDIO_SPDIFOUT_CTRL1                             0x124
-#define    EE_AUDIO_SPDIFOUT_PREAMB                            0x125
-#define    EE_AUDIO_SPDIFOUT_SWAP                              0x126
-#define    EE_AUDIO_SPDIFOUT_CHSTS0                            0x127
-#define    EE_AUDIO_SPDIFOUT_CHSTS1                            0x128
-#define    EE_AUDIO_SPDIFOUT_CHSTS2                            0x129
-#define    EE_AUDIO_SPDIFOUT_CHSTS3                            0x12a
-#define    EE_AUDIO_SPDIFOUT_CHSTS4                            0x12b
-#define    EE_AUDIO_SPDIFOUT_CHSTS5                            0x12c
-#define    EE_AUDIO_SPDIFOUT_CHSTS6                            0x12d
-#define    EE_AUDIO_SPDIFOUT_CHSTS7                            0x12e
-#define    EE_AUDIO_SPDIFOUT_CHSTS8                            0x12f
-#define    EE_AUDIO_SPDIFOUT_CHSTS9                            0x130
-#define    EE_AUDIO_SPDIFOUT_CHSTSA                            0x131
-#define    EE_AUDIO_SPDIFOUT_CHSTSB                            0x132
-#define    EE_AUDIO_SPDIFOUT_MUTE_VAL                          0x133
-#define    EE_AUDIO_TDMOUT_A_CTRL0                             0x140
-#define    EE_AUDIO_TDMOUT_A_CTRL1                             0x141
-#define    EE_AUDIO_TDMOUT_A_SWAP                              0x142
-#define    EE_AUDIO_TDMOUT_A_MASK0                             0x143
-#define    EE_AUDIO_TDMOUT_A_MASK1                             0x144
-#define    EE_AUDIO_TDMOUT_A_MASK2                             0x145
-#define    EE_AUDIO_TDMOUT_A_MASK3                             0x146
-#define    EE_AUDIO_TDMOUT_A_STAT                              0x147
-#define    EE_AUDIO_TDMOUT_A_GAIN0                             0x148
-#define    EE_AUDIO_TDMOUT_A_GAIN1                             0x149
-#define    EE_AUDIO_TDMOUT_A_MUTE_VAL                          0x14a
-#define    EE_AUDIO_TDMOUT_A_MUTE0                             0x14b
-#define    EE_AUDIO_TDMOUT_A_MUTE1                             0x14c
-#define    EE_AUDIO_TDMOUT_A_MUTE2                             0x14d
-#define    EE_AUDIO_TDMOUT_A_MUTE3                             0x14e
-#define    EE_AUDIO_TDMOUT_A_MASK_VAL                          0x14f
-#define    EE_AUDIO_TDMOUT_B_CTRL0                             0x150
-#define    EE_AUDIO_TDMOUT_B_CTRL1                             0x151
-#define    EE_AUDIO_TDMOUT_B_SWAP                              0x152
-#define    EE_AUDIO_TDMOUT_B_MASK0                             0x153
-#define    EE_AUDIO_TDMOUT_B_MASK1                             0x154
-#define    EE_AUDIO_TDMOUT_B_MASK2                             0x155
-#define    EE_AUDIO_TDMOUT_B_MASK3                             0x156
-#define    EE_AUDIO_TDMOUT_B_STAT                              0x157
-#define    EE_AUDIO_TDMOUT_B_GAIN0                             0x158
-#define    EE_AUDIO_TDMOUT_B_GAIN1                             0x159
-#define    EE_AUDIO_TDMOUT_B_MUTE_VAL                          0x15a
-#define    EE_AUDIO_TDMOUT_B_MUTE0                             0x15b
-#define    EE_AUDIO_TDMOUT_B_MUTE1                             0x15c
-#define    EE_AUDIO_TDMOUT_B_MUTE2                             0x15d
-#define    EE_AUDIO_TDMOUT_B_MUTE3                             0x15e
-#define    EE_AUDIO_TDMOUT_B_MASK_VAL                          0x15f
-#define    EE_AUDIO_TDMOUT_C_CTRL0                             0x160
-#define    EE_AUDIO_TDMOUT_C_CTRL1                             0x161
-#define    EE_AUDIO_TDMOUT_C_SWAP                              0x162
-#define    EE_AUDIO_TDMOUT_C_MASK0                             0x163
-#define    EE_AUDIO_TDMOUT_C_MASK1                             0x164
-#define    EE_AUDIO_TDMOUT_C_MASK2                             0x165
-#define    EE_AUDIO_TDMOUT_C_MASK3                             0x166
-#define    EE_AUDIO_TDMOUT_C_STAT                              0x167
-#define    EE_AUDIO_TDMOUT_C_GAIN0                             0x168
-#define    EE_AUDIO_TDMOUT_C_GAIN1                             0x169
-#define    EE_AUDIO_TDMOUT_C_MUTE_VAL                          0x16a
-#define    EE_AUDIO_TDMOUT_C_MUTE0                             0x16b
-#define    EE_AUDIO_TDMOUT_C_MUTE1                             0x16c
-#define    EE_AUDIO_TDMOUT_C_MUTE2                             0x16d
-#define    EE_AUDIO_TDMOUT_C_MUTE3                             0x16e
-#define    EE_AUDIO_TDMOUT_C_MASK_VAL                          0x16f
-#define    EE_AUDIO_POW_DET_CTRL0                              0x180
-#define    EE_AUDIO_POW_DET_TH_HI                              0x181
-#define    EE_AUDIO_POW_DET_TH_LO                              0x182
-#define    EE_AUDIO_POW_DET_VALUE                              0x183
-#define    EE_AUDIO_SECURITY_CTRL                              0x193
-
-/**
- *     AUDIO LOCKER - Registers
- *
- *     BASE_ADR                                                 32'hFF64A000
- */
-#define    AUD_LOCK_EN                                         0x000
-#define    AUD_LOCK_SW_RESET                                   0x001
-#define    AUD_LOCK_SW_LATCH                                   0x002
-#define    AUD_LOCK_HW_LATCH                                   0x003
-#define    AUD_LOCK_REFCLK_SRC                                 0x004
-#define    AUD_LOCK_REFCLK_LAT_INT                             0x005
-#define    AUD_LOCK_IMCLK_LAT_INT                              0x006
-#define    AUD_LOCK_OMCLK_LAT_INT                              0x007
-#define    AUD_LOCK_REFCLK_DS_INT                              0x008
-#define    AUD_LOCK_IMCLK_DS_INT                               0x009
-#define    AUD_LOCK_OMCLK_DS_INT                               0x00a
-#define    AUD_LOCK_INT_CLR                                    0x00b
-#define    AUD_LOCK_GCLK_CTRL                                  0x00c
-#define    AUD_LOCK_INT_CTRL                                   0x00d
-#define    RO_REF2IMCLK_CNT_L                                  0x010
-#define    RO_REF2IMCLK_CNT_H                                  0x011
-#define    RO_REF2OMCLK_CNT_L                                  0x012
-#define    RO_REF2OMCLK_CNT_H                                  0x013
-#define    RO_IMCLK2REF_CNT_L                                  0x014
-#define    RO_IMCLK2REF_CNT_H                                  0x015
-#define    RO_OMCLK2REF_CNT_L                                  0x016
-#define    RO_OMCLK2REF_CNT_H                                  0x017
-#define    RO_REFCLK_PKG_CNT                                   0x018
-#define    RO_IMCLK_PKG_CNT                                    0x019
-#define    RO_OMCLK_PKG_CNT                                    0x01a
-#define    RO_AUD_LOCK_INT_STATUS                              0x01b
-
-/**
- * G12A chipset, base axg chipset, new registers
- */
-
-/* pdm mute value, mute channel ctrl in PDM_CTRL */
-#define    PDM_MUTE_VALUE                                      0x00d
-
-/* clk pad */
-#define    EE_AUDIO_MST_PAD_CTRL0                              0x007
-#define    EE_AUDIO_MST_PAD_CTRL1                              0x008
-#define    EE_AUDIO_SW_RESET                                   0x009
-/* spdifout_b clk*/
-#define    EE_AUDIO_CLK_SPDIFOUT_B_CTRL                        0x02d
-
-/* toddr, frddr int address */
-#define    EE_AUDIO_TODDR_A_INIT_ADDR                          0x049
-#define    EE_AUDIO_TODDR_B_INIT_ADDR                          0x059
-#define    EE_AUDIO_TODDR_C_INIT_ADDR                          0x069
-#define    EE_AUDIO_FRDDR_A_INIT_ADDR                          0x079
-#define    EE_AUDIO_FRDDR_B_INIT_ADDR                          0x089
-#define    EE_AUDIO_FRDDR_C_INIT_ADDR                          0x099
-/* spdif_b registers */
-#define    EE_AUDIO_SPDIFOUT_B_STAT                            0x1a0
-#define    EE_AUDIO_SPDIFOUT_B_GAIN0                           0x1a1
-#define    EE_AUDIO_SPDIFOUT_B_GAIN1                           0x1a2
-#define    EE_AUDIO_SPDIFOUT_B_CTRL0                           0x1a3
-#define    EE_AUDIO_SPDIFOUT_B_CTRL1                           0x1a4
-#define    EE_AUDIO_SPDIFOUT_B_PREAMB                          0x1a5
-#define    EE_AUDIO_SPDIFOUT_B_SWAP                            0x1a6
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS0                          0x1a7
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS1                          0x1a8
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS2                          0x1a9
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS3                          0x1aa
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS4                          0x1ab
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS5                          0x1ac
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS6                          0x1ad
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS7                          0x1ae
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS8                          0x1af
-#define    EE_AUDIO_SPDIFOUT_B_CHSTS9                          0x1b0
-#define    EE_AUDIO_SPDIFOUT_B_CHSTSA                          0x1b1
-#define    EE_AUDIO_SPDIFOUT_B_CHSTSB                          0x1b2
-#define    EE_AUDIO_SPDIFOUT_B_MUTE_VAL                        0x1b3
-
-/* data id */
-#define    EE_AUDIO_DAT_ID0                                    0x0b2
-#define    EE_AUDIO_DAT_ID1                                    0x0b3
-/* lb id */
-#define    EE_AUDIO_LB_ID0                                     0x0b4
-#define    EE_AUDIO_LB_ID1                                     0x0b5
-#define    EE_AUDIO_LB_STS                                     0x0b6
-
-/* TORAM Registers */
-#define    EE_AUDIO_TORAM_CTRL0                                0x1c0
-#define    EE_AUDIO_TORAM_CTRL1                                0x1c1
-#define    EE_AUDIO_TORAM_START_ADDR                           0x1c2
-#define    EE_AUDIO_TORAM_FINISH_ADDR                          0x1c3
-#define    EE_AUDIO_TORAM_INT_ADDR                             0x1c4
-#define    EE_AUDIO_TORAM_STATUS1                              0x1c5
-#define    EE_AUDIO_TORAM_STATUS2                              0x1c6
-#define    EE_AUDIO_TORAM_INIT_ADDR                            0x1c7
-/* TOACODEC Registers */
-#define    EE_AUDIO_TOACODEC_CTRL0                             0x1d0
-/* TOHDMITX Registers */
-#define    EE_AUDIO_TOHDMITX_CTRL0                             0x1d1
-
-/* acodec reset */
-#define    EE_RESET1                                           0x002
-
-/* EQ DRC
- * check BASE_ADR according to chipset
- */
-#define    AED_EQ_CH1_COEF00                                   0x00
-#define    AED_EQ_CH1_COEF01                                   0x01
-#define    AED_EQ_CH1_COEF02                                   0x02
-#define    AED_EQ_CH1_COEF03                                   0x03
-#define    AED_EQ_CH1_COEF04                                   0x04
-#define    AED_EQ_CH1_COEF10                                   0x05
-#define    AED_EQ_CH1_COEF11                                   0x06
-#define    AED_EQ_CH1_COEF12                                   0x07
-#define    AED_EQ_CH1_COEF13                                   0x08
-#define    AED_EQ_CH1_COEF14                                   0x09
-#define    AED_EQ_CH1_COEF20                                   0x0a
-#define    AED_EQ_CH1_COEF21                                   0x0b
-#define    AED_EQ_CH1_COEF22                                   0x0c
-#define    AED_EQ_CH1_COEF23                                   0x0d
-#define    AED_EQ_CH1_COEF24                                   0x0e
-#define    AED_EQ_CH1_COEF30                                   0x0f
-#define    AED_EQ_CH1_COEF31                                   0x10
-#define    AED_EQ_CH1_COEF32                                   0x11
-#define    AED_EQ_CH1_COEF33                                   0x12
-#define    AED_EQ_CH1_COEF34                                   0x13
-#define    AED_EQ_CH1_COEF40                                   0x14
-#define    AED_EQ_CH1_COEF41                                   0x15
-#define    AED_EQ_CH1_COEF42                                   0x16
-#define    AED_EQ_CH1_COEF43                                   0x17
-#define    AED_EQ_CH1_COEF44                                   0x18
-#define    AED_EQ_CH1_COEF50                                   0x19
-#define    AED_EQ_CH1_COEF51                                   0x1a
-#define    AED_EQ_CH1_COEF52                                   0x1b
-#define    AED_EQ_CH1_COEF53                                   0x1c
-#define    AED_EQ_CH1_COEF54                                   0x1d
-#define    AED_EQ_CH1_COEF60                                   0x1e
-#define    AED_EQ_CH1_COEF61                                   0x1f
-#define    AED_EQ_CH1_COEF62                                   0x20
-#define    AED_EQ_CH1_COEF63                                   0x21
-#define    AED_EQ_CH1_COEF64                                   0x22
-#define    AED_EQ_CH1_COEF70                                   0x23
-#define    AED_EQ_CH1_COEF71                                   0x24
-#define    AED_EQ_CH1_COEF72                                   0x25
-#define    AED_EQ_CH1_COEF73                                   0x26
-#define    AED_EQ_CH1_COEF74                                   0x27
-#define    AED_EQ_CH1_COEF80                                   0x28
-#define    AED_EQ_CH1_COEF81                                   0x29
-#define    AED_EQ_CH1_COEF82                                   0x2a
-#define    AED_EQ_CH1_COEF83                                   0x2b
-#define    AED_EQ_CH1_COEF84                                   0x2c
-#define    AED_EQ_CH1_COEF90                                   0x2d
-#define    AED_EQ_CH1_COEF91                                   0x2e
-#define    AED_EQ_CH1_COEF92                                   0x2f
-#define    AED_EQ_CH1_COEF93                                   0x30
-#define    AED_EQ_CH1_COEF94                                   0x31
-#define    AED_EQ_CH2_COEF00                                   0x32
-#define    AED_EQ_CH2_COEF01                                   0x33
-#define    AED_EQ_CH2_COEF02                                   0x34
-#define    AED_EQ_CH2_COEF03                                   0x35
-#define    AED_EQ_CH2_COEF04                                   0x36
-#define    AED_EQ_CH2_COEF10                                   0x37
-#define    AED_EQ_CH2_COEF11                                   0x38
-#define    AED_EQ_CH2_COEF12                                   0x39
-#define    AED_EQ_CH2_COEF13                                   0x3a
-#define    AED_EQ_CH2_COEF14                                   0x3b
-#define    AED_EQ_CH2_COEF20                                   0x3c
-#define    AED_EQ_CH2_COEF21                                   0x3d
-#define    AED_EQ_CH2_COEF22                                   0x3e
-#define    AED_EQ_CH2_COEF23                                   0x3f
-#define    AED_EQ_CH2_COEF24                                   0x40
-#define    AED_EQ_CH2_COEF30                                   0x41
-#define    AED_EQ_CH2_COEF31                                   0x42
-#define    AED_EQ_CH2_COEF32                                   0x43
-#define    AED_EQ_CH2_COEF33                                   0x44
-#define    AED_EQ_CH2_COEF34                                   0x45
-#define    AED_EQ_CH2_COEF40                                   0x46
-#define    AED_EQ_CH2_COEF41                                   0x47
-#define    AED_EQ_CH2_COEF42                                   0x48
-#define    AED_EQ_CH2_COEF43                                   0x49
-#define    AED_EQ_CH2_COEF44                                   0x4a
-#define    AED_EQ_CH2_COEF50                                   0x4b
-#define    AED_EQ_CH2_COEF51                                   0x4c
-#define    AED_EQ_CH2_COEF52                                   0x4d
-#define    AED_EQ_CH2_COEF53                                   0x4e
-#define    AED_EQ_CH2_COEF54                                   0x4f
-#define    AED_EQ_CH2_COEF60                                   0x50
-#define    AED_EQ_CH2_COEF61                                   0x51
-#define    AED_EQ_CH2_COEF62                                   0x52
-#define    AED_EQ_CH2_COEF63                                   0x53
-#define    AED_EQ_CH2_COEF64                                   0x54
-#define    AED_EQ_CH2_COEF70                                   0x55
-#define    AED_EQ_CH2_COEF71                                   0x56
-#define    AED_EQ_CH2_COEF72                                   0x57
-#define    AED_EQ_CH2_COEF73                                   0x58
-#define    AED_EQ_CH2_COEF74                                   0x59
-#define    AED_EQ_CH2_COEF80                                   0x5a
-#define    AED_EQ_CH2_COEF81                                   0x5b
-#define    AED_EQ_CH2_COEF82                                   0x5c
-#define    AED_EQ_CH2_COEF83                                   0x5d
-#define    AED_EQ_CH2_COEF84                                   0x5e
-#define    AED_EQ_CH2_COEF90                                   0x5f
-#define    AED_EQ_CH2_COEF91                                   0x60
-#define    AED_EQ_CH2_COEF92                                   0x61
-#define    AED_EQ_CH2_COEF93                                   0x62
-#define    AED_EQ_CH2_COEF94                                   0x63
-#define    AED_EQ_EN                                           0x64
-#define    AED_EQ_VOLUME                                       0x65
-#define    AED_EQ_VOLUME_SLEW_CNT                              0x66
-#define    AED_MUTE                                            0x67
-#define    AED_DRC_EN                                          0x68
-#define    AED_DRC_AE                                          0x69
-#define    AED_DRC_AA                                          0x6a
-#define    AED_DRC_AD                                          0x6b
-#define    AED_DRC_AE_1M                                       0x6c
-#define    AED_DRC_AA_1M                                       0x6d
-#define    AED_DRC_AD_1M                                       0x6e
-#define    AED_DRC_OFFSET0                                     0x6f
-#define    AED_DRC_OFFSET1                                     0x70
-#define    AED_DRC_THD0                                        0x71
-#define    AED_DRC_THD1                                        0x72
-#define    AED_DRC_K0                                          0x73
-#define    AED_DRC_K1                                          0x74
-#define    AED_CLIP_THD                                        0x75
-#define    AED_NG_THD0                                         0x76
-#define    AED_NG_THD1                                         0x77
-#define    AED_NG_CNT_THD                                      0x78
-#define    AED_NG_CTL                                          0x79
-#define    AED_ED_CTL                                          0x7a
-#define    AED_DEBUG0                                          0x7b
-#define    AED_DEBUG1                                          0x7c
-#define    AED_DEBUG2                                          0x7d
-#define    AED_DEBUG3                                          0x7e
-#define    AED_DEBUG4                                          0x7f
-#define    AED_DEBUG5                                          0x80
-#define    AED_DEBUG6                                          0x81
-#define    AED_DRC_AA_H                                        0x82
-#define    AED_DRC_AD_H                                        0x83
-#define    AED_DRC_AA_1M_H                                     0x84
-#define    AED_DRC_AD_1M_H                                     0x85
-#define    AED_NG_CNT                                          0x86
-#define    AED_NG_STEP                                         0x87
-#define    AED_TOP_CTL                                         0x88
-#define    AED_TOP_REQ_CTL                                     0x89
-
-
-#define    AUD_ADDR_OFFSET(addr)                              ((addr) << 2)
-
 enum clk_sel {
        MASTER_A,
        MASTER_B,
@@ -546,4 +37,804 @@ enum clk_sel {
        SLAVE_J
 };
 
+#define AUD_ADDR_OFFSET(addr)              ((addr) << 2)
+
+/*
+ *  PDM - Registers
+ */
+#define PDM_CTRL                           0x00
+#define PDM_HCIC_CTRL1                     0x01
+#define PDM_HCIC_CTRL2                     0x02
+#define PDM_F1_CTRL                        0x03
+#define PDM_F2_CTRL                        0x04
+#define PDM_F3_CTRL                        0x05
+#define PDM_HPF_CTRL                       0x06
+#define PDM_CHAN_CTRL                      0x07
+#define PDM_CHAN_CTRL1                     0x08
+#define PDM_COEFF_ADDR                     0x09
+#define PDM_COEFF_DATA                     0x0A
+#define PDM_CLKG_CTRL                      0x0B
+#define PDM_STS                            0x0C
+#define PDM_MUTE_VALUE                     0x0D
+#define PDM_MASK_NUM                       0x0E
+
+/*
+ *     AUDIO CLOCK, MST PAD,
+ */
+#define EE_AUDIO_CLK_GATE_EN0              0x000
+#define EE_AUDIO_CLK_GATE_EN1              0x001
+#define EE_AUDIO_MCLK_A_CTRL(offset)       (0x001 + offset)
+#define EE_AUDIO_MCLK_B_CTRL(offset)       (0x002 + offset)
+#define EE_AUDIO_MCLK_C_CTRL(offset)       (0x003 + offset)
+#define EE_AUDIO_MCLK_D_CTRL(offset)       (0x004 + offset)
+#define EE_AUDIO_MCLK_E_CTRL(offset)       (0x005 + offset)
+#define EE_AUDIO_MCLK_F_CTRL(offset)       (0x006 + offset)
+#define EE_AUDIO_MST_PAD_CTRL0(offset)     (0x007 + offset)
+#define EE_AUDIO_MST_PAD_CTRL1(offset)     (0x008 + offset)
+#define EE_AUDIO_SW_RESET0(offset)         (0x009 + offset)
+#define EE_AUDIO_SW_RESET1                 0x00b
+#define EE_AUDIO_CLK81_CTRL                0x00c
+#define EE_AUDIO_CLK81_EN                  0x00d
+
+
+#define EE_AUDIO_MST_A_SCLK_CTRL0          0x010
+#define EE_AUDIO_MST_A_SCLK_CTRL1          0x011
+#define EE_AUDIO_MST_B_SCLK_CTRL0          0x012
+#define EE_AUDIO_MST_B_SCLK_CTRL1          0x013
+#define EE_AUDIO_MST_C_SCLK_CTRL0          0x014
+#define EE_AUDIO_MST_C_SCLK_CTRL1          0x015
+#define EE_AUDIO_MST_D_SCLK_CTRL0          0x016
+#define EE_AUDIO_MST_D_SCLK_CTRL1          0x017
+#define EE_AUDIO_MST_E_SCLK_CTRL0          0x018
+#define EE_AUDIO_MST_E_SCLK_CTRL1          0x019
+#define EE_AUDIO_MST_F_SCLK_CTRL0          0x01a
+#define EE_AUDIO_MST_F_SCLK_CTRL1          0x01b
+
+#define EE_AUDIO_CLK_TDMIN_A_CTRL          0x020
+#define EE_AUDIO_CLK_TDMIN_B_CTRL          0x021
+#define EE_AUDIO_CLK_TDMIN_C_CTRL          0x022
+#define EE_AUDIO_CLK_TDMIN_LB_CTRL         0x023
+#define EE_AUDIO_CLK_TDMOUT_A_CTRL         0x024
+#define EE_AUDIO_CLK_TDMOUT_B_CTRL         0x025
+#define EE_AUDIO_CLK_TDMOUT_C_CTRL         0x026
+#define EE_AUDIO_CLK_SPDIFIN_CTRL          0x027
+#define EE_AUDIO_CLK_SPDIFOUT_CTRL         0x028
+#define EE_AUDIO_CLK_RESAMPLEA_CTRL        0x029
+#define EE_AUDIO_CLK_LOCKER_CTRL           0x02a
+#define EE_AUDIO_CLK_PDMIN_CTRL0           0x02b
+#define EE_AUDIO_CLK_PDMIN_CTRL1           0x02c
+#define EE_AUDIO_CLK_SPDIFOUT_B_CTRL       0x02d
+#define EE_AUDIO_CLK_RESAMPLEB_CTRL        0x02e
+#define EE_AUDIO_CLK_SPDIFIN_LB_CTRL       0x02f
+#define EE_AUDIO_CLK_EQDRC_CTRL0           0x030
+#define EE_AUDIO_VAD_CLK_CTRL              0x031
+
+/*
+ *     AUDIO TODDR
+ */
+#define EE_AUDIO_TODDR_A_CTRL0             0x040
+#define EE_AUDIO_TODDR_A_CTRL1             0x041
+#define EE_AUDIO_TODDR_A_START_ADDR        0x042
+#define EE_AUDIO_TODDR_A_FINISH_ADDR       0x043
+#define EE_AUDIO_TODDR_A_INT_ADDR          0x044
+#define EE_AUDIO_TODDR_A_STATUS1           0x045
+#define EE_AUDIO_TODDR_A_STATUS2           0x046
+#define EE_AUDIO_TODDR_A_START_ADDRB       0x047
+#define EE_AUDIO_TODDR_A_FINISH_ADDRB      0x048
+#define EE_AUDIO_TODDR_A_INIT_ADDR         0x049
+#define EE_AUDIO_TODDR_A_CTRL2             0x04a
+
+#define EE_AUDIO_TODDR_B_CTRL0             0x050
+#define EE_AUDIO_TODDR_B_CTRL1             0x051
+#define EE_AUDIO_TODDR_B_START_ADDR        0x052
+#define EE_AUDIO_TODDR_B_FINISH_ADDR       0x053
+#define EE_AUDIO_TODDR_B_INT_ADDR          0x054
+#define EE_AUDIO_TODDR_B_STATUS1           0x055
+#define EE_AUDIO_TODDR_B_STATUS2           0x056
+#define EE_AUDIO_TODDR_B_START_ADDRB       0x057
+#define EE_AUDIO_TODDR_B_FINISH_ADDRB      0x058
+#define EE_AUDIO_TODDR_B_INIT_ADDR         0x059
+#define EE_AUDIO_TODDR_B_CTRL2             0x05a
+
+#define EE_AUDIO_TODDR_C_CTRL0             0x060
+#define EE_AUDIO_TODDR_C_CTRL1             0x061
+#define EE_AUDIO_TODDR_C_START_ADDR        0x062
+#define EE_AUDIO_TODDR_C_FINISH_ADDR       0x063
+#define EE_AUDIO_TODDR_C_INT_ADDR          0x064
+#define EE_AUDIO_TODDR_C_STATUS1           0x065
+#define EE_AUDIO_TODDR_C_STATUS2           0x066
+#define EE_AUDIO_TODDR_C_START_ADDRB       0x067
+#define EE_AUDIO_TODDR_C_FINISH_ADDRB      0x068
+#define EE_AUDIO_TODDR_C_INIT_ADDR         0x069
+#define EE_AUDIO_TODDR_C_CTRL2             0x06a
+
+/*
+ *     AUDIO FRDDR
+ */
+#define EE_AUDIO_FRDDR_A_CTRL0             0x070
+#define EE_AUDIO_FRDDR_A_CTRL1             0x071
+#define EE_AUDIO_FRDDR_A_START_ADDR        0x072
+#define EE_AUDIO_FRDDR_A_FINISH_ADDR       0x073
+#define EE_AUDIO_FRDDR_A_INT_ADDR          0x074
+#define EE_AUDIO_FRDDR_A_STATUS1           0x075
+#define EE_AUDIO_FRDDR_A_STATUS2           0x076
+#define EE_AUDIO_FRDDR_A_START_ADDRB       0x077
+#define EE_AUDIO_FRDDR_A_FINISH_ADDRB      0x078
+#define EE_AUDIO_FRDDR_A_INIT_ADDR         0x079
+#define EE_AUDIO_FRDDR_A_CTRL2             0x07a
+
+#define EE_AUDIO_FRDDR_B_CTRL0             0x080
+#define EE_AUDIO_FRDDR_B_CTRL1             0x081
+#define EE_AUDIO_FRDDR_B_START_ADDR        0x082
+#define EE_AUDIO_FRDDR_B_FINISH_ADDR       0x083
+#define EE_AUDIO_FRDDR_B_INT_ADDR          0x084
+#define EE_AUDIO_FRDDR_B_STATUS1           0x085
+#define EE_AUDIO_FRDDR_B_STATUS2           0x086
+#define EE_AUDIO_FRDDR_B_START_ADDRB       0x087
+#define EE_AUDIO_FRDDR_B_FINISH_ADDRB      0x088
+#define EE_AUDIO_FRDDR_B_INIT_ADDR         0x089
+#define EE_AUDIO_FRDDR_B_CTRL2             0x08a
+
+#define EE_AUDIO_FRDDR_C_CTRL0             0x090
+#define EE_AUDIO_FRDDR_C_CTRL1             0x091
+#define EE_AUDIO_FRDDR_C_START_ADDR        0x092
+#define EE_AUDIO_FRDDR_C_FINISH_ADDR       0x093
+#define EE_AUDIO_FRDDR_C_INT_ADDR          0x094
+#define EE_AUDIO_FRDDR_C_STATUS1           0x095
+#define EE_AUDIO_FRDDR_C_STATUS2           0x096
+#define EE_AUDIO_FRDDR_C_START_ADDRB       0x097
+#define EE_AUDIO_FRDDR_C_FINISH_ADDRB      0x098
+#define EE_AUDIO_FRDDR_C_INIT_ADDR         0x099
+#define EE_AUDIO_FRDDR_C_CTRL2             0x09a
+
+/*
+ *     AUDIO ARB,
+ */
+#define EE_AUDIO_ARB_CTRL                  0x0a0
+
+/*
+ *     AUDIO TDM
+ */
+#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_TDMIN_A_CTRL              0x0c0
+#define EE_AUDIO_TDMIN_A_SWAP              0x0c1
+#define EE_AUDIO_TDMIN_A_MASK0             0x0c2
+#define EE_AUDIO_TDMIN_A_MASK1             0x0c3
+#define EE_AUDIO_TDMIN_A_MASK2             0x0c4
+#define EE_AUDIO_TDMIN_A_MASK3             0x0c5
+#define EE_AUDIO_TDMIN_A_STAT              0x0c6
+#define EE_AUDIO_TDMIN_A_MUTE_VAL          0x0c7
+#define EE_AUDIO_TDMIN_A_MUTE0             0x0c8
+#define EE_AUDIO_TDMIN_A_MUTE1             0x0c9
+#define EE_AUDIO_TDMIN_A_MUTE2             0x0ca
+#define EE_AUDIO_TDMIN_A_MUTE3             0x0cb
+
+#define EE_AUDIO_TDMIN_B_CTRL              0x0d0
+#define EE_AUDIO_TDMIN_B_SWAP              0x0d1
+#define EE_AUDIO_TDMIN_B_MASK0             0x0d2
+#define EE_AUDIO_TDMIN_B_MASK1             0x0d3
+#define EE_AUDIO_TDMIN_B_MASK2             0x0d4
+#define EE_AUDIO_TDMIN_B_MASK3             0x0d5
+#define EE_AUDIO_TDMIN_B_STAT              0x0d6
+#define EE_AUDIO_TDMIN_B_MUTE_VAL          0x0d7
+#define EE_AUDIO_TDMIN_B_MUTE0             0x0d8
+#define EE_AUDIO_TDMIN_B_MUTE1             0x0d9
+#define EE_AUDIO_TDMIN_B_MUTE2             0x0da
+#define EE_AUDIO_TDMIN_B_MUTE3             0x0db
+
+#define EE_AUDIO_TDMIN_C_CTRL              0x0e0
+#define EE_AUDIO_TDMIN_C_SWAP              0x0e1
+#define EE_AUDIO_TDMIN_C_MASK0             0x0e2
+#define EE_AUDIO_TDMIN_C_MASK1             0x0e3
+#define EE_AUDIO_TDMIN_C_MASK2             0x0e4
+#define EE_AUDIO_TDMIN_C_MASK3             0x0e5
+#define EE_AUDIO_TDMIN_C_STAT              0x0e6
+#define EE_AUDIO_TDMIN_C_MUTE_VAL          0x0e7
+#define EE_AUDIO_TDMIN_C_MUTE0             0x0e8
+#define EE_AUDIO_TDMIN_C_MUTE1             0x0e9
+#define EE_AUDIO_TDMIN_C_MUTE2             0x0ea
+#define EE_AUDIO_TDMIN_C_MUTE3             0x0eb
+
+#define EE_AUDIO_TDMIN_LB_CTRL             0x0f0
+#define EE_AUDIO_TDMIN_LB_SWAP             0x0f1
+#define EE_AUDIO_TDMIN_LB_MASK0            0x0f2
+#define EE_AUDIO_TDMIN_LB_MASK1            0x0f3
+#define EE_AUDIO_TDMIN_LB_MASK2            0x0f4
+#define EE_AUDIO_TDMIN_LB_MASK3            0x0f5
+#define EE_AUDIO_TDMIN_LB_STAT             0x0f6
+#define EE_AUDIO_TDMIN_LB_MUTE_VAL         0x0f7
+#define EE_AUDIO_TDMIN_LB_MUTE0            0x0f8
+#define EE_AUDIO_TDMIN_LB_MUTE1            0x0f9
+#define EE_AUDIO_TDMIN_LB_MUTE2            0x0fa
+#define EE_AUDIO_TDMIN_LB_MUTE3            0x0fb
+
+/*
+ *     AUDIO OUTPUT
+ */
+#define EE_AUDIO_SPDIFIN_CTRL0             0x100
+#define EE_AUDIO_SPDIFIN_CTRL1             0x101
+#define EE_AUDIO_SPDIFIN_CTRL2             0x102
+#define EE_AUDIO_SPDIFIN_CTRL3             0x103
+#define EE_AUDIO_SPDIFIN_CTRL4             0x104
+#define EE_AUDIO_SPDIFIN_CTRL5             0x105
+#define EE_AUDIO_SPDIFIN_CTRL6             0x106
+#define EE_AUDIO_SPDIFIN_STAT0             0x107
+#define EE_AUDIO_SPDIFIN_STAT1             0x108
+#define EE_AUDIO_SPDIFIN_STAT2             0x109
+#define EE_AUDIO_SPDIFIN_MUTE_VAL          0x10a
+
+#define EE_AUDIO_RESAMPLE_CTRL0            0x110
+#define EE_AUDIO_RESAMPLE_CTRL1            0x111
+#define EE_AUDIO_RESAMPLE_CTRL2            0x112
+#define EE_AUDIO_RESAMPLE_CTRL3            0x113
+#define EE_AUDIO_RESAMPLE_COEF0            0x114
+#define EE_AUDIO_RESAMPLE_COEF1            0x115
+#define EE_AUDIO_RESAMPLE_COEF2            0x116
+#define EE_AUDIO_RESAMPLE_COEF3            0x117
+#define EE_AUDIO_RESAMPLE_COEF4            0x118
+#define EE_AUDIO_RESAMPLE_STATUS1          0x119
+
+#define EE_AUDIO_SPDIFOUT_STAT             0x120
+#define EE_AUDIO_SPDIFOUT_GAIN0            0x121
+#define EE_AUDIO_SPDIFOUT_GAIN1            0x122
+#define EE_AUDIO_SPDIFOUT_CTRL0            0x123
+#define EE_AUDIO_SPDIFOUT_CTRL1            0x124
+#define EE_AUDIO_SPDIFOUT_PREAMB           0x125
+#define EE_AUDIO_SPDIFOUT_SWAP             0x126
+#define EE_AUDIO_SPDIFOUT_CHSTS0           0x127
+#define EE_AUDIO_SPDIFOUT_CHSTS1           0x128
+#define EE_AUDIO_SPDIFOUT_CHSTS2           0x129
+#define EE_AUDIO_SPDIFOUT_CHSTS3           0x12a
+#define EE_AUDIO_SPDIFOUT_CHSTS4           0x12b
+#define EE_AUDIO_SPDIFOUT_CHSTS5           0x12c
+#define EE_AUDIO_SPDIFOUT_CHSTS6           0x12d
+#define EE_AUDIO_SPDIFOUT_CHSTS7           0x12e
+#define EE_AUDIO_SPDIFOUT_CHSTS8           0x12f
+#define EE_AUDIO_SPDIFOUT_CHSTS9           0x130
+#define EE_AUDIO_SPDIFOUT_CHSTSA           0x131
+#define EE_AUDIO_SPDIFOUT_CHSTSB           0x132
+#define EE_AUDIO_SPDIFOUT_MUTE_VAL         0x133
+
+#define EE_AUDIO_TDMOUT_A_CTRL0            0x140
+#define EE_AUDIO_TDMOUT_A_CTRL1            0x141
+#define EE_AUDIO_TDMOUT_A_SWAP             0x142
+#define EE_AUDIO_TDMOUT_A_MASK0            0x143
+#define EE_AUDIO_TDMOUT_A_MASK1            0x144
+#define EE_AUDIO_TDMOUT_A_MASK2            0x145
+#define EE_AUDIO_TDMOUT_A_MASK3            0x146
+#define EE_AUDIO_TDMOUT_A_STAT             0x147
+#define EE_AUDIO_TDMOUT_A_GAIN0            0x148
+#define EE_AUDIO_TDMOUT_A_GAIN1            0x149
+#define EE_AUDIO_TDMOUT_A_MUTE_VAL         0x14a
+#define EE_AUDIO_TDMOUT_A_MUTE0            0x14b
+#define EE_AUDIO_TDMOUT_A_MUTE1            0x14c
+#define EE_AUDIO_TDMOUT_A_MUTE2            0x14d
+#define EE_AUDIO_TDMOUT_A_MUTE3            0x14e
+#define EE_AUDIO_TDMOUT_A_MASK_VAL         0x14f
+
+#define EE_AUDIO_TDMOUT_B_CTRL0            0x150
+#define EE_AUDIO_TDMOUT_B_CTRL1            0x151
+#define EE_AUDIO_TDMOUT_B_SWAP             0x152
+#define EE_AUDIO_TDMOUT_B_MASK0            0x153
+#define EE_AUDIO_TDMOUT_B_MASK1            0x154
+#define EE_AUDIO_TDMOUT_B_MASK2            0x155
+#define EE_AUDIO_TDMOUT_B_MASK3            0x156
+#define EE_AUDIO_TDMOUT_B_STAT             0x157
+#define EE_AUDIO_TDMOUT_B_GAIN0            0x158
+#define EE_AUDIO_TDMOUT_B_GAIN1            0x159
+#define EE_AUDIO_TDMOUT_B_MUTE_VAL         0x15a
+#define EE_AUDIO_TDMOUT_B_MUTE0            0x15b
+#define EE_AUDIO_TDMOUT_B_MUTE1            0x15c
+#define EE_AUDIO_TDMOUT_B_MUTE2            0x15d
+#define EE_AUDIO_TDMOUT_B_MUTE3            0x15e
+#define EE_AUDIO_TDMOUT_B_MASK_VAL         0x15f
+
+#define EE_AUDIO_TDMOUT_C_CTRL0            0x160
+#define EE_AUDIO_TDMOUT_C_CTRL1            0x161
+#define EE_AUDIO_TDMOUT_C_SWAP             0x162
+#define EE_AUDIO_TDMOUT_C_MASK0            0x163
+#define EE_AUDIO_TDMOUT_C_MASK1            0x164
+#define EE_AUDIO_TDMOUT_C_MASK2            0x165
+#define EE_AUDIO_TDMOUT_C_MASK3            0x166
+#define EE_AUDIO_TDMOUT_C_STAT             0x167
+#define EE_AUDIO_TDMOUT_C_GAIN0            0x168
+#define EE_AUDIO_TDMOUT_C_GAIN1            0x169
+#define EE_AUDIO_TDMOUT_C_MUTE_VAL         0x16a
+#define EE_AUDIO_TDMOUT_C_MUTE0            0x16b
+#define EE_AUDIO_TDMOUT_C_MUTE1            0x16c
+#define EE_AUDIO_TDMOUT_C_MUTE2            0x16d
+#define EE_AUDIO_TDMOUT_C_MUTE3            0x16e
+#define EE_AUDIO_TDMOUT_C_MASK_VAL         0x16f
+
+/*
+ *     AUDIO POWER DETECT
+ */
+#define EE_AUDIO_POW_DET_CTRL0             0x180
+#define EE_AUDIO_POW_DET_TH_HI             0x181
+#define EE_AUDIO_POW_DET_TH_LO             0x182
+#define EE_AUDIO_POW_DET_VALUE             0x183
+#define EE_AUDIO_SECURITY_CTRL             0x193
+
+/*
+ *     AUDIO SPDIF_B
+ */
+#define EE_AUDIO_SPDIFOUT_B_STAT           0x1a0
+#define EE_AUDIO_SPDIFOUT_B_GAIN0          0x1a1
+#define EE_AUDIO_SPDIFOUT_B_GAIN1          0x1a2
+#define EE_AUDIO_SPDIFOUT_B_CTRL0          0x1a3
+#define EE_AUDIO_SPDIFOUT_B_CTRL1          0x1a4
+#define EE_AUDIO_SPDIFOUT_B_PREAMB         0x1a5
+#define EE_AUDIO_SPDIFOUT_B_SWAP           0x1a6
+#define EE_AUDIO_SPDIFOUT_B_CHSTS0         0x1a7
+#define EE_AUDIO_SPDIFOUT_B_CHSTS1         0x1a8
+#define EE_AUDIO_SPDIFOUT_B_CHSTS2         0x1a9
+#define EE_AUDIO_SPDIFOUT_B_CHSTS3         0x1aa
+#define EE_AUDIO_SPDIFOUT_B_CHSTS4         0x1ab
+#define EE_AUDIO_SPDIFOUT_B_CHSTS5         0x1ac
+#define EE_AUDIO_SPDIFOUT_B_CHSTS6         0x1ad
+#define EE_AUDIO_SPDIFOUT_B_CHSTS7         0x1ae
+#define EE_AUDIO_SPDIFOUT_B_CHSTS8         0x1af
+#define EE_AUDIO_SPDIFOUT_B_CHSTS9         0x1b0
+#define EE_AUDIO_SPDIFOUT_B_CHSTSA         0x1b1
+#define EE_AUDIO_SPDIFOUT_B_CHSTSB         0x1b2
+#define EE_AUDIO_SPDIFOUT_B_MUTE_VAL       0x1b3
+
+/*
+ *     AUDIO LOCKER
+ */
+#define EE_AUDIO_TORAM_CTRL0               0x1c0
+#define EE_AUDIO_TORAM_CTRL1               0x1c1
+#define EE_AUDIO_TORAM_START_ADDR          0x1c2
+#define EE_AUDIO_TORAM_FINISH_ADDR         0x1c3
+#define EE_AUDIO_TORAM_INT_ADDR            0x1c4
+#define EE_AUDIO_TORAM_STATUS1             0x1c5
+#define EE_AUDIO_TORAM_STATUS2             0x1c6
+#define EE_AUDIO_TORAM_INIT_ADDR           0x1c7
+
+/*
+ *     HIU, AUDIO CODEC RESET
+ */
+#define EE_RESET1                          0x002
+
+/*
+ *     AUDIO MUX CONTROLS
+ */
+#define EE_AUDIO_TOACODEC_CTRL0            0x1d0
+#define EE_AUDIO_TOHDMITX_CTRL0            0x1d1
+#define EE_AUDIO_TOVAD_CTRL0               0x1d2
+#define EE_AUDIO_FRATV_CTRL0               0x1d3
+
+#define EE_AUDIO_RESAMPLEB_CTRL0           0x1e0
+#define EE_AUDIO_RESAMPLEB_CTRL1           0x1e1
+#define EE_AUDIO_RESAMPLEB_CTRL2           0x1e2
+#define EE_AUDIO_RESAMPLEB_CTRL3           0x1e3
+#define EE_AUDIO_RESAMPLEB_COEF0           0x1e4
+#define EE_AUDIO_RESAMPLEB_COEF1           0x1e5
+#define EE_AUDIO_RESAMPLEB_COEF2           0x1e6
+#define EE_AUDIO_RESAMPLEB_COEF3           0x1e7
+#define EE_AUDIO_RESAMPLEB_COEF4           0x1e8
+#define EE_AUDIO_RESAMPLEB_STATUS1         0x1e9
+
+#define EE_AUDIO_SPDIFIN_LB_CTRL0          0x1f0
+#define EE_AUDIO_SPDIFIN_LB_CTRL1          0x1f1
+#define EE_AUDIO_SPDIFIN_LB_CTRL6          0x1f6
+#define EE_AUDIO_SPDIFIN_LB_STAT0          0x1f7
+#define EE_AUDIO_SPDIFIN_LB_STAT1          0x1f8
+#define EE_AUDIO_SPDIFIN_LB_MUTE_VAL       0x1fa
+
+#define EE_AUDIO_FRHDMIRX_CTRL0            0x200
+#define EE_AUDIO_FRHDMIRX_CTRL1            0x201
+#define EE_AUDIO_FRHDMIRX_CTRL2            0x202
+#define EE_AUDIO_FRHDMIRX_CTRL3            0x203
+#define EE_AUDIO_FRHDMIRX_CTRL4            0x204
+#define EE_AUDIO_FRHDMIRX_CTRL5            0x205
+#define EE_AUDIO_FRHDMIRX_STAT0            0x20a
+#define EE_AUDIO_FRHDMIRX_STAT1            0x20b
+
+#define EE_AUDIO_TODDR_D_CTRL0             0x210
+#define EE_AUDIO_TODDR_D_CTRL1             0x211
+#define EE_AUDIO_TODDR_D_START_ADDR        0x212
+#define EE_AUDIO_TODDR_D_FINISH_ADDR       0x213
+#define EE_AUDIO_TODDR_D_INT_ADDR          0x214
+#define EE_AUDIO_TODDR_D_STATUS1           0x215
+#define EE_AUDIO_TODDR_D_STATUS2           0x216
+#define EE_AUDIO_TODDR_D_START_ADDRB       0x217
+#define EE_AUDIO_TODDR_D_FINISH_ADDRB      0x218
+#define EE_AUDIO_TODDR_D_INIT_ADDR         0x219
+#define EE_AUDIO_TODDR_D_CTRL2             0x21a
+
+#define EE_AUDIO_FRDDR_D_CTRL0             0x220
+#define EE_AUDIO_FRDDR_D_CTRL1             0x221
+#define EE_AUDIO_FRDDR_D_START_ADDR        0x222
+#define EE_AUDIO_FRDDR_D_FINISH_ADDR       0x223
+#define EE_AUDIO_FRDDR_D_INT_ADDR          0x224
+#define EE_AUDIO_FRDDR_D_STATUS1           0x225
+#define EE_AUDIO_FRDDR_D_STATUS2           0x226
+#define EE_AUDIO_FRDDR_D_START_ADDRB       0x227
+#define EE_AUDIO_FRDDR_D_FINISH_ADDRB      0x228
+#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
+ */
+#define AUD_LOCK_EN                        0x000
+#define AUD_LOCK_SW_RESET                  0x001
+#define AUD_LOCK_SW_LATCH                  0x002
+#define AUD_LOCK_HW_LATCH                  0x003
+#define AUD_LOCK_REFCLK_SRC                0x004
+#define AUD_LOCK_REFCLK_LAT_INT            0x005
+#define AUD_LOCK_IMCLK_LAT_INT             0x006
+#define AUD_LOCK_OMCLK_LAT_INT             0x007
+#define AUD_LOCK_REFCLK_DS_INT             0x008
+#define AUD_LOCK_IMCLK_DS_INT              0x009
+#define AUD_LOCK_OMCLK_DS_INT              0x00a
+#define AUD_LOCK_INT_CLR                   0x00b
+#define AUD_LOCK_GCLK_CTRL                 0x00c
+#define AUD_LOCK_INT_CTRL                  0x00d
+#define RO_REF2IMCLK_CNT_L                 0x010
+#define RO_REF2IMCLK_CNT_H                 0x011
+#define RO_REF2OMCLK_CNT_L                 0x012
+#define RO_REF2OMCLK_CNT_H                 0x013
+#define RO_IMCLK2REF_CNT_L                 0x014
+#define RO_IMCLK2REF_CNT_H                 0x015
+#define RO_OMCLK2REF_CNT_L                 0x016
+#define RO_OMCLK2REF_CNT_H                 0x017
+#define RO_REFCLK_PKG_CNT                  0x018
+#define RO_IMCLK_PKG_CNT                   0x019
+#define RO_OMCLK_PKG_CNT                   0x01a
+#define RO_AUD_LOCK_INT_STATUS             0x01b
+
+/*
+ * EQ DRC, g12a, g12b
+ */
+#define AED_EQ_CH1_COEF00                  0x00
+#define AED_EQ_CH1_COEF01                  0x01
+#define AED_EQ_CH1_COEF02                  0x02
+#define AED_EQ_CH1_COEF03                  0x03
+#define AED_EQ_CH1_COEF04                  0x04
+#define AED_EQ_CH1_COEF10                  0x05
+#define AED_EQ_CH1_COEF11                  0x06
+#define AED_EQ_CH1_COEF12                  0x07
+#define AED_EQ_CH1_COEF13                  0x08
+#define AED_EQ_CH1_COEF14                  0x09
+#define AED_EQ_CH1_COEF20                  0x0a
+#define AED_EQ_CH1_COEF21                  0x0b
+#define AED_EQ_CH1_COEF22                  0x0c
+#define AED_EQ_CH1_COEF23                  0x0d
+#define AED_EQ_CH1_COEF24                  0x0e
+#define AED_EQ_CH1_COEF30                  0x0f
+#define AED_EQ_CH1_COEF31                  0x10
+#define AED_EQ_CH1_COEF32                  0x11
+#define AED_EQ_CH1_COEF33                  0x12
+#define AED_EQ_CH1_COEF34                  0x13
+#define AED_EQ_CH1_COEF40                  0x14
+#define AED_EQ_CH1_COEF41                  0x15
+#define AED_EQ_CH1_COEF42                  0x16
+#define AED_EQ_CH1_COEF43                  0x17
+#define AED_EQ_CH1_COEF44                  0x18
+#define AED_EQ_CH1_COEF50                  0x19
+#define AED_EQ_CH1_COEF51                  0x1a
+#define AED_EQ_CH1_COEF52                  0x1b
+#define AED_EQ_CH1_COEF53                  0x1c
+#define AED_EQ_CH1_COEF54                  0x1d
+#define AED_EQ_CH1_COEF60                  0x1e
+#define AED_EQ_CH1_COEF61                  0x1f
+#define AED_EQ_CH1_COEF62                  0x20
+#define AED_EQ_CH1_COEF63                  0x21
+#define AED_EQ_CH1_COEF64                  0x22
+#define AED_EQ_CH1_COEF70                  0x23
+#define AED_EQ_CH1_COEF71                  0x24
+#define AED_EQ_CH1_COEF72                  0x25
+#define AED_EQ_CH1_COEF73                  0x26
+#define AED_EQ_CH1_COEF74                  0x27
+#define AED_EQ_CH1_COEF80                  0x28
+#define AED_EQ_CH1_COEF81                  0x29
+#define AED_EQ_CH1_COEF82                  0x2a
+#define AED_EQ_CH1_COEF83                  0x2b
+#define AED_EQ_CH1_COEF84                  0x2c
+#define AED_EQ_CH1_COEF90                  0x2d
+#define AED_EQ_CH1_COEF91                  0x2e
+#define AED_EQ_CH1_COEF92                  0x2f
+#define AED_EQ_CH1_COEF93                  0x30
+#define AED_EQ_CH1_COEF94                  0x31
+#define AED_EQ_CH2_COEF00                  0x32
+#define AED_EQ_CH2_COEF01                  0x33
+#define AED_EQ_CH2_COEF02                  0x34
+#define AED_EQ_CH2_COEF03                  0x35
+#define AED_EQ_CH2_COEF04                  0x36
+#define AED_EQ_CH2_COEF10                  0x37
+#define AED_EQ_CH2_COEF11                  0x38
+#define AED_EQ_CH2_COEF12                  0x39
+#define AED_EQ_CH2_COEF13                  0x3a
+#define AED_EQ_CH2_COEF14                  0x3b
+#define AED_EQ_CH2_COEF20                  0x3c
+#define AED_EQ_CH2_COEF21                  0x3d
+#define AED_EQ_CH2_COEF22                  0x3e
+#define AED_EQ_CH2_COEF23                  0x3f
+#define AED_EQ_CH2_COEF24                  0x40
+#define AED_EQ_CH2_COEF30                  0x41
+#define AED_EQ_CH2_COEF31                  0x42
+#define AED_EQ_CH2_COEF32                  0x43
+#define AED_EQ_CH2_COEF33                  0x44
+#define AED_EQ_CH2_COEF34                  0x45
+#define AED_EQ_CH2_COEF40                  0x46
+#define AED_EQ_CH2_COEF41                  0x47
+#define AED_EQ_CH2_COEF42                  0x48
+#define AED_EQ_CH2_COEF43                  0x49
+#define AED_EQ_CH2_COEF44                  0x4a
+#define AED_EQ_CH2_COEF50                  0x4b
+#define AED_EQ_CH2_COEF51                  0x4c
+#define AED_EQ_CH2_COEF52                  0x4d
+#define AED_EQ_CH2_COEF53                  0x4e
+#define AED_EQ_CH2_COEF54                  0x4f
+#define AED_EQ_CH2_COEF60                  0x50
+#define AED_EQ_CH2_COEF61                  0x51
+#define AED_EQ_CH2_COEF62                  0x52
+#define AED_EQ_CH2_COEF63                  0x53
+#define AED_EQ_CH2_COEF64                  0x54
+#define AED_EQ_CH2_COEF70                  0x55
+#define AED_EQ_CH2_COEF71                  0x56
+#define AED_EQ_CH2_COEF72                  0x57
+#define AED_EQ_CH2_COEF73                  0x58
+#define AED_EQ_CH2_COEF74                  0x59
+#define AED_EQ_CH2_COEF80                  0x5a
+#define AED_EQ_CH2_COEF81                  0x5b
+#define AED_EQ_CH2_COEF82                  0x5c
+#define AED_EQ_CH2_COEF83                  0x5d
+#define AED_EQ_CH2_COEF84                  0x5e
+#define AED_EQ_CH2_COEF90                  0x5f
+#define AED_EQ_CH2_COEF91                  0x60
+#define AED_EQ_CH2_COEF92                  0x61
+#define AED_EQ_CH2_COEF93                  0x62
+#define AED_EQ_CH2_COEF94                  0x63
+#define AED_EQ_EN_G12X                     0x64
+#define AED_EQ_VOLUME_G12X                 0x65
+#define AED_EQ_VOLUME_SLEW_CNT_G12X        0x66
+#define AED_MUTE_G12X                      0x67
+#define AED_DRC_EN                         0x68
+#define AED_DRC_AE                         0x69
+#define AED_DRC_AA                         0x6a
+#define AED_DRC_AD                         0x6b
+#define AED_DRC_AE_1M                      0x6c
+#define AED_DRC_AA_1M                      0x6d
+#define AED_DRC_AD_1M                      0x6e
+#define AED_DRC_OFFSET0                    0x6f
+#define AED_DRC_OFFSET1                    0x70
+#define AED_DRC_THD0_G12X                  0x71
+#define AED_DRC_THD1_G12X                  0x72
+#define AED_DRC_K0_G12X                    0x73
+#define AED_DRC_K1_G12X                    0x74
+#define AED_CLIP_THD_G12X                  0x75
+#define AED_NG_THD0                        0x76
+#define AED_NG_THD1                        0x77
+#define AED_NG_CNT_THD                     0x78
+#define AED_NG_CTL                         0x79
+#define AED_ED_CTL                         0x7a
+#define AED_DEBUG0                         0x7b
+#define AED_DEBUG1                         0x7c
+#define AED_DEBUG2                         0x7d
+#define AED_DEBUG3                         0x7e
+#define AED_DEBUG4                         0x7f
+#define AED_DEBUG5                         0x80
+#define AED_DEBUG6                         0x81
+#define AED_DRC_AA_H                       0x82
+#define AED_DRC_AD_H                       0x83
+#define AED_DRC_AA_1M_H                    0x84
+#define AED_DRC_AD_1M_H                    0x85
+#define AED_NG_CNT                         0x86
+#define AED_NG_STEP                        0x87
+/*
+ * EQ DRC, New ARCH, from tl1
+ */
+#define AED_COEF_RAM_CNTL                  0x00
+#define AED_COEF_RAM_DATA                  0x01
+#define AED_EQ_EN                          0x02
+#define AED_EQ_TAP_CNTL                    0x03
+#define AED_EQ_VOLUME                      0x04
+#define AED_EQ_VOLUME_SLEW_CNT             0x05
+#define AED_MUTE                           0x06
+#define AED_DRC_CNTL                       0x07
+#define AED_DRC_RMS_COEF0                  0x08
+#define AED_DRC_RMS_COEF1                  0x09
+#define AED_DRC_THD0                       0x0a
+#define AED_DRC_THD1                       0x0b
+#define AED_DRC_THD2                       0x0c
+#define AED_DRC_THD3                       0x0d
+#define AED_DRC_THD4                       0x0e
+#define AED_DRC_K0                         0x0f
+#define AED_DRC_K1                         0x10
+#define AED_DRC_K2                         0x11
+#define AED_DRC_K3                         0x12
+#define AED_DRC_K4                         0x13
+#define AED_DRC_K5                         0x14
+#define AED_DRC_THD_OUT0                   0x15
+#define AED_DRC_THD_OUT1                   0x16
+#define AED_DRC_THD_OUT2                   0x17
+#define AED_DRC_THD_OUT3                   0x18
+#define AED_DRC_OFFSET                     0x19
+#define AED_DRC_RELEASE_COEF00             0x1a
+#define AED_DRC_RELEASE_COEF01             0x1b
+#define AED_DRC_RELEASE_COEF10             0x1c
+#define AED_DRC_RELEASE_COEF11             0x1d
+#define AED_DRC_RELEASE_COEF20             0x1e
+#define AED_DRC_RELEASE_COEF21             0x1f
+#define AED_DRC_RELEASE_COEF30             0x20
+#define AED_DRC_RELEASE_COEF31             0x21
+#define AED_DRC_RELEASE_COEF40             0x22
+#define AED_DRC_RELEASE_COEF41             0x23
+#define AED_DRC_RELEASE_COEF50             0x24
+#define AED_DRC_RELEASE_COEF51             0x25
+#define AED_DRC_ATTACK_COEF00              0x26
+#define AED_DRC_ATTACK_COEF01              0x27
+#define AED_DRC_ATTACK_COEF10              0x28
+#define AED_DRC_ATTACK_COEF11              0x29
+#define AED_DRC_ATTACK_COEF20              0x2a
+#define AED_DRC_ATTACK_COEF21              0x2b
+#define AED_DRC_ATTACK_COEF30              0x2c
+#define AED_DRC_ATTACK_COEF31              0x2d
+#define AED_DRC_ATTACK_COEF40              0x2e
+#define AED_DRC_ATTACK_COEF41              0x2f
+#define AED_DRC_ATTACK_COEF50              0x30
+#define AED_DRC_ATTACK_COEF51              0x31
+#define AED_DRC_LOOPBACK_CNTL              0x32
+#define AED_MDRC_CNTL                      0x33
+#define AED_MDRC_RMS_COEF00                0x34
+#define AED_MDRC_RMS_COEF01                0x35
+#define AED_MDRC_RELEASE_COEF00            0x36
+#define AED_MDRC_RELEASE_COEF01            0x37
+#define AED_MDRC_ATTACK_COEF00             0x38
+#define AED_MDRC_ATTACK_COEF01             0x39
+#define AED_MDRC_THD0                      0x3a
+#define AED_MDRC_K0                        0x3b
+#define AED_MDRC_LOW_GAIN                  0x3c
+#define AED_MDRC_OFFSET0                   0x3d
+#define AED_MDRC_RMS_COEF10                0x3e
+#define AED_MDRC_RMS_COEF11                0x3f
+#define AED_MDRC_RELEASE_COEF10            0x40
+#define AED_MDRC_RELEASE_COEF11            0x41
+#define AED_MDRC_ATTACK_COEF10             0x42
+#define AED_MDRC_ATTACK_COEF11             0x43
+#define AED_MDRC_THD1                      0x44
+#define AED_MDRC_K1                        0x45
+#define AED_MDRC_OFFSET1                   0x46
+#define AED_MDRC_MID_GAIN                  0x47
+#define AED_MDRC_RMS_COEF20                0x48
+#define AED_MDRC_RMS_COEF21                0x49
+#define AED_MDRC_RELEASE_COEF20            0x4a
+#define AED_MDRC_RELEASE_COEF21            0x4b
+#define AED_MDRC_ATTACK_COEF20             0x4c
+#define AED_MDRC_ATTACK_COEF21             0x4d
+#define AED_MDRC_THD2                      0x4e
+#define AED_MDRC_K2                        0x4f
+#define AED_MDRC_OFFSET2                   0x50
+#define AED_MDRC_HIGH_GAIN                 0x51
+#define AED_ED_CNTL                        0x52
+#define AED_DC_EN                          0x53
+#define AED_ND_LOW_THD                     0x54
+#define AED_ND_HIGH_THD                    0x55
+#define AED_ND_CNT_THD                     0x56
+#define AED_ND_SUM_NUM                     0x57
+#define AED_ND_CZ_NUM                      0x58
+#define AED_ND_SUM_THD0                    0x59
+#define AED_ND_SUM_THD1                    0x5a
+#define AED_ND_CZ_THD0                     0x5b
+#define AED_ND_CZ_THD1                     0x5c
+#define AED_ND_COND_CNTL                   0x5d
+#define AED_ND_RELEASE_COEF0               0x5e
+#define AED_ND_RELEASE_COEF1               0x5f
+#define AED_ND_ATTACK_COEF0                0x60
+#define AED_ND_ATTACK_COEF1                0x61
+#define AED_ND_CNTL                        0x62
+#define AED_MIX0_LL                        0x63
+#define AED_MIX0_RL                        0x64
+#define AED_MIX0_LR                        0x65
+#define AED_MIX0_RR                        0x66
+#define AED_CLIP_THD                       0x67
+#define AED_CH1_ND_SUM_OUT                 0x68
+#define AED_CH2_ND_SUM_OUT                 0x69
+#define AED_CH1_ND_CZ_OUT                  0x6a
+#define AED_CH2_ND_CZ_OUT                  0x6b
+#define AED_NOISE_STATUS                   0x6c
+#define AED_POW_CURRENT_S0                 0x6d
+#define AED_POW_CURRENT_S1                 0x6e
+#define AED_POW_CURRENT_S2                 0x6f
+#define AED_POW_OUT0                       0x70
+#define AED_POW_OUT1                       0x71
+#define AED_POW_OUT2                       0x72
+#define AED_POW_ADJ_INDEX0                 0x73
+#define AED_POW_ADJ_INDEX1                 0x74
+#define AED_POW_ADJ_INDEX2                 0x75
+#define AED_DRC_GAIN_INDEX0                0x76
+#define AED_DRC_GAIN_INDEX1                0x77
+#define AED_DRC_GAIN_INDEX2                0x78
+#define AED_CH1_VOLUME_STATE               0x79
+#define AED_CH2_VOLUME_STATE               0x7a
+#define AED_CH1_VOLUME_GAIN                0x7b
+#define AED_CH2_VOLUME_GAIN                0x7c
+#define AED_FULL_POW_CURRENT               0x7d
+#define AED_FULL_POW_OUT                   0x7e
+#define AED_FULL_POW_ADJ                   0x7f
+#define AED_FULL_DRC_GAIN                  0x80
+#define AED_MASTER_VOLUME_STATE            0x81
+#define AED_MASTER_VOLUME_GAIN             0x82
+
+#define AED_TOP_CTL                        0x88
+#define AED_TOP_REQ_CTL                    0x89
+
+/*
+ * VAD, Voice activity detection
+ */
+#define VAD_TOP_CTRL0                      0x000
+#define VAD_TOP_CTRL1                      0x001
+#define VAD_TOP_CTRL2                      0x002
+#define VAD_FIR_CTRL                      0x003
+#define VAD_FIR_EMP                        0x004
+#define VAD_FIR_COEF0                      0x005
+#define VAD_FIR_COEF1                      0x006
+#define VAD_FIR_COEF2                      0x007
+#define VAD_FIR_COEF3                      0x008
+#define VAD_FIR_COEF4                      0x009
+#define VAD_FIR_COEF5                      0x00a
+#define VAD_FIR_COEF6                      0x00b
+#define VAD_FIR_COEF7                      0x00c
+#define VAD_FIR_COEF8                      0x00d
+#define VAD_FIR_COEF9                      0x00e
+#define VAD_FIR_COEF10                     0x00f
+#define VAD_FIR_COEF11                     0x010
+#define VAD_FIR_COEF12                     0x011
+#define VAD_FRAME_CTRL0                    0x012
+#define VAD_FRAME_CTRL1                    0x013
+#define VAD_FRAME_CTRL2                    0x014
+#define VAD_CEP_CTRL0                      0x015
+#define VAD_CEP_CTRL1                      0x016
+#define VAD_CEP_CTRL2                      0x017
+#define VAD_CEP_CTRL3                      0x018
+#define VAD_CEP_CTRL4                      0x019
+#define VAD_CEP_CTRL5                      0x01a
+#define VAD_DEC_CTRL                       0x01b
+#define VAD_TOP_STS0                       0x01c
+#define VAD_TOP_STS1                       0x01d
+#define VAD_TOP_STS2                       0x01e
+#define VAD_FIR_STS0                       0x01f
+#define VAD_FIR_STS1                       0x020
+#define VAD_POW_STS0                       0x021
+#define VAD_POW_STS1                       0x022
+#define VAD_POW_STS2                       0x023
+#define VAD_FFT_STS0                       0x024
+#define VAD_FFT_STS1                       0x025
+#define VAD_SPE_STS0                       0x026
+#define VAD_SPE_STS1                       0x027
+#define VAD_SPE_STS2                       0x028
+#define VAD_SPE_STS3                       0x029
+#define VAD_DEC_STS0                       0x02a
+#define VAD_DEC_STS1                       0x02b
+#define VAD_LUT_CTRL                       0x02c
+#define VAD_LUT_WR                         0x02d
+#define VAD_LUT_RD                         0x02e
+#define VAD_IN_SEL0                        0x02f
+#define VAD_IN_SEL1                        0x030
+#define VAD_TO_DDR                         0x031
+
 #endif
index f6bc8ca..2aa663b 100644 (file)
@@ -46,7 +46,7 @@
 #define SPDIF_B        1
 
 /* Debug by PTM when bringup */
-/* #define G12A_PTM */
+/*#define __PTM_SPDIF_CLK__*/
 
 /* for debug */
 /*#define __SPDIFIN_INSERT_CHNUM__*/
@@ -1135,8 +1135,8 @@ static void aml_set_spdifclk(struct aml_spdif *p_spdif)
                }
                mpll_freq = p_spdif->sysclk_freq * mul;
 
-#ifdef G12A_PTM
-               mpll_freq = p_spdif->sysclk_freq * 57;
+#ifdef __PTM_SPDIF_CLK__
+               mpll_freq = p_spdif->sysclk_freq * 58;
 #endif
                pr_info("\t finally sys freq:%d, mpll freq:%d\n",
                        p_spdif->sysclk_freq,
@@ -1168,7 +1168,7 @@ static int aml_dai_set_spdif_sysclk(struct snd_soc_dai *cpu_dai,
                freq,
                dir);
 
-       if (dir == SND_SOC_CLOCK_OUT) {
+       if (clk_id == 0) {
                struct aml_spdif *p_spdif = snd_soc_dai_get_drvdata(cpu_dai);
 
                p_spdif->sysclk_freq = freq;
@@ -1349,18 +1349,40 @@ struct spdif_chipinfo g12a_spdif_b_chipinfo = {
        .eq_drc_en    = true,
 };
 
+struct spdif_chipinfo tl1_spdif_a_chipinfo = {
+       .id           = SPDIF_A,
+       .chnum_en     = true,
+       .hold_start   = true,
+       .eq_drc_en    = true,
+};
+
+struct spdif_chipinfo tl1_spdif_b_chipinfo = {
+       .id           = SPDIF_B,
+       .chnum_en     = true,
+       .hold_start   = true,
+       .eq_drc_en    = true,
+};
+
 static const struct of_device_id aml_spdif_device_id[] = {
        {
                .compatible = "amlogic, axg-snd-spdif",
-               .data = &axg_spdif_chipinfo,
+               .data       = &axg_spdif_chipinfo,
        },
        {
                .compatible = "amlogic, g12a-snd-spdif-a",
-               .data = &g12a_spdif_a_chipinfo,
+               .data       = &g12a_spdif_a_chipinfo,
        },
        {
                .compatible = "amlogic, g12a-snd-spdif-b",
-               .data = &g12a_spdif_b_chipinfo,
+               .data       = &g12a_spdif_b_chipinfo,
+       },
+       {
+               .compatible = "amlogic, tl1-snd-spdif-a",
+               .data       = &tl1_spdif_a_chipinfo,
+       },
+       {
+               .compatible = "amlogic, tl1-snd-spdif-b",
+               .data       = &tl1_spdif_b_chipinfo,
        },
        {},
 };
index 0a0e089..fedbac2 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/amlogic/media/sound/aout_notify.h>
 
 /*#define G12A_PTM*/
-/*#define G12A_PTM_LB_INTERNAL*/
+/*#define __PTM_SPDIF_INTERNAL_LB__*/
 
 unsigned int aml_spdif_ctrl_read(struct aml_audio_controller *actrl,
        int stream, int index)
@@ -85,7 +85,7 @@ void aml_spdif_enable(
        } else {
                aml_audiobus_update_bits(actrl,
                        EE_AUDIO_SPDIFIN_CTRL0, 1<<31, is_enable<<31);
-#ifdef G12A_PTM_LB_INTERNAL
+#ifdef __PTM_SPDIF_INTERNAL_LB__
                if (index == 0)
                aml_audiobus_update_bits(actrl,
                        EE_AUDIO_SPDIFIN_CTRL0, 0x3<<4, 0x1<<4);
index 425eebf..d0d803a 100644 (file)
@@ -39,7 +39,7 @@
 #include "ddr_mngr.h"
 #include "tdm_hw.h"
 
-/*#define G12A_PTM*/
+/*#define __PTM_TDM_CLK__*/
 
 #include "sharebuffer.h"
 
@@ -485,6 +485,16 @@ static int aml_dai_tdm_prepare(struct snd_pcm_substream *substream,
                        return -EINVAL;
                }
 
+               if (toddr_src_get() == FRHDMIRX) {
+                       src = FRHDMIRX;
+
+                       tdm_update_slot_in(p_tdm->actrl, p_tdm->id, HDMIRX_I2S);
+               }
+
+               pr_info("%s Expected toddr src:%s\n",
+                       __func__,
+                       toddr_src_get_str(src));
+
                fmt.type      = toddr_type;
                fmt.msb       = 31;
                fmt.lsb       = lsb;
@@ -803,11 +813,11 @@ static int aml_dai_set_tdm_sysclk(struct snd_soc_dai *cpu_dai,
 
        p_tdm->setting.sysclk = freq;
 
-#ifdef G12A_PTM
+#ifdef __PTM_TDM_CLK__
        if (p_tdm->id == 0)
                ratio = 14;
        else if (p_tdm->id == 1)
-               ratio = 18;
+               ratio = 18 * 2;
        else if (p_tdm->id == 2)
                ratio = 20;
 #endif
@@ -1056,23 +1066,23 @@ static struct snd_soc_dai_driver aml_tdm_dai[] = {
 };
 
 static const struct snd_soc_component_driver aml_tdm_component = {
-       .name           = DRV_NAME,
+       .name        = DRV_NAME,
 };
 
 struct tdm_chipinfo axg_tdma_chipinfo = {
-       .id = TDM_A,
+       .id          = TDM_A,
 };
 
 struct tdm_chipinfo axg_tdmb_chipinfo = {
-       .id = TDM_B,
+       .id          = TDM_B,
 };
 
 struct tdm_chipinfo axg_tdmc_chipinfo = {
-       .id = TDM_C,
+       .id          = TDM_C,
 };
 
 struct tdm_chipinfo g12a_tdma_chipinfo = {
-       .id = TDM_A,
+       .id          = TDM_A,
        .sclk_ws_inv = true,
        .oe_fn       = true,
        .clk_pad_ctl = true,
@@ -1080,7 +1090,7 @@ struct tdm_chipinfo g12a_tdma_chipinfo = {
 };
 
 struct tdm_chipinfo g12a_tdmb_chipinfo = {
-       .id = TDM_B,
+       .id          = TDM_B,
        .sclk_ws_inv = true,
        .oe_fn       = true,
        .clk_pad_ctl = true,
@@ -1088,7 +1098,31 @@ struct tdm_chipinfo g12a_tdmb_chipinfo = {
 };
 
 struct tdm_chipinfo g12a_tdmc_chipinfo = {
-       .id = TDM_C,
+       .id          = TDM_C,
+       .sclk_ws_inv = true,
+       .oe_fn       = true,
+       .clk_pad_ctl = true,
+       .same_src_fn = true,
+};
+
+struct tdm_chipinfo tl1_tdma_chipinfo = {
+       .id          = TDM_A,
+       .sclk_ws_inv = true,
+       .oe_fn       = true,
+       .clk_pad_ctl = true,
+       .same_src_fn = true,
+};
+
+struct tdm_chipinfo tl1_tdmb_chipinfo = {
+       .id          = TDM_B,
+       .sclk_ws_inv = true,
+       .oe_fn       = true,
+       .clk_pad_ctl = true,
+       .same_src_fn = true,
+};
+
+struct tdm_chipinfo tl1_tdmc_chipinfo = {
+       .id          = TDM_C,
        .sclk_ws_inv = true,
        .oe_fn       = true,
        .clk_pad_ctl = true,
@@ -1098,27 +1132,39 @@ struct tdm_chipinfo g12a_tdmc_chipinfo = {
 static const struct of_device_id aml_tdm_device_id[] = {
        {
                .compatible = "amlogic, axg-snd-tdma",
-               .data = &axg_tdma_chipinfo,
+               .data       = &axg_tdma_chipinfo,
        },
        {
                .compatible = "amlogic, axg-snd-tdmb",
-               .data = &axg_tdmb_chipinfo,
+               .data       = &axg_tdmb_chipinfo,
        },
        {
                .compatible = "amlogic, axg-snd-tdmc",
-               .data = &axg_tdmc_chipinfo,
+               .data       = &axg_tdmc_chipinfo,
        },
        {
                .compatible = "amlogic, g12a-snd-tdma",
-               .data = &g12a_tdma_chipinfo,
+               .data       = &g12a_tdma_chipinfo,
        },
        {
                .compatible = "amlogic, g12a-snd-tdmb",
-               .data = &g12a_tdmb_chipinfo,
+               .data       = &g12a_tdmb_chipinfo,
        },
        {
                .compatible = "amlogic, g12a-snd-tdmc",
-               .data = &g12a_tdmc_chipinfo,
+               .data       = &g12a_tdmc_chipinfo,
+       },
+       {
+               .compatible = "amlogic, tl1-snd-tdma",
+               .data       = &tl1_tdma_chipinfo,
+       },
+       {
+               .compatible = "amlogic, tl1-snd-tdmb",
+               .data       = &tl1_tdmb_chipinfo,
+       },
+       {
+               .compatible = "amlogic, tl1-snd-tdmc",
+               .data       = &tl1_tdmc_chipinfo,
        },
        {},
 };
index 7eb5482..c720947 100644 (file)
@@ -26,8 +26,8 @@
 #define MST_CLK_INVERT_PH2_TDMOUT_BCLK    (1 << 4)
 #define MST_CLK_INVERT_PH2_TDMOUT_FCLK    (1 << 5)
 
-/*#define G12A_PTM*/
 /*#define G12A_PTM_LB_INTERNAL*/
+/*#define TL1_PTM_LB_INTERNAL*/
 
 /* without audio handler, it should be improved */
 void aml_tdm_enable(
@@ -335,9 +335,7 @@ void aml_tdm_set_format(
        pr_debug("sclk_ph0 (pad) clk ctl set:%x\n", clkctl);
        /* clk ctrl: delay line and invert clk */
        /*clkctl |= 0x88880000;*/
-#ifdef G12A_PTM
-       clkctl |= 0x77777700;
-#endif
+
        if (master_mode) {
                off_set = EE_AUDIO_MST_B_SCLK_CTRL1 - EE_AUDIO_MST_A_SCLK_CTRL1;
                reg_out = EE_AUDIO_MST_A_SCLK_CTRL1 + off_set * id;
@@ -431,7 +429,7 @@ void aml_tdm_set_slot_in(
        offset = EE_AUDIO_TDMIN_B_CTRL - EE_AUDIO_TDMIN_A_CTRL;
        reg = EE_AUDIO_TDMIN_A_CTRL + offset * index;
 
-#ifdef G12A_PTM_LB_INTERNAL
+#if defined(G12A_PTM_LB_INTERNAL)
        if (index == 0) /*TODO: ptm, tdma dsp_a lb*/
                aml_audiobus_update_bits(actrl, reg,
                        0xf<<20|0x1f, 6<<20|(slot_width-1));
@@ -439,11 +437,32 @@ void aml_tdm_set_slot_in(
                aml_audiobus_update_bits(actrl, reg,
                        0xf<<20|0x1f, 7<<20|(slot_width-1));
        else
+#elif defined(TL1_PTM_LB_INTERNAL)
+if (index == 0) /*TODO: ptm, tdma dsp_a lb*/
+       aml_audiobus_update_bits(actrl, reg,
+               0xf<<20|0x1f, 13<<20|(slot_width-1));
+else if (index == 1) /*TODO: ptm, tdmb i2s lb*/
+       aml_audiobus_update_bits(actrl, reg,
+               0xf<<20|0x1f, 14<<20|(slot_width-1));
+else
 #endif
        aml_audiobus_update_bits(actrl, reg,
                0xf << 20 | 0x1f, in_src << 20 | (slot_width-1));
 }
 
+void tdm_update_slot_in(
+       struct aml_audio_controller *actrl,
+       int index, int in_src)
+{
+       unsigned int reg, offset;
+
+       offset = EE_AUDIO_TDMIN_B_CTRL - EE_AUDIO_TDMIN_A_CTRL;
+       reg = EE_AUDIO_TDMIN_A_CTRL + offset * index;
+
+       aml_audiobus_update_bits(actrl, reg,
+               0xf << 20, in_src << 20);
+}
+
 void aml_tdm_set_channel_mask(
        struct aml_audio_controller *actrl,
        int stream, int index, int lane, int mask)
@@ -561,11 +580,11 @@ void aml_tdm_clk_pad_select(
                pr_err("unknown tdm mpad:%d\n", mpad);
                return;
        }
-       reg = EE_AUDIO_MST_PAD_CTRL0;
+       reg = EE_AUDIO_MST_PAD_CTRL0(0);
        aml_audiobus_update_bits(actrl, reg,
                mask_offset, val_offset);
 
-       reg = EE_AUDIO_MST_PAD_CTRL1;
+       reg = EE_AUDIO_MST_PAD_CTRL1(0);
        switch (tdm_index) {
        case 0:
                mask_offset = 0x7 << 16 | 0x7 << 0;
index 896bdf2..fc5bcab 100644 (file)
 #include "audio_io.h"
 #include "regs.h"
 
+//     TODO: fix me, now based by tl1
+enum tdmin_src {
+       PAD_TDMINA_DIN = 0,
+       PAD_TDMINB_DIN = 1,
+       PAD_TDMINC_DIN = 2,
+       PAD_TDMINA_D = 4,
+       PAD_TDMINB_D = 5,
+       PAD_TDMINC_D = 6,
+       HDMIRX_I2S = 7,
+       ACODEC_ADC = 8,
+       TDMOUTA = 13,
+       TDMOUTB = 14,
+       TDMOUTC = 15,
+};
+
 struct pcm_setting {
        unsigned int pcm_mode;
        unsigned int sysclk;
@@ -80,6 +95,10 @@ extern void aml_tdm_set_slot_in(
        struct aml_audio_controller *actrl,
        int index, int in_src, int slot_width);
 
+extern void tdm_update_slot_in(
+       struct aml_audio_controller *actrl,
+       int index, int in_src);
+
 extern void aml_tdm_set_channel_mask(
        struct aml_audio_controller *actrl,
        int stream, int index, int lanes, int mask);
diff --git a/sound/soc/amlogic/auge/tl1,clocks.c b/sound/soc/amlogic/auge/tl1,clocks.c
new file mode 100644 (file)
index 0000000..c4e9817
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * sound/soc/amlogic/auge/tl1,clocks.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.
+ *
+ */
+#undef pr_fmt
+#define pr_fmt(fmt) "tl1_clocks: " fmt
+
+#include <dt-bindings/clock/amlogic,tl1-audio-clk.h>
+
+#include "audio_clks.h"
+#include "regs.h"
+
+static spinlock_t aclk_lock;
+
+static const char *const mclk_parent_names[] = {"mpll0", "mpll1",
+       "mpll2", "mpll3", "hifi_pll", "fclk_div3", "fclk_div4", "gp0_pll"};
+
+static const char *const audioclk_parent_names[] = {
+       "mclk_a", "mclk_b", "mclk_c", "mclk_d", "mclk_e",
+       "mclk_f", "i_slv_sclk_a", "i_slv_sclk_b", "i_slv_sclk_c",
+       "i_slv_sclk_d", "i_slv_sclk_e", "i_slv_sclk_f", "i_slv_sclk_g",
+       "i_slv_sclk_h", "i_slv_sclk_i", "i_slv_sclk_j"};
+
+CLOCK_GATE(audio_ddr_arb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 0);
+CLOCK_GATE(audio_pdm, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 1);
+CLOCK_GATE(audio_tdmina, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 2);
+CLOCK_GATE(audio_tdminb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 3);
+CLOCK_GATE(audio_tdminc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 4);
+CLOCK_GATE(audio_tdminlb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 5);
+CLOCK_GATE(audio_tdmouta, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 6);
+CLOCK_GATE(audio_tdmoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 7);
+CLOCK_GATE(audio_tdmoutc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 8);
+CLOCK_GATE(audio_frddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 9);
+CLOCK_GATE(audio_frddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 10);
+CLOCK_GATE(audio_frddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 11);
+CLOCK_GATE(audio_toddra, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 12);
+CLOCK_GATE(audio_toddrb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 13);
+CLOCK_GATE(audio_toddrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 14);
+CLOCK_GATE(audio_loopbacka, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 15);
+CLOCK_GATE(audio_spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 16);
+CLOCK_GATE(audio_spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 17);
+CLOCK_GATE(audio_resamplea, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 18);
+CLOCK_GATE(audio_reserved0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 19);
+CLOCK_GATE(audio_reserved1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 20);
+CLOCK_GATE(audio_spdifoutb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 21);
+CLOCK_GATE(audio_eqdrc, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 22);
+CLOCK_GATE(audio_resampleb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 26);
+CLOCK_GATE(audio_tovad, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 27);
+CLOCK_GATE(audio_audiolocker, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 28);
+CLOCK_GATE(audio_spdifin_lb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 29);
+CLOCK_GATE(audio_fratv, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 30);
+CLOCK_GATE(audio_frhdmirx, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN0), 31);
+
+CLOCK_GATE(audio_frddrd, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 0);
+CLOCK_GATE(audio_toddrd, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 1);
+CLOCK_GATE(audio_loopbackb, AUD_ADDR_OFFSET(EE_AUDIO_CLK_GATE_EN1), 2);
+
+static struct clk_gate *tl1_audio_clk_gates[] = {
+       &audio_ddr_arb,
+       &audio_pdm,
+       &audio_tdmina,
+       &audio_tdminb,
+       &audio_tdminc,
+       &audio_tdminlb,
+       &audio_tdmouta,
+       &audio_tdmoutb,
+       &audio_tdmoutc,
+       &audio_frddra,
+       &audio_frddrb,
+       &audio_frddrc,
+       &audio_toddra,
+       &audio_toddrb,
+       &audio_toddrc,
+       &audio_loopbacka,
+       &audio_spdifin,
+       &audio_spdifout,
+       &audio_resamplea,
+       &audio_reserved0,
+       &audio_reserved1,
+       &audio_spdifoutb,
+       &audio_eqdrc,
+       &audio_resampleb,
+       &audio_tovad,
+       &audio_audiolocker,
+       &audio_spdifin_lb,
+       &audio_fratv,
+       &audio_frhdmirx,
+
+       &audio_frddrd,
+       &audio_toddrd,
+       &audio_loopbackb,
+};
+
+/* Array of all clocks provided by this provider */
+static struct clk_hw *tl1_audio_clk_hws[] = {
+       [CLKID_AUDIO_DDR_ARB]    = &audio_ddr_arb.hw,
+       [CLKID_AUDIO_PDM]        = &audio_pdm.hw,
+       [CLKID_AUDIO_TDMINA]     = &audio_tdmina.hw,
+       [CLKID_AUDIO_TDMINB]     = &audio_tdminb.hw,
+       [CLKID_AUDIO_TDMINC]     = &audio_tdminc.hw,
+       [CLKID_AUDIO_TDMINLB]    = &audio_tdminlb.hw,
+       [CLKID_AUDIO_TDMOUTA]    = &audio_tdmouta.hw,
+       [CLKID_AUDIO_TDMOUTB]    = &audio_tdmoutb.hw,
+       [CLKID_AUDIO_TDMOUTC]    = &audio_tdmoutc.hw,
+       [CLKID_AUDIO_FRDDRA]     = &audio_frddra.hw,
+       [CLKID_AUDIO_FRDDRB]     = &audio_frddrb.hw,
+       [CLKID_AUDIO_FRDDRC]     = &audio_frddrc.hw,
+       [CLKID_AUDIO_TODDRA]     = &audio_toddra.hw,
+       [CLKID_AUDIO_TODDRB]     = &audio_toddrb.hw,
+       [CLKID_AUDIO_TODDRC]     = &audio_toddrc.hw,
+       [CLKID_AUDIO_LOOPBACKA]  = &audio_loopbacka.hw,
+       [CLKID_AUDIO_SPDIFIN]    = &audio_spdifin.hw,
+       [CLKID_AUDIO_SPDIFOUT]   = &audio_spdifout.hw,
+       [CLKID_AUDIO_RESAMPLEA]  = &audio_resamplea.hw,
+       [CLKID_AUDIO_RESERVED0]  = &audio_reserved0.hw,
+       [CLKID_AUDIO_RESERVED1]  = &audio_reserved1.hw,
+       [CLKID_AUDIO_SPDIFOUTB]  = &audio_spdifoutb.hw,
+       [CLKID_AUDIO_EQDRC]      = &audio_eqdrc.hw,
+       [CLKID_AUDIO_RESAMPLEB]  = &audio_resampleb.hw,
+       [CLKID_AUDIO_TOVAD]      = &audio_tovad.hw,
+       [CLKID_AUDIO_AUDIOLOCKER] = &audio_audiolocker.hw,
+       [CLKID_AUDIO_SPDIFIN_LB] = &audio_spdifin_lb.hw,
+       [CLKID_AUDIO_FRATV]      = &audio_fratv.hw,
+       [CLKID_AUDIO_FRHDMIRX]   = &audio_frhdmirx.hw,
+       [CLKID_AUDIO_FRDDRD]     = &audio_frddrd.hw,
+       [CLKID_AUDIO_TODDRD]     = &audio_toddrd.hw,
+       [CLKID_AUDIO_LOOPBACKB]  = &audio_loopbackb.hw,
+};
+
+static int tl1_clk_gates_init(struct clk **clks, void __iomem *iobase)
+{
+       int clkid;
+
+       if (ARRAY_SIZE(tl1_audio_clk_gates) != MCLK_BASE) {
+               pr_err("check clk gates number\n");
+               return -EINVAL;
+       }
+
+       for (clkid = 0; clkid < MCLK_BASE; clkid++) {
+               tl1_audio_clk_gates[clkid]->reg = iobase;
+               clks[clkid] = clk_register(NULL, tl1_audio_clk_hws[clkid]);
+               WARN_ON(IS_ERR_OR_NULL(clks[clkid]));
+       }
+
+       return 0;
+}
+
+/* mclk_a */
+CLOCK_COM_MUX(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(1)), 0x7, 24);
+CLOCK_COM_DIV(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(1)), 0, 16);
+CLOCK_COM_GATE(mclk_a, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_A_CTRL(1)), 31);
+/* mclk_b */
+CLOCK_COM_MUX(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(1)), 0x7, 24);
+CLOCK_COM_DIV(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(1)), 0, 16);
+CLOCK_COM_GATE(mclk_b, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_B_CTRL(1)), 31);
+/* mclk_c */
+CLOCK_COM_MUX(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(1)), 0x7, 24);
+CLOCK_COM_DIV(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(1)), 0, 16);
+CLOCK_COM_GATE(mclk_c, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_C_CTRL(1)), 31);
+/* mclk_d */
+CLOCK_COM_MUX(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(1)), 0x7, 24);
+CLOCK_COM_DIV(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(1)), 0, 16);
+CLOCK_COM_GATE(mclk_d, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_D_CTRL(1)), 31);
+/* mclk_e */
+CLOCK_COM_MUX(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(1)), 0x7, 24);
+CLOCK_COM_DIV(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(1)), 0, 16);
+CLOCK_COM_GATE(mclk_e, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_E_CTRL(1)), 31);
+/* mclk_f */
+CLOCK_COM_MUX(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(1)), 0x7, 24);
+CLOCK_COM_DIV(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(1)), 0, 16);
+CLOCK_COM_GATE(mclk_f, AUD_ADDR_OFFSET(EE_AUDIO_MCLK_F_CTRL(1)), 31);
+/* spdifin */
+CLOCK_COM_MUX(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0x7, 24);
+CLOCK_COM_DIV(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 0, 8);
+CLOCK_COM_GATE(spdifin, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFIN_CTRL), 31);
+/* spdifout */
+CLOCK_COM_MUX(spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_CTRL), 0x7, 24);
+CLOCK_COM_DIV(spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_CTRL), 0, 10);
+CLOCK_COM_GATE(spdifout, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_CTRL), 31);
+/* pdmin0 */
+CLOCK_COM_MUX(pdmin0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL0), 0x7, 24);
+CLOCK_COM_DIV(pdmin0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL0), 0, 16);
+CLOCK_COM_GATE(pdmin0, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL0), 31);
+/* pdmin1 */
+CLOCK_COM_MUX(pdmin1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL1), 0x7, 24);
+CLOCK_COM_DIV(pdmin1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL1), 0, 16);
+CLOCK_COM_GATE(pdmin1, AUD_ADDR_OFFSET(EE_AUDIO_CLK_PDMIN_CTRL1), 31);
+/* spdifout b*/
+CLOCK_COM_MUX(spdifout_b,
+       AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 0x7, 24);
+CLOCK_COM_DIV(spdifout_b, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 0, 10);
+CLOCK_COM_GATE(spdifout_b, AUD_ADDR_OFFSET(EE_AUDIO_CLK_SPDIFOUT_B_CTRL), 31);
+/* audio locker_out */
+CLOCK_COM_MUX(locker_out, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0xf, 24);
+CLOCK_COM_DIV(locker_out, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 16, 8);
+CLOCK_COM_GATE(locker_out, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 31);
+/* audio locker_in */
+CLOCK_COM_MUX(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0xf, 8);
+CLOCK_COM_DIV(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 0, 8);
+CLOCK_COM_GATE(locker_in, AUD_ADDR_OFFSET(EE_AUDIO_CLK_LOCKER_CTRL), 15);
+/* audio resample */
+CLOCK_COM_MUX(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0xf, 24);
+CLOCK_COM_DIV(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 0, 8);
+CLOCK_COM_GATE(resample, AUD_ADDR_OFFSET(EE_AUDIO_CLK_RESAMPLEA_CTRL), 31);
+
+static int tl1_clks_init(struct clk **clks, void __iomem *iobase)
+{
+       IOMAP_COM_CLK(mclk_a, iobase);
+       clks[CLKID_AUDIO_MCLK_A] = REGISTER_CLK_COM(mclk_a);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_A]));
+
+       IOMAP_COM_CLK(mclk_b, iobase);
+       clks[CLKID_AUDIO_MCLK_B] = REGISTER_CLK_COM(mclk_b);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_B]));
+
+       IOMAP_COM_CLK(mclk_c, iobase);
+       clks[CLKID_AUDIO_MCLK_C] = REGISTER_CLK_COM(mclk_c);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_C]));
+
+       IOMAP_COM_CLK(mclk_d, iobase);
+       clks[CLKID_AUDIO_MCLK_D] = REGISTER_CLK_COM(mclk_d);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_D]));
+
+       IOMAP_COM_CLK(mclk_e, iobase);
+       clks[CLKID_AUDIO_MCLK_E] = REGISTER_CLK_COM(mclk_e);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_E]));
+
+       IOMAP_COM_CLK(mclk_f, iobase);
+       clks[CLKID_AUDIO_MCLK_F] = REGISTER_CLK_COM(mclk_f);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_MCLK_F]));
+
+       IOMAP_COM_CLK(spdifin, iobase);
+       clks[CLKID_AUDIO_SPDIFIN_CTRL] = REGISTER_CLK_COM(spdifin);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFIN_CTRL]));
+
+       IOMAP_COM_CLK(spdifout, iobase);
+       clks[CLKID_AUDIO_SPDIFOUT_CTRL] = REGISTER_CLK_COM(spdifout);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFOUT_CTRL]));
+
+       IOMAP_COM_CLK(pdmin0, iobase);
+       clks[CLKID_AUDIO_PDMIN0] = REGISTER_CLK_COM(pdmin0);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_PDMIN0]));
+
+       IOMAP_COM_CLK(pdmin1, iobase);
+       clks[CLKID_AUDIO_PDMIN1] = REGISTER_CLK_COM(pdmin1);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_PDMIN1]));
+
+       IOMAP_COM_CLK(spdifout_b, iobase);
+       clks[CLKID_AUDIO_SPDIFOUTB_CTRL] = REGISTER_CLK_COM(spdifout_b);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_SPDIFOUTB_CTRL]));
+
+       IOMAP_COM_CLK(locker_out, iobase);
+       clks[CLKID_AUDIO_LOCKER_OUT] = REGISTER_AUDIOCLK_COM(locker_out);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_LOCKER_OUT]));
+
+       IOMAP_COM_CLK(locker_in, iobase);
+       clks[CLKID_AUDIO_LOCKER_IN] = REGISTER_AUDIOCLK_COM(locker_in);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_LOCKER_IN]));
+
+       IOMAP_COM_CLK(resample, iobase);
+       clks[CLKID_AUDIO_RESAMPLE_CTRL] = REGISTER_AUDIOCLK_COM(resample);
+       WARN_ON(IS_ERR_OR_NULL(clks[CLKID_AUDIO_RESAMPLE_CTRL]));
+
+       return 0;
+}
+
+struct audio_clk_init tl1_audio_clks_init = {
+       .clk_num   = NUM_AUDIO_CLKS,
+       .clk_gates = tl1_clk_gates_init,
+       .clks      = tl1_clks_init,
+};