ASoC: SOF: Intel: hda-stream: handle real stream interrupts only
authorKeyon Jie <yang.jie@linux.intel.com>
Tue, 30 Apr 2019 23:09:30 +0000 (18:09 -0500)
committerMark Brown <broonie@kernel.org>
Fri, 3 May 2019 06:01:26 +0000 (15:01 +0900)
The stream and IPC share the same interrupt. The stream interrupt
handler mistakenly uses the ipc interrupt and return IRQ_HANDLED,
causing the ipc interrupt to be missed.

Make sure the stream interrupt handler only deals with stream-related
interrupts.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-stream.c

index 39f4212..c92006f 100644 (file)
@@ -433,6 +433,8 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
 irqreturn_t hda_dsp_stream_interrupt(int irq, void *context)
 {
        struct hdac_bus *bus = context;
+       struct sof_intel_hda_dev *sof_hda = bus_to_sof_hda(bus);
+       u32 stream_mask;
        u32 status;
 
        if (!pm_runtime_active(bus->dev))
@@ -441,7 +443,10 @@ irqreturn_t hda_dsp_stream_interrupt(int irq, void *context)
        spin_lock(&bus->reg_lock);
 
        status = snd_hdac_chip_readl(bus, INTSTS);
-       if (status == 0 || status == 0xffffffff) {
+       stream_mask = GENMASK(sof_hda->stream_max - 1, 0) | AZX_INT_CTRL_EN;
+
+       /* Not stream interrupt or register inaccessible, ignore it.*/
+       if (!(status & stream_mask) || status == 0xffffffff) {
                spin_unlock(&bus->reg_lock);
                return IRQ_NONE;
        }