audio: optimize DDR fifo management
authorShuai Li <shuai.li@amlogic.com>
Wed, 6 Sep 2017 11:37:57 +0000 (19:37 +0800)
committerShuai Li <shuai.li@amlogic.com>
Mon, 11 Sep 2017 08:12:23 +0000 (01:12 -0700)
PD#150616: optimize audio DDR FIFO management driver.

Previously, we need to set DDR num and DDR IRQ number
in each audio devices.

This commit add one DDR manager which manipulate all
the ddr num and irq stuffs.
Make other audio driver easy to use it by simple interface.

Change-Id: Ie9688e651a4eff6fd4135811c50aa343e89580fe
Signed-off-by: Shuai Li <shuai.li@amlogic.com>
18 files changed:
arch/arm64/boot/dts/amlogic/axg_a113d_skt.dts
arch/arm64/boot/dts/amlogic/axg_a113x_skt.dts
arch/arm64/boot/dts/amlogic/axg_s400.dts
arch/arm64/boot/dts/amlogic/axg_s400_v03.dts
arch/arm64/boot/dts/amlogic/axg_s420.dts
arch/arm64/boot/dts/amlogic/axg_s420_128m.dts
arch/arm64/boot/dts/amlogic/axg_s420_v03.dts
arch/arm64/boot/dts/amlogic/mesonaxg.dtsi
sound/soc/amlogic/auge/ddr_mngr.c
sound/soc/amlogic/auge/ddr_mngr.h
sound/soc/amlogic/auge/pdm.c
sound/soc/amlogic/auge/pdm.h
sound/soc/amlogic/auge/spdif.c
sound/soc/amlogic/auge/spdif_hw.c
sound/soc/amlogic/auge/spdif_hw.h
sound/soc/amlogic/auge/tdm.c
sound/soc/amlogic/auge/tdm_hw.c
sound/soc/amlogic/auge/tdm_hw.h

index a881e51..2cc5e38 100644 (file)
                #sound-dai-cells = <0>;
                dai-tdm-lane-slot-mask = <1>;
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmout_a &tdmin_a>;
        };
                #sound-dai-cells = <0>;
                dai-tdm-lane-slot-mask = <1 1 1 1>;
                dai-tdm-clk-sel = <1>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b>;
        };
                dai-tdm-lane-slot-mask-in = <0 1 0 0>;
                dai-tdm-lane-slot-mask-out = <1 0 1 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c>;// &tdmin_c>;
        };
        aml_spdif: spdif {
                compatible = "amlogic, snd-spdif";
                #sound-dai-cells = <0>;
-               spdif_from_ddr = <0>;
-               spdif_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0
                                &clkc CLKID_FCLK_DIV4
                                &clkaudio CLKID_AUDIO_SPDIFIN
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "okay";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index 1244e90..34907b8 100644 (file)
                dai-tdm-lane-slot-mask = <1 1 1 1>;
                /* select tdm lr/bclk src, see aml_axg_tdm.c */
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmin_a &tdmout_a>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>;
        };
        aml_spdif: spdif {
                compatible = "amlogic, snd-spdif";
                #sound-dai-cells = <0>;
-               spdif_from_ddr = <0>;
-               spdif_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0
                                &clkc CLKID_FCLK_DIV4
                                &clkaudio CLKID_AUDIO_SPDIFIN
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "disabled";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index d5ee330..2923826 100644 (file)
                dai-tdm-lane-slot-mask-in = <1 0>;
                dai-tdm-lane-slot-mask-out = <0 1>;
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmout_a &tdmin_a &tdmout_a_data>;
        };
                #sound-dai-cells = <0>;
                dai-tdm-lane-slot-mask-in = <1 1 1 1>;
                dai-tdm-clk-sel = <1>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;
        };
                dai-tdm-lane-slot-mask-in = <0 1 0 0>;
                dai-tdm-lane-slot-mask-out = <1 0 1 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>;
        };
        aml_spdif: spdif {
                compatible = "amlogic, snd-spdif";
                #sound-dai-cells = <0>;
-               spdif_from_ddr = <0>;
-               spdif_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0
                                &clkc CLKID_FCLK_DIV4
                                &clkaudio CLKID_AUDIO_SPDIFIN
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "okay";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index 933950d..db41bb1 100644 (file)
                dai-tdm-lane-slot-mask-in = <1 0>;
                dai-tdm-lane-slot-mask-out = <0 1>;
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmout_a &tdmin_a &tdmout_a_data>;
        };
                /*dai-tdm-lane-slot-mask-in = <1 1 1 1>;*/
                dai-tdm-lane-slot-mask-in = <0 0 0 1>;
                dai-tdm-clk-sel = <1>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;
        };
                dai-tdm-lane-slot-mask-in = <0 1 0 0>;
                dai-tdm-lane-slot-mask-out = <0 0 1 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>;
        };
        aml_spdif: spdif {
                compatible = "amlogic, snd-spdif";
                #sound-dai-cells = <0>;
-               spdif_from_ddr = <0>;
-               spdif_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0
                                &clkc CLKID_FCLK_DIV4
                                &clkaudio CLKID_AUDIO_SPDIFIN
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "okay";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index 63bac6a..6da1c56 100644 (file)
                dai-tdm-lane-slot-mask-in = <1 0>;
                dai-tdm-lane-slot-mask-out = <0 1>;
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmin_a &tdmout_a  &tdmout_a_data>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>;
        };
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "disabled";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index 38806bf..2d03988 100644 (file)
                dai-tdm-lane-slot-mask-out = <0 1>;
                /* select tdm lr/bclk src, see aml_axg_tdm.c */
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmin_a &tdmout_a  &tdmout_a_data>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <1>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>;
        };
        aml_spdif: spdif {
                compatible = "amlogic, snd-spdif";
                #sound-dai-cells = <0>;
-               spdif_from_ddr = <0>;
-               spdif_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0
                                &clkc CLKID_FCLK_DIV4
                                &clkaudio CLKID_AUDIO_SPDIFIN
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "disabled";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index 435b88f..1cd63a2 100644 (file)
                dai-tdm-lane-slot-mask-out = <0 1>;
                /* select tdm lr/bclk src, see aml_axg_tdm.c */
                dai-tdm-clk-sel = <0>;
-               tdm_from_ddr = <0>;
-               tdm_to_ddr = <0>;
                clocks = <&clkc CLKID_MPLL0>;
                                        //&clkaudio CLKID_AUDIO_TDMOUTA
                                        //&clkaudio CLKID_AUDIO_MCLK_A>;
                clock-names = "mpll0", "gate", "mclk";
-               interrupts =
-                       <GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmin_a &tdmout_a  &tdmout_a_data>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <1>;
-               tdm_from_ddr = <1>;
-               tdm_to_ddr = <1>;
                clocks = <&clkc CLKID_MPLL1>;
                clock-names = "mpll1";
-               interrupts =
-                       <GIC_SPI 85 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmb_mclk &tdmout_b &tdmin_b>;
        };
                dai-tdm-lane-slot-mask-out = <1 0>;
                dai-tdm-lane-slot-mask-in = <0 1>;
                dai-tdm-clk-sel = <2>;
