Lines Matching +full:spi +full:- +full:if
4 * SPDX-License-Identifier: Apache-2.0
10 #include <zephyr/drivers/spi.h>
11 #include <zephyr/drivers/spi/rtio.h>
40 struct spi_sedi_data *data = dev->data; in spi_sedi_configure()
41 const struct spi_sedi_config *info = dev->config; in spi_sedi_configure()
44 if (spi_context_configured(&data->ctx, config) == true) { in spi_sedi_configure()
48 word_size = SPI_WORD_SIZE_GET(config->operation); in spi_sedi_configure()
49 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_DATA_WIDTH, in spi_sedi_configure()
53 cpol = SPI_MODE_GET(config->operation) & SPI_MODE_CPOL; in spi_sedi_configure()
54 cpha = SPI_MODE_GET(config->operation) & SPI_MODE_CPHA; in spi_sedi_configure()
56 if ((cpol == 0) && (cpha == 0)) { in spi_sedi_configure()
57 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_CPOL0_CPHA0, in spi_sedi_configure()
59 } else if ((cpol == 0) && (cpha == 1U)) { in spi_sedi_configure()
60 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_CPOL0_CPHA1, in spi_sedi_configure()
62 } else if ((cpol == 1) && (cpha == 0U)) { in spi_sedi_configure()
63 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_CPOL1_CPHA0, in spi_sedi_configure()
66 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_CPOL1_CPHA1, in spi_sedi_configure()
71 if (config->operation & SPI_TRANSFER_LSB) { in spi_sedi_configure()
72 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_LSB, 0); in spi_sedi_configure()
76 loopback = SPI_MODE_GET(config->operation) & SPI_MODE_LOOP; in spi_sedi_configure()
77 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_LOOPBACK, loopback); in spi_sedi_configure()
80 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_SPEED_SET, in spi_sedi_configure()
81 config->frequency); in spi_sedi_configure()
83 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_CS_HW, config->slave); in spi_sedi_configure()
85 data->ctx.config = config; in spi_sedi_configure()
86 spi_context_cs_control(&data->ctx, true); in spi_sedi_configure()
97 const struct spi_sedi_config *info = dev->config; in transceive()
98 struct spi_sedi_data *spi = dev->data; in transceive() local
99 struct spi_context *ctx = &spi->ctx; in transceive()
107 spi_context_lock(&spi->ctx, asynchronous, cb, userdata, config); in transceive()
111 ret = sedi_spi_set_power(info->spi_device, SEDI_POWER_FULL); in transceive()
112 if (ret) { in transceive()
116 /* If need to configure, re-configure */ in transceive()
119 spi->tx_data_updated = false; in transceive()
120 spi->rx_data_updated = false; in transceive()
122 spi_context_buffers_setup(&spi->ctx, tx_bufs, rx_bufs, 1); in transceive()
124 if ((ctx->tx_count > 1) || (ctx->rx_count > 1)) { in transceive()
128 if (ctx->tx_count > ctx->rx_count) { in transceive()
129 spi->tx_dummy_len = 0; in transceive()
130 for (i = ctx->rx_count; i < ctx->tx_count; i++) { in transceive()
131 buf = ctx->current_tx + i; in transceive()
132 dummy_len += buf->len; in transceive()
134 spi->rx_dummy_len = dummy_len; in transceive()
135 } else if (ctx->tx_count < ctx->rx_count) { in transceive()
136 spi->rx_dummy_len = 0; in transceive()
137 for (i = ctx->tx_count; i < ctx->rx_count; i++) { in transceive()
138 buf = ctx->current_rx + i; in transceive()
139 dummy_len += buf->len; in transceive()
141 spi->tx_dummy_len = dummy_len; in transceive()
143 spi->tx_dummy_len = 0; in transceive()
144 spi->rx_dummy_len = 0; in transceive()
147 if ((ctx->tx_len == 0) && (ctx->rx_len == 0)) { in transceive()
148 spi_context_cs_control(&spi->ctx, true); in transceive()
149 spi_context_complete(&spi->ctx, dev, 0); in transceive()
154 if (is_multibufs) { in transceive()
155 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_BUFFER_SETS, 1); in transceive()
158 if (ctx->tx_len == 0) { in transceive()
161 data_in = (uint8_t *)ctx->rx_buf; in transceive()
162 transfer_bytes = ctx->rx_len; in transceive()
163 spi->tx_dummy_len -= transfer_bytes; in transceive()
164 } else if (ctx->rx_len == 0) { in transceive()
166 data_out = (uint8_t *)ctx->tx_buf; in transceive()
168 transfer_bytes = ctx->tx_len; in transceive()
169 spi->rx_dummy_len -= transfer_bytes; in transceive()
170 } else if (ctx->tx_len == ctx->rx_len) { in transceive()
172 data_out = (uint8_t *)ctx->tx_buf; in transceive()
173 data_in = (uint8_t *)ctx->rx_buf; in transceive()
174 transfer_bytes = ctx->tx_len; in transceive()
175 } else if (ctx->tx_len > ctx->rx_len) { in transceive()
180 data_out = (uint8_t *)ctx->tx_buf; in transceive()
181 data_in = ctx->rx_buf; in transceive()
182 transfer_bytes = ctx->rx_len; in transceive()
188 data_out = (uint8_t *)ctx->tx_buf; in transceive()
189 data_in = ctx->rx_buf; in transceive()
190 transfer_bytes = ctx->tx_len; in transceive()
193 spi_context_cs_control(&spi->ctx, false); in transceive()
195 ret = sedi_spi_transfer(info->spi_device, data_out, data_in, in transceive()
198 if (ret != SEDI_DRIVER_OK) { in transceive()
202 ret = spi_context_wait_for_completion(&spi->ctx); in transceive()
203 if (ret != 0) { in transceive()
206 sedi_spi_get_status(info->spi_device, &spi_status); in transceive()
208 /* SPI ABORT */ in transceive()
209 sedi_spi_control(info->spi_device, SEDI_SPI_IOCTL_ABORT, 0); in transceive()
211 spi_context_cs_control(&spi->ctx, true); in transceive()
214 spi_context_release(&spi->ctx, ret); in transceive()
243 struct spi_sedi_data *spi = dev->data; in spi_sedi_release() local
245 if (!spi_context_configured(&spi->ctx, config)) { in spi_sedi_release()
246 return -EINVAL; in spi_sedi_release()
249 spi_context_unlock_unconditionally(&spi->ctx); in spi_sedi_release()
259 const struct spi_sedi_config *info = dev->config; in spi_sedi_callback()
260 struct spi_sedi_data *spi = dev->data; in spi_sedi_callback() local
261 struct spi_context *ctx = &spi->ctx; in spi_sedi_callback()
264 if (event == SEDI_SPI_EVENT_DATA_LOST) { in spi_sedi_callback()
265 error = -EIO; in spi_sedi_callback()
270 if ((event == SEDI_SPI_EVENT_COMPLETE) || in spi_sedi_callback()
272 spi_context_cs_control(&spi->ctx, true); in spi_sedi_callback()
273 spi_context_complete(&spi->ctx, dev, error); in spi_sedi_callback()
274 } else if (event == SEDI_SPI_EVENT_TX_FINISHED) { in spi_sedi_callback()
275 spi_context_update_tx(ctx, 1, ctx->tx_len); in spi_sedi_callback()
276 if (ctx->tx_len != 0) { in spi_sedi_callback()
277 sedi_spi_update_tx_buf(info->spi_device, ctx->tx_buf, in spi_sedi_callback()
278 ctx->tx_len); in spi_sedi_callback()
279 if ((ctx->rx_len == 0) && in spi_sedi_callback()
280 (spi->rx_data_updated == false)) { in spi_sedi_callback()
281 /* Update rx length if always no rx */ in spi_sedi_callback()
282 sedi_spi_update_rx_buf(info->spi_device, NULL, in spi_sedi_callback()
283 spi->rx_dummy_len); in spi_sedi_callback()
284 spi->rx_data_updated = true; in spi_sedi_callback()
286 } else if (spi->tx_data_updated == false) { in spi_sedi_callback()
287 sedi_spi_update_tx_buf(info->spi_device, NULL, in spi_sedi_callback()
288 spi->tx_dummy_len); in spi_sedi_callback()
289 spi->tx_data_updated = true; in spi_sedi_callback()
291 } else if (event == SEDI_SPI_EVENT_RX_FINISHED) { in spi_sedi_callback()
292 spi_context_update_rx(ctx, 1, ctx->rx_len); in spi_sedi_callback()
293 if (ctx->rx_len != 0) { in spi_sedi_callback()
294 sedi_spi_update_rx_buf(info->spi_device, ctx->rx_buf, in spi_sedi_callback()
295 ctx->rx_len); in spi_sedi_callback()
300 static DEVICE_API(spi, sedi_spi_api) = {
313 const struct spi_sedi_config *info = dev->config; in spi_sedi_init()
314 struct spi_sedi_data *spi = dev->data; in spi_sedi_init() local
319 ret = sedi_spi_init(info->spi_device, spi_sedi_callback, (void *)dev, in spi_sedi_init()
321 if (ret != SEDI_DRIVER_OK) { in spi_sedi_init()
322 return -ENODEV; in spi_sedi_init()
326 info->irq_config(); in spi_sedi_init()
328 spi_context_unlock_unconditionally(&spi->ctx); in spi_sedi_init()
337 const struct spi_sedi_config *config = dev->config; in spi_suspend_device()
339 if (pm_device_is_busy(dev)) { in spi_suspend_device()
340 return -EBUSY; in spi_suspend_device()
343 int ret = sedi_spi_set_power(config->spi_device, SEDI_POWER_SUSPEND); in spi_suspend_device()
345 if (ret != SEDI_DRIVER_OK) { in spi_suspend_device()
346 return -EIO; in spi_suspend_device()
354 const struct spi_sedi_config *config = dev->config; in spi_resume_device_from_suspend()
357 ret = sedi_spi_set_power(config->spi_device, SEDI_POWER_FULL); in spi_resume_device_from_suspend()
358 if (ret != SEDI_DRIVER_OK) { in spi_resume_device_from_suspend()
359 return -EIO; in spi_resume_device_from_suspend()
380 ret = -ENOTSUP; in spi_sedi_device_ctrl()