spi: s3c64xx: Use DMA mode from fifo size
authorJaewon Kim <jaewon02.kim@samsung.com>
Fri, 29 Mar 2024 08:58:40 +0000 (17:58 +0900)
committerMark Brown <broonie@kernel.org>
Fri, 29 Mar 2024 13:48:15 +0000 (13:48 +0000)
If the SPI data size is smaller than FIFO, it operates in PIO mode,
and if it is larger than FIFO size, it oerates in DMA mode.

If the SPI data size is equal to fifo, it operates in PIO mode and it is
separated to 2 transfers. To prevent it, it must operate in DMA mode
from the case where the data size and the fifo size are the same.

Fixes: 1ee806718d5e ("spi: s3c64xx: support interrupt based pio mode")
Signed-off-by: Jaewon Kim <jaewon02.kim@samsung.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
Link: https://lore.kernel.org/r/20240329085840.65856-1-jaewon02.kim@samsung.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-s3c64xx.c

index 9fcbe040cb2f2e0b8f8fb916d1c867c1c1949332..f726d86704287e56b5cffba6ed40d8f7e1ca4956 100644 (file)
@@ -430,7 +430,7 @@ static bool s3c64xx_spi_can_dma(struct spi_controller *host,
        struct s3c64xx_spi_driver_data *sdd = spi_controller_get_devdata(host);
 
        if (sdd->rx_dma.ch && sdd->tx_dma.ch)
-               return xfer->len > sdd->fifo_depth;
+               return xfer->len >= sdd->fifo_depth;
 
        return false;
 }
@@ -826,10 +826,9 @@ static int s3c64xx_spi_transfer_one(struct spi_controller *host,
                        return status;
        }
 
-       if (!is_polling(sdd) && (xfer->len > fifo_len) &&
+       if (!is_polling(sdd) && xfer->len >= fifo_len &&
            sdd->rx_dma.ch && sdd->tx_dma.ch) {
                use_dma = 1;
-
        } else if (xfer->len >= fifo_len) {
                tx_buf = xfer->tx_buf;
                rx_buf = xfer->rx_buf;