> On 01/04/2018 01:22 AM, Lorenzo Bianconi wrote: >>> >>> On 01/02/2018 04:30 AM, Jonathan Cameron wrote: >>>> >>>> >>>> On Mon, 1 Jan 2018 11:32:21 -0800 >>>> Martin Kelly <martin@xxxxxxxxxxxxxxxx> wrote: >>>> >>>>> On 01/01/2018 02:42 AM, Jonathan Cameron wrote: >>>>>> >>>>>> >>>>>> On Sun, 31 Dec 2017 13:06:52 -0800 >>>>>> Martin Kelly <martin@xxxxxxxxxxxxxxxx> wrote: >>>>>> >>>>>>> >>>>>>> From: Martin Kelly <martin@xxxxxxxxxxxxxxxx> >>>>>>> >>>>>>> Update the sensor settings to support the LSM9DS1 sensor. >>>>>>> >>>>>>> Signed-off-by: Martin Kelly <martin@xxxxxxxxxxxxxxxx> >>>>>> >>>>>> >>>>>> >>>>>> Hi Martin, >>>>>> >>>>>> I'm rather unsure if we should be adding more gyro only >>>>>> support for these devices. Ths lsm9ds0 was in theory >>>>>> a stop gap whilst support was properly sorted out. >>>>>> >>>>>> Looking back Crestez did post an RFC for each of the >>>>>> parts as well for reference but made the point that this was >>>>>> the wrong way to do things. >>>>>> >>>>>> This part (and the ds0) really need to be supported by a proper >>>>>> gyro/accel >>>>>> driver rather than just cherry picking out the gyro part. >>>>>> >>>>>> We are stuck having to maintain precise backwards compatibility >>>>>> for the ds0 part by the fact it is upstream already. I'm not >>>>>> particularly keen to make things worse. >>>>>> >>>>>> https://patchwork.kernel.org/patch/8824981/ >>>>>> https://marc.info/?t=146057421800001&r=1&w=4 >>>>>> >>>>>> Looking at the datasheet this is a mess of a device. >>>>>> >>>>>> The accel and gyro feed one fifo, the magnetometer only supports >>>>>> direct access. The magnetometer is effectively a separate part >>>>>> so supporting that should be easy enough. >>>>>> >>>>>> Denis, did your rework of the st driver to support these dual >>>>>> devices get anywhere? >>>>>> >>>>>> Anyhow, lets hold this one for now until we hear from Denis or >>>>>> someone else at ST on the current status of supporting these >>>>>> properly. >>>>>> >>>>> >>>>> >>>>> Sure, I'll wait for Denis. It seems to me we have two possible >>>>> situations: >>>>> >>>>> (1) A proper combo driver is ready soon, or can be made to work with >>>>> not >>>>> much more effort than extending the current driver. In this case, I >>>>> should rewrite the patch to use the combo driver, or wait until the >>>>> combo driver is available. I'm not sure if the proper combo driver is >>>>> something Denis is working on or if it's Lorenzo's driver. >>>>> >>>>> (2) The combo driver won't be ready for a while, or it takes a large >>>>> refactor to make it work with the LSM9X combo devices. In this case, it >>>>> seems to me that adding another device should not significantly >>>>> increase >>>>> maintenance burden, as the main maintenance is in maintaining the >>>>> infrastructure rather than the settings struct for each device itself. >>>>> We still need to solve the need for a proper combo driver, but in the >>>>> meantime (which could be a while), we'll have support for a new device, >>>>> which is good for everyone. >>>> >>>> >>>> >>>> The issue is not so much code maintenance but rather the fact that any >>>> new driver that supports the combo modes will inherently add some >>>> degree of ABI change to userspace (even if it is just the name of the >>>> device changing). Definitely less than ideal given in theory we >>>> guarantee never to break userspace - however fragile that userspace >>>> is... Honestly I should never have taken the first part that does >>>> this but clearly had a weak moment. >>>> >>>> Jonathan >>>> >>> >>> OK, makes sense. It sounds like if I want to get the LSM9DS1 supported, I >>> should help out with the combo driver work and get it supported properly >>> with accel+gyro. Is that right? >> >> >> I have a couple of trivial st_lsm6dsx queued patches that would help >> Martin to add LSM9DS{0,1} >> support to st_lsm6dsx (they are not related to LSM9DS{0,1}, just >> modify the driver to be more general respect to FIFO parsing). >> I will send them as soon as regmap patchset has been reviewed. >> >> Regards, >> Lorenzo >> > > Thanks Lorenzo. Is the st_lsm6dsx the right place to add support for an > LSM9DSX combo driver, or is Dennis working on something as well? If the > st_lsm6dsx is the right place, could you give me a high-level overview of > what's needed to make that support possible? > st_lsm6dsx has been done to support new ST combo devices (accel + gyro) like LSM6DSM (starting from LSM6DS3), so theoretically yes, but I do not know how LSM9DSx FIFO management and register map are different respect to newer combo devices (and so the effort to support them). I need to carefully review the ds first. Regards, Lorenzo > >>> >>> >>>>> >>>>>> Jonathan >>>>>> >>>>>>> >>>>>>> --- >>>>>>> .../devicetree/bindings/iio/st-sensors.txt | 1 + >>>>>>> drivers/iio/gyro/Kconfig | 3 +- >>>>>>> drivers/iio/gyro/st_gyro.h | 1 + >>>>>>> drivers/iio/gyro/st_gyro_core.c | 95 >>>>>>> ++++++++++++++++++++++ >>>>>>> drivers/iio/gyro/st_gyro_i2c.c | 5 ++ >>>>>>> drivers/iio/gyro/st_gyro_spi.c | 5 ++ >>>>>>> 6 files changed, 109 insertions(+), 1 deletion(-) >>>>>>> >>>>>>> diff --git a/Documentation/devicetree/bindings/iio/st-sensors.txt >>>>>>> b/Documentation/devicetree/bindings/iio/st-sensors.txt >>>>>>> index 6f626f73417e..e3d2b5d5d707 100644 >>>>>>> --- a/Documentation/devicetree/bindings/iio/st-sensors.txt >>>>>>> +++ b/Documentation/devicetree/bindings/iio/st-sensors.txt >>>>>>> @@ -59,6 +59,7 @@ Gyroscopes: >>>>>>> - st,l3g4is-gyro >>>>>>> - st,lsm330-gyro >>>>>>> - st,lsm9ds0-gyro >>>>>>> +- st,lsm9ds1-gyro >>>>>>> Magnetometers: >>>>>>> - st,lsm303agr-magn >>>>>>> diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig >>>>>>> index 3126cf05e6b9..0d63c84c5312 100644 >>>>>>> --- a/drivers/iio/gyro/Kconfig >>>>>>> +++ b/drivers/iio/gyro/Kconfig >>>>>>> @@ -111,7 +111,8 @@ config IIO_ST_GYRO_3AXIS >>>>>>> select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) >>>>>>> help >>>>>>> Say yes here to build support for STMicroelectronics >>>>>>> gyroscopes: >>>>>>> - L3G4200D, LSM330DL, L3GD20, LSM330DLC, L3G4IS, LSM330, >>>>>>> LSM9DS0. >>>>>>> + L3G4200D, LSM330DL, L3GD20, LSM330DLC, L3G4IS, LSM330, >>>>>>> LSM9DS0, >>>>>>> + LSM9DS1. >>>>>> >>>>>> >>>>>> >>>>>> Please copy the spaces vs tabs in Kconfig > >>>>> >>>>> >>>>> >>>>> Ooops, will do if we go forward with the patch as-is. >>>>> >>>>>>> This driver can also be built as a module. If so, these >>>>>>> modules >>>>>>> will be created: >>>>>>> diff --git a/drivers/iio/gyro/st_gyro.h b/drivers/iio/gyro/st_gyro.h >>>>>>> index 48923ae6ac3b..f89de446d066 100644 >>>>>>> --- a/drivers/iio/gyro/st_gyro.h >>>>>>> +++ b/drivers/iio/gyro/st_gyro.h >>>>>>> @@ -23,6 +23,7 @@ >>>>>>> #define L3G4IS_GYRO_DEV_NAME "l3g4is_ui" >>>>>>> #define LSM330_GYRO_DEV_NAME "lsm330_gyro" >>>>>>> #define LSM9DS0_GYRO_DEV_NAME "lsm9ds0_gyro" >>>>>>> +#define LSM9DS1_GYRO_DEV_NAME "lsm9ds1_gyro" >>>>>>> /** >>>>>>> * struct st_sensors_platform_data - gyro platform data >>>>>>> diff --git a/drivers/iio/gyro/st_gyro_core.c >>>>>>> b/drivers/iio/gyro/st_gyro_core.c >>>>>>> index b31064ba37b9..ebfce311e855 100644 >>>>>>> --- a/drivers/iio/gyro/st_gyro_core.c >>>>>>> +++ b/drivers/iio/gyro/st_gyro_core.c >>>>>>> @@ -56,6 +56,23 @@ static const struct iio_chan_spec >>>>>>> st_gyro_16bit_channels[] = { >>>>>>> IIO_CHAN_SOFT_TIMESTAMP(3) >>>>>>> }; >>>>>>> +/* The LSM9DS1 uses different output registers that the other >>>>>>> chips. */ >>>>>>> +static const struct iio_chan_spec st_gyro_lsm9ds1_16bit_channels[] = >>>>>>> { >>>>>>> + ST_SENSORS_LSM_CHANNELS(IIO_ANGL_VEL, >>>>>>> + BIT(IIO_CHAN_INFO_RAW) | >>>>>>> BIT(IIO_CHAN_INFO_SCALE), >>>>>>> + ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, >>>>>>> 16, 16, >>>>>>> + 0x18), >>>>>>> + ST_SENSORS_LSM_CHANNELS(IIO_ANGL_VEL, >>>>>>> + BIT(IIO_CHAN_INFO_RAW) | >>>>>>> BIT(IIO_CHAN_INFO_SCALE), >>>>>>> + ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, >>>>>>> 16, 16, >>>>>>> + 0x1a), >>>>>>> + ST_SENSORS_LSM_CHANNELS(IIO_ANGL_VEL, >>>>>>> + BIT(IIO_CHAN_INFO_RAW) | >>>>>>> BIT(IIO_CHAN_INFO_SCALE), >>>>>>> + ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, >>>>>>> 16, 16, >>>>>>> + 0x1c), >>>>>>> + IIO_CHAN_SOFT_TIMESTAMP(3) >>>>>>> +}; >>>>>>> + >>>>>>> static const struct st_sensor_settings st_gyro_sensors_settings[] >>>>>>> = >>>>>>> { >>>>>>> { >>>>>>> .wai = 0xd3, >>>>>>> @@ -285,6 +302,84 @@ static const struct st_sensor_settings >>>>>>> st_gyro_sensors_settings[] = { >>>>>>> .multi_read_bit = true, >>>>>>> .bootime = 2, >>>>>>> }, >>>>>>> + { >>>>>>> + .wai = 0x68, >>>>>>> + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, >>>>>>> + .sensors_supported = { >>>>>>> + [0] = LSM9DS1_GYRO_DEV_NAME, >>>>>>> + }, >>>>>>> + .ch = (struct iio_chan_spec >>>>>>> *)st_gyro_lsm9ds1_16bit_channels, >>>>>>> + .odr = { >>>>>>> + .addr = 0x10, >>>>>>> + .mask = 0xe0, >>>>>>> + .odr_avl = { >>>>>>> + { .hz = 15, .value = 0x01, }, >>>>>>> + { .hz = 60, .value = 0x02, }, >>>>>>> + { .hz = 119, .value = 0x03, }, >>>>>>> + { .hz = 238, .value = 0x04, }, >>>>>>> + { .hz = 476, .value = 0x05, }, >>>>>>> + { .hz = 952, .value = 0x06, }, >>>>>>> + }, >>>>>>> + }, >>>>>>> + .pw = { >>>>>>> + .addr = 0x10, >>>>>>> + .mask = 0xe0, >>>>>>> + .value_on = >>>>>>> ST_SENSORS_DEFAULT_POWER_ON_VALUE, >>>>>>> + .value_off = >>>>>>> ST_SENSORS_DEFAULT_POWER_OFF_VALUE, >>>>>>> + }, >>>>>>> + .enable_axis = { >>>>>>> + .addr = 0x1e, >>>>>>> + .mask = 0x38, >>>>>>> + }, >>>>>>> + .fs = { >>>>>>> + .addr = 0x10, >>>>>>> + .mask = 0x38, >>>>>>> + .fs_avl = { >>>>>>> + [0] = { >>>>>>> + .num = ST_GYRO_FS_AVL_250DPS, >>>>>>> + .value = 0x00, >>>>>>> + .gain = >>>>>>> IIO_DEGREE_TO_RAD(8750), >>>>>>> + }, >>>>>>> + [1] = { >>>>>>> + .num = ST_GYRO_FS_AVL_500DPS, >>>>>>> + .value = 0x01, >>>>>>> + .gain = >>>>>>> IIO_DEGREE_TO_RAD(17500), >>>>>>> + }, >>>>>>> + [2] = { >>>>>>> + .num = >>>>>>> ST_GYRO_FS_AVL_2000DPS, >>>>>>> + /* 2 is "Not Available". */ >>>>>>> + .value = 0x03, >>>>>>> + .gain = >>>>>>> IIO_DEGREE_TO_RAD(70000), >>>>>>> + }, >>>>>>> + }, >>>>>>> + }, >>>>>>> + .bdu = { >>>>>>> + .addr = 0x22, >>>>>>> + .mask = 0x40, >>>>>>> + }, >>>>>>> + .drdy_irq = { >>>>>>> + .int1 = { >>>>>>> + .addr = 0x0c, >>>>>>> + .mask = 0x02, >>>>>>> + }, >>>>>>> + .int2 = { >>>>>>> + .addr = 0x0d, >>>>>>> + .mask = 0x02, >>>>>>> + }, >>>>>>> + .addr_ihl = 0x22, >>>>>>> + .mask_ihl = 0x20, >>>>>>> + .stat_drdy = { >>>>>>> + .addr = ST_SENSORS_DEFAULT_STAT_ADDR, >>>>>>> + .mask = 0x02, >>>>>>> + }, >>>>>>> + }, >>>>>>> + .sim = { >>>>>>> + .addr = 0x22, >>>>>>> + .value = BIT(3), >>>>>>> + }, >>>>>>> + .multi_read_bit = false, >>>>>>> + .bootime = 2, >>>>>>> + }, >>>>>>> }; >>>>>>> static int st_gyro_read_raw(struct iio_dev *indio_dev, >>>>>>> diff --git a/drivers/iio/gyro/st_gyro_i2c.c >>>>>>> b/drivers/iio/gyro/st_gyro_i2c.c >>>>>>> index b405b82b9177..97faa3ddac17 100644 >>>>>>> --- a/drivers/iio/gyro/st_gyro_i2c.c >>>>>>> +++ b/drivers/iio/gyro/st_gyro_i2c.c >>>>>>> @@ -56,6 +56,10 @@ static const struct of_device_id >>>>>>> st_gyro_of_match[] >>>>>>> = { >>>>>>> .compatible = "st,lsm9ds0-gyro", >>>>>>> .data = LSM9DS0_GYRO_DEV_NAME, >>>>>>> }, >>>>>>> + { >>>>>>> + .compatible = "st,lsm9ds1-gyro", >>>>>>> + .data = LSM9DS1_GYRO_DEV_NAME, >>>>>>> + }, >>>>>>> {}, >>>>>>> }; >>>>>>> MODULE_DEVICE_TABLE(of, st_gyro_of_match); >>>>>>> @@ -104,6 +108,7 @@ static const struct i2c_device_id >>>>>>> st_gyro_id_table[] = { >>>>>>> { L3G4IS_GYRO_DEV_NAME }, >>>>>>> { LSM330_GYRO_DEV_NAME }, >>>>>>> { LSM9DS0_GYRO_DEV_NAME }, >>>>>>> + { LSM9DS1_GYRO_DEV_NAME }, >>>>>>> {}, >>>>>>> }; >>>>>>> MODULE_DEVICE_TABLE(i2c, st_gyro_id_table); >>>>>>> diff --git a/drivers/iio/gyro/st_gyro_spi.c >>>>>>> b/drivers/iio/gyro/st_gyro_spi.c >>>>>>> index 0b52ed577dc2..7d4661cc260c 100644 >>>>>>> --- a/drivers/iio/gyro/st_gyro_spi.c >>>>>>> +++ b/drivers/iio/gyro/st_gyro_spi.c >>>>>>> @@ -61,6 +61,10 @@ static const struct of_device_id >>>>>>> st_gyro_of_match[] >>>>>>> = { >>>>>>> .compatible = "st,lsm9ds0-gyro", >>>>>>> .data = LSM9DS0_GYRO_DEV_NAME, >>>>>>> }, >>>>>>> + { >>>>>>> + .compatible = "st,lsm9ds1-gyro", >>>>>>> + .data = LSM9DS1_GYRO_DEV_NAME, >>>>>>> + }, >>>>>>> {}, >>>>>>> }; >>>>>>> MODULE_DEVICE_TABLE(of, st_gyro_of_match); >>>>>>> @@ -108,6 +112,7 @@ static const struct spi_device_id >>>>>>> st_gyro_id_table[] = { >>>>>>> { L3G4IS_GYRO_DEV_NAME }, >>>>>>> { LSM330_GYRO_DEV_NAME }, >>>>>>> { LSM9DS0_GYRO_DEV_NAME }, >>>>>>> + { LSM9DS1_GYRO_DEV_NAME }, >>>>>>> {}, >>>>>>> }; >>>>>>> MODULE_DEVICE_TABLE(spi, st_gyro_id_table); >>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in >>>>> the body of a message to majordomo@xxxxxxxxxxxxxxx >>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>>> >>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in >>>> the body of a message to majordomo@xxxxxxxxxxxxxxx >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>> >> >> >> > -- UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch; unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp; umount; make clean; sleep -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html