Line data Source code
1 0 : /* 2 : * Copyright (c) 2024 Croxel, Inc. 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_DRIVERS_SPI_RTIO_H_ 8 : #define ZEPHYR_DRIVERS_SPI_RTIO_H_ 9 : 10 : #include <zephyr/kernel.h> 11 : #include <zephyr/drivers/spi.h> 12 : #include <zephyr/rtio/rtio.h> 13 : 14 : #ifdef __cplusplus 15 : extern "C" { 16 : #endif 17 : 18 : /** 19 : * @brief Driver context for implementing SPI with RTIO 20 : */ 21 1 : struct spi_rtio { 22 0 : struct k_spinlock lock; 23 0 : struct rtio *r; 24 0 : struct mpsc io_q; 25 0 : struct rtio_iodev iodev; 26 0 : struct rtio_iodev_sqe *txn_head; 27 0 : struct rtio_iodev_sqe *txn_curr; 28 0 : struct spi_dt_spec dt_spec; 29 : }; 30 : 31 : /** 32 : * @brief Statically define a spi_rtio context 33 : * 34 : * @param _name Symbolic name of the context 35 : * @param _sq_sz Submission queue entry pool size 36 : * @param _cq_sz Completion queue entry pool size 37 : */ 38 1 : #define SPI_RTIO_DEFINE(_name, _sq_sz, _cq_sz) \ 39 : RTIO_DEFINE(CONCAT(_name, _r), _sq_sz, _cq_sz); \ 40 : static struct spi_rtio _name = { \ 41 : .r = &CONCAT(_name, _r), \ 42 : }; 43 : 44 : /** 45 : * @brief Copy the tx_bufs and rx_bufs into a set of RTIO requests 46 : * 47 : * @param[in] r rtio context 48 : * @param[in] iodev iodev to transceive with 49 : * @param[in] tx_bufs transmit buffer set 50 : * @param[in] rx_bufs receive buffer set 51 : * @param[out] last_sqe last sqe submitted, NULL if not enough memory 52 : * 53 : * @retval Number of submission queue entries 54 : * @retval -ENOMEM out of memory 55 : */ 56 1 : int spi_rtio_copy(struct rtio *r, 57 : struct rtio_iodev *iodev, 58 : const struct spi_buf_set *tx_bufs, 59 : const struct spi_buf_set *rx_bufs, 60 : struct rtio_sqe **last_sqe); 61 : 62 : /** 63 : * @brief Initialize a SPI RTIO context 64 : * 65 : * @param ctx SPI RTIO driver context 66 : * @param dev SPI bus 67 : */ 68 1 : void spi_rtio_init(struct spi_rtio *ctx, const struct device *dev); 69 : 70 : /** 71 : * @brief Signal that the current (ctx->txn_curr) submission has been completed 72 : * 73 : * @param ctx SPI RTIO driver context 74 : * @param status Completion status, negative values are errors 75 : * 76 : * @retval true Next submission is ready to start 77 : * @retval false No more submissions to work on 78 : */ 79 1 : bool spi_rtio_complete(struct spi_rtio *ctx, int status); 80 : 81 : /** 82 : * @brief Submit, atomically, a submission to work on at some point 83 : * 84 : * @retval true Next submission is ready to start 85 : * @retval false No new submission to start or submissions are in progress already 86 : */ 87 1 : bool spi_rtio_submit(struct spi_rtio *ctx, struct rtio_iodev_sqe *iodev_sqe); 88 : 89 : /** 90 : * @brief Perform a SPI Transfer (transceive) in a blocking call 91 : * 92 : * Provides a compatible API for the existing spi_transceive API by blocking 93 : * the caller until the operation is complete. 94 : * For details see @ref spi_transceive. 95 : */ 96 1 : int spi_rtio_transceive(struct spi_rtio *ctx, 97 : const struct spi_config *config, 98 : const struct spi_buf_set *tx_bufs, 99 : const struct spi_buf_set *rx_bufs); 100 : 101 : /** 102 : * @brief Fallback SPI RTIO submit implementation. 103 : * 104 : * Default RTIO SPI implementation for drivers who do no yet have 105 : * native support. For details, see @ref spi_iodev_submit. 106 : */ 107 1 : void spi_rtio_iodev_default_submit(const struct device *dev, 108 : struct rtio_iodev_sqe *iodev_sqe); 109 : 110 : #ifdef __cplusplus 111 : } 112 : #endif 113 : 114 : #endif /* ZEPHYR_DRIVERS_SPI_RTIO_H_ */