ASoC: dwc: Unmask I2S interrupts only for enabled channels
authorJose Abreu <Jose.Abreu@synopsys.com>
Tue, 5 Apr 2016 17:08:02 +0000 (18:08 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 5 Apr 2016 18:57:54 +0000 (11:57 -0700)
There is no need to unmask all interrupts at I2S start. This
can cause performance issues in slower platforms.

Unmask only the interrupts for the used channels.

Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/dwc/designware_i2s.c

index bff258d7bcea1f380403df5b9380ac7c9aabf835..3effcd1a7df87916dde162e039bc97c27b0596b1 100644 (file)
@@ -147,17 +147,18 @@ static inline void i2s_clear_irqs(struct dw_i2s_dev *dev, u32 stream)
 static void i2s_start(struct dw_i2s_dev *dev,
                      struct snd_pcm_substream *substream)
 {
+       struct i2s_clk_config_data *config = &dev->config;
        u32 i, irq;
        i2s_write_reg(dev->i2s_base, IER, 1);
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               for (i = 0; i < 4; i++) {
+               for (i = 0; i < (config->chan_nr / 2); i++) {
                        irq = i2s_read_reg(dev->i2s_base, IMR(i));
                        i2s_write_reg(dev->i2s_base, IMR(i), irq & ~0x30);
                }
                i2s_write_reg(dev->i2s_base, ITER, 1);
        } else {
-               for (i = 0; i < 4; i++) {
+               for (i = 0; i < (config->chan_nr / 2); i++) {
                        irq = i2s_read_reg(dev->i2s_base, IMR(i));
                        i2s_write_reg(dev->i2s_base, IMR(i), irq & ~0x03);
                }