ASoC: SOF: Intel: hda-ipc: simplify handling of IPC IRQ
authorKeyon Jie <yang.jie@linux.intel.com>
Tue, 30 Apr 2019 23:09:28 +0000 (18:09 -0500)
committerMark Brown <broonie@kernel.org>
Fri, 3 May 2019 06:00:32 +0000 (15:00 +0900)
When using a shared IRQ between IPC interrupt and stream IOC interrupt,
the interrupt handlers need to check the interrupt source before
scheduling their respective IRQ threads. In the case of IPC handler, it
should check if it is an IPC interrupt before waking up the IPC IRQ
thread.

The IPC IRQ thread, once scheduled, does not need to check the IRQ
source again. So, remove the superfluous check in the thread. Remove the
irq_status field from snd_sof_dev struct also as it is no longer needed.

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/cnl.c
sound/soc/sof/intel/hda-ipc.c
sound/soc/sof/sof-priv.h

index 3afd96d9c92575418c4e1fa3c9152f9ebb5c7170..d128839b24504bf682ecdee3b52e930333e96462 100644 (file)
@@ -39,10 +39,6 @@ static irqreturn_t cnl_ipc_irq_thread(int irq, void *context)
        u32 msg_ext;
        irqreturn_t ret = IRQ_NONE;
 
-       /* here we handle IPC interrupts only */
-       if (!(sdev->irq_status & HDA_DSP_ADSPIS_IPC))
-               return ret;
-
        hipcida = snd_sof_dsp_read(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDA);
        hipcctl = snd_sof_dsp_read(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCCTL);
        hipctdr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCTDR);
index a938f568dbb1c3d98bd1e0eb1059313e9dd5d893..73ead7070cdefd4c9364c543f4ee23de4848456f 100644 (file)
@@ -145,10 +145,6 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
        u32 msg;
        u32 msg_ext;
 
-       /* here we handle IPC interrupts only */
-       if (!(sdev->irq_status & HDA_DSP_ADSPIS_IPC))
-               return IRQ_NONE;
-
        /* read IPC status */
        hipcie = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
                                  HDA_DSP_REG_HIPCIE);
@@ -234,19 +230,20 @@ irqreturn_t hda_dsp_ipc_irq_handler(int irq, void *context)
 {
        struct snd_sof_dev *sdev = context;
        int ret = IRQ_NONE;
+       u32 irq_status;
 
        spin_lock(&sdev->hw_lock);
 
        /* store status */
-       sdev->irq_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
-                                           HDA_DSP_REG_ADSPIS);
+       irq_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIS);
+       dev_vdbg(sdev->dev, "irq handler: irq_status:0x%x\n", irq_status);
 
        /* invalid message ? */
-       if (sdev->irq_status == 0xffffffff)
+       if (irq_status == 0xffffffff)
                goto out;
 
        /* IPC message ? */
-       if (sdev->irq_status & HDA_DSP_ADSPIS_IPC) {
+       if (irq_status & HDA_DSP_ADSPIS_IPC) {
                /* disable IPC interrupt */
                snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
                                                 HDA_DSP_REG_ADSPIC,
index 675bb10c82f597bf24bb22b2bdfec9c546afc725..bbc285018f9a729e7ac9882218d1862cabbb4bfb 100644 (file)
@@ -366,7 +366,6 @@ struct snd_sof_dev {
        struct snd_sof_mailbox host_box;        /* Host initiated IPC */
        struct snd_sof_mailbox stream_box;      /* Stream position update */
        struct snd_sof_ipc_msg *msg;
-       u64 irq_status;
        int ipc_irq;
        u32 next_comp_id; /* monotonic - reset during S3 */