Commit 66e65339 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown

ASoC: SOF: Intel: hda-ipc: re-enable IPC IRQ at end of handler

Align with Skylake driver and enable the IRQ at end of handler,
instead of at beginning.

Also add an error log if we have nothing to do in this handler.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5dbeb828
...@@ -131,7 +131,6 @@ static bool hda_dsp_ipc_is_sof(uint32_t msg) ...@@ -131,7 +131,6 @@ static bool hda_dsp_ipc_is_sof(uint32_t msg)
irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
{ {
struct snd_sof_dev *sdev = context; struct snd_sof_dev *sdev = context;
irqreturn_t ret = IRQ_NONE;
u32 hipci; u32 hipci;
u32 hipcie; u32 hipcie;
u32 hipct; u32 hipct;
...@@ -139,6 +138,7 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) ...@@ -139,6 +138,7 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
u32 hipcctl; u32 hipcctl;
u32 msg; u32 msg;
u32 msg_ext; u32 msg_ext;
bool ipc_irq = false;
/* read IPC status */ /* read IPC status */
hipcie = snd_sof_dsp_read(sdev, HDA_DSP_BAR, hipcie = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
...@@ -148,10 +148,6 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) ...@@ -148,10 +148,6 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
hipci = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCI); hipci = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCI);
hipcte = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCTE); hipcte = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCTE);
/* reenable IPC interrupt */
snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
HDA_DSP_ADSPIC_IPC, HDA_DSP_ADSPIC_IPC);
/* is this a reply message from the DSP */ /* is this a reply message from the DSP */
if (hipcie & HDA_DSP_REG_HIPCIE_DONE && if (hipcie & HDA_DSP_REG_HIPCIE_DONE &&
hipcctl & HDA_DSP_REG_HIPCCTL_DONE) { hipcctl & HDA_DSP_REG_HIPCCTL_DONE) {
...@@ -196,7 +192,7 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) ...@@ -196,7 +192,7 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
spin_unlock_irq(&sdev->ipc_lock); spin_unlock_irq(&sdev->ipc_lock);
ret = IRQ_HANDLED; ipc_irq = true;
} }
/* is this a new message from DSP */ /* is this a new message from DSP */
...@@ -225,10 +221,22 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context) ...@@ -225,10 +221,22 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
hda_dsp_ipc_host_done(sdev); hda_dsp_ipc_host_done(sdev);
ret = IRQ_HANDLED; ipc_irq = true;
} }
return ret; if (!ipc_irq) {
/*
* This interrupt is not shared so no need to return IRQ_NONE.
*/
dev_err_ratelimited(sdev->dev,
"error: nothing to do in IRQ thread\n");
}
/* re-enable IPC interrupt */
snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
HDA_DSP_ADSPIC_IPC, HDA_DSP_ADSPIC_IPC);
return IRQ_HANDLED;
} }
/* is this IRQ for ADSP ? - we only care about IPC here */ /* is this IRQ for ADSP ? - we only care about IPC here */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment