ソースを参照

starfive(multimedia): Add ALSA audio framework

1. Modify the linux dts to support audio device
2. Support audio devices or interface: pwmdac, wm8960, ac108, spdif, vad

Signed-off-by: sw.multimedia <sw.multimedia@starfivetech.com>
Signed-off-by: michael.yan <michael.yan@starfivetech.com>
Signed-off-by: andy.hu <andy.hu@starfivetech.com>
sw.multimedia 2 年 前
コミット
a688bb0daa

+ 34 - 0
arch/riscv/dts/codecs/sf_ac108.dtsi

@@ -0,0 +1,34 @@
+&sound {
+	/* i2s + ac108 */
+	simple-audio-card,dai-link@1 {
+		reg = <1>;
+		format = "i2s";
+		bitclock-master = <&sndcodec1>;
+		frame-master = <&sndcodec1>;
+
+		widgets =
+				"Microphone", "Mic Jack",
+				"Line", "Line In",
+				"Line", "Line Out",
+				"Speaker", "Speaker",
+				"Headphone", "Headphone Jack";
+		routing =
+				"Headphone Jack", "HP_L",
+				"Headphone Jack", "HP_R",
+				"Speaker", "SPK_LP",
+				"Speaker", "SPK_LN",
+				"LINPUT1", "Mic Jack",
+				"LINPUT3", "Mic Jack",
+				"RINPUT1", "Mic Jack",
+				"RINPUT2", "Mic Jack";
+
+		cpu {
+			sound-dai = <&i2sadc0>;
+		};
+		sndcodec1: codec {
+			sound-dai = <&ac108_a>;
+			clocks = <&ac108_mclk>;
+			clock-names = "mclk";
+		};
+	};
+};

+ 17 - 0
arch/riscv/dts/codecs/sf_pdm.dtsi

@@ -0,0 +1,17 @@
+&sound {
+	/* pdm + i2s */
+	simple-audio-card,dai-link@1 {
+		reg = <1>;
+		format = "i2s";
+		bitclock-master = <&sndcodec1>;
+		frame-master = <&sndcodec1>;
+
+		cpu {
+			sound-dai = <&i2sadc0>;
+		};
+
+		sndcodec1: codec {
+			sound-dai = <&pdm>;
+		};
+	};
+};

+ 16 - 0
arch/riscv/dts/codecs/sf_spdif.dtsi

@@ -0,0 +1,16 @@
+&sound {
+	/* spdif */
+	simple-audio-card,dai-link@1 {
+		reg = <1>;
+		format = "left_j";
+		bitclock-master = <&sndcpu1>;
+		frame-master = <&sndcpu1>;
+
+		sndcpu1: cpu {
+			sound-dai = <&spdif0>;
+		};
+		codec {
+			sound-dai = <&spdif_transmitter>;
+		};
+	};
+};

+ 18 - 0
arch/riscv/dts/codecs/sf_vad.dtsi

@@ -0,0 +1,18 @@
+&sound {
+	/* pdm + i2svad */
+	simple-audio-card,dai-link@1 {
+		reg = <1>;
+		format = "i2s";
+		bitclock-master = <&sndcodec1>;
+		frame-master = <&sndcodec1>;
+
+		cpu {
+			sound-dai = <&i2svad>;
+		};
+
+		sndcodec1: codec {
+			sound-dai = <&pdm>;
+		};
+	};
+	
+};

+ 38 - 0
arch/riscv/dts/codecs/sf_wm8960.dtsi

@@ -0,0 +1,38 @@
+&sound{
+	/* i2s + wm8960 */
+	simple-audio-card,dai-link@1 {
+		reg = <1>;
+		status = "okay";
+		format = "i2s";
+		bitclock-master = <&sndcodec1>;
+		frame-master = <&sndcodec1>;
+
+		widgets =
+				"Microphone", "Mic Jack",
+				"Line", "Line In",
+				"Line", "Line Out",
+				"Speaker", "Speaker",
+				"Headphone", "Headphone Jack";
+		routing =
+				"Headphone Jack", "HP_L",
+				"Headphone Jack", "HP_R",
+				"Speaker", "SPK_LP",
+				"Speaker", "SPK_LN",
+				"LINPUT1", "Mic Jack",
+				"LINPUT3", "Mic Jack",
+				"RINPUT1", "Mic Jack",
+				"RINPUT2", "Mic Jack";
+		cpu0 {
+			sound-dai = <&i2sdac0>;
+		};
+		cpu1 {
+			sound-dai = <&i2sadc0>;
+		};
+
+		sndcodec1:codec {
+			sound-dai = <&wm8960>;
+			clocks = <&wm8960_mclk>;
+			clock-names = "mclk";
+		};
+	};
+};

