Browse Source

support i2s, pwmdac, pdm, i2svad and spdif.

michael.yan 2 years ago
parent
commit
ab564b359a

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

@@ -0,0 +1,18 @@
+&sound {
+	compatible = "simple-audio-card";
+	simple-audio-card,format = "i2s";
+	simple-audio-card,name = "sf-ac108-voicecard"; 
+	simple-audio-card,bitclock-master = <&dailink0_master>;
+	simple-audio-card,frame-master = <&dailink0_master>;
+	simple-audio-card,codec-clock-rate = <12288000>;
+	status = "okay";
+	
+	simple-audio-card,cpu {
+		sound-dai = <&i2sadc0>;
+	};
+	dailink0_master:simple-audio-card,codec {
+		sound-dai = <&ac108_a>;
+		clocks = <&ac108_mclk>;
+		clock-names = "mclk";
+	};
+};

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

@@ -0,0 +1,18 @@
+&sound {
+	compatible = "simple-audio-card";
+	simple-audio-card,format = "i2s";
+	simple-audio-card,name = "SF-PDM-Sound-Card";
+	simple-audio-card,bitclock-master = <&dailink0_master>;
+	simple-audio-card,frame-master = <&dailink0_master>;
+	status = "okay";
+	
+	simple-audio-card,cpu {
+		sound-dai = <&i2sadc0>;
+	};
+	
+	dailink0_master:simple-audio-card,codec {
+		sound-dai = <&pdm>;
+	};
+};
+
+

+ 14 - 0
arch/riscv/dts/codecs/sf_pwmdac.dtsi

@@ -0,0 +1,14 @@
+&sound {
+	compatible = "simple-audio-card";
+	simple-audio-card,name = "SF-PWMDAC-Sound-Card";
+	simple-audio-card,bitclock-master = <&dailink0_master>;
+	simple-audio-card,frame-master = <&dailink0_master>;
+	simple-audio-card,format = "left_j";
+	dailink0_master:simple-audio-card,cpu {
+		sound-dai = <&pwmdac>;
+	};
+
+	simple-audio-card,codec {
+		sound-dai = <&codec>;
+	};
+};

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

@@ -0,0 +1,14 @@
+&sound {
+	compatible = "simple-audio-card";
+	simple-audio-card,name = "SF-SPDIF-Sound-Card";
+	simple-audio-card,bitclock-master = <&dailink0_master>;
+	simple-audio-card,frame-master = <&dailink0_master>;
+	simple-audio-card,format = "left_j";
+	dailink0_master:simple-audio-card,cpu {
+		sound-dai = <&spdif0>;
+	};
+
+	simple-audio-card,codec {
+		sound-dai = <&spdif_transmitter>;
+	};
+};

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

@@ -0,0 +1,18 @@
+&sound {
+	compatible = "simple-audio-card";
+	simple-audio-card,format = "i2s";
+	simple-audio-card,name = "SF-VAD-Sound-Card";
+	simple-audio-card,bitclock-master = <&dailink0_master>;
+	simple-audio-card,frame-master = <&dailink0_master>;
+	status = "okay";
+	
+	simple-audio-card,cpu {
+		sound-dai = <&i2svad>;
+	};
+	
+	dailink0_master:simple-audio-card,codec {
+		sound-dai = <&pdm>;
+	};
+};
+
+

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

@@ -0,0 +1,36 @@
+&sound{
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,name = "seeed-2mic-voicecard"; 
+		simple-audio-card,bitclock-master = <&dailink0_master>;
+		simple-audio-card,frame-master = <&dailink0_master>;
+		simple-audio-card,codec-clock-rate = <12288000>;
+		status = "okay";
+		simple-audio-card,widgets =
+				"Microphone", "Mic Jack",
+				"Line", "Line In",
+				"Line", "Line Out",
+				"Speaker", "Speaker",
+				"Headphone", "Headphone Jack";
+		simple-audio-card,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";
+		simple-audio-card,cpu0 {
+                sound-dai = <&i2sdac0>;
+            };
+            cpu1 {
+                sound-dai = <&i2sadc0>;
+            };
+
+		dailink0_master:simple-audio-card,codec {
+			sound-dai = <&wm8960>;
+			clocks = <&wm8960_mclk>;
+			clock-names = "mclk";
+		};
+    };

+ 5 - 0
arch/riscv/dts/starfive_vic7100_clk.dtsi

@@ -90,4 +90,9 @@
             compatible = "fixed-clock";
             clock-frequency = <50000000>;
 	};
+	audioclk: audioclk {
+            #clock-cells = <0>;
+            compatible = "fixed-clock";
+            clock-frequency = <12288000>;
+        };
 };

+ 148 - 0
arch/riscv/dts/starfive_vic7100_evb.dts

@@ -326,6 +326,21 @@
 			i2c-sda-hold-time-ns = <300>;
 			i2c-sda-falling-time-ns = <100>;
 			i2c-scl-falling-time-ns = <100>;
+			
+			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;
+			};
 		};
 
 		i2c2: i2c@12450000 {
@@ -654,6 +669,139 @@
 			csi-height = <1080>;
 			csi-dt = <0x2b>;
 		};
+		
+		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>;
+		};
+		
+		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 = "sf-audio-card";
+		};
 	};
 };
 #include "tda998x_1080p.dtsi"
+/* #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" */

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

@@ -35,6 +35,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 - 24
board/starfive/vic7100/vic7100.c

@@ -33,6 +33,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/vic_audio_mode.h>
+
+#define STARFIVE_AUDIO_AC108	0
+#define STARFIVE_AUDIO_WM8960	0
+#define STARFIVE_AUDIO_VAD		0
+#define STARFIVE_AUDIO_PWMDAC	0
+#define STARFIVE_AUDIO_SPDIF	1
+#define STARFIVE_AUDIO_PDM		0
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -285,12 +293,14 @@ INIT_FUNC_DEF(gmac)
 	_SET_SYSCON_REG_register101_SCFG_funcshare_pad_ctrl_69(0x00c000c0);
 	_SET_SYSCON_REG_register102_SCFG_funcshare_pad_ctrl_70(0x00c000c0);
 
+	#if 0
 	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
 
@@ -358,9 +368,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)
@@ -370,42 +393,180 @@ 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)
 {
-	_ENABLE_CLOCK_clk_apb_i2sdac16k_;
-	_CLEAR_RESET_audio_rst_gen_rstn_apb_i2sdac16k_;
-	_CLEAR_RESET_audio_rst_gen_rstn_i2sdac16k_srst_;
+    _ENABLE_CLOCK_clk_apb_i2sdac16k_;
+    _CLEAR_RESET_audio_rst_gen_rstn_apb_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)
 {
 	_ENABLE_CLOCK_clk_usb_axi_;
@@ -434,8 +595,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_;
 }
 
 INIT_FUNC_DEF(qspi)
@@ -458,6 +622,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)
@@ -873,6 +1039,87 @@ 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(i2svad);
+	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)
 {
@@ -889,14 +1136,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);