[PATCH 1/5] spi: tegra114: Allow PIO fallback when DMA is unavailable
From: Vishwaroop A
Date: Wed Oct 21 2026 - 09:26:23 EST
From: Krishna Yarlagadda <kyarlagadda@xxxxxxxxxx>
The driver can still use PIO if DMA is not declared in DT. The DT
binding lists 'dmas' as required, but tolerate its absence by
falling back to PIO instead of failing probe. This lets platforms
that legitimately do not wire up a DMA controller use the SPI
controller in PIO-only mode.
The runtime transfer path only takes DMA when both channels are
set, so PIO-only probes automatically stay on the PIO path.
Signed-off-by: Krishna Yarlagadda <kyarlagadda@xxxxxxxxxx>
Signed-off-by: Vishwaroop A <va@xxxxxxxxxx>
---
drivers/spi/spi-tegra114.c | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c
index 333fb549214e..f9bd783cb4dc 100644
--- a/drivers/spi/spi-tegra114.c
+++ b/drivers/spi/spi-tegra114.c
@@ -901,7 +901,8 @@ static int tegra_spi_start_transfer_one(struct spi_device *spi,
ret = tegra_spi_flush_fifos(tspi);
if (ret < 0)
return ret;
- if (total_fifo_words > SPI_FIFO_DEPTH)
+ if (total_fifo_words > SPI_FIFO_DEPTH &&
+ tspi->tx_dma_chan && tspi->rx_dma_chan)
ret = tegra_spi_start_dma_based_transfer(tspi, t);
else
ret = tegra_spi_start_cpu_based_transfer(tspi, t);
@@ -1366,15 +1367,21 @@ static int tegra_spi_probe(struct platform_device *pdev)
tspi->max_buf_size = SPI_FIFO_DEPTH << 2;
tspi->dma_buf_size = DEFAULT_SPI_DMA_BUF_LEN;
- ret = tegra_spi_init_dma_param(tspi, true);
- if (ret < 0)
- return ret;
- ret = tegra_spi_init_dma_param(tspi, false);
- if (ret < 0)
- goto exit_rx_dma_free;
- tspi->max_buf_size = tspi->dma_buf_size;
- init_completion(&tspi->tx_dma_complete);
- init_completion(&tspi->rx_dma_complete);
+ if (of_property_present(pdev->dev.of_node, "dmas")) {
+ ret = tegra_spi_init_dma_param(tspi, true);
+ if (ret < 0)
+ return ret;
+ ret = tegra_spi_init_dma_param(tspi, false);
+ if (ret < 0)
+ goto exit_rx_dma_free;
+
+ tspi->max_buf_size = tspi->dma_buf_size;
+ init_completion(&tspi->tx_dma_complete);
+ init_completion(&tspi->rx_dma_complete);
+ } else {
+ dev_warn(&pdev->dev,
+ "'dmas' is required by the binding, falling back to PIO\n");
+ }
init_completion(&tspi->xfer_completion);
base-commit: b810335a0699d1810683796b0e3ffe8827ddfe6c
--
2.17.1