Skip to content

Commit db2c1f9

Browse files
Andrew Jacksonbroonie
authored andcommitted
ASoC: dwc: Iterate over all channels
The Designware core can be configured with up to four stereo channels. Each stereo channel is individually configured so, when the driver's hw_params call is made, each requested stereo channel has to be programmed. Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com> Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 3475c3d commit db2c1f9

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

sound/soc/dwc/designware_i2s.c

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,9 @@ static int dw_i2s_hw_params(struct snd_pcm_substream *substream,
209209

210210
switch (config->chan_nr) {
211211
case EIGHT_CHANNEL_SUPPORT:
212-
ch_reg = 3;
213-
break;
214212
case SIX_CHANNEL_SUPPORT:
215-
ch_reg = 2;
216-
break;
217213
case FOUR_CHANNEL_SUPPORT:
218-
ch_reg = 1;
219-
break;
220214
case TWO_CHANNEL_SUPPORT:
221-
ch_reg = 0;
222215
break;
223216
default:
224217
dev_err(dev->dev, "channel not supported\n");
@@ -227,18 +220,22 @@ static int dw_i2s_hw_params(struct snd_pcm_substream *substream,
227220

228221
i2s_disable_channels(dev, substream->stream);
229222

230-
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
231-
i2s_write_reg(dev->i2s_base, TCR(ch_reg), xfer_resolution);
232-
i2s_write_reg(dev->i2s_base, TFCR(ch_reg), 0x02);
233-
irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
234-
i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x30);
235-
i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
236-
} else {
237-
i2s_write_reg(dev->i2s_base, RCR(ch_reg), xfer_resolution);
238-
i2s_write_reg(dev->i2s_base, RFCR(ch_reg), 0x07);
239-
irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
240-
i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x03);
241-
i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
223+
for (ch_reg = 0; ch_reg < (config->chan_nr / 2); ch_reg++) {
224+
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
225+
i2s_write_reg(dev->i2s_base, TCR(ch_reg),
226+
xfer_resolution);
227+
i2s_write_reg(dev->i2s_base, TFCR(ch_reg), 0x02);
228+
irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
229+
i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x30);
230+
i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
231+
} else {
232+
i2s_write_reg(dev->i2s_base, RCR(ch_reg),
233+
xfer_resolution);
234+
i2s_write_reg(dev->i2s_base, RFCR(ch_reg), 0x07);
235+
irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
236+
i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x03);
237+
i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
238+
}
242239
}
243240

244241
i2s_write_reg(dev->i2s_base, CCR, ccr);

0 commit comments

Comments
 (0)