[PATCH v3 2/2] spi: axi-spi-engine: fix stale SYNC IRQ pending in trigger_enable
From: Jonathan Santos
Date: Wed Oct 07 2026 - 09:09:09 EST
spi_engine_trigger_enable() sends SYNC(1) and polls SYNC_ID, it never
clears the INT_PENDING[SYNC] bit afterward. This leaves a stale pending
interrupt that can fire spuriously when INT_SYNC is later enabled.
Simillarly to the fix on spi_engine_setup(), clear INT_PENDING[SYNC]
after polling the SYNC_ID.
Fixes: 8fc13b822c74 ("spi: axi-spi-engine: don't repeat mode config for offload")
Reviewed-by: Nuno Sá <nuno.sa@xxxxxxxxxx>
Signed-off-by: Jonathan Santos <Jonathan.Santos@xxxxxxxxxx>
---
drivers/spi/spi-axi-spi-engine.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/spi/spi-axi-spi-engine.c b/drivers/spi/spi-axi-spi-engine.c
index 87c05cb064cc..ead5b295e680 100644
--- a/drivers/spi/spi-axi-spi-engine.c
+++ b/drivers/spi/spi-axi-spi-engine.c
@@ -1036,7 +1036,13 @@ static int spi_engine_trigger_enable(struct spi_offload *offload)
spi_engine->base + SPI_ENGINE_REG_CMD_FIFO);
ret = readl_relaxed_poll_timeout(spi_engine->base + SPI_ENGINE_REG_SYNC_ID,
- reg, reg == 1, 1, 1000);
+ reg, reg == 1, 1, 1 * USEC_PER_MSEC);
+
+ /* Clear the stale SYNC pending bit so it doesn't fire when the IRQ is later enabled */
+ writel_relaxed(SPI_ENGINE_INT_SYNC, spi_engine->base + SPI_ENGINE_REG_INT_PENDING);
+ /* Read back to flush posted write. */
+ readl_relaxed(spi_engine->base + SPI_ENGINE_REG_INT_PENDING);
+
if (ret)
return ret;
--
2.34.1