Skip to content

Commit e919ca3

Browse files
SrikanthGoud123broonie
authored andcommitted
spi: cadence-quadspi: Fix indirect write timeout when DMA read mode is enabled
When use_dma_read is enabled, the IRQ handler unconditionally overwrites irq_status with the return value of get_dma_status(). For write operations, DMA status returns 0 since no DMA read is in progress, causing irq_status to become 0. The subsequent completion signal is never triggered and the write operation times out with -ETIMEDOUT: cadence-qspi f1010000.spi: Indirect write timeout spi-nor spi0.1: operation failed with -110 Fix this by separating the DMA completion path from the write interrupt path. If get_dma_status() indicates DMA read completion, signal completion and return immediately. Otherwise, preserve the original irq_status so that write completion interrupts are correctly recognized and signalled. Fixes: aac733a ("spi: cadence-qspi: Fix style and improve readability") Signed-off-by: Srikanth Boyapally <srikanth.boyapally@amd.com> Reviewed-by: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> Link: https://patch.msgid.link/20260708045148.2993313-1-srikanth.boyapally@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 0bcd597 commit e919ca3

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

drivers/spi/spi-cadence-quadspi.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -382,12 +382,16 @@ static irqreturn_t cqspi_irq_handler(int this_irq, void *dev)
382382
/* Clear interrupt */
383383
writel(irq_status, cqspi->iobase + CQSPI_REG_IRQSTATUS);
384384

385-
if (cqspi->use_dma_read && ddata && ddata->get_dma_status)
386-
irq_status = ddata->get_dma_status(cqspi);
387-
else if (cqspi->slow_sram)
385+
if (cqspi->use_dma_read && ddata && ddata->get_dma_status) {
386+
if (ddata->get_dma_status(cqspi)) {
387+
complete(&cqspi->transfer_complete);
388+
return IRQ_HANDLED;
389+
}
390+
} else if (cqspi->slow_sram) {
388391
irq_status &= CQSPI_IRQ_MASK_RD_SLOW_SRAM | CQSPI_IRQ_MASK_WR;
389-
else
392+
} else {
390393
irq_status &= CQSPI_IRQ_MASK_RD | CQSPI_IRQ_MASK_WR;
394+
}
391395

392396
if (irq_status)
393397
complete(&cqspi->transfer_complete);

0 commit comments

Comments
 (0)