1 /*
2  * Copyright (c) 2025 Croxel Inc.
3  * Copyright (c) 2025 CogniPilot Foundation
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #ifndef ZEPHYR_DRIVERS_SENSOR_ICM45686_BUS_H_
9 #define ZEPHYR_DRIVERS_SENSOR_ICM45686_BUS_H_
10 
11 #include <stdint.h>
12 #include <zephyr/rtio/rtio.h>
13 
14 #include "icm45686.h"
15 #include "icm45686_reg.h"
16 
icm45686_bus_read(const struct device * dev,uint8_t reg,uint8_t * buf,uint16_t len)17 static inline int icm45686_bus_read(const struct device *dev,
18 				    uint8_t reg,
19 				    uint8_t *buf,
20 				    uint16_t len)
21 {
22 	struct icm45686_data *data = dev->data;
23 	struct rtio *ctx = data->rtio.ctx;
24 	struct rtio_iodev *iodev = data->rtio.iodev;
25 	struct rtio_sqe *write_sqe = rtio_sqe_acquire(ctx);
26 	struct rtio_sqe *read_sqe = rtio_sqe_acquire(ctx);
27 	struct rtio_cqe *cqe;
28 	int err;
29 
30 	if (!write_sqe || !read_sqe) {
31 		return -ENOMEM;
32 	}
33 
34 	reg = reg | REG_SPI_READ_BIT;
35 
36 	rtio_sqe_prep_write(write_sqe, iodev, RTIO_PRIO_HIGH, &reg, 1, NULL);
37 	write_sqe->flags |= RTIO_SQE_TRANSACTION;
38 	rtio_sqe_prep_read(read_sqe, iodev, RTIO_PRIO_HIGH, buf, len, NULL);
39 
40 	err = rtio_submit(ctx, 2);
41 	if (err) {
42 		return err;
43 	}
44 
45 	do {
46 		cqe = rtio_cqe_consume(ctx);
47 		if (cqe != NULL) {
48 			err = cqe->result;
49 			rtio_cqe_release(ctx, cqe);
50 		}
51 	} while (cqe != NULL);
52 
53 	return err;
54 }
55 
icm45686_bus_write(const struct device * dev,uint8_t reg,const uint8_t * buf,uint16_t len)56 static inline int icm45686_bus_write(const struct device *dev,
57 				     uint8_t reg,
58 				     const uint8_t *buf,
59 				     uint16_t len)
60 {
61 	struct icm45686_data *data = dev->data;
62 	struct rtio *ctx = data->rtio.ctx;
63 	struct rtio_iodev *iodev = data->rtio.iodev;
64 	struct rtio_sqe *write_reg_sqe = rtio_sqe_acquire(ctx);
65 	struct rtio_sqe *write_buf_sqe = rtio_sqe_acquire(ctx);
66 	struct rtio_cqe *cqe;
67 	int err;
68 
69 	if (!write_reg_sqe || !write_buf_sqe) {
70 		return -ENOMEM;
71 	}
72 
73 	rtio_sqe_prep_write(write_reg_sqe, iodev, RTIO_PRIO_HIGH, &reg, 1, NULL);
74 	write_reg_sqe->flags |= RTIO_SQE_TRANSACTION;
75 	rtio_sqe_prep_write(write_buf_sqe, iodev, RTIO_PRIO_HIGH, buf, len, NULL);
76 
77 	err = rtio_submit(ctx, 2);
78 	if (err) {
79 		return err;
80 	}
81 
82 	do {
83 		cqe = rtio_cqe_consume(ctx);
84 		if (cqe != NULL) {
85 			err = cqe->result;
86 			rtio_cqe_release(ctx, cqe);
87 		}
88 	} while (cqe != NULL);
89 
90 	return err;
91 }
92 
93 #endif /* ZEPHYR_DRIVERS_SENSOR_ICM45686_BUS_H_ */
94