spi: dw: Handle combined tx and rx messages
authorPhil Elwell <phil@raspberrypi.com>
Tue, 29 Nov 2022 10:09:54 +0000 (10:09 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:34:48 +0000 (11:34 +0000)
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
drivers/spi/spi-dw-core.c
drivers/spi/spi-dw-mmio.c

index 0274c92..86f33e6 100644 (file)
@@ -239,8 +239,11 @@ static irqreturn_t dw_spi_transfer_handler(struct dw_spi *dws)
         */
        if (irq_status & DW_SPI_INT_TXEI) {
                dw_writer(dws);
-               if (!dws->tx_len)
+               if (!dws->tx_len) {
                        dw_spi_mask_intr(dws, DW_SPI_INT_TXEI);
+                       if (!dws->rx_len)
+                               spi_finalize_current_transfer(dws->host);
+               }
        }
 
        return IRQ_HANDLED;
@@ -367,8 +370,11 @@ static void dw_spi_irq_setup(struct dw_spi *dws)
 
        dws->transfer_handler = dw_spi_transfer_handler;
 
-       imask = DW_SPI_INT_TXEI | DW_SPI_INT_TXOI |
-               DW_SPI_INT_RXUI | DW_SPI_INT_RXOI | DW_SPI_INT_RXFI;
+       imask = 0;
+       if (dws->tx_len)
+               imask |= DW_SPI_INT_TXEI | DW_SPI_INT_TXOI;
+       if (dws->rx_len)
+               imask |= DW_SPI_INT_RXUI | DW_SPI_INT_RXOI | DW_SPI_INT_RXFI;
        dw_spi_umask_intr(dws, imask);
 }
 
index 805264c..50bad1c 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/property.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
+#include <linux/interrupt.h>
 
 #include "spi-dw.h"
 
@@ -337,8 +338,11 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
        dws->paddr = mem->start;
 
        dws->irq = platform_get_irq(pdev, 0);
-       if (dws->irq < 0)
-               return dws->irq; /* -ENXIO */
+       if (dws->irq < 0) {
+               if (dws->irq != -ENXIO)
+                       return dws->irq; /* -ENXIO */
+               dws->irq = IRQ_NOTCONNECTED;
+       }
 
        dwsmmio->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(dwsmmio->clk))