ASoC: SOF: Intel: hda: merge IPC, stream and SoundWire interrupt handlers
We have a single irq handler for SOF interrupts. We can further merge SoundWire ones to completely remove MSI interrupts handling issues leading to timeouts. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Link: https://lore.kernel.org/r/20200325215027.28716-8-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
3eadff5639
commit
722ba5f1f5
|
@ -198,6 +198,38 @@ static int hda_sdw_exit(struct snd_sof_dev *sdev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool hda_dsp_check_sdw_irq(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct sof_intel_hda_dev *hdev;
|
||||
bool ret = false;
|
||||
u32 irq_status;
|
||||
|
||||
hdev = sdev->pdata->hw_pdata;
|
||||
|
||||
if (!hdev->sdw)
|
||||
return ret;
|
||||
|
||||
/* store status */
|
||||
irq_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIS2);
|
||||
|
||||
/* invalid message ? */
|
||||
if (irq_status == 0xffffffff)
|
||||
goto out;
|
||||
|
||||
/* SDW message ? */
|
||||
if (irq_status & HDA_DSP_REG_ADSPIS2_SNDW)
|
||||
ret = true;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static irqreturn_t hda_dsp_sdw_thread(int irq, void *context)
|
||||
{
|
||||
return sdw_intel_thread(irq, context);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -618,6 +650,7 @@ static irqreturn_t hda_dsp_interrupt_handler(int irq, void *context)
|
|||
static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
|
||||
{
|
||||
struct snd_sof_dev *sdev = context;
|
||||
struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
|
||||
|
||||
/* deal with streams and controller first */
|
||||
if (hda_dsp_check_stream_irq(sdev))
|
||||
|
@ -626,6 +659,9 @@ static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
|
|||
if (hda_dsp_check_ipc_irq(sdev))
|
||||
sof_ops(sdev)->irq_thread(irq, sdev);
|
||||
|
||||
if (hda_dsp_check_sdw_irq(sdev))
|
||||
hda_dsp_sdw_thread(irq, hdev->sdw);
|
||||
|
||||
/* enable GIE interrupt */
|
||||
snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
|
||||
SOF_HDA_INTCTL,
|
||||
|
|
|
@ -232,6 +232,8 @@
|
|||
#define HDA_DSP_REG_ADSPIC2 (HDA_DSP_GEN_BASE + 0x10)
|
||||
#define HDA_DSP_REG_ADSPIS2 (HDA_DSP_GEN_BASE + 0x14)
|
||||
|
||||
#define HDA_DSP_REG_ADSPIS2_SNDW BIT(5)
|
||||
|
||||
/* Intel HD Audio Inter-Processor Communication Registers */
|
||||
#define HDA_DSP_IPC_BASE 0x40
|
||||
#define HDA_DSP_REG_HIPCT (HDA_DSP_IPC_BASE + 0x00)
|
||||
|
@ -696,6 +698,15 @@ static inline void hda_sdw_int_enable(struct snd_sof_dev *sdev, bool enable)
|
|||
{
|
||||
}
|
||||
|
||||
static inline bool hda_dsp_check_sdw_irq(struct snd_sof_dev *sdev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline irqreturn_t hda_dsp_sdw_thread(int irq, void *context)
|
||||
{
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* common dai driver */
|
||||
|
|
Loading…
Reference in New Issue