+ 36 - 6
arch/riscv/dts/jh7100-beaglev-starlight.dts

@@ -90,8 +90,8 @@
 	i2c-sda-hold-time-ns = <300>;
 	i2c-sda-falling-time-ns = <500>;
 	i2c-scl-falling-time-ns = <500>;
-	scl-gpio = <&gpio 62 0>;
-	sda-gpio = <&gpio 61 0>;
+	scl-gpio = <&gpio 62 GPIO_ACTIVE_HIGH>;
+	sda-gpio = <&gpio 61 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 
 	imx219@10 {
@@ -121,9 +121,27 @@
 	i2c-sda-hold-time-ns = <300>;
 	i2c-sda-falling-time-ns = <100>;
 	i2c-scl-falling-time-ns = <100>;
-	scl-gpio = <&gpio 47 0>;
-	sda-gpio = <&gpio 48 0>;
+	scl-gpio = <&gpio 47 GPIO_ACTIVE_HIGH>;
+	sda-gpio = <&gpio 48 GPIO_ACTIVE_HIGH>;
 	status = "okay";
+
+	ac108_a: ac108@3b {
+		compatible = "x-power,ac108_0";
+		reg = <0x3b>;
+		#sound-dai-cells = <0>;
+		data-protocol = <0>;
+	};
+	wm8960: codec@1a {
+		compatible = "wlf,wm8960";
+		reg = <0x1a>;
+		#sound-dai-cells = <0>;
+		wlf,shared-lrclk;
+	};
+	seeed_plane_i2c@45 {
+		compatible = "seeed_panel";
+		reg = <0x45>;
+	};
+
 };
 
 &i2c2 {
@@ -131,13 +149,19 @@
 	i2c-sda-hold-time-ns = <300>;
 	i2c-sda-falling-time-ns = <500>;
 	i2c-scl-falling-time-ns = <500>;
-	scl-gpio = <&gpio 60 0>;
-	sda-gpio = <&gpio 59 0>;
+	scl-gpio = <&gpio 60 GPIO_ACTIVE_HIGH>;
+	sda-gpio = <&gpio 59 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 
 	seeed_plane_i2c@45 {
 		compatible = "seeed_panel";
 		reg = <0x45>;
+
+		port {
+			panel_dsi_port: endpoint {
+				remote-endpoint = <&dsi_out_port>;
+			};
+		};
 	};
 };
 
@@ -463,3 +487,9 @@
 	dr_mode = "host";
 	status = "okay";
 };
+
+/* #include "codecs/sf_pdm.dtsi" */
+/* #include "codecs/sf_spdif.dtsi" */
+/* #include "codecs/sf_ac108.dtsi" */
+/* #include "codecs/sf_wm8960.dtsi" */
+/* #include "codecs/sf_vad.dtsi" */

+ 148 - 0
arch/riscv/dts/jh7100.dtsi

@@ -2,6 +2,7 @@
 /* Copyright (c) 2021 StarFive Technology Co., Ltd. */
 
 /dts-v1/;
+#include "starfive_vic7100_clk.dtsi"
 #include <dt-bindings/clock/starfive-jh7100.h>
 #include <dt-bindings/starfive_fb.h>
 
@@ -225,6 +226,7 @@
 			snps,priority = <0 1 2 3>;
 			snps,axi-max-burst-len = <128>;
 			status = "okay";
+			dma-coherent;
 		};
 
 		dma1p: dma-controller@10500000 {
@@ -622,5 +624,151 @@
 			fuse-count = <0x200>;
 			clocks = <&clkgen JH7100_CLK_OTP_APB>;
 		};
