spi: zynqmp-gqspi: Always acknowledge interrupts
[ Upstream commit 89785306453ce6d949e783f6936821a0b7649ee2 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
ccf4a818d8
commit
df76df11fd
@@ -799,7 +799,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);
|
||||
@@ -814,27 +813,24 @@ static irqreturn_t zynqmp_qspi_irq(int irq, void *dev_id)
|
||||
dma_status);
|
||||
}
|
||||
|
||||
if (mask & GQSPI_ISR_TXNOT_FULL_MASK) {
|
||||
zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL);
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
if (!mask && !dma_status)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (dma_status & GQSPI_QSPIDMA_DST_I_STS_DONE_MASK) {
|
||||
if (mask & GQSPI_ISR_TXNOT_FULL_MASK)
|
||||
zynqmp_qspi_filltxfifo(xqspi, GQSPI_TX_FIFO_FILL);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user