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)
return 1;
{
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. */
- /* If the module receives data by DMAC, it also needs TX DMAC */
- if (rspi_pd->dma_rx_id && rspi_pd->dma_tx_id) {
- rspi->chan_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM,
- rspi_pd->dma_rx_id,
- res->start + RSPI_SPDR);
- if (!rspi->chan_rx)
- return -ENODEV;
+ rspi->chan_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM,
+ rspi_pd->dma_rx_id,
+ res->start + RSPI_SPDR);
+ if (!rspi->chan_rx)
+ return -ENODEV;
- dev_info(dev, "Use DMA when rx.\n");
- }
- if (rspi_pd->dma_tx_id) {
- rspi->chan_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV,
- rspi_pd->dma_tx_id,
- res->start + RSPI_SPDR);
- if (!rspi->chan_tx)
- return -ENODEV;
-
- dev_info(dev, "Use DMA when tx\n");
+ rspi->chan_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV,
+ rspi_pd->dma_tx_id,
+ res->start + RSPI_SPDR);
+ if (!rspi->chan_tx) {
+ dma_release_channel(rspi->chan_rx);
+ rspi->chan_rx = NULL;
+ return -ENODEV;
}
+ dev_info(dev, "DMA available");
return 0;
}