+
+		i2sadc0: i2sadc0@10400000 {
+			compatible = "snps,designware-i2sadc0";
+			reg = <0x0 0x10400000 0x0 0x1000>;
+			interrupt-parent = <&plic>;
+			/* interrupts = <59>; */
+			/* interrupt-names = "rx"; */
+			clocks = <&apb1clk>;
+			clock-names = "i2sclk";
+			#sound-dai-cells = <0>;
+			dmas = <&dma2p 28>;
+			dma-names = "rx";
+		};
+		
+		i2svad: i2svad@10420000 {
+			compatible = "sf,sf-i2svad";
+			reg = <0x0 0x10420000 0x0 0x1000> ;
+			interrupt-parent = <&plic>;
+			interrupts = <60>, <61>;
+			interrupt-names = "spintr", "slintr";
+			clocks = <&apb1clk>;
+			clock-names = "i2sclk";
+			#sound-dai-cells = <0>;
+		};
+
+		i2sdac0: i2sdac0@10450000 {
+			compatible = "snps,designware-i2sdac0";
+			reg = <0x0 0x10450000 0x0 0x1000>;
+			interrupt-parent = <&plic>;
+			/*interrupts = <64>; */
+			/*interrupt-names = "tx";*/
+			clocks = <&apb1clk>;
+			clock-names = "i2sclk";
+			#sound-dai-cells = <0>;
+			dmas = <&dma2p 30>;
+			dma-names = "tx";
+		};
+		
+		i2sdac1: i2sdac1@10460000 {
+			compatible = "snps,designware-i2sdac1";
+			reg = <0x0 0x10460000 0x0 0x1000>;
+			interrupt-parent = <&plic>;
+			/*interrupts = <66>;*/
+			/*interrupt-names = "tx";*/
+			clocks = <&apb1clk>;
+			clock-names = "i2sclk";
+			#sound-dai-cells = <0>;
+			dmas = <&dma2p 31>;
+			dma-names = "tx";
+		};
+
+		i2sdac16k: i2sdac16k@10470000 {
+			compatible = "snps,designware-i2sdac16k";
+			reg = <0x0 0x10470000 0x0 0x1000>;
+			interrupt-parent = <&plic>;
+			/* interrupts = <68>; */
+			/* interrupt-names = "tx"; */
+			clocks = <&apb1clk>;
+			clock-names = "i2sclk";
+			#sound-dai-cells = <0>;
+			dmas = <&dma2p 29>;
+			dma-names = "tx";
+		};
+
+		spdif0: spdif0@10430000 {
+			compatible = "starfive,sf-spdif";
+			reg = <0x0 0x10430000 0x0 0x1000>;
+			interrupt-parent = <&plic>;
+			interrupts = <62>;
+			interrupt-names = "tx";
+			clocks = <&audioclk>;
+			clock-names = "audioclk";
+			#sound-dai-cells = <0>;
+		};
+
+		pdm: pdm@10410000 {
+			compatible = "starfive,sf-pdm";
+			reg = <0x0 0x10410000 0x0 0x1000>, <0x0 0x10480000 0x0 0x1000>;
+			reg-names = "pdm", "audio-clk";
+			clocks = <&audioclk>;
+			clock-names = "audioclk";
+			#sound-dai-cells = <0>;
+		};
+	
+		ac108_mclk: ac108_mclk {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <24576000>;
+		};
+		
+		wm8960_mclk: wm8960_mclk {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <24576000>;
+		};
+
+		spdif_transmitter: spdif_transmitter {
+			compatible = "linux,spdif-dit";
+			#sound-dai-cells = <0>;
+		};	
+		
+		spdif_receiver: spdif_receiver {
+			compatible = "linux,spdif-dir";
+			#sound-dai-cells = <0>;
+		};
+		
+		pwmdac: pwmdac@10440000 {
+			compatible = "sf,pwmdac";
+			reg = <0x0 0x10440000 0x0 0x1000>;
+			clocks = <&apb1clk>;
+			dmas = <&dma2p 23>;
+			dma-names = "tx";
+			#sound-dai-cells = <0>;
+		};
+		
+		pwmdac_codec: pwmdac-transmitter {
+			compatible = "linux,pwmdac-dit";
+			#sound-dai-cells = <0>;
+		};
+		
+		dmic_codec: dmic_codec { 
+			compatible = "dmic-codec";
+			#sound-dai-cells = <0>;
+		}; 
+
+		sound:snd-card{
+			compatible = "simple-audio-card";
+			simple-audio-card,name = "Starfive-Multi-Sound-Card";
+			
+			/* pwmdac */
+			simple-audio-card,dai-link@0 {
+				reg = <0>;
+				status = "okay";
+				format = "left_j";
+				bitclock-master = <&sndcpu0>;
+				frame-master = <&sndcpu0>;
+				
+				sndcpu0: cpu {
+					sound-dai = <&pwmdac>;
+				};
+
+				codec {
+					sound-dai = <&pwmdac_codec>;
+				};
+			};
+		};
 	};
 };

