Skip to content

Commit e47f213

Browse files
committed
soundwire: cadence: Clear interrupts before handling them
Clear interrupts before handling them in sdw_cdns_irq() to prevent loasing events that re-triggered before they can be handled. Clearing interrupts at the end of sdw_cdns_irq() is a potential race. If the event re-triggered while sdw_cdns_irq() is still running it would be cleared when sdw_cdns_irq() ends, so the irq handler would not be re-triggered to handle it. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Fixes: 2f52a51 ("soundwire: cdns: Add cadence library")
1 parent 9c731cb commit e47f213

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

drivers/soundwire/cadence_master.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,12 @@ irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
950950
}
951951
}
952952

953+
/*
954+
* Clear interrupts before handling them so we don't lose
955+
* events that re-trigger while this code is running.
956+
*/
957+
cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status);
958+
953959
if (int_status & CDNS_MCP_INT_PARITY) {
954960
/* Parity error detected by Master */
955961
dev_err_ratelimited(cdns->dev, "Parity error\n");
@@ -993,7 +999,6 @@ irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
993999
schedule_work(&cdns->work);
9941000
}
9951001

996-
cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status);
9971002
return IRQ_HANDLED;
9981003
}
9991004
EXPORT_SYMBOL(sdw_cdns_irq);

0 commit comments

Comments
 (0)