-               tdm_from_ddr = <2>;
-               tdm_to_ddr = <2>;
                clocks = <&clkc CLKID_MPLL2>;
                clock-names = "mpll2";
-               interrupts =
-                       <GIC_SPI 86 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "tdmin", "tdmout";
                pinctrl-names = "tdm_pins";
                pinctrl-0 = <&tdmc_mclk &tdmout_c &tdmin_c>;
        };
                clock-names = "sysclk", "fixed_clk", "gate_spdifin",
                                "gate_spdifout", "clk_spdifin", "clk_spdifout";
                interrupts =
-                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 84 IRQ_TYPE_EDGE_RISING
-                               GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
+                               <GIC_SPI 87 IRQ_TYPE_EDGE_RISING>;
 
-               interrupt-names = "irq_spdifin", "irq_toddr", "irq_frddr";
+               interrupt-names = "irq_spdifin";
                pinctrl-names = "spdif_pins";
                pinctrl-0 = <&spdifout &spdifin>;
                status = "disabled";
        aml_pdm: pdm {
                compatible = "amlogic, snd-pdm";
                #sound-dai-cells = <0>;
-               to_ddr = <2>;
                clocks = <&clkaudio CLKID_AUDIO_PDM
                                        &clkc CLKID_MPLL3
                                        &clkaudio CLKID_AUDIO_PDMIN0
                                        &clkaudio CLKID_AUDIO_PDMIN1>;
                clock-names = "gate", "pll_clk", "pdm_dclk", "pdm_sysclk";
-               interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "pdmin_irq";
                pinctrl-names = "pdm_pins";
                pinctrl-0 = <&pdmin>;
                filter_mode = <1>; /* mode 0~4, defalut:1 */
index a99d934..7ace06a 100644 (file)
                                #clock-cells = <1>;
                                reg = <0x0 0x0 0x0 0xb0>;
                        };
+                       ddr_manager {
+                               compatible = "amlogic, audio-ddr-manager";
+                               interrupts = <
+                                       GIC_SPI 84 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 85 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 86 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 88 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 89 IRQ_TYPE_EDGE_RISING
+                                       GIC_SPI 90 IRQ_TYPE_EDGE_RISING
+                               >;
+                               interrupt-names =
+                                       "toddr_a", "toddr_b", "toddr_c",
+                                       "frddr_a", "frddr_b", "frddr_c";
+                       };
                };/* end of audiobus*/
        }; /* end of soc*/
 
index 110c3c4..01f4fc8 100644 (file)
  */
 
 #include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/init.h>
 #include <linux/slab.h>
 #include "regs.h"
 #include "ddr_mngr.h"
 #include "audio_utils.h"
 
-static DEFINE_MUTEX(ddr_mutex);
+#define DRV_NAME "aml_audio_ddr_manager"
 
