@@ -92,7 +92,7 @@ static inline int lsm6dsl_reboot(const struct device *dev)
9292{
9393 struct lsm6dsl_data * data = dev -> data ;
9494
95- if (data -> hw_tf -> update_reg (data , LSM6DSL_REG_CTRL3_C ,
95+ if (data -> hw_tf -> update_reg (dev , LSM6DSL_REG_CTRL3_C ,
9696 LSM6DSL_MASK_CTRL3_C_BOOT ,
9797 1 << LSM6DSL_SHIFT_CTRL3_C_BOOT ) < 0 ) {
9898 return - EIO ;
@@ -108,7 +108,7 @@ static int lsm6dsl_accel_set_fs_raw(const struct device *dev, uint8_t fs)
108108{
109109 struct lsm6dsl_data * data = dev -> data ;
110110
111- if (data -> hw_tf -> update_reg (data ,
111+ if (data -> hw_tf -> update_reg (dev ,
112112 LSM6DSL_REG_CTRL1_XL ,
113113 LSM6DSL_MASK_CTRL1_XL_FS_XL ,
114114 fs << LSM6DSL_SHIFT_CTRL1_XL_FS_XL ) < 0 ) {
@@ -124,7 +124,7 @@ static int lsm6dsl_accel_set_odr_raw(const struct device *dev, uint8_t odr)
124124{
125125 struct lsm6dsl_data * data = dev -> data ;
126126
127- if (data -> hw_tf -> update_reg (data ,
127+ if (data -> hw_tf -> update_reg (dev ,
128128 LSM6DSL_REG_CTRL1_XL ,
129129 LSM6DSL_MASK_CTRL1_XL_ODR_XL ,
130130 odr << LSM6DSL_SHIFT_CTRL1_XL_ODR_XL ) < 0 ) {
@@ -141,14 +141,14 @@ static int lsm6dsl_gyro_set_fs_raw(const struct device *dev, uint8_t fs)
141141 struct lsm6dsl_data * data = dev -> data ;
142142
143143 if (fs == GYRO_FULLSCALE_125 ) {
144- if (data -> hw_tf -> update_reg (data ,
144+ if (data -> hw_tf -> update_reg (dev ,
145145 LSM6DSL_REG_CTRL2_G ,
146146 LSM6DSL_MASK_CTRL2_FS125 ,
147147 1 << LSM6DSL_SHIFT_CTRL2_FS125 ) < 0 ) {
148148 return - EIO ;
149149 }
150150 } else {
151- if (data -> hw_tf -> update_reg (data ,
151+ if (data -> hw_tf -> update_reg (dev ,
152152 LSM6DSL_REG_CTRL2_G ,
153153 LSM6DSL_MASK_CTRL2_G_FS_G ,
154154 fs << LSM6DSL_SHIFT_CTRL2_G_FS_G ) < 0 ) {
@@ -163,7 +163,7 @@ static int lsm6dsl_gyro_set_odr_raw(const struct device *dev, uint8_t odr)
163163{
164164 struct lsm6dsl_data * data = dev -> data ;
165165
166- if (data -> hw_tf -> update_reg (data ,
166+ if (data -> hw_tf -> update_reg (dev ,
167167 LSM6DSL_REG_CTRL2_G ,
168168 LSM6DSL_MASK_CTRL2_G_ODR_G ,
169169 odr << LSM6DSL_SHIFT_CTRL2_G_ODR_G ) < 0 ) {
@@ -322,7 +322,7 @@ static int lsm6dsl_sample_fetch_accel(const struct device *dev)
322322 struct lsm6dsl_data * data = dev -> data ;
323323 uint8_t buf [6 ];
324324
325- if (data -> hw_tf -> read_data (data , LSM6DSL_REG_OUTX_L_XL ,
325+ if (data -> hw_tf -> read_data (dev , LSM6DSL_REG_OUTX_L_XL ,
326326 buf , sizeof (buf )) < 0 ) {
327327 LOG_DBG ("failed to read sample" );
328328 return - EIO ;
@@ -343,7 +343,7 @@ static int lsm6dsl_sample_fetch_gyro(const struct device *dev)
343343 struct lsm6dsl_data * data = dev -> data ;
344344 uint8_t buf [6 ];
345345
346- if (data -> hw_tf -> read_data (data , LSM6DSL_REG_OUTX_L_G ,
346+ if (data -> hw_tf -> read_data (dev , LSM6DSL_REG_OUTX_L_G ,
347347 buf , sizeof (buf )) < 0 ) {
348348 LOG_DBG ("failed to read sample" );
349349 return - EIO ;
@@ -365,7 +365,7 @@ static int lsm6dsl_sample_fetch_temp(const struct device *dev)
365365 struct lsm6dsl_data * data = dev -> data ;
366366 uint8_t buf [2 ];
367367
368- if (data -> hw_tf -> read_data (data , LSM6DSL_REG_OUT_TEMP_L ,
368+ if (data -> hw_tf -> read_data (dev , LSM6DSL_REG_OUT_TEMP_L ,
369369 buf , sizeof (buf )) < 0 ) {
370370 LOG_DBG ("failed to read sample" );
371371 return - EIO ;
@@ -699,7 +699,7 @@ static int lsm6dsl_channel_get(const struct device *dev,
699699 return 0 ;
700700}
701701
702- static const struct sensor_driver_api lsm6dsl_api_funcs = {
702+ static const struct sensor_driver_api lsm6dsl_driver_api = {
703703 .attr_set = lsm6dsl_attr_set ,
704704#if CONFIG_LSM6DSL_TRIGGER
705705 .trigger_set = lsm6dsl_trigger_set ,
@@ -718,7 +718,7 @@ static int lsm6dsl_init_chip(const struct device *dev)
718718 return - EIO ;
719719 }
720720
721- if (data -> hw_tf -> read_reg (data , LSM6DSL_REG_WHO_AM_I , & chip_id ) < 0 ) {
721+ if (data -> hw_tf -> read_reg (dev , LSM6DSL_REG_WHO_AM_I , & chip_id ) < 0 ) {
722722 LOG_DBG ("failed reading chip id" );
723723 return - EIO ;
724724 }
@@ -754,15 +754,15 @@ static int lsm6dsl_init_chip(const struct device *dev)
754754 return - EIO ;
755755 }
756756
757- if (data -> hw_tf -> update_reg (data ,
757+ if (data -> hw_tf -> update_reg (dev ,
758758 LSM6DSL_REG_FIFO_CTRL5 ,
759759 LSM6DSL_MASK_FIFO_CTRL5_FIFO_MODE ,
760760 0 << LSM6DSL_SHIFT_FIFO_CTRL5_FIFO_MODE ) < 0 ) {
761761 LOG_DBG ("failed to set FIFO mode" );
762762 return - EIO ;
763763 }
764764
765- if (data -> hw_tf -> update_reg (data ,
765+ if (data -> hw_tf -> update_reg (dev ,
766766 LSM6DSL_REG_CTRL3_C ,
767767 LSM6DSL_MASK_CTRL3_C_BDU |
768768 LSM6DSL_MASK_CTRL3_C_BLE |
@@ -777,27 +777,18 @@ static int lsm6dsl_init_chip(const struct device *dev)
777777 return 0 ;
778778}
779779
780- static struct lsm6dsl_config lsm6dsl_config = {
781- .comm_master_dev_name = DT_INST_BUS_LABEL (0 ),
782- };
783-
784780static int lsm6dsl_init (const struct device * dev )
785781{
786782 const struct lsm6dsl_config * const config = dev -> config ;
787783 struct lsm6dsl_data * data = dev -> data ;
788784
789- data -> comm_master = device_get_binding (config -> comm_master_dev_name );
790- if (!data -> comm_master ) {
791- LOG_DBG ("master not found: %s" ,
792- config -> comm_master_dev_name );
785+ data -> bus = device_get_binding (config -> bus_name );
786+ if (!data -> bus ) {
787+ LOG_DBG ("master not found: %s" , config -> bus_name );
793788 return - EINVAL ;
794789 }
795790
796- #if DT_ANY_INST_ON_BUS_STATUS_OKAY (spi )
797- lsm6dsl_spi_init (dev );
798- #else
799- lsm6dsl_i2c_init (dev );
800- #endif
791+ config -> bus_init (dev );
801792
802793 if (lsm6dsl_init_chip (dev ) < 0 ) {
803794 LOG_DBG ("failed to initialize chip" );
@@ -822,8 +813,129 @@ static int lsm6dsl_init(const struct device *dev)
822813}
823814
824815
825- static struct lsm6dsl_data lsm6dsl_data ;
816+ #if DT_NUM_INST_STATUS_OKAY (DT_DRV_COMPAT ) == 0
817+ #warning "LSM6DSL driver enabled without any devices"
818+ #endif
819+
820+ /*
821+ * Device creation macro, shared by LSM6DSL_DEFINE_SPI() and
822+ * LSM6DSL_DEFINE_I2C().
823+ */
824+
825+ #define LSM6DSL_DEVICE_INIT (inst ) \
826+ DEVICE_AND_API_INIT(lsm6dsl_##inst, \
827+ DT_INST_LABEL(inst), \
828+ lsm6dsl_init, \
829+ &lsm6dsl_data_##inst, \
830+ &lsm6dsl_config_##inst, \
831+ POST_KERNEL, \
832+ CONFIG_SENSOR_INIT_PRIORITY, \
833+ &lsm6dsl_driver_api);
834+
835+ /*
836+ * Instantiation macros used when a device is on a SPI bus.
837+ */
838+
839+ #define LSM6DSL_HAS_CS (inst ) DT_INST_SPI_DEV_HAS_CS_GPIOS(inst)
840+
841+ #define LSM6DSL_DATA_SPI_CS (inst ) \
842+ { .cs_ctrl = { \
843+ .gpio_pin = DT_INST_SPI_DEV_CS_GPIOS_PIN(inst), \
844+ .gpio_dt_flags = DT_INST_SPI_DEV_CS_GPIOS_FLAGS(inst), \
845+ }, \
846+ }
847+
848+ #define LSM6DSL_DATA_SPI (inst ) \
849+ COND_CODE_1(LSM6DSL_HAS_CS(inst), \
850+ (LSM6DSL_DATA_SPI_CS(inst)), \
851+ ({}))
852+
853+ #define LSM6DSL_SPI_CS_PTR (inst ) \
854+ COND_CODE_1(LSM6DSL_HAS_CS(inst), \
855+ (&(lsm6dsl_data_##inst.cs_ctrl)), \
856+ (NULL))
857+
858+ #define LSM6DSL_SPI_CS_LABEL (inst ) \
859+ COND_CODE_1(LSM6DSL_HAS_CS(inst), \
860+ (DT_INST_SPI_DEV_CS_GPIOS_LABEL(inst)), (NULL))
861+
862+ #define LSM6DSL_SPI_CFG (inst ) \
863+ (&(struct lsm6dsl_spi_cfg) { \
864+ .spi_conf = { \
865+ .frequency = \
866+ DT_INST_PROP(inst, spi_max_frequency), \
867+ .operation = (SPI_WORD_SET(8) | \
868+ SPI_OP_MODE_MASTER | \
869+ SPI_MODE_CPOL | \
870+ SPI_MODE_CPHA), \
871+ .slave = DT_INST_REG_ADDR(inst), \
872+ .cs = LSM6DSL_SPI_CS_PTR(inst), \
873+ }, \
874+ .cs_gpios_label = LSM6DSL_SPI_CS_LABEL(inst), \
875+ })
876+
877+ #ifdef CONFIG_LSM6DSL_TRIGGER
878+ #define LSM6DSL_CONFIG_SPI (inst ) \
879+ { \
880+ .bus_name = DT_INST_BUS_LABEL(inst), \
881+ .bus_init = lsm6dsl_spi_init, \
882+ .bus_cfg = { .spi_cfg = LSM6DSL_SPI_CFG(inst) }, \
883+ .irq_dev_name = DT_INST_GPIO_LABEL(inst, irq_gpios), \
884+ .irq_pin = DT_INST_GPIO_PIN(inst, irq_gpios), \
885+ .irq_flags = DT_INST_GPIO_FLAGS(inst, irq_gpios), \
886+ }
887+ #else
888+ #define LSM6DSL_CONFIG_SPI (inst ) \
889+ { \
890+ .bus_name = DT_INST_BUS_LABEL(inst), \
891+ .bus_init = lsm6dsl_spi_init, \
892+ .bus_cfg = { .spi_cfg = LSM6DSL_SPI_CFG(inst) } \
893+ }
894+ #endif /* CONFIG_LSM6DSL_TRIGGER */
895+
896+ #define LSM6DSL_DEFINE_SPI (inst ) \
897+ static struct lsm6dsl_data lsm6dsl_data_##inst = \
898+ LSM6DSL_DATA_SPI(inst); \
899+ static const struct lsm6dsl_config lsm6dsl_config_##inst = \
900+ LSM6DSL_CONFIG_SPI(inst); \
901+ LSM6DSL_DEVICE_INIT(inst)
902+
903+ /*
904+ * Instantiation macros used when a device is on an I2C bus.
905+ */
906+
907+ #ifdef CONFIG_LSM6DSL_TRIGGER
908+ #define LSM6DSL_CONFIG_I2C (inst ) \
909+ { \
910+ .bus_name = DT_INST_BUS_LABEL(inst), \
911+ .bus_init = lsm6dsl_i2c_init, \
912+ .bus_cfg = { .i2c_slv_addr = DT_INST_REG_ADDR(inst), }, \
913+ .irq_dev_name = DT_INST_GPIO_LABEL(inst, irq_gpios), \
914+ .irq_pin = DT_INST_GPIO_PIN(inst, irq_gpios), \
915+ .irq_flags = DT_INST_GPIO_FLAGS(inst, irq_gpios), \
916+ }
917+ #else
918+ #define LSM6DSL_CONFIG_I2C (inst ) \
919+ { \
920+ .bus_name = DT_INST_BUS_LABEL(inst), \
921+ .bus_init = lsm6dsl_i2c_init, \
922+ .bus_cfg = { .i2c_slv_addr = DT_INST_REG_ADDR(inst), } \
923+ }
924+ #endif /* CONFIG_LSM6DSL_TRIGGER */
925+
926+ #define LSM6DSL_DEFINE_I2C (inst ) \
927+ static struct lsm6dsl_data lsm6dsl_data_##inst; \
928+ static const struct lsm6dsl_config lsm6dsl_config_##inst = \
929+ LSM6DSL_CONFIG_I2C(inst); \
930+ LSM6DSL_DEVICE_INIT(inst)
931+ /*
932+ * Main instantiation macro. Use of COND_CODE_1() selects the right
933+ * bus-specific macro at preprocessor time.
934+ */
935+
936+ #define LSM6DSL_DEFINE (inst ) \
937+ COND_CODE_1(DT_INST_ON_BUS(inst, spi), \
938+ (LSM6DSL_DEFINE_SPI(inst)), \
939+ (LSM6DSL_DEFINE_I2C(inst)))
826940
827- DEVICE_AND_API_INIT (lsm6dsl , DT_INST_LABEL (0 ), lsm6dsl_init ,
828- & lsm6dsl_data , & lsm6dsl_config , POST_KERNEL ,
829- CONFIG_SENSOR_INIT_PRIORITY , & lsm6dsl_api_funcs );
941+ DT_INST_FOREACH_STATUS_OKAY (LSM6DSL_DEFINE )
0 commit comments