+ 5 - 1
arch/riscv/dts/starfive_jh7100_clk.dtsi

@@ -108,5 +108,9 @@
 		compatible = "fixed-clock";
 		clock-frequency = <125000000>;
 	};
-
+	audioclk: audioclk {
+		#clock-cells = <0>;
+		compatible = "fixed-clock";
+		clock-frequency = <12288000>;
+	};
 };

+ 1 - 1
arch/riscv/dts/starfive_jh7100_starlight.dts

@@ -438,7 +438,7 @@
 			clocks = <&vpuclk>;
 			clock-names = "vcodec";
 			status = "okay";
-	};
+		};
 
 		vpu_enc:vpu_enc@118E0000 {
 			compatible = "cm,cm521-vpu";

+ 13 - 0
arch/riscv/include/asm/arch-jh7100/vad.h

@@ -38,6 +38,19 @@
 #define SCFG_vad_i2s_ctrl_REG_ADDR   (I2S_VAD_BASE_ADDR + 0x884)
 #define VAD_AIX_MEM_ADDR             (0x701F0000)
 
+#define  _SET_SYSCON_REG_SCFG_ctrl_i2sadc_enable { \
+	uint32_t value = MA_INW(VAD_SW); \
+	value &= ~(1<<1); \
+	value |= (1<<1); \
+	MA_OUTW(VAD_SW, value); \
+}
+	
+#define _SET_SYSCON_REG_SCFG_ctrl_i2sadc_disable { \
+	uint32_t value = MA_INW(VAD_SW); \
+	value &= ~(1<<1); \
+	MA_OUTW(VAD_SW, value); \
+}
+
 #define _SET_SYSCON_REG_SCFG_aon_i2s_ctrl_adci2s_d0_sel(v) { \
 	uint32_t _ezchip_macro_read_value_=MA_INW(SCFG_vad_i2s_ctrl_REG_ADDR); \
 	_ezchip_macro_read_value_ &= ~(0x7); \

+ 266 - 27
board/starfive/jh7100/jh7100.c

@@ -36,6 +36,14 @@
 #include <asm/arch/vad.h>
 #include <asm/arch/syscon_remap_vp6_noc_macro.h>
 #include <asm/arch/syscon_iopad_ctrl_macro.h>
+#include <asm/arch/jh_audio_mode.h>
+
+#define STARFIVE_AUDIO_AC108	0
+#define STARFIVE_AUDIO_WM8960	0
+#define STARFIVE_AUDIO_VAD		0
+#define STARFIVE_AUDIO_PWMDAC	1
+#define STARFIVE_AUDIO_SPDIF	0
+#define STARFIVE_AUDIO_PDM		0
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -296,12 +304,12 @@ INIT_FUNC_DEF(gmac)
 	udelay(1000);
 	SET_GPIO_25_dout_HIGH;
 #elif defined(CONFIG_JH_STARLIGHT)
-	SET_GPIO_45_doen_LOW;
-	SET_GPIO_45_dout_HIGH;
-	udelay(1000);
-	SET_GPIO_45_dout_LOW;
-	udelay(1000);
-	SET_GPIO_45_dout_HIGH;
+	//SET_GPIO_45_doen_LOW;
+	//SET_GPIO_45_dout_HIGH;
+	//udelay(1000);
+	//SET_GPIO_45_dout_LOW;
+	//udelay(1000);
+	//SET_GPIO_45_dout_HIGH;
 #endif
 
 	_SET_SYSCON_REG_register28_SCFG_gmac_phy_intf_sel(0x1);//rgmii