+static DEFINE_MUTEX(ddr_mutex);
+#if 0
 struct ddr_desc {
        /* start address of DDR */
        unsigned int start;
@@ -41,9 +45,9 @@ struct ddr_desc {
        struct clk *ddr;
        struct clk *ddr_arb;
 };
-
+#endif
 struct toddr {
-       struct ddr_desc dscrpt;
+       //struct ddr_desc dscrpt;
        struct device *dev;
        unsigned int resample: 1;
        unsigned int ext_signed: 1;
@@ -51,76 +55,88 @@ struct toddr {
        unsigned int lsb_bit;
        unsigned int reg_base;
        enum toddr_src src;
+       int irq;
+       bool in_use: 1;
        struct aml_audio_controller *actrl;
 };
 
 struct frddr {
-       struct ddr_desc dscrpt;
+       //struct ddr_desc dscrpt;
        struct device *dev;
        enum frddr_dest dest;
        struct aml_audio_controller *actrl;
        unsigned int reg_base;
+       unsigned int fifo_id;
+       int irq;
+       bool in_use;
 };
 
 #define DDRMAX 3
-static struct frddr *frddrs[DDRMAX];
-static struct toddr *toddrs[DDRMAX];
+static struct frddr frddrs[DDRMAX];
+static struct toddr toddrs[DDRMAX];
 
 /* to DDRS */
 static struct toddr *register_toddr_l(struct device *dev,
-       struct aml_audio_controller *actrl, enum ddr_num id)
+       struct aml_audio_controller *actrl,
+       irq_handler_t handler, void *data)
 {
        struct toddr *to;
        unsigned int mask_bit;
+       int i, ret;
 
-       if (toddrs[id] != NULL)
-               return NULL;
+       /* lookup unused toddr */
+       for (i = 0; i < DDRMAX; i++) {
+               if (!toddrs[i].in_use)
+                       break;
+       }
 
-       to = kzalloc(sizeof(struct toddr), GFP_KERNEL);
-       if (!to)
+       if (i >= DDRMAX)
                return NULL;
 
-       switch (id) {
-       case DDR_A:
-               to->reg_base = EE_AUDIO_TODDR_A_CTRL0;
-               break;
-       case DDR_B:
-               to->reg_base = EE_AUDIO_TODDR_B_CTRL0;
-               break;
-       case DDR_C:
-               to->reg_base = EE_AUDIO_TODDR_C_CTRL0;
-               break;
-       default:
+       to = &toddrs[i];
+
+       /* irqs request */
+       ret = request_irq(to->irq, handler,
+               0, dev_name(dev), data);
+       if (ret) {
+               dev_err(dev, "failed to claim irq %u\n", to->irq);
                return NULL;
        }
-
        /* enable audio ddr arb */
-       mask_bit = id;
+       mask_bit = i;
        aml_audiobus_update_bits(actrl, EE_AUDIO_ARB_CTRL,
                        1<<31|1<<mask_bit, 1<<31|1<<mask_bit);
+
        to->dev = dev;
        to->actrl = actrl;
-       toddrs[id] = to;
-       pr_info("toddrs[%d] occupied by device %s\n", id, dev_name(dev));
+       to->in_use = true;
+       pr_info("toddrs[%d] registered by device %s\n", i, dev_name(dev));
        return to;
 }
 
-static int unregister_toddr_l(struct device *dev, enum ddr_num id)
+static int unregister_toddr_l(struct device *dev, void *data)
 {
        struct toddr *to;
        struct aml_audio_controller *actrl;
        unsigned int mask_bit;
        unsigned int value;
+       int i;
 
        if (dev == NULL)
                return -EINVAL;
 
-       to = toddrs[id];
-       if (to->dev != dev)
+       for (i = 0; i < DDRMAX; i++) {
+               if ((toddrs[i].dev) == dev && toddrs[i].in_use)
+                       break;
+       }
+
+       if (i >= DDRMAX)
                return -EINVAL;
 
+       to = &toddrs[i];
+
        /* disable audio ddr arb */
-       mask_bit = id;
+       mask_bit = i;
        actrl = to->actrl;
        aml_audiobus_update_bits(actrl, EE_AUDIO_ARB_CTRL,
                        1<<mask_bit, 0<<mask_bit);
@@ -130,30 +146,34 @@ static int unregister_toddr_l(struct device *dev, enum ddr_num id)
                aml_audiobus_update_bits(actrl, EE_AUDIO_ARB_CTRL,
                                1<<31, 0<<31);
 
-       kfree(to);
-       toddrs[id] = NULL;
-       pr_info("toddrs[%d] released by device %s\n", id, dev_name(dev));
+       free_irq(to->irq, data);
+       to->dev = NULL;
+       to->actrl = NULL;
+       to->in_use = false;
+       pr_info("toddrs[%d] released by device %s\n", i, dev_name(dev));
 
        return 0;
 }
 
 struct toddr *aml_audio_register_toddr(struct device *dev,
-       struct aml_audio_controller *actrl, enum ddr_num id)
+       struct aml_audio_controller *actrl,
+       irq_handler_t handler, void *data)
 {
        struct toddr *to = NULL;
 
        mutex_lock(&ddr_mutex);
-       to = register_toddr_l(dev, actrl, id);
+       to = register_toddr_l(dev, actrl,
+               handler, data);
        mutex_unlock(&ddr_mutex);
        return to;
 }
 
-int aml_audio_unregister_toddr(struct device *dev, enum ddr_num id)
+int aml_audio_unregister_toddr(struct device *dev, void *data)
 {
        int ret;
 
        mutex_lock(&ddr_mutex);
-       ret = unregister_toddr_l(dev, id);
+       ret = unregister_toddr_l(dev, data);
        mutex_unlock(&ddr_mutex);
        return ret;
 }
@@ -251,59 +271,66 @@ void aml_toddr_set_format(struct toddr *to,
 
 /* from DDRS */
 static struct frddr *register_frddr_l(struct device *dev,
-       struct aml_audio_controller *actrl, enum ddr_num id)
+       struct aml_audio_controller *actrl,
+       irq_handler_t handler, void *data)
 {
        struct frddr *from;
        unsigned int mask_bit;
+       int i, ret;
 
-       if (frddrs[id] != NULL)
-               return NULL;
+       /* lookup unused frddr */
+       for (i = 0; i < DDRMAX; i++) {
+               if (!frddrs[i].in_use)
+                       break;
+       }
 
-       from = kzalloc(sizeof(struct frddr), GFP_KERNEL);
-       if (!from)
+       if (i >= DDRMAX)
                return NULL;
 
-       switch (id) {
-       case DDR_A:
-               from->reg_base = EE_AUDIO_FRDDR_A_CTRL0;
-               break;
-       case DDR_B:
-               from->reg_base = EE_AUDIO_FRDDR_B_CTRL0;
-               break;
-       case DDR_C:
-               from->reg_base = EE_AUDIO_FRDDR_C_CTRL0;
-               break;
-       default:
-               return NULL;
-       }
+       from = &frddrs[i];
 
        /* enable audio ddr arb */
-       mask_bit = id + 4;
+       mask_bit = i + 4;
        aml_audiobus_update_bits(actrl, EE_AUDIO_ARB_CTRL,
                        1<<31|1<<mask_bit, 1<<31|1<<mask_bit);
+
+       /* irqs request */
+       ret = request_irq(from->irq, handler,
+               0, dev_name(dev), data);
+       if (ret) {
+               dev_err(dev, "failed to claim irq %u\n", from->irq);
+               return NULL;
+       }
        from->dev = dev;
        from->actrl = actrl;
-       frddrs[id] = from;
-       pr_info("frddrs[%d] claimed by device %s\n", id, dev_name(dev));
+       from->in_use = true;
+       pr_info("frddrs[%d] registered by device %s\n", i, dev_name(dev));
        return from;
 }
 
-static int unregister_frddr_l(struct device *dev, enum ddr_num id)
+static int unregister_frddr_l(struct device *dev, void *data)
 {
        struct frddr *from;
        struct aml_audio_controller *actrl;
        unsigned int mask_bit;
        unsigned int value;
+       int i;
 
        if (dev == NULL)
                return -EINVAL;
 
-       from = frddrs[id];
-       if (from->dev != dev)
+       for (i = 0; i < DDRMAX; i++) {
+               if ((frddrs[i].dev) == dev && frddrs[i].in_use)
+                       break;
+       }
+
+       if (i >= DDRMAX)
                return -EINVAL;
 
+       from = &frddrs[i];
+
        /* disable audio ddr arb */
-       mask_bit = id + 4;
+       mask_bit = i + 4;
        actrl = from->actrl;
        aml_audiobus_update_bits(actrl, EE_AUDIO_ARB_CTRL,
                        1<<mask_bit, 0<<mask_bit);
@@ -313,29 +340,32 @@ static int unregister_frddr_l(struct device *dev, enum ddr_num id)
                aml_audiobus_update_bits(actrl, EE_AUDIO_ARB_CTRL,
                                1<<31, 0<<31);
 
-       kfree(from);
-       frddrs[id] = NULL;
-       pr_info("frddrs[%d] released by device %s\n", id, dev_name(dev));
+       free_irq(from->irq, data);
+       from->dev = NULL;
+       from->actrl = NULL;
+       from->in_use = false;
+       pr_info("frddrs[%d] released by device %s\n", i, dev_name(dev));
        return 0;
 }
 
 struct frddr *aml_audio_register_frddr(struct device *dev,
-       struct aml_audio_controller *actrl, enum ddr_num id)
+       struct aml_audio_controller *actrl,
+       irq_handler_t handler, void *data)
 {
        struct frddr *fr = NULL;
 
        mutex_lock(&ddr_mutex);
-       fr = register_frddr_l(dev, actrl, id);
+       fr = register_frddr_l(dev, actrl, handler, data);
        mutex_unlock(&ddr_mutex);
        return fr;
 }
 
