Przeglądaj źródła

优化声音驱动,添加i2s2支持

huangliang 3 lat temu
rodzic
commit
db08fadec4

+ 36 - 0
buildroot-external/board/arkmicro/ark1668e_devb/rootfs_overlay/etc/asound.conf

@@ -11,6 +11,19 @@ pcm.!dmix {
 #               rate 44100
         }
 }
+pcm.!dmix_beep {
+        type dmix
+        ipc_key 6789
+        ipc_key_add_uid yes
+        slave {
+                pcm "hw:0,2"
+#               period_time 0
+                period_size 1024
+                buffer_size 16384
+#               format S16_LE
+#               rate 44100
+        }
+}
 pcm.!dsnoop {
         type dsnoop
         ipc_key 5778
@@ -92,6 +105,19 @@ pcm.softvol4 {
     max_dB            -0.0 
     resolution        128                                                         
 }  
+pcm.softvol5 {
+    type            softvol
+    slave {
+        pcm         "dmix_beep"      #redirect the output to dmix (instead of "hw:0,0")
+    }
+    control {
+        name        "softmaster5"       #override the PCM slider to set the softvol volume level globally
+        card        0
+    }
+    min_dB            -51.0
+    max_dB            -0.0
+    resolution        128
+}
 pcm.asymed {
         type asym
         playback.pcm "softvol"
@@ -103,6 +129,16 @@ pcm.!default {
         slave.pcm "asymed"
 }
 
+pcm.asymed_beep {
+        type asym
+        playback.pcm "softvol5"
+}
+
+pcm.!playback_beep {
+        type plug
+        slave.pcm "asymed_beep"
+}
+
 ctl.mixer0 {
         type hw
         card 0

+ 21 - 0
linux/arch/arm/boot/dts/ark1668e-pinctrl.dtsi

@@ -257,6 +257,27 @@
 				<ARK_PBANK_1 15 ARK_PVAL_2>;	/* i2s1 sadata out */
 			group-mux = <0x204 12 1 0>;			/*i2s1 sadata out*/
 		};
+
+		pinctrl_i2s2dac_sync: i2s2-sync {
+			ark,pins =
+				<ARK_PBANK_4 14 ARK_PVAL_1>;		/* i2s2 sync */
+		};
+
+		pinctrl_i2s2dac_sadata_out: i2s2-sadata {
+			ark,pins =
+				<ARK_PBANK_4 15 ARK_PVAL_1>;		/* i2s2 sadata */
+			group-mux = <0x204 30 1 1>;			/* sadata out */
+		};
+
+		pinctrl_i2s2dac_mclk: i2s2-mclk {
+			ark,pins =
+				<ARK_PBANK_4 16 ARK_PVAL_1>;		/* i2s2 mclk */
+		};
+
+		pinctrl_i2s2dac_bclk: i2s2-bclk {
+			ark,pins =
+				<ARK_PBANK_4 17 ARK_PVAL_1>;	/* i2s2 bclk */
+		};
 	};
 
 	itu {

+ 11 - 0
linux/arch/arm/boot/dts/ark1668e.dtsi

@@ -552,6 +552,17 @@
 			#sound-dai-cells = <0>;
 		};
 
+		i2s2_dac: i2s2-dac@e4800000 {
+			compatible = "arkmicro,ark1668e-i2s";
+			reg = <0xe4800000 0x1000>;
+			interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+			nco-reg = <0xe4900178>;
+			dmas = <&dmac 23 1 0>, <&dmac 24 0 1>;
+			dma-names = "rx", "tx";
+			clocks = <&i2s2_dac_clk>;
+			#sound-dai-cells = <0>;
+		};
+
 		ark_codec: ark-adac@e4900000 {
 			compatible = "arkmicro,ark-audio-codec";
 			reg = <0xe4900000 0x1000>;

+ 27 - 9
linux/arch/arm/boot/dts/ark1668e_devb.dts

@@ -21,10 +21,10 @@
 				status = "okay";
 				compatible = "arkmicro,drv_bd37033";
 				reg = <0x40>;		/* i2c address(7 bit)*/
-				flout-gain = <65>;	/*min = 0 ;max = 95*/
-				frout-gain = <65>;	/*min = 0 ;max = 95*/
-				rlout-gain = <65>;	/*min = 0 ;max = 95*/
-				rrout-gain = <65>;	/*min = 0 ;max = 95*/
+				flout-gain = <80>;	/*min = 0 ;max = 95*/
+				frout-gain = <80>;	/*min = 0 ;max = 95*/
+				rlout-gain = <80>;	/*min = 0 ;max = 95*/
+				rrout-gain = <80>;	/*min = 0 ;max = 95*/
 				#sound-dai-cells = <0>;
 		};
 	};
