diff --git a/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi.c b/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi.c index 09ec9f0dded6..8cf59f3ad72b 100644 --- a/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi.c +++ b/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi.c @@ -11,9 +11,14 @@ LOG_MODULE_REGISTER(spi_mcux_lpspi, CONFIG_SPI_LOG_LEVEL); #include "spi_nxp_lpspi_priv.h" +struct lpspi_driver_data { + lpspi_master_handle_t handle; +}; + static int spi_mcux_transfer_next_packet(const struct device *dev) { struct spi_mcux_data *data = dev->data; + struct lpspi_driver_data *lpspi_data = (struct lpspi_driver_data *)data->driver_data; LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); struct spi_context *ctx = &data->ctx; size_t max_chunk = spi_context_max_continuous_chunk(ctx); @@ -33,7 +38,7 @@ static int spi_mcux_transfer_next_packet(const struct device *dev) transfer.rxData = (ctx->rx_len == 0 ? NULL : ctx->rx_buf); transfer.dataSize = max_chunk; - status = LPSPI_MasterTransferNonBlocking(base, &data->handle, &transfer); + status = LPSPI_MasterTransferNonBlocking(base, &lpspi_data->handle, &transfer); if (status != kStatus_Success) { LOG_ERR("Transfer could not start on %s: %d", dev->name, status); return status == kStatus_LPSPI_Busy ? -EBUSY : -EINVAL; @@ -45,9 +50,10 @@ static int spi_mcux_transfer_next_packet(const struct device *dev) static void lpspi_isr(const struct device *dev) { struct spi_mcux_data *data = dev->data; + struct lpspi_driver_data *lpspi_data = (struct lpspi_driver_data *)data->driver_data; LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); - LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &data->handle); + LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &lpspi_data->handle); } static void spi_mcux_master_callback(LPSPI_Type *base, lpspi_master_handle_t *handle, @@ -67,6 +73,7 @@ static int transceive(const struct device *dev, const struct spi_config *spi_cfg { LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); struct spi_mcux_data *data = dev->data; + struct lpspi_driver_data *lpspi_data = (struct lpspi_driver_data *)data->driver_data; int ret; spi_context_lock(&data->ctx, asynchronous, cb, userdata, spi_cfg); @@ -76,7 +83,7 @@ static int transceive(const struct device *dev, const struct spi_config *spi_cfg goto out; } - LPSPI_MasterTransferCreateHandle(base, &data->handle, spi_mcux_master_callback, data); + LPSPI_MasterTransferCreateHandle(base, &lpspi_data->handle, spi_mcux_master_callback, data); spi_context_buffers_setup(&data->ctx, tx_bufs, rx_bufs, 1); @@ -138,7 +145,12 @@ static int spi_mcux_init(const struct device *dev) SPI_NXP_LPSPI_COMMON_INIT(n) \ SPI_MCUX_LPSPI_CONFIG_INIT(n) \ \ - static struct spi_mcux_data spi_mcux_data_##n = {SPI_NXP_LPSPI_COMMON_DATA_INIT(n)}; \ + static struct lpspi_driver_data lpspi_##n##_driver_data; \ + \ + static struct spi_mcux_data spi_mcux_data_##n = { \ + SPI_NXP_LPSPI_COMMON_DATA_INIT(n) \ + .driver_data = &lpspi_##n##_driver_data, \ + }; \ \ SPI_DEVICE_DT_INST_DEFINE(n, spi_mcux_init, NULL, &spi_mcux_data_##n, \ &spi_mcux_config_##n, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \ diff --git a/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi_rtio.c b/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi_rtio.c index 7c69957e8836..63f4f822229f 100644 --- a/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi_rtio.c +++ b/drivers/spi/spi_nxp_lpspi/spi_mcux_lpspi_rtio.c @@ -12,9 +12,16 @@ LOG_MODULE_REGISTER(spi_mcux_lpspi_rtio, CONFIG_SPI_LOG_LEVEL); #include #include "spi_nxp_lpspi_priv.h" +struct spi_mcux_rtio_data { + lpspi_master_handle_t handle; + struct spi_rtio *rtio_ctx; + size_t transfer_len; +}; + static int spi_mcux_transfer_next_packet(const struct device *dev) { struct spi_mcux_data *data = dev->data; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); struct spi_context *ctx = &data->ctx; size_t max_chunk = spi_context_max_continuous_chunk(ctx); @@ -27,14 +34,14 @@ static int spi_mcux_transfer_next_packet(const struct device *dev) return 0; } - data->transfer_len = max_chunk; + rtio_data->transfer_len = max_chunk; transfer.configFlags = LPSPI_MASTER_XFER_CFG_FLAGS(ctx->config->slave); transfer.txData = (ctx->tx_len == 0 ? NULL : ctx->tx_buf); transfer.rxData = (ctx->rx_len == 0 ? NULL : ctx->rx_buf); transfer.dataSize = max_chunk; - status = LPSPI_MasterTransferNonBlocking(base, &data->handle, &transfer); + status = LPSPI_MasterTransferNonBlocking(base, &rtio_data->handle, &transfer); if (status != kStatus_Success) { LOG_ERR("Transfer could not start on %s: %d", dev->name, status); return status == kStatus_LPSPI_Busy ? -EBUSY : -EINVAL; @@ -49,15 +56,16 @@ static void spi_mcux_master_rtio_callback(LPSPI_Type *base, lpspi_master_handle_ status_t status, void *userData) { struct spi_mcux_data *data = userData; - struct spi_rtio *rtio_ctx = data->rtio_ctx; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; + struct spi_rtio *rtio_ctx = rtio_data->rtio_ctx; if (rtio_ctx->txn_head != NULL) { spi_mcux_iodev_complete(data->dev, status); return; } - spi_context_update_tx(&data->ctx, 1, data->transfer_len); - spi_context_update_rx(&data->ctx, 1, data->transfer_len); + spi_context_update_tx(&data->ctx, 1, rtio_data->transfer_len); + spi_context_update_rx(&data->ctx, 1, rtio_data->transfer_len); spi_mcux_transfer_next_packet(data->dev); } @@ -65,7 +73,8 @@ static void spi_mcux_master_rtio_callback(LPSPI_Type *base, lpspi_master_handle_ static void spi_mcux_iodev_start(const struct device *dev) { struct spi_mcux_data *data = dev->data; - struct spi_rtio *rtio_ctx = data->rtio_ctx; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; + struct spi_rtio *rtio_ctx = rtio_data->rtio_ctx; struct rtio_sqe *sqe = &rtio_ctx->txn_curr->sqe; struct spi_dt_spec *spi_dt_spec = sqe->iodev->data; struct spi_config *spi_cfg = &spi_dt_spec->config; @@ -79,7 +88,8 @@ static void spi_mcux_iodev_start(const struct device *dev) return; } - LPSPI_MasterTransferCreateHandle(base, &data->handle, spi_mcux_master_rtio_callback, data); + LPSPI_MasterTransferCreateHandle(base, &rtio_data->handle, spi_mcux_master_rtio_callback, + data); transfer.configFlags = LPSPI_MASTER_XFER_CFG_FLAGS(spi_cfg->slave); @@ -110,11 +120,11 @@ static void spi_mcux_iodev_start(const struct device *dev) return; } - data->transfer_len = transfer.dataSize; + rtio_data->transfer_len = transfer.dataSize; spi_context_cs_control(&data->ctx, true); - status = LPSPI_MasterTransferNonBlocking(base, &data->handle, &transfer); + status = LPSPI_MasterTransferNonBlocking(base, &rtio_data->handle, &transfer); if (status != kStatus_Success) { LOG_ERR("Transfer could not start on %s: %d", dev->name, status); spi_mcux_iodev_complete(dev, -EIO); @@ -124,7 +134,8 @@ static void spi_mcux_iodev_start(const struct device *dev) static void spi_mcux_iodev_complete(const struct device *dev, int status) { struct spi_mcux_data *data = dev->data; - struct spi_rtio *rtio_ctx = data->rtio_ctx; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; + struct spi_rtio *rtio_ctx = rtio_data->rtio_ctx; if (!status && rtio_ctx->txn_curr->sqe.flags & RTIO_SQE_TRANSACTION) { rtio_ctx->txn_curr = rtio_txn_next(rtio_ctx->txn_curr); @@ -143,7 +154,8 @@ static void spi_mcux_iodev_complete(const struct device *dev, int status) static void spi_mcux_iodev_submit(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe) { struct spi_mcux_data *data = dev->data; - struct spi_rtio *rtio_ctx = data->rtio_ctx; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; + struct spi_rtio *rtio_ctx = rtio_data->rtio_ctx; if (spi_rtio_submit(rtio_ctx, iodev_sqe)) { spi_mcux_iodev_start(dev); @@ -154,7 +166,8 @@ static int transceive_rtio(const struct device *dev, const struct spi_config *sp const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs) { struct spi_mcux_data *data = dev->data; - struct spi_rtio *rtio_ctx = data->rtio_ctx; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; + struct spi_rtio *rtio_ctx = rtio_data->rtio_ctx; int ret; spi_context_lock(&data->ctx, false, NULL, NULL, spi_cfg); @@ -195,6 +208,7 @@ static DEVICE_API(spi, spi_mcux_rtio_driver_api) = { static int spi_mcux_rtio_init(const struct device *dev) { struct spi_mcux_data *data = dev->data; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; int err = 0; err = spi_nxp_init_common(dev); @@ -202,7 +216,7 @@ static int spi_mcux_rtio_init(const struct device *dev) return err; } - spi_rtio_init(data->rtio_ctx, dev); + spi_rtio_init(rtio_data->rtio_ctx, dev); spi_context_unlock_unconditionally(&data->ctx); @@ -212,9 +226,10 @@ static int spi_mcux_rtio_init(const struct device *dev) static void lpspi_isr(const struct device *dev) { struct spi_mcux_data *data = dev->data; + struct spi_mcux_rtio_data *rtio_data = (struct spi_mcux_rtio_data *)data->driver_data; LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); - LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &data->handle); + LPSPI_MasterTransferHandleIRQ(LPSPI_IRQ_HANDLE_ARG, &rtio_data->handle); } #define SPI_MCUX_RTIO_DEFINE(n) \ @@ -226,7 +241,11 @@ static void lpspi_isr(const struct device *dev) SPI_NXP_LPSPI_COMMON_INIT(n) \ SPI_MCUX_LPSPI_CONFIG_INIT(n) \ \ - static struct spi_mcux_data spi_mcux_data_##n = {.rtio_ctx = &spi_mcux_rtio_##n, \ + static struct spi_mcux_rtio_data lpspi_rtio_data_##n = { \ + .rtio_ctx = &spi_mcux_rtio_##n, \ + }; \ + \ + static struct spi_mcux_data spi_mcux_data_##n = {.driver_data = &lpspi_rtio_data_##n, \ SPI_NXP_LPSPI_COMMON_DATA_INIT(n)}; \ \ SPI_DEVICE_DT_INST_DEFINE(n, spi_mcux_rtio_init, NULL, &spi_mcux_data_##n, \ diff --git a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_dma.c b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_dma.c index f5289247925d..63f27a1e8425 100644 --- a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_dma.c +++ b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_dma.c @@ -9,8 +9,24 @@ #include LOG_MODULE_REGISTER(spi_mcux_lpspi_dma, CONFIG_SPI_LOG_LEVEL); +#include #include "spi_nxp_lpspi_priv.h" +struct spi_dma_stream { + const struct device *dma_dev; + uint32_t channel; /* stores the channel for dma */ + struct dma_config dma_cfg; + struct dma_block_config dma_blk_cfg; +}; + +struct spi_nxp_dma_data { + volatile uint32_t status_flags; + struct spi_dma_stream dma_rx; + struct spi_dma_stream dma_tx; + /* dummy value used for transferring NOP when tx buf is null */ + uint32_t dummy_buffer; +}; + /* These flags are arbitrary */ #define LPSPI_DMA_ERROR_FLAG BIT(0) #define LPSPI_DMA_RX_DONE_FLAG BIT(1) @@ -23,6 +39,7 @@ static void spi_mcux_dma_callback(const struct device *dev, void *arg, uint32_t /* arg directly holds the spi device */ const struct device *spi_dev = arg; struct spi_mcux_data *data = (struct spi_mcux_data *)spi_dev->data; + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; char debug_char; if (status < 0) { @@ -30,13 +47,13 @@ static void spi_mcux_dma_callback(const struct device *dev, void *arg, uint32_t } /* identify the origin of this callback */ - if (channel == data->dma_tx.channel) { + if (channel == dma_data->dma_tx.channel) { /* this part of the transfer ends */ - data->status_flags |= LPSPI_DMA_TX_DONE_FLAG; + dma_data->status_flags |= LPSPI_DMA_TX_DONE_FLAG; debug_char = 'T'; - } else if (channel == data->dma_rx.channel) { + } else if (channel == dma_data->dma_rx.channel) { /* this part of the transfer ends */ - data->status_flags |= LPSPI_DMA_RX_DONE_FLAG; + dma_data->status_flags |= LPSPI_DMA_RX_DONE_FLAG; debug_char = 'R'; } else { goto error; @@ -45,7 +62,7 @@ static void spi_mcux_dma_callback(const struct device *dev, void *arg, uint32_t LOG_DBG("DMA %cX Block Complete", debug_char); #if CONFIG_SPI_ASYNC - if (data->ctx.asynchronous && (data->status_flags & LPSPI_DMA_DONE_FLAG)) { + if (data->ctx.asynchronous && (dma_data->status_flags & LPSPI_DMA_DONE_FLAG)) { /* Load dma blocks of equal length */ size_t dma_size = spi_context_max_continuous_chunk(data->ctx); @@ -61,7 +78,7 @@ static void spi_mcux_dma_callback(const struct device *dev, void *arg, uint32_t goto done; error: LOG_ERR("DMA callback error with channel %d.", channel); - data->status_flags |= LPSPI_DMA_ERROR_FLAG; + dma_data->status_flags |= LPSPI_DMA_ERROR_FLAG; done: spi_context_complete(&data->ctx, spi_dev, 0); } @@ -71,6 +88,7 @@ static struct dma_block_config *spi_mcux_dma_common_load(struct spi_dma_stream * const uint8_t *buf, size_t len) { struct spi_mcux_data *data = dev->data; + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; struct dma_block_config *blk_cfg = &stream->dma_blk_cfg; /* prepare the block for this TX DMA channel */ @@ -79,8 +97,8 @@ static struct dma_block_config *spi_mcux_dma_common_load(struct spi_dma_stream * blk_cfg->block_size = len; if (buf == NULL) { - blk_cfg->source_address = (uint32_t)&data->dummy_buffer; - blk_cfg->dest_address = (uint32_t)&data->dummy_buffer; + blk_cfg->source_address = (uint32_t)&dma_data->dummy_buffer; + blk_cfg->dest_address = (uint32_t)&dma_data->dummy_buffer; /* pretend it is peripheral xfer so DMA just xfer to dummy buf */ stream->dma_cfg.channel_direction = PERIPHERAL_TO_PERIPHERAL; } else { @@ -100,8 +118,9 @@ static int spi_mcux_dma_tx_load(const struct device *dev, const uint8_t *buf, si { LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); struct spi_mcux_data *data = dev->data; + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; /* remember active TX DMA channel (used in callback) */ - struct spi_dma_stream *stream = &data->dma_tx; + struct spi_dma_stream *stream = &dma_data->dma_tx; struct dma_block_config *blk_cfg = spi_mcux_dma_common_load(stream, dev, buf, len); if (buf != NULL) { @@ -121,8 +140,9 @@ static int spi_mcux_dma_rx_load(const struct device *dev, uint8_t *buf, size_t l { LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base); struct spi_mcux_data *data = dev->data; + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; /* retrieve active RX DMA channel (used in callback) */ - struct spi_dma_stream *stream = &data->dma_rx; + struct spi_dma_stream *stream = &dma_data->dma_rx; struct dma_block_config *blk_cfg = spi_mcux_dma_common_load(stream, dev, buf, len); if (buf != NULL) { @@ -140,6 +160,7 @@ static int spi_mcux_dma_rx_load(const struct device *dev, uint8_t *buf, size_t l static int wait_dma_rx_tx_done(const struct device *dev) { struct spi_mcux_data *data = dev->data; + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; int ret; do { @@ -147,10 +168,10 @@ static int wait_dma_rx_tx_done(const struct device *dev) if (ret) { LOG_DBG("Timed out waiting for SPI context to complete"); return ret; - } else if (data->status_flags & LPSPI_DMA_ERROR_FLAG) { + } else if (dma_data->status_flags & LPSPI_DMA_ERROR_FLAG) { return -EIO; } - } while (!((data->status_flags & LPSPI_DMA_DONE_FLAG) == LPSPI_DMA_DONE_FLAG)); + } while (!((dma_data->status_flags & LPSPI_DMA_DONE_FLAG) == LPSPI_DMA_DONE_FLAG)); LOG_DBG("DMA block completed"); return 0; @@ -159,11 +180,12 @@ static int wait_dma_rx_tx_done(const struct device *dev) static inline int spi_mcux_dma_rxtx_load(const struct device *dev, size_t *dma_size) { struct spi_mcux_data *data = dev->data; + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; struct spi_context *ctx = &data->ctx; int ret = 0; /* Clear status flags */ - data->status_flags = 0U; + dma_data->status_flags = 0U; /* Load dma blocks of equal length */ *dma_size = spi_context_max_continuous_chunk(ctx); @@ -179,12 +201,12 @@ static inline int spi_mcux_dma_rxtx_load(const struct device *dev, size_t *dma_s } /* Start DMA */ - ret = dma_start(data->dma_tx.dma_dev, data->dma_tx.channel); + ret = dma_start(dma_data->dma_tx.dma_dev, dma_data->dma_tx.channel); if (ret != 0) { return ret; } - ret = dma_start(data->dma_rx.dma_dev, data->dma_rx.channel); + ret = dma_start(dma_data->dma_rx.dma_dev, dma_data->dma_rx.channel); return ret; } @@ -319,8 +341,10 @@ static int lpspi_dma_dev_ready(const struct device *dma_dev) static int lpspi_dma_devs_ready(struct spi_mcux_data *data) { - return lpspi_dma_dev_ready(data->dma_tx.dma_dev) | - lpspi_dma_dev_ready(data->dma_rx.dma_dev); + struct spi_nxp_dma_data *dma_data = (struct spi_nxp_dma_data *)data->driver_data; + + return lpspi_dma_dev_ready(dma_data->dma_tx.dma_dev) | + lpspi_dma_dev_ready(dma_data->dma_rx.dma_dev); } static int spi_mcux_dma_init(const struct device *dev) @@ -344,17 +368,17 @@ static int spi_mcux_dma_init(const struct device *dev) } static int spi_nxp_dma_transceive_sync(const struct device *dev, const struct spi_config *spi_cfg, - const struct spi_buf_set *tx_bufs, - const struct spi_buf_set *rx_bufs) + const struct spi_buf_set *tx_bufs, + const struct spi_buf_set *rx_bufs) { return transceive_dma(dev, spi_cfg, tx_bufs, rx_bufs, false, NULL, NULL); } #ifdef CONFIG_SPI_ASYNC static int spi_nxp_dma_transceive_async(const struct device *dev, const struct spi_config *spi_cfg, - const struct spi_buf_set *tx_bufs, - const struct spi_buf_set *rx_bufs, spi_callback_t cb, - void *userdata) + const struct spi_buf_set *tx_bufs, + const struct spi_buf_set *rx_bufs, spi_callback_t cb, + void *userdata) { return transceive_dma(dev, spi_cfg, tx_bufs, rx_bufs, true, cb, userdata); } @@ -399,8 +423,10 @@ static void lpspi_isr(const struct device *dev) SPI_NXP_LPSPI_COMMON_INIT(n) \ SPI_MCUX_LPSPI_CONFIG_INIT(n) \ \ - static struct spi_mcux_data spi_mcux_data_##n = {SPI_NXP_LPSPI_COMMON_DATA_INIT(n) \ - SPI_DMA_CHANNELS(n)}; \ + static struct spi_nxp_dma_data lpspi_dma_data##n = {SPI_DMA_CHANNELS(n)}; \ + \ + static struct spi_mcux_data spi_mcux_data_##n = {.driver_data = &lpspi_dma_data##n, \ + SPI_NXP_LPSPI_COMMON_DATA_INIT(n)}; \ \ SPI_DEVICE_DT_INST_DEFINE(n, spi_mcux_dma_init, NULL, &spi_mcux_data_##n, \ &spi_mcux_config_##n, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \ diff --git a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h index a68da3a3f2c0..73df071d2e6f 100644 --- a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h +++ b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h @@ -44,33 +44,12 @@ struct spi_mcux_config { bool output_config; }; -#ifdef CONFIG_SPI_MCUX_LPSPI_DMA -#include - -struct spi_dma_stream { - const struct device *dma_dev; - uint32_t channel; /* stores the channel for dma */ - struct dma_config dma_cfg; - struct dma_block_config dma_blk_cfg; -}; -#endif /* CONFIG_SPI_MCUX_LPSPI_DMA */ - struct spi_mcux_data { DEVICE_MMIO_NAMED_RAM(reg_base); const struct device *dev; - lpspi_master_handle_t handle; struct spi_context ctx; + void *driver_data; size_t transfer_len; -#ifdef CONFIG_SPI_RTIO - struct spi_rtio *rtio_ctx; -#endif -#ifdef CONFIG_SPI_MCUX_LPSPI_DMA - volatile uint32_t status_flags; - struct spi_dma_stream dma_rx; - struct spi_dma_stream dma_tx; - /* dummy value used for transferring NOP when tx buf is null */ - uint32_t dummy_buffer; -#endif }; /* common configure function that verifies spi_cfg validity and set up configuration parameters */