Skip to content

Commit ce0cc3a

Browse files
aviscontinashif
authored andcommitted
drivers: sensor: lsm6dsl: make the driver multi-instance
Make this driver multi-instance and use the new API. Fixes #28390 Signed-off-by: Armando Visconti <[email protected]>
1 parent 0e49f55 commit ce0cc3a

File tree

5 files changed

+263
-116
lines changed

5 files changed

+263
-116
lines changed

drivers/sensor/lsm6dsl/lsm6dsl.c

Lines changed: 142 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
784780
static 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)

drivers/sensor/lsm6dsl/lsm6dsl.h

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616
#include <drivers/gpio.h>
1717
#include <sys/util.h>
1818

19+
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
20+
#include <drivers/spi.h>
21+
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
22+
23+
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
24+
#include <drivers/i2c.h>
25+
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) */
26+
1927
#define LSM6DSL_REG_FUNC_CFG_ACCESS 0x01
2028
#define LSM6DSL_MASK_FUNC_CFG_EN BIT(7)
2129
#define LSM6DSL_SHIFT_FUNC_CFG_EN 7
@@ -603,25 +611,53 @@
603611
#define LSM6DSL_GYRO_ODR_RUNTIME 1
604612
#endif
605613

614+
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
615+
struct lsm6dsl_spi_cfg {
616+
struct spi_config spi_conf;
617+
const char *cs_gpios_label;
618+
};
619+
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
620+
621+
union lsm6dsl_bus_cfg {
622+
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
623+
uint16_t i2c_slv_addr;
624+
#endif
625+
626+
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
627+
const struct lsm6dsl_spi_cfg *spi_cfg;
628+
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
629+
};
630+
606631
struct lsm6dsl_config {
607-
char *comm_master_dev_name;
632+
char *bus_name;
633+
int (*bus_init)(const struct device *dev);
634+
const union lsm6dsl_bus_cfg bus_cfg;
635+
#ifdef CONFIG_LSM6DSL_TRIGGER
636+
char *irq_dev_name;
637+
uint32_t irq_pin;
638+
int irq_flags;
639+
#endif
608640
};
609641

610642
struct lsm6dsl_data;
611643

612644
struct lsm6dsl_transfer_function {
613-
int (*read_data)(struct lsm6dsl_data *data, uint8_t reg_addr,
645+
int (*read_data)(const struct device *dev, uint8_t reg_addr,
614646
uint8_t *value, uint8_t len);
615-
int (*write_data)(struct lsm6dsl_data *data, uint8_t reg_addr,
647+
int (*write_data)(const struct device *dev, uint8_t reg_addr,
616648
uint8_t *value, uint8_t len);
617-
int (*read_reg)(struct lsm6dsl_data *data, uint8_t reg_addr,
649+
int (*read_reg)(const struct device *dev, uint8_t reg_addr,
618650
uint8_t *value);
619-
int (*update_reg)(struct lsm6dsl_data *data, uint8_t reg_addr,
651+
int (*update_reg)(const struct device *dev, uint8_t reg_addr,
620652
uint8_t mask, uint8_t value);
621653
};
622654

623655
struct lsm6dsl_data {
624-
const struct device *comm_master;
656+
const struct device *bus;
657+
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
658+
struct spi_cs_control cs_ctrl;
659+
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
660+
625661
int accel_sample_x;
626662
int accel_sample_y;
627663
int accel_sample_z;

0 commit comments

Comments
 (0)