/* * Copyright (c) 2023 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include "zephyr/rtio/rtio.h" #include #include #include const struct rtio_iodev_api i2c_iodev_api = { .submit = i2c_iodev_submit, }; struct rtio_sqe *i2c_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct i2c_msg *msgs, uint8_t num_msgs) { __ASSERT(num_msgs > 0, "Expecting at least one message to copy"); struct rtio_sqe *sqe = NULL; for (uint8_t i = 0; i < num_msgs; i++) { sqe = rtio_sqe_acquire(r); if (sqe == NULL) { rtio_spsc_drop_all(r->sq); return NULL; } if (msgs[i].flags & I2C_MSG_READ) { rtio_sqe_prep_read(sqe, iodev, RTIO_PRIO_NORM, msgs[i].buf, msgs[i].len, NULL); } else { rtio_sqe_prep_write(sqe, iodev, RTIO_PRIO_NORM, msgs[i].buf, msgs[i].len, NULL); } sqe->flags |= RTIO_SQE_TRANSACTION; sqe->iodev_flags = ((msgs[i].flags & I2C_MSG_STOP) ? RTIO_IODEV_I2C_STOP : 0) | ((msgs[i].flags & I2C_MSG_RESTART) ? RTIO_IODEV_I2C_RESTART : 0) | ((msgs[i].flags & I2C_MSG_ADDR_10_BITS) ? RTIO_IODEV_I2C_10_BITS : 0); } sqe->flags &= ~RTIO_SQE_TRANSACTION; return sqe; }