Pārlūkot izejas kodu

修复全双工i2s1先录音后再放音会造成之前录音丢数据的问题

huangliang 6 mēneši atpakaļ
vecāks
revīzija
59b1762ba0

+ 1 - 16
linux/arch/arm/boot/dts/ark1668e_devb.dts

@@ -67,7 +67,7 @@
 			};
 		};
 #endif
-	
+
 		rn6752: da380@4e {
 			compatible = "arkmicro,ark1668e_rn6752";
 			//reset-gpio = <&gpio3 11 0>;
@@ -81,26 +81,15 @@
 			};
 		};
 
-		mclk: mclk@12K {
-			#clock-cells = <0>;
-			compatible = "fixed-clock";
-			clock-frequency = <12288000>;
-		};
-
 		es8316_codec: es8316@10 {
 			compatible = "arkmicro,es8316";
 			reg = <0x10>;
-			clocks = <&mclk>;
-			clock-names = "mclk";
 			#sound-dai-cells = <0>;
 		};
 
 		es7210_codec: es7210@40 {
 			compatible = "arkmicro,es7210";
 			reg = <0x40>;/* i2c address(7 bits) */
-			clocks = <&mclk>;
-			clock-names = "mclk";
-			pinctrl-names = "default";
 			#sound-dai-cells = <0>;
 		};
 	};
@@ -108,16 +97,12 @@
 	cs4334_codec: ark1668e_cs4334_codec {
 		status = "okay";
 		compatible = "arkmicro,ark1668e_cs4334_codec";
-		clock-names = "cs4334_mclk";
-		clocks = <&mclk>;
 		#sound-dai-cells = <0>;
 	};
 
 	cs5343_codec: ark1668e_cs5343_codec {
 		status = "okay";
 		compatible = "arkmicro,ark1668e_cs5343_codec";
-		clock-names = "cs5343_mclk";
-		clocks = <&mclk>;
 		#sound-dai-cells = <0>;
 	};
 

+ 1 - 16
linux/arch/arm/boot/dts/ark1668e_devb_dashboard.dts

@@ -67,7 +67,7 @@
 			};
 		};
 #endif
-	
+
 		rn6752: da380@4e {
 			compatible = "arkmicro,ark1668e_rn6752";
 			//reset-gpio = <&gpio3 11 0>;
@@ -81,26 +81,15 @@
 			};
 		};
 
-		mclk: mclk@12K {
-			#clock-cells = <0>;
-			compatible = "fixed-clock";
-			clock-frequency = <12288000>;
-		};
-
 		es8316_codec: es8316@10 {
 			compatible = "arkmicro,es8316";
 			reg = <0x10>;
-			clocks = <&mclk>;
-			clock-names = "mclk";
 			#sound-dai-cells = <0>;
 		};
 
 		es7210_codec: es7210@40 {
 			compatible = "arkmicro,es7210";
 			reg = <0x40>;/* i2c address(7 bits) */
-			clocks = <&mclk>;
-			clock-names = "mclk";
-			pinctrl-names = "default";
 			#sound-dai-cells = <0>;
 		};
 	};
@@ -108,16 +97,12 @@
 	cs4334_codec: ark1668e_cs4334_codec {
 		status = "okay";
 		compatible = "arkmicro,ark1668e_cs4334_codec";
-		clock-names = "cs4334_mclk";
-		clocks = <&mclk>;
 		#sound-dai-cells = <0>;
 	};
 
 	cs5343_codec: ark1668e_cs5343_codec {
 		status = "okay";
 		compatible = "arkmicro,ark1668e_cs5343_codec";
-		clock-names = "cs5343_mclk";
-		clocks = <&mclk>;
 		#sound-dai-cells = <0>;
 	};
 

+ 1 - 16
linux/arch/arm/boot/dts/ark1668e_devb_emmc.dts

@@ -67,7 +67,7 @@
 			};
 		};
 #endif
-	
+
 		rn6752: da380@4e {
 			compatible = "arkmicro,ark1668e_rn6752";
 			//reset-gpio = <&gpio3 11 0>;
@@ -81,26 +81,15 @@
 			};
 		};
 
-		mclk: mclk@12K {
-			#clock-cells = <0>;
-			compatible = "fixed-clock";
-			clock-frequency = <12288000>;
-		};
-
 		es8316_codec: es8316@10 {
 			compatible = "arkmicro,es8316";
 			reg = <0x10>;
-			clocks = <&mclk>;
-			clock-names = "mclk";
 			#sound-dai-cells = <0>;
 		};
 
 		es7210_codec: es7210@40 {
 			compatible = "arkmicro,es7210";
 			reg = <0x40>;/* i2c address(7 bits) */
-			clocks = <&mclk>;
-			clock-names = "mclk";
-			pinctrl-names = "default";
 			#sound-dai-cells = <0>;
 		};
 	};
@@ -108,16 +97,12 @@
 	cs4334_codec: ark1668e_cs4334_codec {
 		status = "okay";
 		compatible = "arkmicro,ark1668e_cs4334_codec";
-		clock-names = "cs4334_mclk";
-		clocks = <&mclk>;
 		#sound-dai-cells = <0>;
 	};
 
 	cs5343_codec: ark1668e_cs5343_codec {
 		status = "okay";
 		compatible = "arkmicro,ark1668e_cs5343_codec";
-		clock-names = "cs5343_mclk";
-		clocks = <&mclk>;
 		#sound-dai-cells = <0>;
 	};
 

+ 8 - 11
linux/sound/soc/arkmicro/ark1668e_i2s.c

@@ -45,6 +45,9 @@ static int ark1668e_i2s_startup(
 	struct ark1668e_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai);
 	unsigned int sacr0 = 0;
 
+	if(readl(i2s->base + I2S_SACR0) & SACR0_ENB)
+		return 0;
+
 	/* reset */
 	writel(SACR0_RST, i2s->base + I2S_SACR0);
 	udelay(1);
@@ -59,17 +62,14 @@ static int ark1668e_i2s_startup(
 		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);
+
 	}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
@@ -77,23 +77,20 @@ static int ark1668e_i2s_startup(
 			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);
 		}