@@ -122,9 +122,9 @@
 		simple-audio-card,aux-devs = <&amp>;
 
 		simple-audio-card,format = "i2s";
-		simple-audio-card,bitclock-master = <&dailink0_master>;
-		simple-audio-card,frame-master = <&dailink0_master>;
-		dailink0_master:simple-audio-card,cpu {
+		simple-audio-card,bitclock-master = <&cpu_master>;
+		simple-audio-card,frame-master = <&cpu_master>;
+		cpu_master:simple-audio-card,cpu {
 			sound-dai = <&i2s_dac>;
 		};
 		simple-audio-card,codec {
@@ -140,7 +140,7 @@
 				sound-dai = <&i2s_adc>;
 			};
 			capture_codec: codec {
-				sound-dai = <&cs5343_codec>;//External(ADC):es8316_codec , cs5343_codec  ; Internal:ark_codec
+				sound-dai = <&cs5343_codec>;//External(ADC):cs5343_codec  ; Internal:ark_codec
 			};
 		};
 
@@ -152,7 +152,19 @@
 				sound-dai = <&i2s_dac>;
 			};
 			playback_codec: codec {
-				sound-dai = <&ark_codec>;//External(DAC):es8316_codec ,cs4334_codec ; Internal:ark_codec
+				sound-dai = <&ark_codec>;//Internal:ark_codec
+			};
+		};
+
+		simple-audio-card,dai-link@2 {		/* I2S2 - dac */
+			format = "i2s";
+			bitclock-master = <&cpu_master>;
+			frame-master = <&cpu_master>;
+			cpu_master: cpu {
+				sound-dai = <&i2s2_dac>;
+			};
+			codec_master: codec {
+				sound-dai = <&cs4334_codec>;//External(DAC):cs4334_codec ;
 			};
 		};
 #endif
@@ -292,6 +304,12 @@
 	pinctrl-names = "default";
 };
 
+&i2s2_dac {
+	pinctrl-0 = <&pinctrl_i2s2dac_sync &pinctrl_i2s2dac_sadata_out
+					&pinctrl_i2s2dac_mclk &pinctrl_i2s2dac_bclk>;
+	pinctrl-names = "default";
+};
+
 &ethernet {
 	status = "okay";
 	phy-handle = <&eth_phy0>;

+ 42 - 9
linux/arch/arm/boot/dts/ark1668e_devb_emmc.dts

@@ -4,6 +4,7 @@
 #include "ark1668e-pinctrl.dtsi"
 
 //#define I2S_FULL_DUPLEX_CODEC_SUPPORT
+//#define DYNAMIC_TRACK_DISPLAY
 
 / {
 	i2c-gpio-0 {
@@ -20,10 +21,10 @@
 				status = "okay";
 				compatible = "arkmicro,drv_bd37033";
 				reg = <0x40>;		/* i2c address(7 bit)*/
-				flout-gain = <65>;	/*min = 0 ;max = 95*/
-				frout-gain = <65>;	/*min = 0 ;max = 95*/
-				rlout-gain = <65>;	/*min = 0 ;max = 95*/
-				rrout-gain = <65>;	/*min = 0 ;max = 95*/
+				flout-gain = <80>;	/*min = 0 ;max = 95*/
+				frout-gain = <80>;	/*min = 0 ;max = 95*/
+				rlout-gain = <80>;	/*min = 0 ;max = 95*/
+				rrout-gain = <80>;	/*min = 0 ;max = 95*/
 				#sound-dai-cells = <0>;
 		};
 	};
@@ -121,9 +122,9 @@
 		simple-audio-card,aux-devs = <&amp>;
 
 		simple-audio-card,format = "i2s";
-		simple-audio-card,bitclock-master = <&dailink0_master>;
-		simple-audio-card,frame-master = <&dailink0_master>;
-		dailink0_master:simple-audio-card,cpu {
+		simple-audio-card,bitclock-master = <&cpu_master>;
+		simple-audio-card,frame-master = <&cpu_master>;
+		cpu_master:simple-audio-card,cpu {
 			sound-dai = <&i2s_dac>;
 		};
 		simple-audio-card,codec {
@@ -139,7 +140,7 @@
 				sound-dai = <&i2s_adc>;
 			};
 			capture_codec: codec {
-				sound-dai = <&cs5343_codec>;//External(ADC):es8316_codec , cs5343_codec  ; Internal:ark_codec
+				sound-dai = <&cs5343_codec>;//External(ADC):cs5343_codec  ; Internal:ark_codec
 			};
 		};
 
@@ -151,7 +152,19 @@
 				sound-dai = <&i2s_dac>;
 			};
 			playback_codec: codec {
-				sound-dai = <&ark_codec>;//External(DAC):es8316_codec ,cs4334_codec ; Internal:ark_codec
+				sound-dai = <&ark_codec>;//Internal:ark_codec
+			};
+		};
+
+		simple-audio-card,dai-link@2 {		/* I2S2 - dac */
+			format = "i2s";
+			bitclock-master = <&cpu_master>;
+			frame-master = <&cpu_master>;
+			cpu_master: cpu {
+				sound-dai = <&i2s2_dac>;
+			};
+			codec_master: codec {
+				sound-dai = <&cs4334_codec>;//External(DAC):cs4334_codec ;
 			};
 		};
 #endif
