soc: swr-mstr-ctrl: ignore interrupt when master is in clk stop mode

When swr master is in clk stop mode, the value of interrupt_status
is not actual interrupt value. Add check for pm_runtime status to
avoid endless interrupt handler.

Change-Id: I4cd7fe5f01ffdca2a441521088ea39f8804d6b51
Signed-off-by: Meng Wang <mengw@codeaurora.org>
This commit is contained in:
Meng Wang
2021-06-22 13:24:39 +08:00
committed by Gerrit - the friendly Code Review server
parent b61e1747a5
commit 642659b2a3

View File

@@ -2084,7 +2084,8 @@ handle_irq:
handle_nested_irq( handle_nested_irq(
irq_find_mapping( irq_find_mapping(
swr_dev->slave_irq, 0)); swr_dev->slave_irq, 0));
} while (swr_dev->slave_irq_pending); trace_printk("%s: slave_irq_pending\n", __func__);
} while (swr_dev->slave_irq_pending && swrm->dev_up);
} }
} }
@@ -2095,6 +2096,8 @@ handle_irq:
break; break;
case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS: case SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS:
status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS); status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS);
trace_printk("%s: ENUM_SLAVE_STATUS 0x%x, slave_status 0x%x\n", __func__,
status, swrm->slave_status);
swrm_enable_slave_irq(swrm); swrm_enable_slave_irq(swrm);
if (status == swrm->slave_status) { if (status == swrm->slave_status) {
dev_dbg(swrm->dev, dev_dbg(swrm->dev,
@@ -2247,10 +2250,11 @@ handle_irq:
intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS); intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS);
intr_sts_masked = intr_sts & swrm->intr_mask; intr_sts_masked = intr_sts & swrm->intr_mask;
if (intr_sts_masked) { if (intr_sts_masked && !pm_runtime_suspended(swrm->dev)) {
dev_dbg(swrm->dev, "%s: new interrupt received 0x%x\n", dev_dbg(swrm->dev, "%s: new interrupt received 0x%x\n",
__func__, intr_sts_masked); __func__, intr_sts_masked);
trace_printk("%s, new interrupt received\n", __func__); trace_printk("%s: new interrupt received 0x%x\n", __func__,
intr_sts_masked);
goto handle_irq; goto handle_irq;
} }