-int aml_audio_unregister_frddr(struct device *dev, enum ddr_num id)
+int aml_audio_unregister_frddr(struct device *dev, void *data)
 {
        int ret;
 
        mutex_lock(&ddr_mutex);
-       ret = unregister_frddr_l(dev, id);
+       ret = unregister_frddr_l(dev, data);
        mutex_unlock(&ddr_mutex);
        return ret;
 }
@@ -418,6 +448,62 @@ void aml_frddr_set_fifos(struct frddr *fr,
                        (depth - 1)<<24 | (thresh - 1)<<16 | 2<<8);
 }
 
+unsigned int aml_frddr_get_fifo_id(struct frddr *fr)
+{
+       return fr->fifo_id;
+}
+
+static int aml_ddr_mngr_platform_probe(struct platform_device *pdev)
+{
+       int i;
+
+       /* irqs */
+       toddrs[DDR_A].irq = platform_get_irq_byname(pdev, "toddr_a");
+       toddrs[DDR_B].irq = platform_get_irq_byname(pdev, "toddr_b");
+       toddrs[DDR_C].irq = platform_get_irq_byname(pdev, "toddr_c");
+
+       frddrs[DDR_A].irq = platform_get_irq_byname(pdev, "frddr_a");
+       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++) {
+               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) {
+                       dev_err(&pdev->dev, "platform_get_irq_byname failed\n");
+                       return -ENXIO;
+               }
+       }
+
+       /* inits */
+       toddrs[DDR_A].reg_base = EE_AUDIO_TODDR_A_CTRL0;
+       toddrs[DDR_B].reg_base = EE_AUDIO_TODDR_B_CTRL0;
+       toddrs[DDR_C].reg_base = EE_AUDIO_TODDR_C_CTRL0;
+       frddrs[DDR_A].reg_base = EE_AUDIO_FRDDR_A_CTRL0;
+       frddrs[DDR_B].reg_base = EE_AUDIO_FRDDR_B_CTRL0;
+       frddrs[DDR_C].reg_base = EE_AUDIO_FRDDR_C_CTRL0;
+       frddrs[DDR_A].fifo_id = DDR_A;
+       frddrs[DDR_B].fifo_id = DDR_B;
+       frddrs[DDR_C].fifo_id = DDR_C;
+
+       return 0;
+}
+
+static const struct of_device_id aml_ddr_mngr_device_id[] = {
+       { .compatible = "amlogic, audio-ddr-manager", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, aml_ddr_mngr_device_id);
+
+struct platform_driver aml_audio_ddr_manager = {
+       .driver = {
+               .name = DRV_NAME,
+               .of_match_table = aml_ddr_mngr_device_id,
+       },
+       .probe   = aml_ddr_mngr_platform_probe,
+};
+module_platform_driver(aml_audio_ddr_manager);
+
 /* Module information */
 MODULE_AUTHOR("Amlogic, Inc.");
 MODULE_DESCRIPTION("ALSA Soc Aml Audio DDR Manager");
index 7927744..8f151e8 100644 (file)
@@ -19,6 +19,7 @@
 #define __AML_AUDIO_DDR_MANAGER_H_
 
 #include <linux/device.h>
+#include <linux/interrupt.h>
 #include "audio_io.h"
 
 enum ddr_num {
@@ -55,8 +56,9 @@ enum frddr_dest {
 
 /* to ddrs */
 struct toddr *aml_audio_register_toddr(struct device *dev,
-               struct aml_audio_controller *actrl, enum ddr_num);
-int aml_audio_unregister_toddr(struct device *dev, enum ddr_num);
+               struct aml_audio_controller *actrl,
+               irq_handler_t handler, void *data);
+int aml_audio_unregister_toddr(struct device *dev, void *data);
 int aml_toddr_set_buf(struct toddr *to, unsigned int start,
                        unsigned int end);
 int aml_toddr_set_intrpt(struct toddr *to, unsigned int intrpt);
@@ -69,8 +71,9 @@ void aml_toddr_set_format(struct toddr *to,
 
 /* from ddrs */
 struct frddr *aml_audio_register_frddr(struct device *dev,
-               struct aml_audio_controller *actrl, enum ddr_num);
-int aml_audio_unregister_frddr(struct device *dev, enum ddr_num);
+               struct aml_audio_controller *actrl,
+               irq_handler_t handler, void *data);
+int aml_audio_unregister_frddr(struct device *dev, void *data);
 int aml_frddr_set_buf(struct frddr *fr, unsigned int start,
                        unsigned int end);
 int aml_frddr_set_intrpt(struct frddr *fr, unsigned int intrpt);
@@ -79,6 +82,7 @@ void aml_frddr_enable(struct frddr *fr, bool enable);
 void aml_frddr_select_dst(struct frddr *fr, enum frddr_dest);
 void aml_frddr_set_fifos(struct frddr *fr,
                unsigned int depth, unsigned int thresh);
+unsigned int aml_frddr_get_fifo_id(struct frddr *fr);
 
 #endif
 
index 81e7418..1433ede 100644 (file)
@@ -206,8 +206,8 @@ static int aml_pdm_open(struct snd_pcm_substream *substream)
                                                        dev_get_drvdata(dev);
        int ret;
 
-       pr_info("%s, stream:%d, irq :%d\n",
-               __func__, substream->stream, p_pdm->irq_pdmin);
+       pr_info("%s, stream:%d\n",
+               __func__, substream->stream);
 
        snd_soc_set_runtime_hwparams(substream, &aml_pdm_hardware);
 
@@ -239,27 +239,11 @@ static int aml_pdm_open(struct snd_pcm_substream *substream)
        if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
 
                p_pdm->tddr = aml_audio_register_toddr
-                                       (dev, p_pdm->actrl, p_pdm->to_ddr_num);
+                       (dev, p_pdm->actrl, aml_pdm_isr_handler, substream);
                if (p_pdm->tddr == NULL) {
-                       dev_err(dev, "failed to claim to ddr %u\n",
-                                       p_pdm->to_ddr_num);
+                       dev_err(dev, "failed to claim to ddr\n");
                        return -ENXIO;
                }
-
-               ret = request_irq(p_pdm->irq_pdmin,
-                               aml_pdm_isr_handler,
-                               IRQF_SHARED,
-                               "pdmin_irq",
-                               substream);
-
-               if (ret) {
-                       aml_audio_unregister_toddr(p_pdm->dev,
-                               p_pdm->to_ddr_num);
-                       dev_err(p_pdm->dev,
-                               "failed to claim irq %u\n",
-                               p_pdm->irq_pdmin);
-                       return ret;
-               }
        }
 
        return 0;
@@ -271,11 +255,10 @@ static int aml_pdm_close(struct snd_pcm_substream *substream)
        struct device *dev = rtd->platform->dev;
        struct aml_pdm *p_pdm = (struct aml_pdm *)dev_get_drvdata(dev);
 
-       pr_info("enter %s type: %d, irq:%d\n",
-               __func__, substream->stream, p_pdm->irq_pdmin);
+       pr_info("enter %s type: %d\n",
+               __func__, substream->stream);
 
-       aml_audio_unregister_toddr(p_pdm->dev, p_pdm->to_ddr_num);
-       free_irq(p_pdm->irq_pdmin, substream);
+       aml_audio_unregister_toddr(p_pdm->dev, substream);
 
        return 0;
 }
