From 910d417a92f0092d35a6941fd7279dac7209f7e0 Mon Sep 17 00:00:00 2001 From: Dat Nguyen Duy Date: Thu, 15 Jun 2023 15:48:19 +0700 Subject: [PATCH] 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 --- drivers/spi/spi_mcux_lpspi.c | 89 ++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 39 deletions(-) diff --git a/drivers/spi/spi_mcux_lpspi.c b/drivers/spi/spi_mcux_lpspi.c index 2ddee4a2b09..8af05a28434 100644 --- a/drivers/spi/spi_mcux_lpspi.c +++ b/drivers/spi/spi_mcux_lpspi.c @@ -472,7 +472,7 @@ out: return ret; } -#else +#endif static int transceive(const struct device *dev, const struct spi_config *spi_cfg, @@ -505,7 +505,6 @@ out: return ret; } -#endif /*CONFIG_SPI_MCUX_LPSPI_DMA */ static int spi_mcux_transceive(const struct device *dev, 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) { #ifdef CONFIG_SPI_MCUX_LPSPI_DMA - return transceive_dma(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL); -#else - return transceive(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL); + const struct spi_mcux_data *data = dev->data; + + 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 */ + + return transceive(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL); } #ifdef CONFIG_SPI_ASYNC @@ -559,14 +562,16 @@ static int spi_mcux_init(const struct device *dev) data->dev = dev; #ifdef CONFIG_SPI_MCUX_LPSPI_DMA - if (!device_is_ready(data->dma_tx.dma_dev)) { - LOG_ERR("%s device is not ready", data->dma_tx.dma_dev->name); - return -ENODEV; - } + if (data->dma_tx.dma_dev && data->dma_rx.dma_dev) { + if (!device_is_ready(data->dma_tx.dma_dev)) { + LOG_ERR("%s device is not ready", data->dma_tx.dma_dev->name); + return -ENODEV; + } - if (!device_is_ready(data->dma_rx.dma_dev)) { - LOG_ERR("%s device is not ready", data->dma_rx.dma_dev->name); - return -ENODEV; + if (!device_is_ready(data->dma_rx.dma_dev)) { + LOG_ERR("%s device is not ready", data->dma_rx.dma_dev->name); + return -ENODEV; + } } #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 -#define SPI_DMA_CHANNELS(n) \ - .dma_tx = { \ - .dma_dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, tx)), \ - .channel = \ - DT_INST_DMAS_CELL_BY_NAME(n, tx, mux), \ - .dma_cfg = { \ - .channel_direction = MEMORY_TO_PERIPHERAL, \ - .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, 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), \ - .dma_cfg = { \ - .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) \ - } \ - } +#define SPI_DMA_CHANNELS(n) \ + IF_ENABLED(DT_INST_DMAS_HAS_NAME(n, tx), \ + ( \ + .dma_tx = { \ + .dma_dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, tx)), \ + .channel = \ + DT_INST_DMAS_CELL_BY_NAME(n, tx, mux), \ + .dma_cfg = { \ + .channel_direction = MEMORY_TO_PERIPHERAL, \ + .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, tx, source) \ + } \ + }, \ + )) \ + IF_ENABLED(DT_INST_DMAS_HAS_NAME(n, rx), \ + ( \ + .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), \ + .dma_cfg = { \ + .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 #define SPI_DMA_CHANNELS(n) #endif /* CONFIG_SPI_MCUX_LPSPI_DMA */