Asoc: SOF: Intel: hda: check SoundWire wakeen interrupt in irq thread
authorRander Wang <rander.wang@intel.com>
Wed, 25 Mar 2020 21:50:26 +0000 (16:50 -0500)
committerMark Brown <broonie@kernel.org>
Fri, 27 Mar 2020 15:16:36 +0000 (15:16 +0000)
If pci device is in D0, wakeen interrupt will be
aggregated at cAVS level as interrupt. This commit
check the wakeen status and process it in irq thread

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Rander Wang <rander.wang@intel.com>
Link: https://lore.kernel.org/r/20200325215027.28716-11-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/hda.h

index 7d1aa4c..211e91e 100644 (file)
@@ -241,6 +241,19 @@ static irqreturn_t hda_dsp_sdw_thread(int irq, void *context)
        return sdw_intel_thread(irq, context);
 }
 
+static bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
+{
+       struct sof_intel_hda_dev *hdev;
+
+       hdev = sdev->pdata->hw_pdata;
+       if (hdev->sdw &&
+           snd_sof_dsp_read(sdev, HDA_DSP_BAR,
+                            HDA_DSP_REG_SNDW_WAKE_STS))
+               return true;
+
+       return false;
+}
+
 void hda_sdw_process_wakeen(struct snd_sof_dev *sdev)
 {
        struct sof_intel_hda_dev *hdev;
@@ -684,6 +697,9 @@ static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
        if (hda_dsp_check_sdw_irq(sdev))
                hda_dsp_sdw_thread(irq, hdev->sdw);
 
+       if (hda_sdw_check_wakeen_irq(sdev))
+               hda_sdw_process_wakeen(sdev);
+
        /* enable GIE interrupt */
        snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
                                SOF_HDA_INTCTL,
index 6f1765b..e982579 100644 (file)
 #define HDA_DSP_REG_ADSPIS2            (HDA_DSP_GEN_BASE + 0x14)
 
 #define HDA_DSP_REG_ADSPIS2_SNDW       BIT(5)
+#define HDA_DSP_REG_SNDW_WAKE_STS      0x2C192
 
 /* Intel HD Audio Inter-Processor Communication Registers */
 #define HDA_DSP_IPC_BASE               0x40
@@ -709,6 +710,11 @@ static inline irqreturn_t hda_dsp_sdw_thread(int irq, void *context)
        return IRQ_HANDLED;
 }
 
+static inline bool hda_sdw_check_wakeen_irq(struct snd_sof_dev *sdev)
+{
+       return false;
+}
+
 static inline void hda_sdw_process_wakeen(struct snd_sof_dev *sdev)
 {
 }