@@ -589,8 +572,8 @@ static int aml_pdm_dai_set_sysclk(struct snd_soc_dai *cpu_dai,
        if (pll_freq > 196608000)
                pll_freq = 196608000;
 
-       pr_info("%s irq:%d freq:%d, pll_freq:%d\n",
-               __func__, p_pdm->irq_pdmin, freq, pll_freq);
+       pr_info("%s freq:%d, pll_freq:%d\n",
+               __func__, freq, pll_freq);
 
        clk_set_rate(p_pdm->clk_pll, pll_freq);
        clk_set_rate(p_pdm->clk_pdm_sysclk, pll_freq);
@@ -729,15 +712,6 @@ static int aml_pdm_platform_probe(struct platform_device *pdev)
        actrl = (struct aml_audio_controller *)
                                platform_get_drvdata(pdev_parent);
        p_pdm->actrl = actrl;
-
-       /* parse DTS configured ddr */
-       ret = of_property_read_u32(node, "to_ddr",
-                       &p_pdm->to_ddr_num);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "Can't retrieve tdm_to_ddr\n");
-               return -ENXIO;
-       }
-
        /* clock gate */
        p_pdm->clk_gate = devm_clk_get(&pdev->dev, "gate");
        if (IS_ERR(p_pdm->clk_gate)) {
@@ -755,14 +729,6 @@ static int aml_pdm_platform_probe(struct platform_device *pdev)
                return PTR_ERR(p_pdm->pdm_pins);
        }
 