@@ -372,9 +380,22 @@ INIT_FUNC_DEF(i2srx_3ch)
 
 INIT_FUNC_DEF(pdm)
 {
+    _DIVIDE_CLOCK_clk_audio_root_(2);
+    _DIVIDE_CLOCK_clk_audio_div_(0x4528);
+	_ASSERT_RESET_audio_rst_gen_rstn_apb_pdm_;  
+	_DIVIDE_CLOCK_clk_pdm_mclk_(6); 
+    _SWITCH_CLOCK_clk_pdm_mclk_SOURCE_clk_audio_src_;   
+	//_SWITCH_CLOCK_clk_pdm_mclk_SOURCE_clk_audio_12288_;
 	_ENABLE_CLOCK_clk_apb_pdm_;
 	_ENABLE_CLOCK_clk_pdm_mclk_;
 	_CLEAR_RESET_audio_rst_gen_rstn_apb_pdm_;
+
+	SET_GPIO_46_dout_dmic_clk_out;  
+	SET_GPIO_46_doen_LOW;
+	SET_GPIO_dmic_sdin_bit0(44);
+	SET_GPIO_dmic_sdin_bit1(22);
+	SET_GPIO_44_doen_HIGH;
+	SET_GPIO_22_doen_HIGH;  
 }
 
 INIT_FUNC_DEF(i2svad)
@@ -384,33 +405,144 @@ INIT_FUNC_DEF(i2svad)
 	_CLEAR_RESET_audio_rst_gen_rstn_i2svad_srst_ ;
 }
 
