Re: [PATCH] iio: gyro: st_gyro: add support for the LSM9DS1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 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

>
>
>>>
>>>> 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



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux