* [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct @ 2019-07-16 9:33 Martin Kepplinger 2019-07-16 9:33 ` [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 Martin Kepplinger ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: Martin Kepplinger @ 2019-07-16 9:33 UTC (permalink / raw) To: lorenzo.bianconi83, jic23, knaack.h, lars, pmeerw Cc: linux-iio, devicetree, linux-kernel, Martin Kepplinger Move some register definitions to the per-device array of struct st_lsm6dsx_sensor_settings in order to simplify adding new sensor devices to the driver. Also, remove completely unused register definitions. Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm> --- This is already based on Lorenzo's recent changes: https://lore.kernel.org/linux-iio/853f216a-7814-cb79-180b-078ac5e8a359@puri.sm/T/#u https://lore.kernel.org/linux-iio/501b0db9-63cb-905c-c09b-682eb73f1ff3@puri.sm/T/#u revision history: v2: improve variable names, thanks Lorenzo thanks martin drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 6 ++++ drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 31 ++++++++++++++------ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h index ab1c66615d67..3c47f5d27d30 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -198,6 +198,9 @@ struct st_lsm6dsx_ext_dev_settings { /** * struct st_lsm6dsx_settings - ST IMU sensor settings * @wai: Sensor WhoAmI default value. + * @int1_addr: Control Register address for INT1 + * @int2_addr: Control Register address for INT2 + * @reset_addr: register address for reset/reboot * @max_fifo_size: Sensor max fifo length in FIFO words. * @id: List of hw id/device name supported by the driver configuration. * @odr_table: Hw sensors odr table (Hz + val). @@ -210,6 +213,9 @@ struct st_lsm6dsx_ext_dev_settings { */ struct st_lsm6dsx_settings { u8 wai; + u8 int1_addr; + u8 int2_addr; + u8 reset_addr; u16 max_fifo_size; struct { enum st_lsm6dsx_hw_id hw_id; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c index 9aa109428a52..e0d2149625cc 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -49,17 +49,12 @@ #include "st_lsm6dsx.h" -#define ST_LSM6DSX_REG_INT1_ADDR 0x0d -#define ST_LSM6DSX_REG_INT2_ADDR 0x0e #define ST_LSM6DSX_REG_FIFO_FTH_IRQ_MASK BIT(3) #define ST_LSM6DSX_REG_WHOAMI_ADDR 0x0f -#define ST_LSM6DSX_REG_RESET_ADDR 0x12 #define ST_LSM6DSX_REG_RESET_MASK BIT(0) #define ST_LSM6DSX_REG_BOOT_MASK BIT(7) #define ST_LSM6DSX_REG_BDU_ADDR 0x12 #define ST_LSM6DSX_REG_BDU_MASK BIT(6) -#define ST_LSM6DSX_REG_INT2_ON_INT1_ADDR 0x13 -#define ST_LSM6DSX_REG_INT2_ON_INT1_MASK BIT(5) #define ST_LSM6DSX_REG_ACC_OUT_X_L_ADDR 0x28 #define ST_LSM6DSX_REG_ACC_OUT_Y_L_ADDR 0x2a @@ -72,6 +67,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { { .wai = 0x69, + .int1_addr = 0x0d, + .int2_addr = 0x0e, + .reset_addr = 0x12, .max_fifo_size = 1365, .id = { { @@ -170,6 +168,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { }, { .wai = 0x69, + .int1_addr = 0x0d, + .int2_addr = 0x0e, + .reset_addr = 0x12, .max_fifo_size = 682, .id = { { @@ -268,6 +269,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { }, { .wai = 0x6a, + .int1_addr = 0x0d, + .int2_addr = 0x0e, + .reset_addr = 0x12, .max_fifo_size = 682, .id = { { @@ -375,6 +379,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { }, { .wai = 0x6c, + .int1_addr = 0x0d, + .int2_addr = 0x0e, + .reset_addr = 0x12, .max_fifo_size = 512, .id = { { @@ -494,6 +501,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { }, { .wai = 0x6b, + .int1_addr = 0x0d, + .int2_addr = 0x0e, + .reset_addr = 0x12, .max_fifo_size = 512, .id = { { @@ -584,6 +594,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { }, { .wai = 0x6b, + .int1_addr = 0x0d, + .int2_addr = 0x0e, + .reset_addr = 0x12, .max_fifo_size = 512, .id = { { @@ -1117,10 +1130,10 @@ static int st_lsm6dsx_get_drdy_reg(struct st_lsm6dsx_hw *hw, u8 *drdy_reg) switch (drdy_pin) { case 1: - *drdy_reg = ST_LSM6DSX_REG_INT1_ADDR; + *drdy_reg = hw->settings->int1_addr; break; case 2: - *drdy_reg = ST_LSM6DSX_REG_INT2_ADDR; + *drdy_reg = hw->settings->int2_addr; break; default: dev_err(hw->dev, "unsupported data ready pin\n"); @@ -1220,7 +1233,7 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw) int err; /* device sw reset */ - err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR, + err = regmap_update_bits(hw->regmap, hw->settings->reset_addr, ST_LSM6DSX_REG_RESET_MASK, FIELD_PREP(ST_LSM6DSX_REG_RESET_MASK, 1)); if (err < 0) @@ -1229,7 +1242,7 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw) msleep(50); /* reload trimming parameter */ - err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR, + err = regmap_update_bits(hw->regmap, hw->settings->reset_addr, ST_LSM6DSX_REG_BOOT_MASK, FIELD_PREP(ST_LSM6DSX_REG_BOOT_MASK, 1)); if (err < 0) -- 2.20.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 2019-07-16 9:33 [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Martin Kepplinger @ 2019-07-16 9:33 ` Martin Kepplinger 2019-07-16 9:48 ` Lorenzo Bianconi 2019-07-16 9:33 ` [PATCH 3/3] dt-bindings: iio: imu: st_lsm6dsx: add lsm9ds1 device bindings Martin Kepplinger 2019-07-16 9:43 ` [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Lorenzo Bianconi 2 siblings, 1 reply; 5+ messages in thread From: Martin Kepplinger @ 2019-07-16 9:33 UTC (permalink / raw) To: lorenzo.bianconi83, jic23, knaack.h, lars, pmeerw Cc: linux-iio, devicetree, linux-kernel, Martin Kepplinger The LSM9DS1's accelerometer / gyroscope unit and it's magnetometer (separately supported in iio/magnetometer/st_magn*) are located on a separate i2c addresses on the bus. For the datasheet, see https://www.st.com/resource/en/datasheet/lsm9ds1.pdf Treat it just like the LSM6* devices and, despite it's name, hook it up to the st_lsm6dsx driver, using it's basic functionality. Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm> --- This is already based on Lorenzo's recent changes: https://lore.kernel.org/linux-iio/853f216a-7814-cb79-180b-078ac5e8a359@puri.sm/T/#u https://lore.kernel.org/linux-iio/501b0db9-63cb-905c-c09b-682eb73f1ff3@puri.sm/T/#u revision history: v2: overall further simplification thanks martin drivers/iio/imu/st_lsm6dsx/Kconfig | 1 + drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 + drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 94 +++++++++++++++++++- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c | 5 ++ drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c | 5 ++ 5 files changed, 104 insertions(+), 3 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/Kconfig b/drivers/iio/imu/st_lsm6dsx/Kconfig index 2d8b2e1edfce..4a57bfb3c12e 100644 --- a/drivers/iio/imu/st_lsm6dsx/Kconfig +++ b/drivers/iio/imu/st_lsm6dsx/Kconfig @@ -11,6 +11,7 @@ config IIO_ST_LSM6DSX Say yes here to build support for STMicroelectronics LSM6DSx imu sensor. Supported devices: lsm6ds3, lsm6ds3h, lsm6dsl, lsm6dsm, ism330dlc, lsm6dso, lsm6dsox, asm330lhh, lsm6dsr, lsm6ds3tr-c + and the accelerometer/gyroscope of lsm9ds1. 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 3c47f5d27d30..9a30cc717de2 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -23,6 +23,7 @@ #define ST_LSM6DSOX_DEV_NAME "lsm6dsox" #define ST_LSM6DSR_DEV_NAME "lsm6dsr" #define ST_LSM6DS3TRC_DEV_NAME "lsm6ds3tr-c" +#define ST_LSM9DS1_DEV_NAME "lsm9ds1" enum st_lsm6dsx_hw_id { ST_LSM6DS3_ID, @@ -35,6 +36,7 @@ enum st_lsm6dsx_hw_id { ST_LSM6DSOX_ID, ST_LSM6DSR_ID, ST_LSM6DS3TRC_ID, + ST_LSM9DS1_ID, ST_LSM6DSX_MAX_ID, }; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c index e0d2149625cc..2f3d2bf25646 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -10,6 +10,8 @@ * +-125/+-245/+-500/+-1000/+-2000 dps * LSM6DSx series has an integrated First-In-First-Out (FIFO) buffer * allowing dynamic batching of sensor data. + * LSM9DSx series is similar but includes an additional magnetometer, handled + * by a different driver. * * Supported sensors: * - LSM6DS3: @@ -30,6 +32,13 @@ * - Gyroscope supported full-scale [dps]: +-125/+-245/+-500/+-1000/+-2000 * - FIFO size: 3KB * + * - LSM9DS1: + * - Accelerometer supported ODR [Hz]: 10, 50, 119, 238, 476, 952 + * - Accelerometer supported full-scale [g]: +-2/+-4/+-8/+-16 + * - Gyroscope supported ODR [Hz]: 15, 60, 119, 238, 476, 952 + * - Gyroscope supported full-scale [dps]: +-245/+-500/+-2000 + * - FIFO size: 32 + * * Copyright 2016 STMicroelectronics Inc. * * Lorenzo Bianconi <lorenzo.bianconi@st.com> @@ -64,7 +73,72 @@ #define ST_LSM6DSX_REG_GYRO_OUT_Y_L_ADDR 0x24 #define ST_LSM6DSX_REG_GYRO_OUT_Z_L_ADDR 0x26 +#define ST_LSM9DSX_REG_GYRO_OUT_X_L_ADDR 0x18 +#define ST_LSM9DSX_REG_GYRO_OUT_Y_L_ADDR 0x1a +#define ST_LSM9DSX_REG_GYRO_OUT_Z_L_ADDR 0x1c + static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { + { + .wai = 0x68, + .int1_addr = 0x0c, + .int2_addr = 0x0d, + .reset_addr = 0x22, + .max_fifo_size = 32, + .id = { + { + .hw_id = ST_LSM9DS1_ID, + .name = ST_LSM9DS1_DEV_NAME, + }, + }, + .odr_table = { + [ST_LSM6DSX_ID_ACC] = { + .reg = { + .addr = 0x20, + .mask = GENMASK(7, 5), + }, + .odr_avl[0] = { 10, 0x01 }, + .odr_avl[1] = { 50, 0x02 }, + .odr_avl[2] = { 119, 0x03 }, + .odr_avl[3] = { 238, 0x04 }, + .odr_avl[4] = { 476, 0x05 }, + .odr_avl[5] = { 952, 0x06 }, + }, + [ST_LSM6DSX_ID_GYRO] = { + .reg = { + .addr = 0x10, + .mask = GENMASK(7, 5), + }, + .odr_avl[0] = { 15, 0x01 }, + .odr_avl[1] = { 60, 0x02 }, + .odr_avl[2] = { 119, 0x03 }, + .odr_avl[3] = { 238, 0x04 }, + .odr_avl[4] = { 476, 0x05 }, + .odr_avl[5] = { 952, 0x06 }, + }, + }, + .fs_table = { + [ST_LSM6DSX_ID_ACC] = { + .reg = { + .addr = 0x20, + .mask = GENMASK(4, 3), + }, + .fs_avl[0] = { 599, 0x0 }, + .fs_avl[1] = { 1197, 0x2 }, + .fs_avl[2] = { 2394, 0x3 }, + .fs_avl[3] = { 4788, 0x1 }, + }, + [ST_LSM6DSX_ID_GYRO] = { + .reg = { + .addr = 0x10, + .mask = GENMASK(4, 3), + }, + .fs_avl[0] = { IIO_DEGREE_TO_RAD(245), 0x0 }, + .fs_avl[1] = { IIO_DEGREE_TO_RAD(500), 0x1 }, + .fs_avl[2] = { IIO_DEGREE_TO_RAD(0), 0x2 }, + .fs_avl[3] = { IIO_DEGREE_TO_RAD(2000), 0x3 }, + }, + }, + }, { .wai = 0x69, .int1_addr = 0x0d, @@ -733,6 +807,16 @@ static const struct iio_chan_spec st_lsm6dsx_gyro_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(3), }; +static const struct iio_chan_spec st_lsm9dsx_gyro_channels[] = { + ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, ST_LSM9DSX_REG_GYRO_OUT_X_L_ADDR, + IIO_MOD_X, 0), + ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, ST_LSM9DSX_REG_GYRO_OUT_Y_L_ADDR, + IIO_MOD_Y, 1), + ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, ST_LSM9DSX_REG_GYRO_OUT_Z_L_ADDR, + IIO_MOD_Z, 2), + IIO_CHAN_SOFT_TIMESTAMP(3), +}; + int st_lsm6dsx_set_page(struct st_lsm6dsx_hw *hw, bool enable) { const struct st_lsm6dsx_shub_settings *hub_settings; @@ -1278,7 +1362,7 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw) static struct iio_dev *st_lsm6dsx_alloc_iiodev(struct st_lsm6dsx_hw *hw, enum st_lsm6dsx_sensor_id id, - const char *name) + const char *name, int hw_id) { struct st_lsm6dsx_sensor *sensor; struct iio_dev *iio_dev; @@ -1308,7 +1392,11 @@ static struct iio_dev *st_lsm6dsx_alloc_iiodev(struct st_lsm6dsx_hw *hw, name); break; case ST_LSM6DSX_ID_GYRO: - iio_dev->channels = st_lsm6dsx_gyro_channels; + if (hw_id == ST_LSM9DS1_ID) + iio_dev->channels = st_lsm9dsx_gyro_channels; + else + iio_dev->channels = st_lsm6dsx_gyro_channels; + iio_dev->num_channels = ARRAY_SIZE(st_lsm6dsx_gyro_channels); iio_dev->info = &st_lsm6dsx_gyro_info; @@ -1354,7 +1442,7 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id, return err; for (i = 0; i < ST_LSM6DSX_ID_EXT0; i++) { - hw->iio_devs[i] = st_lsm6dsx_alloc_iiodev(hw, i, name); + hw->iio_devs[i] = st_lsm6dsx_alloc_iiodev(hw, i, name, hw_id); if (!hw->iio_devs[i]) return -ENOMEM; } diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c index 28581eb0532c..c36a057c36ee 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c @@ -79,6 +79,10 @@ static const struct of_device_id st_lsm6dsx_i2c_of_match[] = { .compatible = "st,lsm6ds3tr-c", .data = (void *)ST_LSM6DS3TRC_ID, }, + { + .compatible = "st,lsm9ds1", + .data = (void *)ST_LSM9DS1_ID, + }, {}, }; MODULE_DEVICE_TABLE(of, st_lsm6dsx_i2c_of_match); @@ -94,6 +98,7 @@ static const struct i2c_device_id st_lsm6dsx_i2c_id_table[] = { { ST_LSM6DSOX_DEV_NAME, ST_LSM6DSOX_ID }, { ST_LSM6DSR_DEV_NAME, ST_LSM6DSR_ID }, { ST_LSM6DS3TRC_DEV_NAME, ST_LSM6DS3TRC_ID }, + { ST_LSM9DS1_DEV_NAME, ST_LSM9DS1_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 0371e8b94a3e..138e3b985865 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c @@ -79,6 +79,10 @@ static const struct of_device_id st_lsm6dsx_spi_of_match[] = { .compatible = "st,lsm6ds3tr-c", .data = (void *)ST_LSM6DS3TRC_ID, }, + { + .compatible = "st,lsm9ds1", + .data = (void *)ST_LSM9DS1_ID, + }, {}, }; MODULE_DEVICE_TABLE(of, st_lsm6dsx_spi_of_match); @@ -94,6 +98,7 @@ static const struct spi_device_id st_lsm6dsx_spi_id_table[] = { { ST_LSM6DSOX_DEV_NAME, ST_LSM6DSOX_ID }, { ST_LSM6DSR_DEV_NAME, ST_LSM6DSR_ID }, { ST_LSM6DS3TRC_DEV_NAME, ST_LSM6DS3TRC_ID }, + { ST_LSM9DS1_DEV_NAME, ST_LSM9DS1_ID }, {}, }; MODULE_DEVICE_TABLE(spi, st_lsm6dsx_spi_id_table); -- 2.20.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 2019-07-16 9:33 ` [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 Martin Kepplinger @ 2019-07-16 9:48 ` Lorenzo Bianconi 0 siblings, 0 replies; 5+ messages in thread From: Lorenzo Bianconi @ 2019-07-16 9:48 UTC (permalink / raw) To: Martin Kepplinger Cc: lorenzo.bianconi83, jic23, knaack.h, lars, pmeerw, linux-iio, devicetree, linux-kernel [-- Attachment #1: Type: text/plain, Size: 9611 bytes --] > The LSM9DS1's accelerometer / gyroscope unit and it's magnetometer (separately > supported in iio/magnetometer/st_magn*) are located on a separate i2c addresses > on the bus. > > For the datasheet, see https://www.st.com/resource/en/datasheet/lsm9ds1.pdf > > Treat it just like the LSM6* devices and, despite it's name, hook it up > to the st_lsm6dsx driver, using it's basic functionality. I think LSM9DS1 relies on LSM6DS0 for acc and gyro part so I guess we can use this name here, what do you think? > > Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm> > --- > > > This is already based on Lorenzo's recent changes: > https://lore.kernel.org/linux-iio/853f216a-7814-cb79-180b-078ac5e8a359@puri.sm/T/#u > https://lore.kernel.org/linux-iio/501b0db9-63cb-905c-c09b-682eb73f1ff3@puri.sm/T/#u > > revision history: > v2: overall further simplification > > thanks > martin > > > > drivers/iio/imu/st_lsm6dsx/Kconfig | 1 + > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 + > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 94 +++++++++++++++++++- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c | 5 ++ > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c | 5 ++ > 5 files changed, 104 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/imu/st_lsm6dsx/Kconfig b/drivers/iio/imu/st_lsm6dsx/Kconfig > index 2d8b2e1edfce..4a57bfb3c12e 100644 > --- a/drivers/iio/imu/st_lsm6dsx/Kconfig > +++ b/drivers/iio/imu/st_lsm6dsx/Kconfig > @@ -11,6 +11,7 @@ config IIO_ST_LSM6DSX > Say yes here to build support for STMicroelectronics LSM6DSx imu > sensor. Supported devices: lsm6ds3, lsm6ds3h, lsm6dsl, lsm6dsm, > ism330dlc, lsm6dso, lsm6dsox, asm330lhh, lsm6dsr, lsm6ds3tr-c > + and the accelerometer/gyroscope of lsm9ds1. > > 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 3c47f5d27d30..9a30cc717de2 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > @@ -23,6 +23,7 @@ > #define ST_LSM6DSOX_DEV_NAME "lsm6dsox" > #define ST_LSM6DSR_DEV_NAME "lsm6dsr" > #define ST_LSM6DS3TRC_DEV_NAME "lsm6ds3tr-c" > +#define ST_LSM9DS1_DEV_NAME "lsm9ds1" > > enum st_lsm6dsx_hw_id { > ST_LSM6DS3_ID, > @@ -35,6 +36,7 @@ enum st_lsm6dsx_hw_id { > ST_LSM6DSOX_ID, > ST_LSM6DSR_ID, > ST_LSM6DS3TRC_ID, > + ST_LSM9DS1_ID, > ST_LSM6DSX_MAX_ID, > }; > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index e0d2149625cc..2f3d2bf25646 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -10,6 +10,8 @@ > * +-125/+-245/+-500/+-1000/+-2000 dps > * LSM6DSx series has an integrated First-In-First-Out (FIFO) buffer > * allowing dynamic batching of sensor data. > + * LSM9DSx series is similar but includes an additional magnetometer, handled > + * by a different driver. > * > * Supported sensors: > * - LSM6DS3: > @@ -30,6 +32,13 @@ > * - Gyroscope supported full-scale [dps]: +-125/+-245/+-500/+-1000/+-2000 > * - FIFO size: 3KB > * > + * - LSM9DS1: > + * - Accelerometer supported ODR [Hz]: 10, 50, 119, 238, 476, 952 > + * - Accelerometer supported full-scale [g]: +-2/+-4/+-8/+-16 > + * - Gyroscope supported ODR [Hz]: 15, 60, 119, 238, 476, 952 > + * - Gyroscope supported full-scale [dps]: +-245/+-500/+-2000 > + * - FIFO size: 32 > + * > * Copyright 2016 STMicroelectronics Inc. > * > * Lorenzo Bianconi <lorenzo.bianconi@st.com> > @@ -64,7 +73,72 @@ > #define ST_LSM6DSX_REG_GYRO_OUT_Y_L_ADDR 0x24 > #define ST_LSM6DSX_REG_GYRO_OUT_Z_L_ADDR 0x26 > > +#define ST_LSM9DSX_REG_GYRO_OUT_X_L_ADDR 0x18 > +#define ST_LSM9DSX_REG_GYRO_OUT_Y_L_ADDR 0x1a > +#define ST_LSM9DSX_REG_GYRO_OUT_Z_L_ADDR 0x1c > + > static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > + { > + .wai = 0x68, > + .int1_addr = 0x0c, > + .int2_addr = 0x0d, > + .reset_addr = 0x22, > + .max_fifo_size = 32, > + .id = { > + { > + .hw_id = ST_LSM9DS1_ID, > + .name = ST_LSM9DS1_DEV_NAME, > + }, > + }, > + .odr_table = { > + [ST_LSM6DSX_ID_ACC] = { > + .reg = { > + .addr = 0x20, > + .mask = GENMASK(7, 5), > + }, > + .odr_avl[0] = { 10, 0x01 }, > + .odr_avl[1] = { 50, 0x02 }, > + .odr_avl[2] = { 119, 0x03 }, > + .odr_avl[3] = { 238, 0x04 }, > + .odr_avl[4] = { 476, 0x05 }, > + .odr_avl[5] = { 952, 0x06 }, > + }, > + [ST_LSM6DSX_ID_GYRO] = { > + .reg = { > + .addr = 0x10, > + .mask = GENMASK(7, 5), > + }, > + .odr_avl[0] = { 15, 0x01 }, > + .odr_avl[1] = { 60, 0x02 }, > + .odr_avl[2] = { 119, 0x03 }, > + .odr_avl[3] = { 238, 0x04 }, > + .odr_avl[4] = { 476, 0x05 }, > + .odr_avl[5] = { 952, 0x06 }, > + }, > + }, > + .fs_table = { > + [ST_LSM6DSX_ID_ACC] = { > + .reg = { > + .addr = 0x20, > + .mask = GENMASK(4, 3), > + }, > + .fs_avl[0] = { 599, 0x0 }, > + .fs_avl[1] = { 1197, 0x2 }, > + .fs_avl[2] = { 2394, 0x3 }, > + .fs_avl[3] = { 4788, 0x1 }, > + }, > + [ST_LSM6DSX_ID_GYRO] = { > + .reg = { > + .addr = 0x10, > + .mask = GENMASK(4, 3), > + }, > + .fs_avl[0] = { IIO_DEGREE_TO_RAD(245), 0x0 }, > + .fs_avl[1] = { IIO_DEGREE_TO_RAD(500), 0x1 }, > + .fs_avl[2] = { IIO_DEGREE_TO_RAD(0), 0x2 }, > + .fs_avl[3] = { IIO_DEGREE_TO_RAD(2000), 0x3 }, > + }, > + }, > + }, > { > .wai = 0x69, > .int1_addr = 0x0d, > @@ -733,6 +807,16 @@ static const struct iio_chan_spec st_lsm6dsx_gyro_channels[] = { > IIO_CHAN_SOFT_TIMESTAMP(3), > }; > > +static const struct iio_chan_spec st_lsm9dsx_gyro_channels[] = { > + ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, ST_LSM9DSX_REG_GYRO_OUT_X_L_ADDR, > + IIO_MOD_X, 0), I guess you can use 0x18, 0x1a and 0x1c here and remove the definitions > + ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, ST_LSM9DSX_REG_GYRO_OUT_Y_L_ADDR, > + IIO_MOD_Y, 1), > + ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, ST_LSM9DSX_REG_GYRO_OUT_Z_L_ADDR, > + IIO_MOD_Z, 2), > + IIO_CHAN_SOFT_TIMESTAMP(3), > +}; > + > int st_lsm6dsx_set_page(struct st_lsm6dsx_hw *hw, bool enable) > { > const struct st_lsm6dsx_shub_settings *hub_settings; > @@ -1278,7 +1362,7 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw) > > static struct iio_dev *st_lsm6dsx_alloc_iiodev(struct st_lsm6dsx_hw *hw, > enum st_lsm6dsx_sensor_id id, > - const char *name) > + const char *name, int hw_id) > { > struct st_lsm6dsx_sensor *sensor; > struct iio_dev *iio_dev; > @@ -1308,7 +1392,11 @@ static struct iio_dev *st_lsm6dsx_alloc_iiodev(struct st_lsm6dsx_hw *hw, > name); > break; > case ST_LSM6DSX_ID_GYRO: > - iio_dev->channels = st_lsm6dsx_gyro_channels; > + if (hw_id == ST_LSM9DS1_ID) > + iio_dev->channels = st_lsm9dsx_gyro_channels; > + else > + iio_dev->channels = st_lsm6dsx_gyro_channels; > + > iio_dev->num_channels = ARRAY_SIZE(st_lsm6dsx_gyro_channels); > iio_dev->info = &st_lsm6dsx_gyro_info; > > @@ -1354,7 +1442,7 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id, > return err; > > for (i = 0; i < ST_LSM6DSX_ID_EXT0; i++) { > - hw->iio_devs[i] = st_lsm6dsx_alloc_iiodev(hw, i, name); > + hw->iio_devs[i] = st_lsm6dsx_alloc_iiodev(hw, i, name, hw_id); > if (!hw->iio_devs[i]) > return -ENOMEM; > } > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c > index 28581eb0532c..c36a057c36ee 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c > @@ -79,6 +79,10 @@ static const struct of_device_id st_lsm6dsx_i2c_of_match[] = { > .compatible = "st,lsm6ds3tr-c", > .data = (void *)ST_LSM6DS3TRC_ID, > }, > + { > + .compatible = "st,lsm9ds1", > + .data = (void *)ST_LSM9DS1_ID, > + }, > {}, > }; > MODULE_DEVICE_TABLE(of, st_lsm6dsx_i2c_of_match); > @@ -94,6 +98,7 @@ static const struct i2c_device_id st_lsm6dsx_i2c_id_table[] = { > { ST_LSM6DSOX_DEV_NAME, ST_LSM6DSOX_ID }, > { ST_LSM6DSR_DEV_NAME, ST_LSM6DSR_ID }, > { ST_LSM6DS3TRC_DEV_NAME, ST_LSM6DS3TRC_ID }, > + { ST_LSM9DS1_DEV_NAME, ST_LSM9DS1_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 0371e8b94a3e..138e3b985865 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c > @@ -79,6 +79,10 @@ static const struct of_device_id st_lsm6dsx_spi_of_match[] = { > .compatible = "st,lsm6ds3tr-c", > .data = (void *)ST_LSM6DS3TRC_ID, > }, > + { > + .compatible = "st,lsm9ds1", > + .data = (void *)ST_LSM9DS1_ID, > + }, > {}, > }; > MODULE_DEVICE_TABLE(of, st_lsm6dsx_spi_of_match); > @@ -94,6 +98,7 @@ static const struct spi_device_id st_lsm6dsx_spi_id_table[] = { > { ST_LSM6DSOX_DEV_NAME, ST_LSM6DSOX_ID }, > { ST_LSM6DSR_DEV_NAME, ST_LSM6DSR_ID }, > { ST_LSM6DS3TRC_DEV_NAME, ST_LSM6DS3TRC_ID }, > + { ST_LSM9DS1_DEV_NAME, ST_LSM9DS1_ID }, > {}, > }; > MODULE_DEVICE_TABLE(spi, st_lsm6dsx_spi_id_table); > -- > 2.20.1 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3/3] dt-bindings: iio: imu: st_lsm6dsx: add lsm9ds1 device bindings 2019-07-16 9:33 [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Martin Kepplinger 2019-07-16 9:33 ` [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 Martin Kepplinger @ 2019-07-16 9:33 ` Martin Kepplinger 2019-07-16 9:43 ` [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Lorenzo Bianconi 2 siblings, 0 replies; 5+ messages in thread From: Martin Kepplinger @ 2019-07-16 9:33 UTC (permalink / raw) To: lorenzo.bianconi83, jic23, knaack.h, lars, pmeerw Cc: linux-iio, devicetree, linux-kernel, Martin Kepplinger Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm> --- Documentation/devicetree/bindings/iio/imu/st_lsm6dsx.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/iio/imu/st_lsm6dsx.txt b/Documentation/devicetree/bindings/iio/imu/st_lsm6dsx.txt index 92b48f242356..fd1722fc93af 100644 --- a/Documentation/devicetree/bindings/iio/imu/st_lsm6dsx.txt +++ b/Documentation/devicetree/bindings/iio/imu/st_lsm6dsx.txt @@ -12,6 +12,7 @@ Required properties: "st,lsm6dsox" "st,lsm6dsr" "st,lsm6ds3tr-c" + "st,lsm9ds1" - reg: i2c address of the sensor / spi cs line Optional properties: -- 2.20.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct 2019-07-16 9:33 [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Martin Kepplinger 2019-07-16 9:33 ` [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 Martin Kepplinger 2019-07-16 9:33 ` [PATCH 3/3] dt-bindings: iio: imu: st_lsm6dsx: add lsm9ds1 device bindings Martin Kepplinger @ 2019-07-16 9:43 ` Lorenzo Bianconi 2 siblings, 0 replies; 5+ messages in thread From: Lorenzo Bianconi @ 2019-07-16 9:43 UTC (permalink / raw) To: Martin Kepplinger Cc: lorenzo.bianconi83, jic23, knaack.h, lars, pmeerw, linux-iio, devicetree [-- Attachment #1: Type: text/plain, Size: 5590 bytes --] > Move some register definitions to the per-device array of struct > st_lsm6dsx_sensor_settings in order to simplify adding new sensor > devices to the driver. > > Also, remove completely unused register definitions. > > Signed-off-by: Martin Kepplinger <martin.kepplinger@puri.sm> > --- > Acked-by: Lorenzo Bianconi <lorenzo@kernel.org> > > This is already based on Lorenzo's recent changes: > https://lore.kernel.org/linux-iio/853f216a-7814-cb79-180b-078ac5e8a359@puri.sm/T/#u > https://lore.kernel.org/linux-iio/501b0db9-63cb-905c-c09b-682eb73f1ff3@puri.sm/T/#u > > revision history: > v2: improve variable names, thanks Lorenzo > > thanks > martin > > > > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 6 ++++ > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 31 ++++++++++++++------ > 2 files changed, 28 insertions(+), 9 deletions(-) > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > index ab1c66615d67..3c47f5d27d30 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > @@ -198,6 +198,9 @@ struct st_lsm6dsx_ext_dev_settings { > /** > * struct st_lsm6dsx_settings - ST IMU sensor settings > * @wai: Sensor WhoAmI default value. > + * @int1_addr: Control Register address for INT1 > + * @int2_addr: Control Register address for INT2 > + * @reset_addr: register address for reset/reboot > * @max_fifo_size: Sensor max fifo length in FIFO words. > * @id: List of hw id/device name supported by the driver configuration. > * @odr_table: Hw sensors odr table (Hz + val). > @@ -210,6 +213,9 @@ struct st_lsm6dsx_ext_dev_settings { > */ > struct st_lsm6dsx_settings { > u8 wai; > + u8 int1_addr; > + u8 int2_addr; > + u8 reset_addr; > u16 max_fifo_size; > struct { > enum st_lsm6dsx_hw_id hw_id; > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 9aa109428a52..e0d2149625cc 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -49,17 +49,12 @@ > > #include "st_lsm6dsx.h" > > -#define ST_LSM6DSX_REG_INT1_ADDR 0x0d > -#define ST_LSM6DSX_REG_INT2_ADDR 0x0e > #define ST_LSM6DSX_REG_FIFO_FTH_IRQ_MASK BIT(3) > #define ST_LSM6DSX_REG_WHOAMI_ADDR 0x0f > -#define ST_LSM6DSX_REG_RESET_ADDR 0x12 > #define ST_LSM6DSX_REG_RESET_MASK BIT(0) > #define ST_LSM6DSX_REG_BOOT_MASK BIT(7) > #define ST_LSM6DSX_REG_BDU_ADDR 0x12 > #define ST_LSM6DSX_REG_BDU_MASK BIT(6) > -#define ST_LSM6DSX_REG_INT2_ON_INT1_ADDR 0x13 > -#define ST_LSM6DSX_REG_INT2_ON_INT1_MASK BIT(5) > > #define ST_LSM6DSX_REG_ACC_OUT_X_L_ADDR 0x28 > #define ST_LSM6DSX_REG_ACC_OUT_Y_L_ADDR 0x2a > @@ -72,6 +67,9 @@ > static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > { > .wai = 0x69, > + .int1_addr = 0x0d, > + .int2_addr = 0x0e, > + .reset_addr = 0x12, > .max_fifo_size = 1365, > .id = { > { > @@ -170,6 +168,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > }, > { > .wai = 0x69, > + .int1_addr = 0x0d, > + .int2_addr = 0x0e, > + .reset_addr = 0x12, > .max_fifo_size = 682, > .id = { > { > @@ -268,6 +269,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > }, > { > .wai = 0x6a, > + .int1_addr = 0x0d, > + .int2_addr = 0x0e, > + .reset_addr = 0x12, > .max_fifo_size = 682, > .id = { > { > @@ -375,6 +379,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > }, > { > .wai = 0x6c, > + .int1_addr = 0x0d, > + .int2_addr = 0x0e, > + .reset_addr = 0x12, > .max_fifo_size = 512, > .id = { > { > @@ -494,6 +501,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > }, > { > .wai = 0x6b, > + .int1_addr = 0x0d, > + .int2_addr = 0x0e, > + .reset_addr = 0x12, > .max_fifo_size = 512, > .id = { > { > @@ -584,6 +594,9 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > }, > { > .wai = 0x6b, > + .int1_addr = 0x0d, > + .int2_addr = 0x0e, > + .reset_addr = 0x12, > .max_fifo_size = 512, > .id = { > { > @@ -1117,10 +1130,10 @@ static int st_lsm6dsx_get_drdy_reg(struct st_lsm6dsx_hw *hw, u8 *drdy_reg) > > switch (drdy_pin) { > case 1: > - *drdy_reg = ST_LSM6DSX_REG_INT1_ADDR; > + *drdy_reg = hw->settings->int1_addr; > break; > case 2: > - *drdy_reg = ST_LSM6DSX_REG_INT2_ADDR; > + *drdy_reg = hw->settings->int2_addr; > break; > default: > dev_err(hw->dev, "unsupported data ready pin\n"); > @@ -1220,7 +1233,7 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw) > int err; > > /* device sw reset */ > - err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR, > + err = regmap_update_bits(hw->regmap, hw->settings->reset_addr, > ST_LSM6DSX_REG_RESET_MASK, > FIELD_PREP(ST_LSM6DSX_REG_RESET_MASK, 1)); > if (err < 0) > @@ -1229,7 +1242,7 @@ static int st_lsm6dsx_init_device(struct st_lsm6dsx_hw *hw) > msleep(50); > > /* reload trimming parameter */ > - err = regmap_update_bits(hw->regmap, ST_LSM6DSX_REG_RESET_ADDR, > + err = regmap_update_bits(hw->regmap, hw->settings->reset_addr, > ST_LSM6DSX_REG_BOOT_MASK, > FIELD_PREP(ST_LSM6DSX_REG_BOOT_MASK, 1)); > if (err < 0) > -- > 2.20.1 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-07-16 9:48 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-07-16 9:33 [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Martin Kepplinger 2019-07-16 9:33 ` [PATCHv2 2/3] iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9sd1 Martin Kepplinger 2019-07-16 9:48 ` Lorenzo Bianconi 2019-07-16 9:33 ` [PATCH 3/3] dt-bindings: iio: imu: st_lsm6dsx: add lsm9ds1 device bindings Martin Kepplinger 2019-07-16 9:43 ` [PATCHv2 1/3] iio: imu: st_lsm6sdx: move register definitions to sensor_settings struct Lorenzo Bianconi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).