]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: zynqmp-gqspi: Always acknowledge interrupts
authorSean Anderson <sean.anderson@linux.dev>
Thu, 16 Jan 2025 22:41:30 +0000 (17:41 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 3 Feb 2025 00:40:36 +0000 (00:40 +0000)
RXEMPTY can cause an IRQ, even though we may not do anything about it
(such as if we are waiting for more received data). We must still handle
these IRQs because we can tell they were caused by the device.

Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
Link: https://patch.msgid.link/20250116224130.2684544-6-sean.anderson@linux.dev
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-zynqmp-gqspi.c

index fb08dd29e59053d4682277dd526911bf58c55662..1b0c8ea7afa8fdc6777a88724f68d704a4d9f907 100644 (file)
@@ -806,7 +806,6 @@ static void zynqmp_process_dma_irq(struct zynqmp_qspi *xqspi)
 static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id)
 {
        struct zynqmp_qspi *xqspi = (struct zynqmp_qspi *)dev_id;
-       irqreturn_t ret = IRQ_NONE;
        u32 status, mask, dma_status = 0;
 
        status = zynqmp_gqspi_read(xqspi, GQSPI_ISR_OFST);
@@ -821,27 +820,24 @@ static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id)
                                   dma_status);
        }
 
-       if (mask & GQSPI_ISR_TXNOT_FULL_MASK) {
+       if (!mask && !dma_status)
+               return IRQ_NONE;
+
+       if (mask & GQSPI_ISR_TXNOT_FULL_MASK)
                zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL);
-               ret = IRQ_HANDLED;
-       }
 
-       if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) {
+       if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK)
                zynqmp_process_dma_irq(xqspi);
-               ret = IRQ_HANDLED;
-       } else if (!(mask & GQSPI_IER_RXEMPTY_MASK) &&
-                       (mask & GQSPI_IER_GENFIFOEMPTY_MASK)) {
+       else if (!(mask & GQSPI_IER_RXEMPTY_MASK) &&
+                       (mask & GQSPI_IER_GENFIFOEMPTY_MASK))
                zynqmp_qspi_readrxfifo(xqspi, GQSPI_RX_FIFO_FILL);
-               ret = IRQ_HANDLED;
-       }
 
        if (xqspi->bytes_to_receive == 0 && xqspi->bytes_to_transfer == 0 &&
            ((status & GQSPI_IRQ_MASK) == GQSPI_IRQ_MASK)) {
                zynqmp_gqspi_write(xqspi, GQSPI_IDR_OFST, GQSPI_ISR_IDR_MASK);
                complete(&xqspi->data_completion);
-               ret = IRQ_HANDLED;
        }
-       return ret;
+       return IRQ_HANDLED;
 }
 
 /**