zephyr/drivers/i2c/i2c_rtio.c

50 lines
1.2 KiB
C

/*
* Copyright (c) 2023 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/rtio/rtio.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/rtio/rtio_spsc.h>
#include <zephyr/sys/__assert.h>
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;
}