Lines Matching +full:spi +full:- +full:half +full:- +full:duplex

4  * SPDX-License-Identifier: Apache-2.0
15 #include <zephyr/drivers/spi.h>
16 #include <zephyr/drivers/spi/rtio.h>
56 const struct spi_mcux_config *config = dev->config; in spi_mcux_transfer_next_packet()
57 struct spi_mcux_data *data = dev->data; in spi_mcux_transfer_next_packet()
58 ECSPI_Type *base = config->base; in spi_mcux_transfer_next_packet()
59 struct spi_context *ctx = &data->ctx; in spi_mcux_transfer_next_packet()
63 if ((ctx->tx_len == 0) && (ctx->rx_len == 0)) { in spi_mcux_transfer_next_packet()
65 spi_context_cs_control(&data->ctx, false); in spi_mcux_transfer_next_packet()
66 spi_context_complete(&data->ctx, dev, 0); in spi_mcux_transfer_next_packet()
70 transfer.channel = ctx->config->slave; in spi_mcux_transfer_next_packet()
73 transfer.rxData = &data->rx_data; in spi_mcux_transfer_next_packet()
79 switch (data->dfs) { in spi_mcux_transfer_next_packet()
81 data->tx_data = UNALIGNED_GET((uint8_t *)ctx->tx_buf); in spi_mcux_transfer_next_packet()
84 data->tx_data = UNALIGNED_GET((uint16_t *)ctx->tx_buf); in spi_mcux_transfer_next_packet()
87 data->tx_data = UNALIGNED_GET((uint32_t *)ctx->tx_buf); in spi_mcux_transfer_next_packet()
91 transfer.txData = &data->tx_data; in spi_mcux_transfer_next_packet()
96 transfer.dataSize = data->dfs; in spi_mcux_transfer_next_packet()
98 status = ECSPI_MasterTransferNonBlocking(base, &data->handle, &transfer); in spi_mcux_transfer_next_packet()
101 spi_context_cs_control(&data->ctx, false); in spi_mcux_transfer_next_packet()
102 spi_context_complete(&data->ctx, dev, -EIO); in spi_mcux_transfer_next_packet()
108 const struct spi_mcux_config *config = dev->config; in spi_mcux_isr()
109 struct spi_mcux_data *data = dev->data; in spi_mcux_isr()
110 ECSPI_Type *base = config->base; in spi_mcux_isr()
112 ECSPI_MasterTransferHandleIRQ(base, &data->handle); in spi_mcux_isr()
119 struct spi_mcux_data *data = dev->data; in spi_mcux_master_transfer_callback()
121 if (spi_context_rx_buf_on(&data->ctx)) { in spi_mcux_master_transfer_callback()
122 switch (data->dfs) { in spi_mcux_master_transfer_callback()
124 UNALIGNED_PUT(data->rx_data, (uint8_t *)data->ctx.rx_buf); in spi_mcux_master_transfer_callback()
127 UNALIGNED_PUT(data->rx_data, (uint16_t *)data->ctx.rx_buf); in spi_mcux_master_transfer_callback()
130 UNALIGNED_PUT(data->rx_data, (uint32_t *)data->ctx.rx_buf); in spi_mcux_master_transfer_callback()
135 spi_context_update_tx(&data->ctx, data->dfs, 1); in spi_mcux_master_transfer_callback()
136 spi_context_update_rx(&data->ctx, data->dfs, 1); in spi_mcux_master_transfer_callback()
144 const struct spi_mcux_config *config = dev->config; in spi_mcux_configure()
145 struct spi_mcux_data *data = dev->data; in spi_mcux_configure()
146 ECSPI_Type *base = config->base; in spi_mcux_configure()
151 if (spi_context_configured(&data->ctx, spi_cfg)) { in spi_mcux_configure()
156 if (spi_cfg->operation & SPI_HALF_DUPLEX) { in spi_mcux_configure()
157 LOG_ERR("Half-duplex not supported"); in spi_mcux_configure()
158 return -ENOTSUP; in spi_mcux_configure()
161 if (spi_cfg->operation & SPI_TRANSFER_LSB) { in spi_mcux_configure()
162 LOG_ERR("HW byte re-ordering not supported"); in spi_mcux_configure()
163 return -ENOTSUP; in spi_mcux_configure()
166 if (spi_cfg->slave > kECSPI_Channel3) { in spi_mcux_configure()
167 LOG_ERR("Slave %d is greater than %d", spi_cfg->slave, kECSPI_Channel3); in spi_mcux_configure()
168 return -EINVAL; in spi_mcux_configure()
171 if (clock_control_get_rate(config->clock_dev, config->clock_subsys, &clock_freq)) { in spi_mcux_configure()
173 return -EINVAL; in spi_mcux_configure()
176 word_size = SPI_WORD_SIZE_GET(spi_cfg->operation); in spi_mcux_configure()
179 return -EINVAL; in spi_mcux_configure()
184 master_config.channel = (ecspi_channel_source_t)spi_cfg->slave; in spi_mcux_configure()
186 (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPOL) in spi_mcux_configure()
190 (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPHA) in spi_mcux_configure()
193 master_config.baudRate_Bps = spi_cfg->frequency; in spi_mcux_configure()
196 master_config.enableLoopback = (SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_LOOP); in spi_mcux_configure()
200 DIV_ROUND_UP(spi_cfg->cs.delay * USEC_PER_SEC, spi_cfg->frequency); in spi_mcux_configure()
204 return -EINVAL; in spi_mcux_configure()
210 ECSPI_MasterTransferCreateHandle(base, &data->handle, in spi_mcux_configure()
214 data->word_size = word_size; in spi_mcux_configure()
215 data->dfs = bytes_per_word(word_size); in spi_mcux_configure()
216 data->ctx.config = spi_cfg; in spi_mcux_configure()
229 struct spi_mcux_data *data = dev->data; in transceive()
232 spi_context_lock(&data->ctx, asynchronous, cb, userdata, spi_cfg); in transceive()
239 spi_context_buffers_setup(&data->ctx, tx_bufs, rx_bufs, data->dfs); in transceive()
240 spi_context_cs_control(&data->ctx, true); in transceive()
243 ret = spi_context_wait_for_completion(&data->ctx); in transceive()
246 spi_context_release(&data->ctx, ret); in transceive()
273 struct spi_mcux_data *data = dev->data; in spi_mcux_release()
277 spi_context_unlock_unconditionally(&data->ctx); in spi_mcux_release()
285 const struct spi_mcux_config *config = dev->config; in spi_mcux_init()
286 struct spi_mcux_data *data = dev->data; in spi_mcux_init()
288 config->irq_config_func(dev); in spi_mcux_init()
290 ret = spi_context_cs_configure_all(&data->ctx); in spi_mcux_init()
295 ret = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT); in spi_mcux_init()
300 spi_context_unlock_unconditionally(&data->ctx); in spi_mcux_init()
305 static DEVICE_API(spi, spi_mcux_driver_api) = {