aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-4.4/0571-Revert-bcm2835-i2s-Changes-for-allowing-asymmetric-s.patch
blob: 5fc687455f958c6fe89da03af2b54db9f580fdb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
From ba1f22a0d2179a0201e764c341d9dbf8f1c27ffe Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 16 Jan 2017 20:58:18 +0000
Subject: [PATCH] Revert "bcm2835-i2s: Changes for allowing asymmetric sample
 formats. (#1783)"

This reverts commit 4897c5c2f7adb4f77d638121e9959174dff87b9c.

Signed-off-by: Phil Elwell <phil@raspberrypi.org>

See: https://github.com/raspberrypi/linux/issues/1799
---
 sound/soc/bcm/bcm2835-i2s.c | 54 ++++++++++++++-------------------------------
 1 file changed, 16 insertions(+), 38 deletions(-)

--- a/sound/soc/bcm/bcm2835-i2s.c
+++ b/sound/soc/bcm/bcm2835-i2s.c
@@ -310,7 +310,6 @@ static int bcm2835_i2s_hw_params(struct
 	unsigned int sampling_rate = params_rate(params);
 	unsigned int data_length, data_delay, bclk_ratio;
 	unsigned int ch1pos, ch2pos, mode, format;
-	unsigned int previous_ftxp, previous_frxp;
 	unsigned int mash = BCM2835_CLK_MASH_1;
 	unsigned int divi, divf, target_frequency;
 	int clk_src = -1;
@@ -321,7 +320,6 @@ static int bcm2835_i2s_hw_params(struct
 	bool frame_master =	(master == SND_SOC_DAIFMT_CBS_CFS
 					|| master == SND_SOC_DAIFMT_CBM_CFS);
 	uint32_t csreg;
-	bool packed;
 
 	/*
 	 * If a stream is already enabled,
@@ -467,46 +465,26 @@ static int bcm2835_i2s_hw_params(struct
 		return -EINVAL;
 	}
 
-	/* Set the format for the matching stream direction. */
-	switch (substream->stream) {
-	case SNDRV_PCM_STREAM_PLAYBACK:
-		regmap_write(dev->i2s_regmap, BCM2835_I2S_TXC_A_REG, format);
-		break;
-	case SNDRV_PCM_STREAM_CAPTURE:
-		regmap_write(dev->i2s_regmap, BCM2835_I2S_RXC_A_REG, format);
-		break;
-	default:
-		return -EINVAL;
-	}
+	/*
+	 * Set format for both streams.
+	 * We cannot set another frame length
+	 * (and therefore word length) anyway,
+	 * so the format will be the same.
+	 */
+	regmap_write(dev->i2s_regmap, BCM2835_I2S_RXC_A_REG, format);
+	regmap_write(dev->i2s_regmap, BCM2835_I2S_TXC_A_REG, format);
 
 	/* Setup the I2S mode */
-	/* Keep existing FTXP and FRXP values. */
-	regmap_read(dev->i2s_regmap, BCM2835_I2S_MODE_A_REG, &mode);
-
-	previous_ftxp = mode & BCM2835_I2S_FTXP;
-	previous_frxp = mode & BCM2835_I2S_FRXP;
-
 	mode = 0;
 
-	/*
-	 * Retain the frame packed mode (2 channels per 32 bit word)
-	 * of the other direction stream intact. The formats of each
-	 * direction can be different as long as the frame length is
-	 * shared for both.
-	 */
-	packed = data_length <= 16;
-
-	switch (substream->stream) {
-	case SNDRV_PCM_STREAM_PLAYBACK:
-		mode |= previous_frxp;
-		mode |= packed ? BCM2835_I2S_FTXP : 0;
-		break;
-	case SNDRV_PCM_STREAM_CAPTURE:
-		mode |= previous_ftxp;
-		mode |= packed ? BCM2835_I2S_FRXP : 0;
-		break;
-	default:
-		return -EINVAL;
+	if (data_length <= 16) {
+		/*
+		 * Use frame packed mode (2 channels per 32 bit word)
+		 * We cannot set another frame length in the second stream
+		 * (and therefore word length) anyway,
+		 * so the format will be the same.
+		 */
+		mode |= BCM2835_I2S_FTXP | BCM2835_I2S_FRXP;
 	}
 
 	mode |= BCM2835_I2S_FLEN(bclk_ratio - 1);