-       /* irq */
-       p_pdm->irq_pdmin = platform_get_irq_byname(pdev, "pdmin_irq");
-       if (p_pdm->irq_pdmin < 0) {
-               dev_err(&pdev->dev,
-                       "Can't get pdmin irq number\n");
-               return -EINVAL;
-       }
-
        p_pdm->clk_pll = devm_clk_get(&pdev->dev, "pll_clk");
        if (IS_ERR(p_pdm->clk_pll)) {
                dev_err(&pdev->dev,
index d78c694..a3b1916 100644 (file)
@@ -47,8 +47,6 @@ struct aml_pdm {
        struct clk *clk_pll;
        struct clk *clk_pdm_sysclk;
        struct clk *clk_pdm_dclk;
-       int irq_pdmin;
-       unsigned int to_ddr_num;
        struct toddr *tddr;
        /*
         * filter mode:0~4,
index edf1d8f..fcb027c 100644 (file)
@@ -50,11 +50,7 @@ struct aml_spdif {
        struct clk *clk_spdifout;
        unsigned int sysclk_freq;
        /* bclk src selection */
-       int irq_toddr;
-       int irq_frddr;
        int irq_spdifin;
-       unsigned int from_ddr_num;
-       unsigned int to_ddr_num;
        struct toddr *tddr;
        struct frddr *fddr;
 };
@@ -81,17 +77,7 @@ static const struct snd_pcm_hardware aml_spdif_hardware = {
        .channels_max = 32,
 };
 
-static irqreturn_t aml_spdifout_isr(int irq, void *devid)
-{
-       struct snd_pcm_substream *substream =
-               (struct snd_pcm_substream *)devid;
-
-       snd_pcm_period_elapsed(substream);
-
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t aml_spdifin_isr(int irq, void *devid)
+static irqreturn_t aml_spdif_ddr_isr(int irq, void *devid)
 {
        struct snd_pcm_substream *substream =
                (struct snd_pcm_substream *)devid;
@@ -128,47 +114,27 @@ static int aml_spdif_open(struct snd_pcm_substream *substream)
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                p_spdif->fddr = aml_audio_register_frddr(dev,
                        p_spdif->actrl,
-                       p_spdif->from_ddr_num);
+                       aml_spdif_ddr_isr, substream);
                if (p_spdif->fddr == NULL) {
-                       dev_err(dev, "failed to claim from ddr %u\n",
-                                       p_spdif->from_ddr_num);
+                       dev_err(dev, "failed to claim from ddr\n");
                        return -ENXIO;
                }
-
-               ret = request_irq(p_spdif->irq_frddr,
-                       aml_spdifout_isr, 0, "spdifout", substream);
-               if (ret) {
-                       aml_audio_unregister_frddr(dev, p_spdif->from_ddr_num);
-                       dev_err(p_spdif->dev, "failed to claim irq %u\n",
-                                       p_spdif->irq_frddr);
-                       return ret;
-               }
        } else {
                p_spdif->tddr = aml_audio_register_toddr(dev,
                        p_spdif->actrl,
-                       p_spdif->to_ddr_num);
+                       aml_spdif_ddr_isr, substream);
                if (p_spdif->tddr == NULL) {
-                       dev_err(dev, "failed to claim to ddr %u\n",
-                                       p_spdif->to_ddr_num);
+                       dev_err(dev, "failed to claim to ddr\n");
                        return -ENXIO;
                }
 
-               ret = request_irq(p_spdif->irq_toddr,
-                               aml_spdifin_isr, 0, "spdifin", substream);
-               if (ret) {
-                       aml_audio_unregister_toddr(dev, p_spdif->to_ddr_num);
-                       dev_err(p_spdif->dev, "failed to claim irq %u\n",
-                                               p_spdif->irq_toddr);
-                       return ret;
-               }
-
                ret = request_irq(p_spdif->irq_spdifin,
                                aml_spdifin_status_isr, 0, "irq_spdifin",
                                p_spdif);
                if (ret) {
                        dev_err(p_spdif->dev, "failed to claim irq_spdifin %u\n",
                                                p_spdif->irq_spdifin);
-                       //return ret;
+                       return ret;
                }
 
        }
@@ -187,11 +153,9 @@ static int aml_spdif_close(struct snd_pcm_substream *substream)
        pr_info("asoc debug: %s-%d\n", __func__, __LINE__);
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               aml_audio_unregister_frddr(p_spdif->dev, p_spdif->from_ddr_num);
-               free_irq(p_spdif->irq_frddr, substream);
+               aml_audio_unregister_frddr(p_spdif->dev, substream);
        } else {
-               aml_audio_unregister_toddr(p_spdif->dev, p_spdif->to_ddr_num);
-               free_irq(p_spdif->irq_toddr, substream);
+               aml_audio_unregister_toddr(p_spdif->dev, substream);
                free_irq(p_spdif->irq_spdifin, p_spdif);
        }
 
