Re: [PATCH] spi: axi-spi-engine: fix stale SYNC IRQ pending
From: Andy Shevchenko
Date: Thu Sep 03 2026 - 12:07:49 EST
On Thu, Sep 03, 2026 at 10:49:22AM -0300, Jonathan Santos wrote:
> spi_engine_setup() sends a SYNC(1) command and polls SYNC_ID to confirm
> it was parsed by the FPGA, but never clears the corresponding interrupt
> pending bit (INT_PENDING[SYNC]). When the first real SPI transfer starts
> and INT_SYNC is enabled, that stale pending bit fires immediately, causing
> the IRQ handler to see the leftover SYNC_ID from setup, match it against
> the current transfer's ID, and prematurely signal completion before the
> hardware finishes.
>
> This race manifests at low SPI clock frequencies (~2-3 MHz), where the
> FPGA takes long enough to execute the transfer that handler is parsed
> before it finishes. At higher SCLK rates the transfer completes fast
> enough that the issue is masked.
>
> Fix this by clearing INT_PENDING[SYNC] after the polled SYNC, ensuring no
> stale interrupt is left pending.
>
> Reported-by: Dennis Heinzel <dennis.heinzel@irs.systems>
> Link: https://ez.analog.com/linux-software-drivers/f/q-a/604145/axi-spi-engine-stale-sync-pending-can-complete-first-transfer-early-at-low-spi-clock-2-3-mhz
We have a Closes tag.
> Signed-off-by: Jonathan Santos <Jonathan.Santos@xxxxxxxxxx>
...
> + ret = readl_relaxed_poll_timeout(spi_engine->base + SPI_ENGINE_REG_SYNC_ID,
> + reg, reg == 1, 1, 1000);
While at it I would replace 1000 with 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);
In both cases? Error (timeout) and not?
> + return ret;
--
With Best Regards,
Andy Shevchenko