@@ -163,9 +176,21 @@
 		interrupts = <1 IRQ_TYPE_EDGE_BOTH>;
 		detect-gpios = <&gportd 1 GPIO_ACTIVE_HIGH>;
 		debounce-detect = <0>;
+		mirror-config = <0>;   /* 0:no mirror; 1:level mirror; 2:vertical mirror; 3:vertical && level mirror; */
+#ifdef DYNAMIC_TRACK_DISPLAY
+		dynamic-track = <1>;
+#else
+		dynamic-track = <0>;
+#endif
 		reg = <0x5ea00000 0x400000>;
 	};
 
+#ifdef DYNAMIC_TRACK_DISPLAY
+	mcu_serial: mcu-serial@0 {
+        compatible = "arkmicro,ark-mcu-serial";
+    };
+#endif
+
 	adc {
         compatible = "arkmicro,ark1668e-adc";
         reg = <0xe4500000 0x1000
@@ -236,10 +261,12 @@
 	status = "okay";
 };
 
+#ifdef DYNAMIC_TRACK_DISPLAY
 &uart3 {
     use-in-kernel;
     use-for-mcu;
 };
+#endif
 
 &ituin {
 	status = "okay";
@@ -277,6 +304,12 @@
 	pinctrl-names = "default";
 };
 
