1616#include <zephyr/logging/log.h>
1717LOG_MODULE_DECLARE (LSM6DSV16X_RTIO );
1818
19- /*
20- * Create a chain of SQEs representing a bus transaction to read a reg.
21- * The RTIO-enabled bus driver will:
22- *
23- * - write "reg" address
24- * - read "len" data bytes into "buf".
25- * - call complete_op callback
26- *
27- * If drdy_xl is active it reads XL data (6 bytes) from LSM6DSV16X_OUTX_L_A reg.
28- */
29- static void lsm6dsv16x_rtio_rw_transaction (const struct device * dev , uint8_t reg ,
30- uint8_t * buf , uint32_t len ,
31- rtio_callback_t complete_op_cb )
32- {
33- struct lsm6dsv16x_data * lsm6dsv16x = dev -> data ;
34- struct rtio * rtio = lsm6dsv16x -> rtio_ctx ;
35- struct rtio_iodev * iodev = lsm6dsv16x -> iodev ;
36- struct rtio_sqe * write_addr = rtio_sqe_acquire (rtio );
37- struct rtio_sqe * read_reg = rtio_sqe_acquire (rtio );
38- struct rtio_sqe * complete_op = rtio_sqe_acquire (rtio );
39- struct rtio_iodev_sqe * sqe = lsm6dsv16x -> streaming_sqe ;
40- uint8_t reg_bus = lsm6dsv16x_bus_reg (lsm6dsv16x , reg );
41-
42- /* check we have been able to acquire sqe */
43- if (write_addr == NULL || read_reg == NULL || complete_op == NULL ) {
44- return ;
45- }
46-
47- rtio_sqe_prep_tiny_write (write_addr , iodev , RTIO_PRIO_NORM , & reg_bus , 1 , NULL );
48- write_addr -> flags = RTIO_SQE_TRANSACTION ;
49- rtio_sqe_prep_read (read_reg , iodev , RTIO_PRIO_NORM , buf , len , NULL );
50- read_reg -> flags = RTIO_SQE_CHAINED ;
51- if (lsm6dsv16x -> bus_type == BUS_I2C ) {
52- read_reg -> iodev_flags |= RTIO_IODEV_I2C_STOP | RTIO_IODEV_I2C_RESTART ;
53- } else if (lsm6dsv16x -> bus_type == BUS_I3C ) {
54- read_reg -> iodev_flags |= RTIO_IODEV_I3C_STOP | RTIO_IODEV_I3C_RESTART ;
55- }
56-
57- rtio_sqe_prep_callback_no_cqe (complete_op , complete_op_cb , (void * )dev , sqe );
58- rtio_submit (rtio , 0 );
59- }
60-
6119static void lsm6dsv16x_config_drdy (const struct device * dev , struct trigger_config trig_cfg )
6220{
6321 const struct lsm6dsv16x_config * config = dev -> config ;
@@ -500,6 +458,19 @@ static void lsm6dsv16x_read_fifo_cb(struct rtio *r, const struct rtio_sqe *sqe,
500458 read_buf = buf + sizeof (hdr );
501459 buf_avail = buf_len - sizeof (hdr );
502460
461+ uint8_t reg_addr = lsm6dsv16x_bus_reg (lsm6dsv16x -> bus_type , LSM6DSV16X_FIFO_DATA_OUT_TAG );
462+ struct rtio_regs fifo_regs ;
463+ struct rtio_regs_list regs_list [] = {
464+ {
465+ reg_addr ,
466+ read_buf ,
467+ buf_avail ,
468+ },
469+ };
470+
471+ fifo_regs .rtio_regs_list = regs_list ;
472+ fifo_regs .rtio_regs_num = ARRAY_SIZE (regs_list );
473+
503474 /*
504475 * Prepare rtio enabled bus to read all fifo_count entries from
505476 * LSM6DSV16X_FIFO_DATA_OUT_TAG. Then lsm6dsv16x_complete_op_cb
@@ -515,8 +486,8 @@ static void lsm6dsv16x_read_fifo_cb(struct rtio *r, const struct rtio_sqe *sqe,
515486 * lsm6dsv16x_fifo_out_raw_get(&dev_ctx, &f_data);
516487 * }
517488 */
518- lsm6dsv16x_rtio_rw_transaction ( dev , LSM6DSV16X_FIFO_DATA_OUT_TAG ,
519- read_buf , buf_avail , lsm6dsv16x_complete_op_cb );
489+ rtio_read_regs_async ( lsm6dsv16x -> rtio_ctx , lsm6dsv16x -> iodev , lsm6dsv16x -> bus_type ,
490+ & fifo_regs , lsm6dsv16x -> streaming_sqe , dev , lsm6dsv16x_complete_op_cb );
520491}
521492
522493/*
@@ -646,6 +617,19 @@ static void lsm6dsv16x_read_status_cb(struct rtio *r, const struct rtio_sqe *sqe
646617 memcpy (buf , & hdr , sizeof (hdr ));
647618 read_buf = (uint8_t * )& ((struct lsm6dsv16x_rtio_data * )buf )-> acc [0 ];
648619
620+ uint8_t reg_addr = lsm6dsv16x_bus_reg (lsm6dsv16x -> bus_type , LSM6DSV16X_OUTX_L_A );
621+ struct rtio_regs fifo_regs ;
622+ struct rtio_regs_list regs_list [] = {
623+ {
624+ reg_addr ,
625+ read_buf ,
626+ 6 ,
627+ },
628+ };
629+
630+ fifo_regs .rtio_regs_list = regs_list ;
631+ fifo_regs .rtio_regs_num = ARRAY_SIZE (regs_list );
632+
649633 /*
650634 * Prepare rtio enabled bus to read LSM6DSV16X_OUTX_L_A register
651635 * where accelerometer data is available.
@@ -657,8 +641,9 @@ static void lsm6dsv16x_read_status_cb(struct rtio *r, const struct rtio_sqe *sqe
657641 *
658642 * lsm6dsv16x_acceleration_raw_get(&dev_ctx, accel_raw);
659643 */
660- lsm6dsv16x_rtio_rw_transaction (dev , LSM6DSV16X_OUTX_L_A ,
661- read_buf , 6 , lsm6dsv16x_complete_op_cb );
644+ rtio_read_regs_async (lsm6dsv16x -> rtio_ctx , lsm6dsv16x -> iodev , lsm6dsv16x -> bus_type ,
645+ & fifo_regs , lsm6dsv16x -> streaming_sqe , dev ,
646+ lsm6dsv16x_complete_op_cb );
662647 }
663648}
664649
@@ -708,12 +693,26 @@ void lsm6dsv16x_stream_irq_handler(const struct device *dev)
708693 struct rtio_sqe * check_fifo_status_reg = rtio_sqe_acquire (rtio );
709694
710695 rtio_sqe_prep_callback_no_cqe (check_fifo_status_reg ,
711- lsm6dsv16x_read_fifo_cb , (void * )dev , NULL );
696+ lsm6dsv16x_read_fifo_cb , (void * )dev , NULL );
712697 rtio_submit (rtio , 0 );
713698 } else {
714699#endif
715700 lsm6dsv16x -> fifo_status [0 ] = lsm6dsv16x -> fifo_status [1 ] = 0 ;
716701
702+ uint8_t reg_addr =
703+ lsm6dsv16x_bus_reg (lsm6dsv16x -> bus_type , LSM6DSV16X_FIFO_STATUS1 );
704+ struct rtio_regs fifo_regs ;
705+ struct rtio_regs_list regs_list [] = {
706+ {
707+ reg_addr ,
708+ lsm6dsv16x -> fifo_status ,
709+ 2 ,
710+ },
711+ };
712+
713+ fifo_regs .rtio_regs_list = regs_list ;
714+ fifo_regs .rtio_regs_num = ARRAY_SIZE (regs_list );
715+
717716 /*
718717 * Prepare rtio enabled bus to read LSM6DSV16X_FIFO_STATUS1 and
719718 * LSM6DSV16X_FIFO_STATUS2 registers where FIFO threshold condition and
@@ -726,8 +725,11 @@ void lsm6dsv16x_stream_irq_handler(const struct device *dev)
726725 *
727726 * lsm6dsv16x_fifo_status_get(&dev_ctx, &fifo_status);
728727 */
729- lsm6dsv16x_rtio_rw_transaction (dev , LSM6DSV16X_FIFO_STATUS1 ,
730- lsm6dsv16x -> fifo_status , 2 , lsm6dsv16x_read_fifo_cb );
728+ rtio_read_regs_async (lsm6dsv16x -> rtio_ctx , lsm6dsv16x -> iodev ,
729+ lsm6dsv16x -> bus_type , & fifo_regs ,
730+ lsm6dsv16x -> streaming_sqe , dev ,
731+ lsm6dsv16x_read_fifo_cb );
732+
731733#if LSM6DSVXXX_ANY_INST_ON_BUS_STATUS_OKAY (i3c )
732734 }
733735#endif
@@ -737,6 +739,19 @@ void lsm6dsv16x_stream_irq_handler(const struct device *dev)
737739 if (lsm6dsv16x -> trig_cfg .int_drdy ) {
738740 lsm6dsv16x -> status = 0 ;
739741
742+ uint8_t reg_addr = lsm6dsv16x_bus_reg (lsm6dsv16x -> bus_type , LSM6DSV16X_STATUS_REG );
743+ struct rtio_regs fifo_regs ;
744+ struct rtio_regs_list regs_list [] = {
745+ {
746+ reg_addr ,
747+ & lsm6dsv16x -> status ,
748+ 1 ,
749+ },
750+ };
751+
752+ fifo_regs .rtio_regs_list = regs_list ;
753+ fifo_regs .rtio_regs_num = ARRAY_SIZE (regs_list );
754+
740755 /*
741756 * Prepare rtio enabled bus to read LSM6DSV16X_STATUS_REG register
742757 * where accelerometer and gyroscope data ready status is available.
@@ -748,7 +763,8 @@ void lsm6dsv16x_stream_irq_handler(const struct device *dev)
748763 *
749764 * lsm6dsv16x_flag_data_ready_get(&dev_ctx, &drdy);
750765 */
751- lsm6dsv16x_rtio_rw_transaction (dev , LSM6DSV16X_STATUS_REG ,
752- & lsm6dsv16x -> status , 1 , lsm6dsv16x_read_status_cb );
766+ rtio_read_regs_async (lsm6dsv16x -> rtio_ctx , lsm6dsv16x -> iodev , lsm6dsv16x -> bus_type ,
767+ & fifo_regs , lsm6dsv16x -> streaming_sqe , dev ,
768+ lsm6dsv16x_read_status_cb );
753769 }
754770}
0 commit comments