drivers: spi_mcux_lpspi: add support dma per instance

Currently, the driver imply understand that all instances
will use dma when CONFIG_SPI_MCUX_LPSPI_DMA is set. There
might be an instance doesn't need DMA, so instead of enforce
spi_transceive API to use DMA, add more flexible to enable
DMA only when required

Signed-off-by: Dat Nguyen Duy <dat.nguyenduy@nxp.com>
This commit is contained in:
Dat Nguyen Duy 2023-06-15 15:48:19 +07:00 committed by Carles Cufí
commit 910d417a92

View file

@ -472,7 +472,7 @@ out:
return ret; return ret;
} }
#else #endif
static int transceive(const struct device *dev, static int transceive(const struct device *dev,
const struct spi_config *spi_cfg, const struct spi_config *spi_cfg,
@ -505,7 +505,6 @@ out:
return ret; return ret;
} }
#endif /*CONFIG_SPI_MCUX_LPSPI_DMA */
static int spi_mcux_transceive(const struct device *dev, static int spi_mcux_transceive(const struct device *dev,
const struct spi_config *spi_cfg, const struct spi_config *spi_cfg,
@ -513,10 +512,14 @@ static int spi_mcux_transceive(const struct device *dev,
const struct spi_buf_set *rx_bufs) const struct spi_buf_set *rx_bufs)
{ {
#ifdef CONFIG_SPI_MCUX_LPSPI_DMA #ifdef CONFIG_SPI_MCUX_LPSPI_DMA
return transceive_dma(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL); const struct spi_mcux_data *data = dev->data;
#else
return transceive(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL); if (data->dma_rx.dma_dev && data->dma_tx.dma_dev) {
return transceive_dma(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL);
}
#endif /* CONFIG_SPI_MCUX_LPSPI_DMA */ #endif /* CONFIG_SPI_MCUX_LPSPI_DMA */
return transceive(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL);
} }
#ifdef CONFIG_SPI_ASYNC #ifdef CONFIG_SPI_ASYNC
@ -559,14 +562,16 @@ static int spi_mcux_init(const struct device *dev)
data->dev = dev; data->dev = dev;
#ifdef CONFIG_SPI_MCUX_LPSPI_DMA #ifdef CONFIG_SPI_MCUX_LPSPI_DMA
if (!device_is_ready(data->dma_tx.dma_dev)) { if (data->dma_tx.dma_dev && data->dma_rx.dma_dev) {
LOG_ERR("%s device is not ready", data->dma_tx.dma_dev->name); if (!device_is_ready(data->dma_tx.dma_dev)) {
return -ENODEV; LOG_ERR("%s device is not ready", data->dma_tx.dma_dev->name);
} return -ENODEV;
}
if (!device_is_ready(data->dma_rx.dma_dev)) { if (!device_is_ready(data->dma_rx.dma_dev)) {
LOG_ERR("%s device is not ready", data->dma_rx.dma_dev->name); LOG_ERR("%s device is not ready", data->dma_rx.dma_dev->name);
return -ENODEV; return -ENODEV;
}
} }
#endif /* CONFIG_SPI_MCUX_LPSPI_DMA */ #endif /* CONFIG_SPI_MCUX_LPSPI_DMA */
@ -589,33 +594,39 @@ static const struct spi_driver_api spi_mcux_driver_api = {
}; };
#ifdef CONFIG_SPI_MCUX_LPSPI_DMA #ifdef CONFIG_SPI_MCUX_LPSPI_DMA
#define SPI_DMA_CHANNELS(n) \ #define SPI_DMA_CHANNELS(n) \
.dma_tx = { \ IF_ENABLED(DT_INST_DMAS_HAS_NAME(n, tx), \
.dma_dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, tx)), \ ( \
.channel = \ .dma_tx = { \
DT_INST_DMAS_CELL_BY_NAME(n, tx, mux), \ .dma_dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, tx)), \
.dma_cfg = { \ .channel = \
.channel_direction = MEMORY_TO_PERIPHERAL, \ DT_INST_DMAS_CELL_BY_NAME(n, tx, mux), \
.dma_callback = spi_mcux_dma_callback, \ .dma_cfg = { \
.source_data_size = 1, \ .channel_direction = MEMORY_TO_PERIPHERAL, \
.dest_data_size = 1, \ .dma_callback = spi_mcux_dma_callback, \
.block_count = 1, \ .source_data_size = 1, \
.dma_slot = DT_INST_DMAS_CELL_BY_NAME(n, tx, source) \ .dest_data_size = 1, \
} \ .block_count = 1, \
}, \ .dma_slot = DT_INST_DMAS_CELL_BY_NAME(n, tx, source) \
.dma_rx = { \ } \
.dma_dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, rx)), \ }, \
.channel = \ )) \
DT_INST_DMAS_CELL_BY_NAME(n, rx, mux), \ IF_ENABLED(DT_INST_DMAS_HAS_NAME(n, rx), \
.dma_cfg = { \ ( \
.channel_direction = PERIPHERAL_TO_MEMORY, \ .dma_rx = { \
.dma_callback = spi_mcux_dma_callback, \ .dma_dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, rx)), \
.source_data_size = 1, \ .channel = \
.dest_data_size = 1, \ DT_INST_DMAS_CELL_BY_NAME(n, rx, mux), \
.block_count = 1, \ .dma_cfg = { \
.dma_slot = DT_INST_DMAS_CELL_BY_NAME(n, rx, source) \ .channel_direction = PERIPHERAL_TO_MEMORY, \
} \ .dma_callback = spi_mcux_dma_callback, \
} .source_data_size = 1, \
.dest_data_size = 1, \
.block_count = 1, \
.dma_slot = DT_INST_DMAS_CELL_BY_NAME(n, rx, source) \
} \
} \
))
#else #else
#define SPI_DMA_CHANNELS(n) #define SPI_DMA_CHANNELS(n)
#endif /* CONFIG_SPI_MCUX_LPSPI_DMA */ #endif /* CONFIG_SPI_MCUX_LPSPI_DMA */