+
+INIT_FUNC_DEF(pmd2vad)
+{
+    _SET_SYSCON_REG_SCFG_sram_config0_vad(0);
+	
+	_ENABLE_CLOCK_clk_adc_mclk_;	
+	_ENABLE_CLOCK_clk_apb_i2svad_;	 
+	_CLEAR_RESET_audio_rst_gen_rstn_apb_i2svad_; 
+	_CLEAR_RESET_audio_rst_gen_rstn_i2svad_srst_;	 
+	
+	_SET_SYSCON_REG_SCFG_ctrl_i2sadc_enable;
+	_SET_SYSCON_REG_SCFG_aon_i2s_ctrl_adci2s_d0_sel(AUDIO_IN_PDM_SD0);
+
+	_DIVIDE_CLOCK_clk_adc_mclk_(0x3);
+	_SWITCH_CLOCK_clk_adc_mclk_SOURCE_clk_audio_src_;
+	_DIVIDE_CLOCK_clk_i2sadc_bclk_(0x8);
+	_SWITCH_CLOCK_clk_i2sadc_bclk_SOURCE_clk_adc_mclk_;
+	_DIVIDE_CLOCK_clk_i2sadc_lrclk_(0x20);
+	_SWITCH_CLOCK_clk_i2sadc_lrclk_SOURCE_clk_i2sadc_bclk_n_;
+
+    _ENABLE_CLOCK_clk_apb_i2sadc_;  
+    _CLEAR_RESET_audio_rst_gen_rstn_apb_i2sadc_;    
+    _CLEAR_RESET_audio_rst_gen_rstn_i2sadc_srst_;   
+	_SWITCH_CLOCK_clk_vad_mem_SOURCE_clk_i2svad_bclk_;
+}
+
+
+
 INIT_FUNC_DEF(spdif)
 {
-	_ENABLE_CLOCK_clk_spdif_;
-	_ENABLE_CLOCK_clk_apb_spdif_;
-	_CLEAR_RESET_audio_rst_gen_rstn_apb_spdif_;
+    _DIVIDE_CLOCK_clk_audio_root_(2);
+    _DIVIDE_CLOCK_clk_audio_div_(0x4528);
+    _ENABLE_CLOCK_clk_apb_spdif_;
+	_SWITCH_CLOCK_clk_spdif_SOURCE_clk_audio_src_;
+	//_SWITCH_CLOCK_clk_spdif_SOURCE_clk_audio_12288_;
+    _ENABLE_CLOCK_clk_spdif_;
+	_DIVIDE_CLOCK_clk_spdif_(1);
+    _CLEAR_RESET_audio_rst_gen_rstn_apb_spdif_;
+
+	//tx
+	#if 1
+	SET_GPIO_46_dout_spdif_tx_sdout;
+    SET_GPIO_46_doen_LOW;
+	#else
+	//rx
+	_SET_SYSCON_REG_SCFG_sram_config0_spdif(0x17);
+    SET_GPIO_spdif_rx_sdin(46);
+	#endif
 }
 
 INIT_FUNC_DEF(pwmdac)
 {
-	_ENABLE_CLOCK_clk_apb_pwmdac_;
-	_CLEAR_RESET_audio_rst_gen_rstn_apb_pwmdac_;
+	#if 1
+	/* audio src clk */
+	_DIVIDE_CLOCK_clk_audio_root_(2); //500M
+	_DIVIDE_CLOCK_clk_audio_div_(0x4528); // 500M/12.28M =40.69 :0x4528 out:12.28M
+
+    _ASSERT_RESET_audio_rst_gen_rstn_apb_pwmdac_;   
+	_DISABLE_CLOCK_clk_apb_pwmdac_; 
+	
+ 	_DIVIDE_CLOCK_clk_dac_mclk_(3); //out:4M
+	_SWITCH_CLOCK_clk_dac_mclk_SOURCE_clk_audio_src_; 
+	_ENABLE_CLOCK_clk_dac_mclk_;	
+	_ENABLE_CLOCK_clk_apb_pwmdac_;	
+	_CLEAR_RESET_audio_rst_gen_rstn_apb_pwmdac_;	
+	#else
+	/* pwmdac reset and clkgen */
+	_SWITCH_CLOCK_clk_dac_mclk_SOURCE_clk_audio_12288_; 
+	_DIVIDE_CLOCK_clk_dac_mclk_(3); //out :4M
+	_ENABLE_CLOCK_clk_dac_mclk_;		
+	_ENABLE_CLOCK_clk_apb_pwmdac_;	
+	_CLEAR_RESET_audio_rst_gen_rstn_apb_pwmdac_;	
+	#endif
+	
+    SET_GPIO_23_dout_pwmdac_left_out;  
+	SET_GPIO_23_doen_LOW;
+
+    SET_GPIO_24_dout_pwmdac_right_out;   
+	SET_GPIO_24_doen_LOW;
 }
 
 INIT_FUNC_DEF(i2sdac0)
 {
-	_ENABLE_CLOCK_clk_dac_mclk_;
-	_ENABLE_CLOCK_clk_apb_i2sdac_;
-	_CLEAR_RESET_audio_rst_gen_rstn_apb_i2sdac_;
-	_CLEAR_RESET_audio_rst_gen_rstn_i2sdac_srst_;
+    _ENABLE_CLOCK_clk_dac_mclk_;    
+	_SWITCH_CLOCK_clk_i2sdac_bclk_SOURCE_clk_dac_mclk_;
+	_DIVIDE_CLOCK_clk_i2sdac_bclk_(1);
+	
+	_SWITCH_CLOCK_clk_i2sdac_lrclk_SOURCE_clk_i2sdac_bclk_n_;
+	_DIVIDE_CLOCK_clk_i2sdac_lrclk_(1);
+	
+    _ENABLE_CLOCK_clk_apb_i2sdac_;   
+    _CLEAR_RESET_audio_rst_gen_rstn_apb_i2sdac_;    
+    _CLEAR_RESET_audio_rst_gen_rstn_i2sdac_srst_; 
+	
+	//for wm8960  i2sdac0
+	SET_GPIO_i2stx_bclk_in(45);
+	SET_GPIO_45_doen_HIGH;
+
+    SET_GPIO_i2stx_lrck_in(3);   
+	SET_GPIO_3_doen_HIGH;
+
+	SET_GPIO_0_dout_i2stx_sdout0;
+	SET_GPIO_0_doen_LOW;
+	
+	_SWITCH_CLOCK_clk_i2sdac_bclk_SOURCE_clk_i2sdac_bclk_iopad_;
+	_SWITCH_CLOCK_clk_i2sdac_lrclk_SOURCE_clk_i2sdac_lrclk_iopad_;
 }
 
 INIT_FUNC_DEF(i2sdac1)
 {
-	_ENABLE_CLOCK_clk_i2s1_mclk_;
-	_ENABLE_CLOCK_clk_apb_i2s1_;
-	_CLEAR_RESET_audio_rst_gen_rstn_apb_i2s1_;
-	_CLEAR_RESET_audio_rst_gen_rstn_i2s1_srst_;
+	//vic_i2s1_reset_clk_enable;
+    _SWITCH_CLOCK_clk_i2s1_mclk_SOURCE_clk_audio_12288_;    
+    _ENABLE_CLOCK_clk_i2s1_mclk_;   
+    _DIVIDE_CLOCK_clk_i2s1_mclk_(3); //16k
+	
+    _SWITCH_CLOCK_clk_i2s1_bclk_SOURCE_clk_i2s1_mclk_;  
+    _DIVIDE_CLOCK_clk_i2s1_bclk_(1); 
+	
+    _SWITCH_CLOCK_clk_i2s1_lrclk_SOURCE_clk_i2s1_bclk_; 
+    _DIVIDE_CLOCK_clk_i2s1_lrclk_(1); 
+	
+    _ENABLE_CLOCK_clk_apb_i2s1_;
+    _CLEAR_RESET_audio_rst_gen_rstn_apb_i2s1_;
+    _CLEAR_RESET_audio_rst_gen_rstn_i2s1_srst_;
+	
+	//for wm8960  i2sdac1
+	SET_GPIO_i2stx_bclk_in(45);
+	SET_GPIO_45_doen_HIGH;
+
+    SET_GPIO_i2stx_lrck_in(3);   
+	SET_GPIO_3_doen_HIGH;
+
+	SET_GPIO_0_dout_i2stx_sdout1;
+	SET_GPIO_0_doen_LOW;
+	
+	_SWITCH_CLOCK_clk_i2s1_bclk_SOURCE_clk_i2sdac_bclk_iopad_;
+	_SWITCH_CLOCK_clk_i2s1_lrclk_SOURCE_clk_i2sdac_lrclk_iopad_;
+	
 }
 
 INIT_FUNC_DEF(i2sdac16k)