+&i2s2_dac {
+	pinctrl-0 = <&pinctrl_i2s2dac_sync &pinctrl_i2s2dac_sadata_out
+					&pinctrl_i2s2dac_mclk &pinctrl_i2s2dac_bclk>;
+	pinctrl-names = "default";
+};
+
 &ethernet {
 	status = "okay";
 	phy-handle = <&eth_phy0>;

+ 5 - 4
linux/arch/arm/configs/ark1668e_devb_emmc_defconfig

@@ -217,8 +217,11 @@ CONFIG_SND=y
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC_ARK=y
 CONFIG_SND_SOC_ARK1668E_I2S=y
-CONFIG_SND_SOC_ARK1668E_INTERNAL_DAC=y
-CONFIG_SND_SOC_ARK1668E_INTERNAL_ADC=y
+CONFIG_SND_SOC_ARK1668E_INTERNAL_ADAC=y
+CONFIG_SND_SOC_BD37033=y
+CONFIG_SND_SOC_ES8316=y
+CONFIG_SND_SOC_CS4334=y
+CONFIG_SND_SOC_CS5343=y
 CONFIG_SND_SIMPLE_CARD=y
 # CONFIG_HID_GENERIC is not set
 CONFIG_USB=y
@@ -242,7 +245,6 @@ CONFIG_ARK_AXI_DMA=y
 CONFIG_STAGING=y
 CONFIG_ANDROID_LOGGER=y
 # CONFIG_IOMMU_SUPPORT is not set
-CONFIG_DISABLE_GET_MCU_DATA=y
 CONFIG_REVERSING_TRACK=y
 CONFIG_ARK_HX170DEC=y
 CONFIG_ARK_SCALE=y
@@ -263,7 +265,6 @@ CONFIG_NLS_UTF8=y
 # CONFIG_CRYPTO_ECHAINIV is not set
 CONFIG_CRYPTO_DEFLATE=y
 CONFIG_CRYPTO_LZO=y
-CONFIG_CRYPTO_CRC32C=y
 # CONFIG_CRYPTO_HW is not set
 CONFIG_XZ_DEC=y
 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7

+ 2 - 1
linux/sound/soc/arkmicro/BD37033.c

@@ -629,7 +629,8 @@ int bd37033_set_default(struct bd37033_data *bd)
 	if(mp.input_channel >= 0)
 		bd37033_set_stream(mp.input_channel);
 	else
-		bd37033_select_input_channel(bd,BD37033_INPUT_SELECTOR_D_SINGLE);	//default: navi
+		bd37033_select_input_channel(bd,BD37033_INPUT_SELECTOR_B_SINGLE);	//default: BD37033_INPUT_SELECTOR_D_SINGLE
+		//bd37033_select_input_channel(bd,BD37033_INPUT_SELECTOR_D_SINGLE);       //default: navi
 	
 	//set loudness f0
 	bd37033_mixing_setup(my_bd,BD37033_MIXING_LOUDNESS_F0_TYPE,1);	//1: 800HZ

+ 38 - 26
linux/sound/soc/arkmicro/ark1668e_audio_codec.c

@@ -13,17 +13,17 @@
 //Mute State
 #define MUTE_OFF		0
 #define MUTE_ON		1
-extern  int mute_status;
+extern int audio_codec_mode;
 
-#define ARKDAC_RATES \
+#define ARKADAC_RATES \
 	(SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
 	SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \
 	SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
 	SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 |SNDRV_PCM_RATE_8000)
 
-#define ARKDAC_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE)
+#define ARKADAC_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE)
 
-struct ark_sddac {
+struct ark_adac {
 	struct device *dev;
 	void __iomem *sys_base;//sys_base
 	unsigned int 	vol_l;
@@ -44,25 +44,25 @@ static const struct soc_enum mute_switch_enum =
  *	Mute setting
  *
  ***************************************************************************************************/
-static int get_lineout_mute_status(struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
+static int get_adac_mute_status(struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
 {
 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
-	struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
-	printk("get:lineout_pa_mute_status= %d\n",adac->mute_status);
+	struct ark_adac *adac = snd_soc_component_get_drvdata(component);
+	printk("get:dac_pa_mute_status= %d\n",adac->mute_status);
 	ucontrol->value.integer.value[0] = adac->mute_status;
 	return 0;
 }
 
-static int set_lineout_mute_status (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
+static int set_adac_mute_status (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
 {
 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
-	struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
+	struct ark_adac *adac = snd_soc_component_get_drvdata(component);
 	unsigned int mute;
 	int ret = -1;
 
 	unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_2);
 
-	printk("set:lineout_pa_mute_status= %ld\n",ucontrol->value.integer.value[0]);
+	printk("set:dac_pa_mute_status= %ld\n",ucontrol->value.integer.value[0]);
 	mute = ucontrol->value.integer.value[0];
 	
 	switch (mute)
@@ -92,7 +92,7 @@ static int set_lineout_mute_status (struct snd_kcontrol * kcontrol, struct snd_c
 static int ark_adac_get_l_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
 {
 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
-	struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
+	struct ark_adac *adac = snd_soc_component_get_drvdata(component);
 
 	ucontrol->value.integer.value[0] = adac->vol_l & 0x3f;
 	//printk("get_l_playback_volume = %ld\n",ucontrol->value.integer.value[0]);
@@ -102,7 +102,7 @@ static int ark_adac_get_l_playback_volume (struct snd_kcontrol * kcontrol, struc
 static int ark_adac_set_l_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
 {
 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
-	struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
+	struct ark_adac *adac = snd_soc_component_get_drvdata(component);
 	{
 		//lineout
 		unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
@@ -132,7 +132,7 @@ static int ark_adac_set_l_playback_volume (struct snd_kcontrol * kcontrol, struc
 static int ark_adac_get_r_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
 {
 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
-	struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
+	struct ark_adac *adac = snd_soc_component_get_drvdata(component);
 
 	ucontrol->value.integer.value[0] = adac->vol_r & 0x3f;
 	//printk("get_r_playback_volume = %ld\n",ucontrol->value.integer.value[0]);
@@ -142,14 +142,15 @@ static int ark_adac_get_r_playback_volume (struct snd_kcontrol * kcontrol, struc
 static int ark_adac_set_r_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
 {
 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
-	struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
+	struct ark_adac *adac = snd_soc_component_get_drvdata(component);
 	//unsigned int val = readl(dac->sys_base + rSYS_AUDIO_CFG_3);
 	//dac->vol_r = ucontrol->value.integer.value[0];
 	//printk("set_r_playback_volume = %d\n",dac->vol_r);
 	{
 		//lineout
-		unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
 		adac->vol_r = ucontrol->value.integer.value[0];
+		unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
+		//adac->vol_r = ucontrol->value.integer.value[0];
 		val &= ~DACR0_RVOL_MASK;
 		val |= DACR0_RVOL(adac->vol_r);
 		//printk("new_r_playback_volume = 0x%x\n",DACR0_RVOL(dac->vol_r));
@@ -175,8 +176,8 @@ static const struct snd_kcontrol_new  ark_adac_snd_controls[] = {
 			ark_adac_get_l_playback_volume, ark_adac_set_l_playback_volume),
 	SOC_SINGLE_EXT("DAC Right Playback Volume", 0, 0, 63, 0,
 			ark_adac_get_r_playback_volume, ark_adac_set_r_playback_volume),
-	SOC_ENUM_EXT("DAC PA Mute Control", mute_switch_enum,
-		get_lineout_mute_status, set_lineout_mute_status),
+	SOC_ENUM_EXT("LINEOUT PA Mute", mute_switch_enum,
+		get_adac_mute_status, set_adac_mute_status),
 };
 
 static const struct snd_soc_dapm_widget ark_adac_dapm_widgets[] = {
@@ -200,7 +201,7 @@ static int ark_adac_hw_params(struct snd_pcm_substream *substream,
 	struct snd_soc_dai *dai)
 {
 	unsigned int val;
-	struct ark_sddac *adac = snd_soc_dai_get_drvdata(dai);
+	struct ark_adac *adac = snd_soc_dai_get_drvdata(dai);
 
 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 		//printk(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>PLAYBACK\n");
@@ -262,21 +263,32 @@ static int ark_adac_hw_params(struct snd_pcm_substream *substream,
 			val &= ~(1<<0);//Slave
 
 		//val &= ~(0x3<<13);
+#if 1
 		val &= ~(1<<13);//0:RMICIN	1: RLINEIN
 		val &= ~(1<<14);//0:LMICIN	1:LLINEIN
+#else
+		val |= (1<<13)|(1<<14);//0:RMICIN	//0:RMICIN and LMICIN	1: RLINEIN and LLINEIN
+#endif
 		//val &= ~(1<<15);//
 		//val &= ~(1<<16);//
 		val &= ~(1<<21);
 		val &= ~(1<<22);
 		//val |=(0x3<<13)|(0x1<<9)|(0xf<<1);
 		val |=(0x1<<9)|(0xf<<1);
+
+		//val &= ~(0x3f<<23));//line-in volume gain right control
+		//val |= (0x1b<<23);//default:0dB
 		writel(val, adac->sys_base + rSYS_AUDIO_CFG_0);
 
 		val = readl(adac->sys_base + rSYS_AUDIO_CFG_1);
 		val &= ~(0xf<<6);
 		//val |= ((0x1<<7)|(0x1<<9));//L: Power-down mode	R:Normal mode			//for ksw only
 		//val |= ((0x1<<6)|(0x1<<8));//L:Normal mode			R: Power-down mode
-		val |= (0x5f<<19)|(0x5f<<12);//volume gain control
+		val &= ~((0x7f<<19)|(0x7f<<12));
+		val |= (0x5f<<19)|(0x5f<<12);//adc:digital volume gain control
+
+		//val &= ~(0x3f<<0));//line-in volume gain left control
+		//val |= (0x1b<<0);//default:0dB
 		writel(val, adac->sys_base + rSYS_AUDIO_CFG_1);
 
 		val = readl(adac->sys_base + rSYS_AUDIO_CFG_5);
@@ -301,7 +313,7 @@ static int ark_adac_set_dai_sysclk(struct snd_soc_dai *codec_dai,
 static int ark_adac_set_dai_fmt(struct snd_soc_dai *codec_dai,
 			       unsigned int fmt)
 {
-	struct ark_sddac *i2s = snd_soc_dai_get_drvdata(codec_dai);
+	struct ark_adac *i2s = snd_soc_dai_get_drvdata(codec_dai);
 	
 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 	case SND_SOC_DAIFMT_CBM_CFM:
@@ -334,15 +346,15 @@ static struct snd_soc_dai_driver ark_adac_dai = {
 			.stream_name 	= "Playback",
 			.channels_min	= 1,
 			.channels_max	= 2,
-			.rates			= ARKDAC_RATES,
-			.formats		= ARKDAC_FORMATS,
+			.rates			= ARKADAC_RATES,
+			.formats		= ARKADAC_FORMATS,
 	},
 	.capture = {
 		.stream_name = "Capture",
 		.channels_min = 1,
 		.channels_max = 2,
-		.rates = ARKDAC_RATES,
-		.formats = ARKDAC_FORMATS,
+		.rates = ARKADAC_RATES,
+		.formats = ARKADAC_FORMATS,
 	},
 	.ops 		= &ark_adac_dai_ops,
 };
@@ -363,7 +375,7 @@ static const struct snd_soc_component_driver ark_adac_component_driver = {
 
 static int ark_adac_probe(struct platform_device *pdev)
 {
-	struct ark_sddac *adac;
+	struct ark_adac *adac;
 	struct device *dev = &pdev->dev;
 	struct resource *res;
 	int ret;
@@ -406,7 +418,7 @@ err:
 
 static int ark_adac_remove(struct platform_device *pdev)
 {
-	struct ark_sddac *adac = dev_get_drvdata(&pdev->dev);
+	struct ark_adac *adac = dev_get_drvdata(&pdev->dev);
 
 	if (adac->sys_base)
 		iounmap(adac->sys_base);

+ 42 - 26
linux/sound/soc/arkmicro/ark1668e_i2s.c

@@ -19,7 +19,7 @@
 #define DRV_NAME	"ark1668e-i2s"
 
 //struct ark1668e_i2s1_data_in i2s_data;
-int master_status = SLAVE_ON;////only for junjie
+int audio_codec_mode= SLAVE_MODE;////only for junjie
 
 struct ark1668e_i2s_dev {
 	struct  device	*dev;
@@ -50,39 +50,54 @@ static int ark1668e_i2s_startup(
 	udelay(1);
 	writel(0, i2s->base + I2S_SACR0);
 
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-		/*i2s_regs_init*/
+	if(i2s->full_duplex_en){
 		sacr0 = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN;
-		if(i2s->full_duplex_en)
-			sacr0 |= SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN;
-		if (i2s->master)
-			sacr0 |=  SACR0_BCKD | SACR0_SYNCD;//ark1668e-i2s:Master mode
-		else
-			sacr0 &=  ~(SACR0_BCKD | SACR0_SYNCD);//ark1668e-i2s:slave mode
-		writel(sacr0, i2s->base + I2S_SACR0);
-
-		writel(SAIMR_TUR, i2s->base + I2S_SAIMR);
-		if(i2s->full_duplex_en)
-			writel(SAIMR_ROR, i2s->base + I2S_SAIMR);
-		writel(0x7f, i2s->base + I2S_SAICR);
-		writel(0, i2s->base + I2S_SAICR);
-	} else if(substream->stream == SNDRV_PCM_STREAM_CAPTURE){
-		/*i2s_regs_init*/
-		if(i2s->full_duplex_en)
-			sacr0 = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN;
 		sacr0 |= SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN;
+
 		if (i2s->master)
 			sacr0 |= SACR0_BCKD | SACR0_SYNCD;//ark1668e-i2s:Master mode
 		else
 			sacr0 &= ~(SACR0_BCKD | SACR0_SYNCD);//ark1668e-i2s:slave mode
 		writel(sacr0, i2s->base + I2S_SACR0);
-		if(i2s->full_duplex_en)
-			writel(SAIMR_TUR, i2s->base + I2S_SAIMR);
-		writel(SAIMR_ROR, i2s->base + I2S_SAIMR);
+		//if(i2s->full_duplex_en)
+		//	writel(SAIMR_TUR, i2s->base + I2S_SAIMR);
+		//writel(SAIMR_ROR, i2s->base + I2S_SAIMR);
 		writel(0x7f, i2s->base + I2S_SAICR);
 		writel(0, i2s->base + I2S_SAICR);
+	}else{
+		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+			/*i2s_regs_init*/
+			sacr0 = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN;
+			if(i2s->full_duplex_en)
+				sacr0 |= SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN;
+			if (i2s->master)
+				sacr0 |=  SACR0_BCKD | SACR0_SYNCD;//ark1668e-i2s:Master mode
+			else
+				sacr0 &=  ~(SACR0_BCKD | SACR0_SYNCD);//ark1668e-i2s:slave mode
+			writel(sacr0, i2s->base + I2S_SACR0);
+
+			//writel(SAIMR_TUR, i2s->base + I2S_SAIMR);
+			//if(i2s->full_duplex_en)
+			//	writel(SAIMR_ROR, i2s->base + I2S_SAIMR);
+			writel(0x7f, i2s->base + I2S_SAICR);
+			writel(0, i2s->base + I2S_SAICR);
+		} else if(substream->stream == SNDRV_PCM_STREAM_CAPTURE){
+			/*i2s_regs_init*/
+			if(i2s->full_duplex_en)
+				sacr0 = SACR0_TLFIRST | SACR0_CH_LOCK | SACR0_TFTH(15) | SACR0_TDMAEN;
+			sacr0 |= SACR0_RLFIRST | SACR0_CH_LOCK | SACR0_RFTH(16) | SACR0_RDMAEN;
+			if (i2s->master)
+				sacr0 |= SACR0_BCKD | SACR0_SYNCD;//ark1668e-i2s:Master mode
+			else
+				sacr0 &= ~(SACR0_BCKD | SACR0_SYNCD);//ark1668e-i2s:slave mode
+			writel(sacr0, i2s->base + I2S_SACR0);
+			//if(i2s->full_duplex_en)
+			//	writel(SAIMR_TUR, i2s->base + I2S_SAIMR);
+			//writel(SAIMR_ROR, i2s->base + I2S_SAIMR);
+			writel(0x7f, i2s->base + I2S_SAICR);
+			writel(0, i2s->base + I2S_SAICR);
+		}
 	}
-
 	udelay(1);
 	sacr0 &= ~SACR0_CH_LOCK;
 	writel(sacr0, i2s->base + I2S_SACR0);
@@ -159,7 +174,7 @@ static int ark1668e_i2s_trigger(
 		writel(readl(i2s->base + I2S_SACR0) | SACR0_ENB, i2s->base + I2S_SACR0);
 		break;
 	case SNDRV_PCM_TRIGGER_STOP:
-		/* if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		/*if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 			writel(readl(i2s->base + I2S_SACR1) | SACR1_DRPL, i2s->base + I2S_SACR1);
 		else
 			writel(readl(i2s->base + I2S_SACR1) | SACR1_DREC, i2s->base + I2S_SACR1);
@@ -289,9 +304,10 @@ static irqreturn_t ark1668e_i2s_interrupt(int irq, void *dev_id)
 	status = readl(i2s->base + I2S_SASR0);
 
 	dev_dbg(i2s->dev, "ark1668e_i2s_interrupt status=0x%x.0x%x.\n", status, readl(i2s->base + I2S_SACR0));
+	//printk("ark1668e_i2s_interrupt status=0x%x.0x%x.\n", status, readl(i2s->base + I2S_SACR0));
 
 	writel(status, i2s->base + I2S_SAICR);
-	writel(0, i2s->base + I2S_SAICR);
+	//writel(0, i2s->base + I2S_SAICR);
 
 	return IRQ_HANDLED;
 }

+ 4 - 2
linux/sound/soc/arkmicro/ark1668e_i2s.h

@@ -6,8 +6,8 @@
 #ifndef __ARK1668E_I2S_H
 #define __ARK1668E_I2S_H
 
-#define SLAVE_ON		0
-#define MASTER_ON	1
+#define SLAVE_MODE	0
+#define MASTER_MODE	1
 
 //struct ark1668e_i2s1_data_in{
 //	int i2s1_data ;
@@ -67,6 +67,8 @@
 #define DACR0_RHPVOL_MASK (0x3f << 24)
 #define DACR0_RHPVOL(x)   (((x) & 0x3f) << 24)  /* HPOUT Right Channel Volume */
 
+#define DACR0_L_R_OUT_MUTE(x)   ((x) << 27)  /* LOUT and ROUT mute control */
+
 #define SASR0_RFL(x) 	((x) << 16) /* Rx FIFO Level */
 #define SASR0_TFL(x) 	((x) << 8) 	/* Tx FIFO Level */
 #define SASR0_ROR	(1 << 6)	/* Rx FIFO Overrun */

+ 4 - 4
linux/sound/soc/codecs/es7210.c

@@ -187,10 +187,10 @@ static const struct es7210_reg_config es7210_tdm_reg_common_cfg2[] =  {
 	{ 0x40, 0xC3 },
 	{ 0x41, 0x70 },
 	{ 0x42, 0x70 },
-	{ 0x43, 0x1A },
-	{ 0x44, 0x1A },
-	{ 0x45, 0x1A },
-	{ 0x46, 0x1A },
+	{ 0x43, 0x13 },//mic1
+	{ 0x44, 0x13 },//mic2
+	{ 0x45, 0x1A },//mic3
+	{ 0x46, 0x1A },//mic4
 	{ 0x47, 0x08 },
 	{ 0x48, 0x08 },
 	{ 0x49, 0x08 },

+ 8 - 9
linux/sound/soc/codecs/es8316.c

@@ -741,12 +741,12 @@ static int es8316_pcm_startup(struct snd_pcm_substream *substream,
 			    ES8316_CLKMGR_MCLK_DIV_NML |
 			    ES8316_CLKMGR_DAC_MCLK_EN);
 	es8316->pwr_count++;
-	printk("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
+	//printk(">>>>>>>>>>>>>>>>startup<<<<<<<<<<<<<<<<\n");
 	if (playback) {//printk("startup:>>>>>>>>>>>>>>>>>>SNDRV_PCM_STREAM_PLAYBACK\n");
 		snd_soc_component_write(component, ES8316_SYS_LP1_REG0E, 0x3F);
 		snd_soc_component_write(component, ES8316_SYS_LP2_REG0F, 0x1F);
 		snd_soc_component_write(component, ES8316_HPMIX_SWITCH_REG14, 0x88);
-		snd_soc_component_write(component, ES8316_HPMIX_PDN_REG15, 0x88);//default:0x00		new:0x88
+		snd_soc_component_write(component, ES8316_HPMIX_PDN_REG15, 0x44);//default:0x00		new:0x88
 		snd_soc_component_write(component, ES8316_HPMIX_VOL_REG16, 0xBB);
 		snd_soc_component_write(component, ES8316_CPHP_PDN2_REG1A, 0x10);
 		snd_soc_component_write(component, ES8316_CPHP_LDOCTL_REG1B, 0x30);
@@ -779,9 +779,9 @@ static void es8316_pcm_shutdown(struct snd_pcm_substream *substream,
 	struct snd_soc_component *component = dai->component;
 	struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 	bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
-
+	//printk(">>>>>>>>>>>>>>>>shutdown<<<<<<<<<<<<<<<<\n");
 	if (playback) {
-		snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x66);//default:0x00	new:0x66
+		//snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x66);//default:0x00	new:0x66
 		snd_soc_component_write(component, ES8316_DAC_PDN_REG2F, 0x11);
 		snd_soc_component_write(component, ES8316_CPHP_LDOCTL_REG1B, 0x03);
 		snd_soc_component_write(component, ES8316_CPHP_PDN2_REG1A, 0x22);
@@ -896,8 +896,7 @@ static int es8316_set_bias_level(struct snd_soc_component *component,
 		break;
 
 	case SND_SOC_BIAS_OFF:
-		printk("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
-		snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x00);//0x00		add:20220401
+		//snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x00);//0x00		add:20220401
 		snd_soc_component_write(component, ES8316_DAC_PDN_REG2F, 0x11);
 		snd_soc_component_write(component, ES8316_CPHP_LDOCTL_REG1B, 0x03);
 		snd_soc_component_write(component, ES8316_CPHP_PDN2_REG1A, 0x22);
@@ -1085,7 +1084,7 @@ static int es8316_resume(struct snd_soc_component *component)
 	struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 	int ret;
 
-	printk("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
+	//printk("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
 	es8316_reset(component); /* UPDATED BY DAVID,15-3-5 */
 	ret = snd_soc_component_read32(component, ES8316_CLKMGR_ADCDIV2_REG05);
 	if (!ret) {
@@ -1094,7 +1093,7 @@ static int es8316_resume(struct snd_soc_component *component)
 		/* max debance time, enable interrupt, low active */
 		snd_soc_component_write(component, ES8316_GPIO_DEBUNCE_INT_REG4E, 0xf3);
 		/* es8316_set_bias_level(component, SND_SOC_BIAS_OFF); */
-		snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x66);//0x00
+		//snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x66);//0x00
 		snd_soc_component_write(component, ES8316_DAC_PDN_REG2F, 0x11);
 		snd_soc_component_write(component, ES8316_CPHP_LDOCTL_REG1B, 0x03);
 		snd_soc_component_write(component, ES8316_CPHP_PDN2_REG1A, 0x22);
@@ -1202,7 +1201,7 @@ static int es8316_probe(struct snd_soc_component *component)
 			snd_soc_component_write(component, ES8316_CPHP_PDN2_REG1A, 0x10);//default:0x22	new:0x10
 			snd_soc_component_write(component, ES8316_CPHP_PDN1_REG19, 0x02);//default:0x06	new:0x02
 			snd_soc_component_write(component, ES8316_HPMIX_SWITCH_REG14, 0x88);//default:0x00	new:0x88
-			snd_soc_component_write(component, ES8316_HPMIX_PDN_REG15, 0x88);//default:0x33		new:0x88	0x00
+			snd_soc_component_write(component, ES8316_HPMIX_PDN_REG15, 0x44);//default:0x33		new:0x88	0x00
 			snd_soc_component_write(component, ES8316_HPMIX_VOL_REG16, 0xBB);//default:0x00		new:0xBB
 			if (!es8316->hp_inserted)
 				snd_soc_component_write(component, ES8316_SYS_PDN_REG0D,