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>
#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 */
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 */
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 */
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 */
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 */
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 */
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 */
#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*/
*/
#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;
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;
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);
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;
}
/* 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);
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;
}
(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");
#define __AML_AUDIO_DDR_MANAGER_H_
#include <linux/device.h>
+#include <linux/interrupt.h>
#include "audio_io.h"
enum ddr_num {
/* 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);
/* 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);
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
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);
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;
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;
}
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);
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)) {
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,
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,
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;
};
.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;
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;
}
}
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);
}
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);
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 {
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;
}
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;
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)) {
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;
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,
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);
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;
};
.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;
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);
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;
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;
}
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:
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");
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;
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");
}
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,