ASoC: dwc: always enable/disable i2s irqs
authorBrady Norander <bradynorander@gmail.com>
Sun, 30 Mar 2025 13:08:54 +0000 (09:08 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Apr 2025 08:45:39 +0000 (10:45 +0200)
[ Upstream commit 2b727b3f8a04fe52f55316ccb8792cfd9b2dd05d ]

Commit a42e988 ("ASoC: dwc: add DMA handshake control") changed the
behavior of the driver to not enable or disable i2s irqs if using DMA. This
breaks platforms such as AMD ACP. Audio playback appears to work but no
audio can be heard. Revert to the old behavior by always enabling and
disabling i2s irqs while keeping DMA handshake control.

Fixes: a42e988b626 ("ASoC: dwc: add DMA handshake control")
Signed-off-by: Brady Norander <bradynorander@gmail.com>
Link: https://patch.msgid.link/20250330130852.37881-3-bradynorander@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/dwc/dwc-i2s.c

index 9ea4be56d3b7092a8242ea545d9fb5ca6557ef21..43edad6c887dcb4ef78c1f175b6d4c533e1622ee 100644 (file)
@@ -199,12 +199,10 @@ static void i2s_start(struct dw_i2s_dev *dev,
        else
                i2s_write_reg(dev->i2s_base, IRER, 1);
 
-       /* I2S needs to enable IRQ to make a handshake with DMAC on the JH7110 SoC */
-       if (dev->use_pio || dev->is_jh7110)
-               i2s_enable_irqs(dev, substream->stream, config->chan_nr);
-       else
+       if (!(dev->use_pio || dev->is_jh7110))
                i2s_enable_dma(dev, substream->stream);
 
+       i2s_enable_irqs(dev, substream->stream, config->chan_nr);
        i2s_write_reg(dev->i2s_base, CER, 1);
 }
 
@@ -218,11 +216,12 @@ static void i2s_stop(struct dw_i2s_dev *dev,
        else
                i2s_write_reg(dev->i2s_base, IRER, 0);
 
-       if (dev->use_pio || dev->is_jh7110)
-               i2s_disable_irqs(dev, substream->stream, 8);
-       else
+       if (!(dev->use_pio || dev->is_jh7110))
                i2s_disable_dma(dev, substream->stream);
 
+       i2s_disable_irqs(dev, substream->stream, 8);
+
+
        if (!dev->active) {
                i2s_write_reg(dev->i2s_base, CER, 0);
                i2s_write_reg(dev->i2s_base, IER, 0);