@@ -400,6 +364,7 @@ static int aml_dai_spdif_prepare(
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct aml_spdif *p_spdif = snd_soc_dai_get_drvdata(cpu_dai);
        unsigned int bit_depth = 0;
+       unsigned int fifo_id = 0;
 
        pr_info("%s stream:%d\n", __func__, substream->stream);
 
@@ -408,6 +373,7 @@ static int aml_dai_spdif_prepare(
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                struct frddr *fr = p_spdif->fddr;
 
+               fifo_id = aml_frddr_get_fifo_id(fr);
                aml_frddr_select_dst(fr, SPDIFOUT);
                aml_frddr_set_fifos(fr, 0x40, 0x20);
        } else {
@@ -464,7 +430,8 @@ static int aml_dai_spdif_prepare(
                aml_toddr_set_fifos(to, 0x40);
        }
 
-       aml_spdif_fifo_ctrl(p_spdif->actrl, bit_depth, substream->stream);
+       aml_spdif_fifo_ctrl(p_spdif->actrl, bit_depth,
+                       substream->stream, fifo_id);
 
        return 0;
 }
@@ -696,21 +663,6 @@ static int aml_spdif_platform_probe(struct platform_device *pdev)
                                platform_get_drvdata(pdev_parent);
        aml_spdif->actrl = actrl;
 
-       /* parse DTS configured ddr */
-       ret = of_property_read_u32(node, "spdif_from_ddr",
-                       &aml_spdif->from_ddr_num);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "Can't retrieve spdif_from_ddr\n");
-               return -ENXIO;
-       }
-
-       ret = of_property_read_u32(node, "spdif_to_ddr",
-                       &aml_spdif->to_ddr_num);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "Can't retrieve spdif_to_ddr\n");
-               return -ENXIO;
-       }
-
        ret = aml_spdif_clks_parse_of(aml_spdif);
        if (ret)
                return -EINVAL;
@@ -720,14 +672,6 @@ static int aml_spdif_platform_probe(struct platform_device *pdev)
        if (aml_spdif->irq_spdifin < 0)
                dev_err(dev, "platform_get_irq_byname failed\n");
 
-       aml_spdif->irq_toddr = platform_get_irq_byname(pdev, "irq_toddr");
-       if (aml_spdif->irq_toddr < 0)
-               dev_err(dev, "platform_get_irq_byname failed\n");
-
-       aml_spdif->irq_frddr = platform_get_irq_byname(pdev, "irq_frddr");
-       if (aml_spdif->irq_frddr < 0)
-               dev_err(dev, "platform_get_irq_byname failed\n");
-
        /* spdif pinmux */
        aml_spdif->pin_ctl = devm_pinctrl_get_select(dev, "spdif_pins");
        if (IS_ERR(aml_spdif->pin_ctl)) {
index 84477f4..4ae139b 100644 (file)
@@ -87,7 +87,8 @@ void aml_spdif_fifo_reset(
 void aml_spdif_fifo_ctrl(
        struct aml_audio_controller *actrl,
        int bitwidth,
-       int stream)
+       int stream,
+       unsigned int fifo_id)
 {
        unsigned int frddr_type, toddr_type;
 
@@ -127,7 +128,7 @@ void aml_spdif_fifo_ctrl(
                aml_audiobus_update_bits(actrl,
                        EE_AUDIO_SPDIFOUT_CTRL1,
                        0x3 << 24 | 0x1f << 8 | 0x7 << 4,
-                       0 << 24 | (bitwidth - 1) << 8 | frddr_type<<4);
+                       fifo_id << 24 | (bitwidth - 1) << 8 | frddr_type<<4);
 
                aml_audiobus_write(actrl,
                        EE_AUDIO_SPDIFOUT_SWAP,
index 3e7fc80..d3e29ab 100644 (file)
@@ -37,7 +37,8 @@ extern void aml_spdif_fifo_reset(
 extern void aml_spdif_fifo_ctrl(
        struct aml_audio_controller *actrl,
        int bitwidth,
-       int stream);
+       int stream,
+       unsigned int fifo_id);
 
 extern int spdifin_get_mode(void);
 
index c806a97..8a4dafa 100644 (file)
@@ -75,10 +75,6 @@ struct aml_tdm {
        unsigned int id;
        /* bclk src selection */
        unsigned int clk_sel;
-       int irq_tdmout;
-       int irq_tdmin;
-       unsigned int from_ddr_num;
-       unsigned int to_ddr_num;
        struct toddr *tddr;
        struct frddr *fddr;
 };
@@ -105,16 +101,7 @@ static const struct snd_pcm_hardware aml_tdm_hardware = {
        .channels_max = 32,
 };
 
-static irqreturn_t aml_tdmout_isr(int irq, void *devid)
-{
-       struct snd_pcm_substream *substream = (struct snd_pcm_substream *)devid;
-
-       snd_pcm_period_elapsed(substream);
-
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t aml_tdmin_isr(int irq, void *devid)
+static irqreturn_t aml_tdm_ddr_isr(int irq, void *devid)
 {
        struct snd_pcm_substream *substream = (struct snd_pcm_substream *)devid;
 
@@ -181,7 +168,6 @@ static int aml_tdm_open(struct snd_pcm_substream *substream)
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct device *dev = rtd->platform->dev;
        struct aml_tdm *p_tdm;
-       int ret = 0;
 
        p_tdm = (struct aml_tdm *)dev_get_drvdata(dev);
 
@@ -189,39 +175,18 @@ static int aml_tdm_open(struct snd_pcm_substream *substream)
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                p_tdm->fddr = aml_audio_register_frddr(dev,
-                       p_tdm->actrl, p_tdm->from_ddr_num);
+                       p_tdm->actrl, aml_tdm_ddr_isr, substream);
                if (p_tdm->fddr == NULL) {
-                       dev_err(dev, "failed to claim from ddr %u\n",
-                                       p_tdm->from_ddr_num);
+                       dev_err(dev, "failed to claim from ddr\n");
                        return -ENXIO;
                }
-
-               ret = request_irq(p_tdm->irq_tdmout,
-                       aml_tdmout_isr, 0, "tdmout", substream);
-               if (ret) {
-                       aml_audio_unregister_frddr(dev,
-                               p_tdm->from_ddr_num);
-                       dev_err(p_tdm->dev, "failed to claim irq %u\n",
-                                       p_tdm->irq_tdmout);
-                       return ret;
-               }
        } else {
                p_tdm->tddr = aml_audio_register_toddr(dev,
-                       p_tdm->actrl, p_tdm->to_ddr_num);
+                       p_tdm->actrl, aml_tdm_ddr_isr, substream);
                if (p_tdm->tddr == NULL) {
-                       dev_err(dev, "failed to claim to ddr %u\n",
-                                       p_tdm->to_ddr_num);
+                       dev_err(dev, "failed to claim to ddr\n");
                        return -ENXIO;
                }
-
-               ret = request_irq(p_tdm->irq_tdmin,
-                               aml_tdmin_isr, 0, "tdmin", substream);
-               if (ret) {
-                       aml_audio_unregister_toddr(dev, p_tdm->to_ddr_num);
-                       dev_err(p_tdm->dev, "failed to claim irq %u\n",
-                                               p_tdm->irq_tdmin);
-                       return ret;
-               }
        }
 
        runtime->private_data = p_tdm;
@@ -233,16 +198,12 @@ static int aml_tdm_close(struct snd_pcm_substream *substream)
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct aml_tdm *p_tdm = runtime->private_data;
 
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                aml_audio_unregister_frddr(p_tdm->dev,
-                               p_tdm->from_ddr_num);
-               free_irq(p_tdm->irq_tdmout, substream);
-       } else {
+                               substream);
+       else
                aml_audio_unregister_toddr(p_tdm->dev,
-                               p_tdm->to_ddr_num);
-
-               free_irq(p_tdm->irq_tdmin, substream);
-       }
+                               substream);
 
        return 0;
 }
