blob: c98aec4586f56c02623cf3a1857ee906d4ed871d [file] [log] [blame]
/*
* Copyright (c) 2024 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_I2C_RTIO_H_
#define ZEPHYR_DRIVERS_I2C_RTIO_H_
#include <zephyr/kernel.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/rtio/rtio.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Driver context for implementing i2c with rtio
*/
struct i2c_rtio {
struct k_sem lock;
struct k_spinlock slock;
struct rtio *r;
struct rtio_mpsc io_q;
struct rtio_iodev iodev;
struct rtio_iodev_sqe *txn_head;
struct rtio_iodev_sqe *txn_curr;
struct i2c_dt_spec dt_spec;
};
/**
* @brief Statically define an i2c_rtio context
*
* @param _name Symbolic name of the context
* @param _sq_sz Submission queue entry pool size
* @param _cq_sz Completeion queue entry pool size
*/
#define I2C_RTIO_DEFINE(_name, _sq_sz, _cq_sz) \
RTIO_DEFINE(_name##_r, _sq_sz, _cq_sz); \
static struct i2c_rtio _name = { \
.r = &_name##_r, \
};
/**
* @brief Copy an an array of i2c_msgs to rtio submissions and a transaction
*
* @retval sqe Last sqe setup in the copy
* @retval NULL Not enough memory to copy the transaction
*/
struct rtio_sqe *i2c_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct i2c_msg *msgs,
uint8_t num_msgs);
/**
* @brief Initialize an i2c rtio context
*
* @param ctx I2C RTIO driver context
* @param dev I2C bus
*/
void i2c_rtio_init(struct i2c_rtio *ctx, const struct device *dev);
/**
* @brief Signal that the current (ctx->txn_curr) submission has been completed
*
* @param ctx I2C RTIO driver context
* @param status Completion status, negative values are errors
*
* @retval true Next submission is ready to start
* @retval false No more submissions to work on
*/
bool i2c_rtio_complete(struct i2c_rtio *ctx, int status);
/**
* @brief Submit, atomically, a submission to work on at some point
*
* @retval true Next submission is ready to start
* @retval false No new submission to start or submissions are in progress already
*/
bool i2c_rtio_submit(struct i2c_rtio *ctx, struct rtio_iodev_sqe *iodev_sqe);
/**
* @brief Configure the I2C bus controller
*
* Provides a compatible API for the existing i2c_configure API, and blocks the
* caller until the transfer completes.
*
* See i2c_configure().
*/
int i2c_rtio_configure(struct i2c_rtio *ctx, uint32_t i2c_config);
/**
* @brief Transfer i2c messages in a blocking call
*
* Provides a compatible API for the existing i2c_transfer API, and blocks the caller
* until the transfer completes.
*
* See i2c_transfer().
*/
int i2c_rtio_transfer(struct i2c_rtio *ctx, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr);
/**
* @brief Perform an I2C bus recovery in a blocking call
*
* Provides a compatible API for the existing i2c_recover API, and blocks the caller
* until the process completes.
*
* See i2c_recover().
*/
int i2c_rtio_recover(struct i2c_rtio *ctx);
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_DRVIERS_I2C_RTIO_H_ */