@@ -420,6 +552,33 @@ INIT_FUNC_DEF(i2sdac16k)
 	_CLEAR_RESET_audio_rst_gen_rstn_i2sdac16k_srst_;
 }
 
+INIT_FUNC_DEF(pdm2i2s)
+{
+	_SWITCH_CLOCK_clk_adc_mclk_SOURCE_clk_audio_src_;
+	_DIVIDE_CLOCK_clk_adc_mclk_(4);//3M
+
+	_DIVIDE_CLOCK_clk_i2sadc_bclk_(2);
+	_SWITCH_CLOCK_clk_i2sadc_bclk_SOURCE_clk_adc_mclk_;
+	_DIVIDE_CLOCK_clk_i2sadc_lrclk_(32);
+	_SWITCH_CLOCK_clk_i2sadc_lrclk_SOURCE_clk_i2sadc_bclk_n_;
+
+	_SET_SYSCON_REG_SCFG_ctrl_i2sadc_enable;
+	_SET_SYSCON_REG_SCFG_aon_i2s_ctrl_adci2s_d0_sel(AUDIO_IN_PDM_SD0);
+}
+
+INIT_FUNC_DEF(i2sgpiorx)
+{
+	_DIVIDE_CLOCK_clk_i2sadc_bclk_(1);
+	_DIVIDE_CLOCK_clk_i2sadc_lrclk_(1);
+	_SWITCH_CLOCK_clk_i2sadc_bclk_SOURCE_clk_i2sadc_bclk_iopad_;
+	_SWITCH_CLOCK_clk_i2sadc_lrclk_SOURCE_clk_i2sadc_lrclk_iopad_;
+
+	_SET_SYSCON_REG_SCFG_ctrl_i2sadc_enable;
+
+	_SET_SYSCON_REG_SCFG_aon_i2s_ctrl_adci2s_d0_sel(AUDIO_IN_SPIO_SD0);
+}
+
+
 INIT_FUNC_DEF(usb)
 {
 #if !defined(CONFIG_JH_STARLIGHT)
@@ -466,8 +625,11 @@ INIT_FUNC_DEF(usb)
 
 INIT_FUNC_DEF(sgdma1p)
 {
+	_CLEAR_RESET_audio_rst_gen_rstn_apb_bus_;
 	_ENABLE_CLOCK_clk_sgdma1p_axi_;
+	_ENABLE_CLOCK_clk_dma1p_ahb_;
 	_CLEAR_RESET_rstgen_rstn_sgdma1p_axi_;
+	_CLEAR_RESET_audio_rst_gen_rstn_dma1p_ahb_;
 }
 
 /* disable, when we don't realy use it */
@@ -492,6 +654,8 @@ INIT_FUNC_DEF(sgdma2p)
 	_CLEAR_RESET_rstgen_rstn_sgdma2p_ahb_;
 	_CLEAR_RESET_rstgen_rstn_sgdma2p_axi_;
 	_CLEAR_RESET_rstgen_rstn_dma2pnoc_aix_;
+
+	_SET_SYSCON_REG_register26_SCFG_dma1p2p_sel(0xFFFFFFFF);
 }
 
 INIT_FUNC_DEF(sdio0)