@@ -367,14 +328,18 @@ static int aml_dai_tdm_prepare(struct snd_pcm_substream *substream,
 
        bit_depth = snd_pcm_format_width(runtime->format);
 
-       aml_tdm_fifo_ctrl(p_tdm->actrl,
-               bit_depth,
-               substream->stream,
-               p_tdm->id);
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                struct frddr *fr = p_tdm->fddr;
                enum frddr_dest dst;
+               unsigned int fifo_id;
+
+               fifo_id = aml_frddr_get_fifo_id(fr);
+               aml_tdm_fifo_ctrl(p_tdm->actrl,
+                       bit_depth,
+                       substream->stream,
+                       p_tdm->id,
+                       fifo_id);
 
                switch (p_tdm->id) {
                case 0:
@@ -949,30 +914,6 @@ static int aml_tdm_platform_probe(struct platform_device *pdev)
        if (get_meson_cpu_version(MESON_CPU_VERSION_LVL_MINOR) == 0xa)
                meson_clk_measure((1<<16) | 0x67);
 
-       /* parse DTS configured ddr */
-       ret = of_property_read_u32(node, "tdm_from_ddr",
-                       &p_tdm->from_ddr_num);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "Can't retrieve tdm_from_ddr\n");
-               return -ENXIO;
-       }
-
-       ret = of_property_read_u32(node, "tdm_to_ddr",
-                       &p_tdm->to_ddr_num);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "Can't retrieve tdm_to_ddr\n");
-               return -ENXIO;
-       }
-
-       /* irqs */
-       p_tdm->irq_tdmout = platform_get_irq_byname(pdev, "tdmout");
-       if (p_tdm->irq_tdmout < 0)
-               dev_err(dev, "platform_get_irq_byname failed\n");
-
-       p_tdm->irq_tdmin = platform_get_irq_byname(pdev, "tdmin");
-       if (p_tdm->irq_tdmin < 0)
-               dev_err(dev, "platform_get_irq_byname failed\n");
-
        p_tdm->pin_ctl = devm_pinctrl_get_select(dev, "tdm_pins");
        if (IS_ERR(p_tdm->pin_ctl)) {
                dev_info(dev, "aml_tdm_get_pins error!\n");
index 95279c4..95e8eb4 100644 (file)
@@ -85,7 +85,7 @@ void aml_tdm_fifo_reset(
 void aml_tdm_fifo_ctrl(
        struct aml_audio_controller *actrl,
        int bitwidth, int stream,
-       int index)
+       int index, unsigned int fifo_id)
 {
        unsigned int frddr_type;
        unsigned int reg, offset;
@@ -115,7 +115,7 @@ void aml_tdm_fifo_ctrl(
                reg = EE_AUDIO_TDMOUT_A_CTRL1 + offset * index;
                aml_audiobus_update_bits(actrl, reg,
                                0x3<<24|0x1f<<8|0x7<<4,
-                               index<<24|(bitwidth-1)<<8|frddr_type<<4);
+                               fifo_id<<24|(bitwidth-1)<<8|frddr_type<<4);
        } else {
                pr_info("tdm prepare----capture\n");
        }
index 966cf16..3d75ddb 100644 (file)
@@ -52,7 +52,7 @@ extern void aml_tdm_fifo_reset(
 extern void aml_tdm_fifo_ctrl(
        struct aml_audio_controller *actrl,
        int bitwidth, int stream,
-       int index);
+       int index, unsigned int fifo_id);
 
 extern void aml_tdm_set_format(
        struct aml_audio_controller *actrl,