mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	The patches were generated from the RPi repo with the following command: git format-patch v6.6.34..rpi-6.1.y Some patches needed rebasing and, as usual, the applied and reverted, wireless drivers, Github workflows, READMEs and defconfigs patches were removed. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 69fb23bb184ac6f17054b2233d22c1f0188f001a Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <phil@raspberrypi.com>
 | 
						|
Date: Tue, 28 Nov 2023 12:14:03 +0000
 | 
						|
Subject: [PATCH 0752/1085] ASoC: dwc: Fix full-duplex mode
 | 
						|
 | 
						|
Configuration of the DMA register was carelessly zeroing bits that may
 | 
						|
used by a stream in the other direction. Preserve them instead.
 | 
						|
 | 
						|
See: https://github.com/raspberrypi/linux/issues/5741
 | 
						|
 | 
						|
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
 | 
						|
---
 | 
						|
 sound/soc/dwc/dwc-i2s.c | 20 +++++++++++++-------
 | 
						|
 1 file changed, 13 insertions(+), 7 deletions(-)
 | 
						|
 | 
						|
--- a/sound/soc/dwc/dwc-i2s.c
 | 
						|
+++ b/sound/soc/dwc/dwc-i2s.c
 | 
						|
@@ -235,10 +235,17 @@ static void dw_i2s_config(struct dw_i2s_
 | 
						|
 {
 | 
						|
 	u32 ch_reg;
 | 
						|
 	struct i2s_clk_config_data *config = &dev->config;
 | 
						|
-	u32 dmacr = 0;
 | 
						|
+	u32 dmacr;
 | 
						|
 
 | 
						|
 	i2s_disable_channels(dev, stream);
 | 
						|
 
 | 
						|
+	dmacr = i2s_read_reg(dev->i2s_base, I2S_DMACR);
 | 
						|
+
 | 
						|
+	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
 | 
						|
+		dmacr &= ~(DMACR_DMAEN_TXCH0 * 0xf);
 | 
						|
+	else
 | 
						|
+		dmacr &= ~(DMACR_DMAEN_RXCH0 * 0xf);
 | 
						|
+
 | 
						|
 	for (ch_reg = 0; ch_reg < (config->chan_nr / 2); ch_reg++) {
 | 
						|
 		if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 | 
						|
 			i2s_write_reg(dev->i2s_base, TCR(ch_reg),
 | 
						|
@@ -258,10 +265,6 @@ static void dw_i2s_config(struct dw_i2s_
 | 
						|
 			dmacr |= (DMACR_DMAEN_RXCH0 << ch_reg);
 | 
						|
 		}
 | 
						|
 	}
 | 
						|
-	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
 | 
						|
-		dmacr |= DMACR_DMAEN_TX;
 | 
						|
-	else if (stream == SNDRV_PCM_STREAM_CAPTURE)
 | 
						|
-		dmacr |= DMACR_DMAEN_RX;
 | 
						|
 
 | 
						|
 	i2s_write_reg(dev->i2s_base, I2S_DMACR, dmacr);
 | 
						|
 }
 | 
						|
@@ -370,10 +373,13 @@ static int dw_i2s_startup(struct snd_pcm
 | 
						|
 
 | 
						|
 	dw_i2s_config(dev, substream->stream);
 | 
						|
 	dmacr = i2s_read_reg(dev->i2s_base, I2S_DMACR);
 | 
						|
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 | 
						|
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 | 
						|
 		dma_data = &dev->play_dma_data;
 | 
						|
-	else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
 | 
						|
+		dmacr |= DMACR_DMAEN_TX;
 | 
						|
+	} else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
 | 
						|
 		dma_data = &dev->capture_dma_data;
 | 
						|
+		dmacr |= DMACR_DMAEN_RX;
 | 
						|
+	}
 | 
						|
 
 | 
						|
 	snd_soc_dai_set_dma_data(cpu_dai, substream, (void *)dma_data);
 | 
						|
 	i2s_write_reg(dev->i2s_base, I2S_DMACR, dmacr);
 |