On Thu, 21 Feb 2019 16:20:20 +0100 Lorenzo Bianconi <lorenzo@xxxxxxxxxx> wrote: > Add support to STM ASM330LHH 6-axis (acc + gyro) Mems sensor > https://www.st.com/resource/en/datasheet/asm330lhh.pdf > > Tested-by: Mario Tesi <mario.tesi@xxxxxx> > Signed-off-by: Lorenzo Bianconi <lorenzo@xxxxxxxxxx> Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it. Thanks, Jonathan > --- > drivers/iio/imu/st_lsm6dsx/Kconfig | 2 +- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 + > .../iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 8 ++-- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 41 ++++++++++++++++++- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c | 5 +++ > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c | 5 +++ > 6 files changed, 57 insertions(+), 6 deletions(-) > > diff --git a/drivers/iio/imu/st_lsm6dsx/Kconfig b/drivers/iio/imu/st_lsm6dsx/Kconfig > index 094fd006b63d..36048bf0455a 100644 > --- a/drivers/iio/imu/st_lsm6dsx/Kconfig > +++ b/drivers/iio/imu/st_lsm6dsx/Kconfig > @@ -9,7 +9,7 @@ config IIO_ST_LSM6DSX > help > Say yes here to build support for STMicroelectronics LSM6DSx imu > sensor. Supported devices: lsm6ds3, lsm6ds3h, lsm6dsl, lsm6dsm, > - ism330dlc, lsm6dso > + ism330dlc, lsm6dso, asm330lhh > > To compile this driver as a module, choose M here: the module > will be called st_lsm6dsx. > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > index d1d8d07a0714..de2a0dc39353 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > @@ -20,6 +20,7 @@ > #define ST_LSM6DSM_DEV_NAME "lsm6dsm" > #define ST_ISM330DLC_DEV_NAME "ism330dlc" > #define ST_LSM6DSO_DEV_NAME "lsm6dso" > +#define ST_ASM330LHH_DEV_NAME "asm330lhh" > > enum st_lsm6dsx_hw_id { > ST_LSM6DS3_ID, > @@ -28,6 +29,7 @@ enum st_lsm6dsx_hw_id { > ST_LSM6DSM_ID, > ST_ISM330DLC_ID, > ST_LSM6DSO_ID, > + ST_ASM330LHH_ID, > ST_LSM6DSX_MAX_ID, > }; > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c > index 2c0d3763405a..8f443bdb5b51 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c > @@ -13,9 +13,9 @@ > * (e.g. Gx, Gy, Gz, Ax, Ay, Az), then data are repeated depending on the > * value of the decimation factor and ODR set for each FIFO data set. > * > - * LSM6DSO: The FIFO buffer can be configured to store data from gyroscope and > - * accelerometer. Each sample is queued with a tag (1B) indicating data source > - * (gyroscope, accelerometer, hw timer). > + * LSM6DSO/ASM330LHH: The FIFO buffer can be configured to store data > + * from gyroscope and accelerometer. Each sample is queued with a tag (1B) > + * indicating data source (gyroscope, accelerometer, hw timer). > * > * FIFO supported modes: > * - BYPASS: FIFO disabled > @@ -506,7 +506,7 @@ st_lsm6dsx_push_tagged_data(struct st_lsm6dsx_hw *hw, u8 tag, > } > > /** > - * st_lsm6dsx_read_tagged_fifo() - LSM6DSO read FIFO routine > + * st_lsm6dsx_read_tagged_fifo() - LSM6DSO/ASM330LHH read FIFO routine > * @hw: Pointer to instance of struct st_lsm6dsx_hw. > * > * Read samples from the hw FIFO and push them to IIO buffers. > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 12e29dda9b98..50cab3531b11 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -23,7 +23,7 @@ > * - Gyroscope supported full-scale [dps]: +-125/+-245/+-500/+-1000/+-2000 > * - FIFO size: 4KB > * > - * - LSM6DSO > + * - LSM6DSO/ASM330LHH > * - Accelerometer/Gyroscope supported ODR [Hz]: 13, 26, 52, 104, 208, 416 > * - Accelerometer supported full-scale [g]: +-2/+-4/+-8/+-16 > * - Gyroscope supported full-scale [dps]: +-125/+-245/+-500/+-1000/+-2000 > @@ -347,6 +347,45 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > .batch_en = BIT(3), > } > }, > + { > + .wai = 0x6b, > + .max_fifo_size = 512, > + .id = { > + [0] = ST_ASM330LHH_ID, > + }, > + .batch = { > + [ST_LSM6DSX_ID_ACC] = { > + .addr = 0x09, > + .mask = GENMASK(3, 0), > + }, > + [ST_LSM6DSX_ID_GYRO] = { > + .addr = 0x09, > + .mask = GENMASK(7, 4), > + }, > + }, > + .fifo_ops = { > + .read_fifo = st_lsm6dsx_read_tagged_fifo, > + .fifo_th = { > + .addr = 0x07, > + .mask = GENMASK(8, 0), > + }, > + .fifo_diff = { > + .addr = 0x3a, > + .mask = GENMASK(8, 0), > + }, > + .th_wl = 1, > + }, > + .ts_settings = { > + .timer_en = { > + .addr = 0x19, > + .mask = BIT(5), > + }, > + .decimator = { > + .addr = 0x0a, > + .mask = GENMASK(7, 6), > + }, > + }, > + }, > }; > > static const struct iio_chan_spec st_lsm6dsx_acc_channels[] = { > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c > index 448b7bc1e578..00b4b702645a 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c > @@ -65,6 +65,10 @@ static const struct of_device_id st_lsm6dsx_i2c_of_match[] = { > .compatible = "st,lsm6dso", > .data = (void *)ST_LSM6DSO_ID, > }, > + { > + .compatible = "st,asm330lhh", > + .data = (void *)ST_ASM330LHH_ID, > + }, > {}, > }; > MODULE_DEVICE_TABLE(of, st_lsm6dsx_i2c_of_match); > @@ -76,6 +80,7 @@ static const struct i2c_device_id st_lsm6dsx_i2c_id_table[] = { > { ST_LSM6DSM_DEV_NAME, ST_LSM6DSM_ID }, > { ST_ISM330DLC_DEV_NAME, ST_ISM330DLC_ID }, > { ST_LSM6DSO_DEV_NAME, ST_LSM6DSO_ID }, > + { ST_ASM330LHH_DEV_NAME, ST_ASM330LHH_ID }, > {}, > }; > MODULE_DEVICE_TABLE(i2c, st_lsm6dsx_i2c_id_table); > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c > index b1df8a6973e6..836256c2ac7d 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c > @@ -65,6 +65,10 @@ static const struct of_device_id st_lsm6dsx_spi_of_match[] = { > .compatible = "st,lsm6dso", > .data = (void *)ST_LSM6DSO_ID, > }, > + { > + .compatible = "st,asm330lhh", > + .data = (void *)ST_ASM330LHH_ID, > + }, > {}, > }; > MODULE_DEVICE_TABLE(of, st_lsm6dsx_spi_of_match); > @@ -76,6 +80,7 @@ static const struct spi_device_id st_lsm6dsx_spi_id_table[] = { > { ST_LSM6DSM_DEV_NAME, ST_LSM6DSM_ID }, > { ST_ISM330DLC_DEV_NAME, ST_ISM330DLC_ID }, > { ST_LSM6DSO_DEV_NAME, ST_LSM6DSO_ID }, > + { ST_ASM330LHH_DEV_NAME, ST_ASM330LHH_ID }, > {}, > }; > MODULE_DEVICE_TABLE(spi, st_lsm6dsx_spi_id_table);