Commit 5f338d0c authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Mark Brown

spi: rspi: SPI DMA core needs both RX and TX DMA to function

The SPI DMA core framework needs both RX and TX DMA to function.  As a
preparation for converting the driver to use this framework, fall back to
PIO if no DMA channel or only one DMA channel is available.

This affects only RSPI, which could do DMA transfers for TX-only before.
RSPI-RZ and QSPI (at least for Single SPI Transfers) will need both RX and
TX DMA anyway.
Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent fcdc49ae
...@@ -640,10 +640,6 @@ static int rspi_send_receive_dma(struct rspi_data *rspi, struct spi_transfer *t) ...@@ -640,10 +640,6 @@ static int rspi_send_receive_dma(struct rspi_data *rspi, struct spi_transfer *t)
static int rspi_is_dma(const struct rspi_data *rspi, struct spi_transfer *t) static int rspi_is_dma(const struct rspi_data *rspi, struct spi_transfer *t)
{ {
/* If the module receives data by DMAC, it also needs TX DMAC */
if (t->rx_buf)
return rspi->chan_tx && rspi->chan_rx;
if (rspi->chan_tx) if (rspi->chan_tx)
return 1; return 1;
...@@ -985,29 +981,25 @@ static int rspi_request_dma(struct device *dev, struct rspi_data *rspi, ...@@ -985,29 +981,25 @@ static int rspi_request_dma(struct device *dev, struct rspi_data *rspi,
{ {
const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev); const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev);
if (!rspi_pd) if (!rspi_pd || !rspi_pd->dma_rx_id || !rspi_pd->dma_tx_id)
return 0; /* The driver assumes no error. */ return 0; /* The driver assumes no error. */
/* If the module receives data by DMAC, it also needs TX DMAC */ rspi->chan_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM,
if (rspi_pd->dma_rx_id && rspi_pd->dma_tx_id) { rspi_pd->dma_rx_id,
rspi->chan_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, res->start + RSPI_SPDR);
rspi_pd->dma_rx_id, if (!rspi->chan_rx)
res->start + RSPI_SPDR); return -ENODEV;
if (!rspi->chan_rx)
return -ENODEV;
dev_info(dev, "Use DMA when rx.\n"); rspi->chan_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV,
} rspi_pd->dma_tx_id,
if (rspi_pd->dma_tx_id) { res->start + RSPI_SPDR);
rspi->chan_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, if (!rspi->chan_tx) {
rspi_pd->dma_tx_id, dma_release_channel(rspi->chan_rx);
res->start + RSPI_SPDR); rspi->chan_rx = NULL;
if (!rspi->chan_tx) return -ENODEV;
return -ENODEV;
dev_info(dev, "Use DMA when tx\n");
} }
dev_info(dev, "DMA available");
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment