Lines Matching +full:spi +full:- +full:half +full:- +full:duplex
6 * SPDX-License-Identifier: Apache-2.0
12 #include <zephyr/drivers/spi.h>
13 #include <zephyr/drivers/spi/rtio.h>
49 const struct spi_mcux_config *config = dev->config; in spi_mcux_transfer_next_packet()
50 struct spi_mcux_data *data = dev->data; in spi_mcux_transfer_next_packet()
51 LPSPI_Type *base = config->base; in spi_mcux_transfer_next_packet()
52 struct spi_context *ctx = &data->ctx; in spi_mcux_transfer_next_packet()
56 if ((ctx->tx_len == 0) && (ctx->rx_len == 0)) { in spi_mcux_transfer_next_packet()
58 spi_context_cs_control(&data->ctx, false); in spi_mcux_transfer_next_packet()
59 spi_context_complete(&data->ctx, dev, 0); in spi_mcux_transfer_next_packet()
64 (ctx->config->slave << LPSPI_MASTER_PCS_SHIFT); in spi_mcux_transfer_next_packet()
66 if (ctx->tx_len == 0) { in spi_mcux_transfer_next_packet()
69 transfer.rxData = ctx->rx_buf; in spi_mcux_transfer_next_packet()
70 transfer.dataSize = ctx->rx_len; in spi_mcux_transfer_next_packet()
71 } else if (ctx->rx_len == 0) { in spi_mcux_transfer_next_packet()
73 transfer.txData = (uint8_t *) ctx->tx_buf; in spi_mcux_transfer_next_packet()
75 transfer.dataSize = ctx->tx_len; in spi_mcux_transfer_next_packet()
76 } else if (ctx->tx_len == ctx->rx_len) { in spi_mcux_transfer_next_packet()
78 transfer.txData = (uint8_t *) ctx->tx_buf; in spi_mcux_transfer_next_packet()
79 transfer.rxData = ctx->rx_buf; in spi_mcux_transfer_next_packet()
80 transfer.dataSize = ctx->tx_len; in spi_mcux_transfer_next_packet()
81 } else if (ctx->tx_len > ctx->rx_len) { in spi_mcux_transfer_next_packet()
86 transfer.txData = (uint8_t *) ctx->tx_buf; in spi_mcux_transfer_next_packet()
87 transfer.rxData = ctx->rx_buf; in spi_mcux_transfer_next_packet()
88 transfer.dataSize = ctx->rx_len; in spi_mcux_transfer_next_packet()
95 transfer.txData = (uint8_t *) ctx->tx_buf; in spi_mcux_transfer_next_packet()
96 transfer.rxData = ctx->rx_buf; in spi_mcux_transfer_next_packet()
97 transfer.dataSize = ctx->tx_len; in spi_mcux_transfer_next_packet()
101 if (!(ctx->tx_count <= 1 && ctx->rx_count <= 1)) { in spi_mcux_transfer_next_packet()
105 data->transfer_len = transfer.dataSize; in spi_mcux_transfer_next_packet()
106 status = LPSPI_MasterTransferNonBlocking(base, &data->handle, in spi_mcux_transfer_next_packet()
115 const struct spi_mcux_config *config = dev->config; in spi_mcux_isr()
116 struct spi_mcux_data *data = dev->data; in spi_mcux_isr()
117 LPSPI_Type *base = config->base; in spi_mcux_isr()
119 LPSPI_MasterTransferHandleIRQ(base, &data->handle); in spi_mcux_isr()
128 spi_context_update_tx(&data->ctx, 1, data->transfer_len); in spi_mcux_master_transfer_callback()
129 spi_context_update_rx(&data->ctx, 1, data->transfer_len); in spi_mcux_master_transfer_callback()
131 spi_mcux_transfer_next_packet(data->dev); in spi_mcux_master_transfer_callback()
137 const struct spi_mcux_config *config = dev->config; in spi_mcux_configure()
138 struct spi_mcux_data *data = dev->data; in spi_mcux_configure()
139 LPSPI_Type *base = config->base; in spi_mcux_configure()
144 if (spi_context_configured(&data->ctx, spi_cfg)) { in spi_mcux_configure()
149 if (spi_cfg->operation & SPI_HALF_DUPLEX) { in spi_mcux_configure()
150 LOG_ERR("Half-duplex not supported"); in spi_mcux_configure()
151 return -ENOTSUP; in spi_mcux_configure()
156 if (spi_cfg->slave > CHIP_SELECT_COUNT) { in spi_mcux_configure()
158 spi_cfg->slave, in spi_mcux_configure()
160 return -EINVAL; in spi_mcux_configure()
163 word_size = SPI_WORD_SIZE_GET(spi_cfg->operation); in spi_mcux_configure()
167 return -EINVAL; in spi_mcux_configure()
173 (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPOL) in spi_mcux_configure()
178 (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPHA) in spi_mcux_configure()
183 (spi_cfg->operation & SPI_TRANSFER_LSB) in spi_mcux_configure()
187 master_config.baudRate = spi_cfg->frequency; in spi_mcux_configure()
189 if (!device_is_ready(config->clock_dev)) { in spi_mcux_configure()
191 return -ENODEV; in spi_mcux_configure()
194 if (clock_control_get_rate(config->clock_dev, config->clock_subsys, in spi_mcux_configure()
196 return -EINVAL; in spi_mcux_configure()
201 LPSPI_MasterTransferCreateHandle(base, &data->handle, in spi_mcux_configure()
207 data->ctx.config = spi_cfg; in spi_mcux_configure()
220 struct spi_mcux_data *data = dev->data; in transceive()
223 spi_context_lock(&data->ctx, asynchronous, cb, userdata, spi_cfg); in transceive()
230 spi_context_buffers_setup(&data->ctx, tx_bufs, rx_bufs, 1); in transceive()
232 spi_context_cs_control(&data->ctx, true); in transceive()
236 ret = spi_context_wait_for_completion(&data->ctx); in transceive()
238 spi_context_release(&data->ctx, ret); in transceive()
266 struct spi_mcux_data *data = dev->data; in spi_mcux_release()
268 spi_context_unlock_unconditionally(&data->ctx); in spi_mcux_release()
276 const struct spi_mcux_config *config = dev->config; in spi_mcux_init()
277 struct spi_mcux_data *data = dev->data; in spi_mcux_init()
279 CLOCK_SetIpSrc(config->clock_ip_name, config->clock_ip_src); in spi_mcux_init()
281 config->irq_config_func(dev); in spi_mcux_init()
283 data->dev = dev; in spi_mcux_init()
285 err = spi_context_cs_configure_all(&data->ctx); in spi_mcux_init()
290 err = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT); in spi_mcux_init()
295 spi_context_unlock_unconditionally(&data->ctx); in spi_mcux_init()
300 static DEVICE_API(spi, spi_mcux_driver_api) = {