@@ -1063,6 +1227,86 @@ INIT_FUNC_DEF(dsitx)
 
 }
 
+int board_ac108_init(void)
+{
+	INIT_FUNC_CALL(i2srx_3ch);
+	INIT_FUNC_CALL(i2svad);
+
+	SET_GPIO_i2srx_bclk_in(45);
+	SET_GPIO_45_doen_HIGH;
+	#if 0
+	SET_GPIO_i2srx_lrck_in(6);
+	SET_GPIO_6_doen_HIGH;
+	SET_GPIO_i2srx_sdin_bit0(8);
+	SET_GPIO_8_doen_HIGH;
+	#else
+	SET_GPIO_i2srx_lrck_in(3);
+	SET_GPIO_3_doen_HIGH;
+	SET_GPIO_i2srx_sdin_bit0(2);
+	SET_GPIO_2_doen_HIGH;
+	#endif
+
+	INIT_FUNC_CALL(i2sgpiorx);
+}
+
+int board_wm8960_init(void)
+{
+	INIT_FUNC_CALL(i2srx_3ch);
+	INIT_FUNC_CALL(i2svad);
+	INIT_FUNC_CALL(i2sdac0);
+	//INIT_FUNC_CALL(i2sdac1);
+
+	SET_GPIO_i2srx_bclk_in(45);	
+	SET_GPIO_45_doen_HIGH;
+	SET_GPIO_i2srx_lrck_in(3);
+	SET_GPIO_3_doen_HIGH;
+	SET_GPIO_i2srx_sdin_bit0(2);
+	SET_GPIO_2_doen_HIGH;
+
+	INIT_FUNC_CALL(i2sgpiorx);
+}
+
+int board_vad_init(void)
+{
+	INIT_FUNC_CALL(pdm);
+	INIT_FUNC_CALL(pmd2vad);
+}
+
+int board_pwmdac_init(void)
+{
+	INIT_FUNC_CALL(pwmdac);
+}
+
+int board_spdif_init(void)
+{
+	INIT_FUNC_CALL(spdif);
+}
+
+int board_pdm_init(void)
+{
+	INIT_FUNC_CALL(i2srx_3ch);
+	INIT_FUNC_CALL(pdm);
+	INIT_FUNC_CALL(i2svad);
+	INIT_FUNC_CALL(pdm2i2s);
+}
+
+int board_audio_init(void)
+{
+	#if STARFIVE_AUDIO_AC108
+	board_ac108_init();
+	#elif STARFIVE_AUDIO_WM8960
+	board_wm8960_init();
+	#elif STARFIVE_AUDIO_VAD
+	board_vad_init();
+	#elif STARFIVE_AUDIO_SPDIF
+	board_spdif_init();
+	#elif STARFIVE_AUDIO_PDM
+	board_pdm_init();
+	#endif
+
+	board_pwmdac_init();
+}
+
 /*init system GPIO*/
 int board_hw_init(void)
 {
@@ -1081,14 +1325,9 @@ int board_hw_init(void)
 //	INIT_FUNC_CALL(syscon);
 	INIT_FUNC_CALL(gpio);
 	INIT_FUNC_CALL(audio_subsys);
-	INIT_FUNC_CALL(i2srx_3ch);
-	INIT_FUNC_CALL(pdm);
-	INIT_FUNC_CALL(i2svad);
-	INIT_FUNC_CALL(spdif);
-	INIT_FUNC_CALL(pwmdac);
-	INIT_FUNC_CALL(i2sdac0);
-	INIT_FUNC_CALL(i2sdac1);
-	INIT_FUNC_CALL(i2sdac16k);
+
+	board_audio_init();
+
 	INIT_FUNC_CALL(usb);
 	INIT_FUNC_CALL(sgdma1p);
 //	INIT_FUNC_CALL(qspi);