Skip to content

Commit b1d32fe

Browse files
joabreubroonie
authored andcommitted
ASoC: dwc: Add helper functions to disable/enable irqs
Helper functions to disable and enable the I2S interrupts were added. Only the interrupts of the used channels are enabled. Also, there is no need to enable irqs at dw_i2s_config(), they are already enabled at startup. Signed-off-by: Jose Abreu <[email protected]> Cc: Carlos Palminha <[email protected]> Cc: Mark Brown <[email protected]> Cc: Liam Girdwood <[email protected]> Cc: Jaroslav Kysela <[email protected]> Cc: Takashi Iwai <[email protected]> Cc: Rob Herring <[email protected]> Cc: Alexey Brodkin <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 1a695a9 commit b1d32fe

File tree

1 file changed

+41
-27
lines changed

1 file changed

+41
-27
lines changed

sound/soc/dwc/designware_i2s.c

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -145,51 +145,69 @@ static inline void i2s_clear_irqs(struct dw_i2s_dev *dev, u32 stream)
145145
}
146146
}
147147

148-
static void i2s_start(struct dw_i2s_dev *dev,
149-
struct snd_pcm_substream *substream)
148+
static inline void i2s_disable_irqs(struct dw_i2s_dev *dev, u32 stream,
149+
int chan_nr)
150150
{
151-
struct i2s_clk_config_data *config = &dev->config;
152151
u32 i, irq;
153-
i2s_write_reg(dev->i2s_base, IER, 1);
154152

155-
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
156-
for (i = 0; i < (config->chan_nr / 2); i++) {
153+
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
154+
for (i = 0; i < (chan_nr / 2); i++) {
155+
irq = i2s_read_reg(dev->i2s_base, IMR(i));
156+
i2s_write_reg(dev->i2s_base, IMR(i), irq | 0x30);
157+
}
158+
} else {
159+
for (i = 0; i < (chan_nr / 2); i++) {
160+
irq = i2s_read_reg(dev->i2s_base, IMR(i));
161+
i2s_write_reg(dev->i2s_base, IMR(i), irq | 0x03);
162+
}
163+
}
164+
}
165+
166+
static inline void i2s_enable_irqs(struct dw_i2s_dev *dev, u32 stream,
167+
int chan_nr)
168+
{
169+
u32 i, irq;
170+
171+
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
172+
for (i = 0; i < (chan_nr / 2); i++) {
157173
irq = i2s_read_reg(dev->i2s_base, IMR(i));
158174
i2s_write_reg(dev->i2s_base, IMR(i), irq & ~0x30);
159175
}
160-
i2s_write_reg(dev->i2s_base, ITER, 1);
161176
} else {
162-
for (i = 0; i < (config->chan_nr / 2); i++) {
177+
for (i = 0; i < (chan_nr / 2); i++) {
163178
irq = i2s_read_reg(dev->i2s_base, IMR(i));
164179
i2s_write_reg(dev->i2s_base, IMR(i), irq & ~0x03);
165180
}
166-
i2s_write_reg(dev->i2s_base, IRER, 1);
167181
}
182+
}
183+
184+
static void i2s_start(struct dw_i2s_dev *dev,
185+
struct snd_pcm_substream *substream)
186+
{
187+
struct i2s_clk_config_data *config = &dev->config;
188+
189+
i2s_write_reg(dev->i2s_base, IER, 1);
190+
i2s_enable_irqs(dev, substream->stream, config->chan_nr);
191+
192+
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
193+
i2s_write_reg(dev->i2s_base, ITER, 1);
194+
else
195+
i2s_write_reg(dev->i2s_base, IRER, 1);
168196

169197
i2s_write_reg(dev->i2s_base, CER, 1);
170198
}
171199

172200
static void i2s_stop(struct dw_i2s_dev *dev,
173201
struct snd_pcm_substream *substream)
174202
{
175-
u32 i = 0, irq;
176203

177204
i2s_clear_irqs(dev, substream->stream);
178-
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
205+
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
179206
i2s_write_reg(dev->i2s_base, ITER, 0);
180-
181-
for (i = 0; i < 4; i++) {
182-
irq = i2s_read_reg(dev->i2s_base, IMR(i));
183-
i2s_write_reg(dev->i2s_base, IMR(i), irq | 0x30);
184-
}
185-
} else {
207+
else
186208
i2s_write_reg(dev->i2s_base, IRER, 0);
187209

188-
for (i = 0; i < 4; i++) {
189-
irq = i2s_read_reg(dev->i2s_base, IMR(i));
190-
i2s_write_reg(dev->i2s_base, IMR(i), irq | 0x03);
191-
}
192-
}
210+
i2s_disable_irqs(dev, substream->stream, 8);
193211

194212
if (!dev->active) {
195213
i2s_write_reg(dev->i2s_base, CER, 0);
@@ -223,7 +241,7 @@ static int dw_i2s_startup(struct snd_pcm_substream *substream,
223241

224242
static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
225243
{
226-
u32 ch_reg, irq;
244+
u32 ch_reg;
227245
struct i2s_clk_config_data *config = &dev->config;
228246

229247

@@ -235,16 +253,12 @@ static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
235253
dev->xfer_resolution);
236254
i2s_write_reg(dev->i2s_base, TFCR(ch_reg),
237255
dev->fifo_th - 1);
238-
irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
239-
i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x30);
240256
i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
241257
} else {
242258
i2s_write_reg(dev->i2s_base, RCR(ch_reg),
243259
dev->xfer_resolution);
244260
i2s_write_reg(dev->i2s_base, RFCR(ch_reg),
245261
dev->fifo_th - 1);
246-
irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
247-
i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x03);
248262
i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
249263
}
250264

0 commit comments

Comments
 (0)