Line data Source code
1 0 : /* 2 : * Copyright (c) 2024 Intel Corporation 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_DRIVERS_I2C_RTIO_H_ 8 : #define ZEPHYR_DRIVERS_I2C_RTIO_H_ 9 : 10 : #include <zephyr/kernel.h> 11 : #include <zephyr/drivers/i2c.h> 12 : #include <zephyr/rtio/rtio.h> 13 : 14 : #ifdef __cplusplus 15 : extern "C" { 16 : #endif 17 : 18 : /** 19 : * @brief Driver context for implementing i2c with rtio 20 : */ 21 1 : struct i2c_rtio { 22 0 : struct k_sem lock; 23 0 : struct k_spinlock slock; 24 0 : struct rtio *r; 25 0 : struct mpsc io_q; 26 0 : struct rtio_iodev iodev; 27 0 : struct rtio_iodev_sqe *txn_head; 28 0 : struct rtio_iodev_sqe *txn_curr; 29 0 : struct i2c_dt_spec dt_spec; 30 : }; 31 : 32 : /** 33 : * @brief Statically define an i2c_rtio context 34 : * 35 : * @param _name Symbolic name of the context 36 : * @param _sq_sz Submission queue entry pool size 37 : * @param _cq_sz Completion queue entry pool size 38 : */ 39 1 : #define I2C_RTIO_DEFINE(_name, _sq_sz, _cq_sz) \ 40 : RTIO_DEFINE(CONCAT(_name, _r), _sq_sz, _cq_sz); \ 41 : static struct i2c_rtio _name = { \ 42 : .r = &CONCAT(_name, _r), \ 43 : }; 44 : 45 : /** 46 : * @brief Copy an array of i2c_msgs to rtio submissions and a transaction 47 : * 48 : * @retval sqe Last sqe setup in the copy 49 : * @retval NULL Not enough memory to copy the transaction 50 : */ 51 1 : struct rtio_sqe *i2c_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct i2c_msg *msgs, 52 : uint8_t num_msgs); 53 : 54 : /** 55 : * @brief Initialize an i2c rtio context 56 : * 57 : * @param ctx I2C RTIO driver context 58 : * @param dev I2C bus 59 : */ 60 1 : void i2c_rtio_init(struct i2c_rtio *ctx, const struct device *dev); 61 : 62 : /** 63 : * @brief Signal that the current (ctx->txn_curr) submission has been completed 64 : * 65 : * @param ctx I2C RTIO driver context 66 : * @param status Completion status, negative values are errors 67 : * 68 : * @retval true Next submission is ready to start 69 : * @retval false No more submissions to work on 70 : */ 71 1 : bool i2c_rtio_complete(struct i2c_rtio *ctx, int status); 72 : 73 : /** 74 : * @brief Submit, atomically, a submission to work on at some point 75 : * 76 : * @retval true Next submission is ready to start 77 : * @retval false No new submission to start or submissions are in progress already 78 : */ 79 1 : bool i2c_rtio_submit(struct i2c_rtio *ctx, struct rtio_iodev_sqe *iodev_sqe); 80 : 81 : /** 82 : * @brief Configure the I2C bus controller 83 : * 84 : * Provides a compatible API for the existing i2c_configure API, and blocks the 85 : * caller until the transfer completes. 86 : * 87 : * See i2c_configure(). 88 : */ 89 1 : int i2c_rtio_configure(struct i2c_rtio *ctx, uint32_t i2c_config); 90 : 91 : /** 92 : * @brief Transfer i2c messages in a blocking call 93 : * 94 : * Provides a compatible API for the existing i2c_transfer API, and blocks the caller 95 : * until the transfer completes. 96 : * 97 : * See i2c_transfer(). 98 : */ 99 1 : int i2c_rtio_transfer(struct i2c_rtio *ctx, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr); 100 : 101 : /** 102 : * @brief Perform an I2C bus recovery in a blocking call 103 : * 104 : * Provides a compatible API for the existing i2c_recover API, and blocks the caller 105 : * until the process completes. 106 : * 107 : * See i2c_recover(). 108 : */ 109 1 : int i2c_rtio_recover(struct i2c_rtio *ctx); 110 : 111 : #ifdef __cplusplus 112 : } 113 : #endif 114 : 115 : #endif /* ZEPHYR_DRVIERS_I2C_RTIO_H_ */