mbox series

[v4,00/13] iio: imu: new inv_icm42600 driver

Message ID 20200622153729.12702-1-jmaneyrol@invensense.com
Headers show
Series iio: imu: new inv_icm42600 driver | expand

Message

Jean-Baptiste Maneyrol June 22, 2020, 3:37 p.m. UTC
Changelog
v1
  -initial patch submission
v2
  - formatting reworks, missing headers, code cleanup ...
  - delete all debug traces
  - add commentaries for better explanation of suspend/resume, timestamp, ...
  - delete i2c/spi table ids keeping only of, and use I2C probe_new function
  - switch calibbias to SI units and add calibias_available attribute
  - use DMA-safe buffer for all regmap_bulk_* calls
  - delete iio trigger usage and setup/handle interrupt in core module
  - add open-drain interrupt support
  - add FIFO on reference counter and buffer postenable/predisable to replace
    iio trigger usage
  - check that temperature data is present before copying in buffer
  - add temperature sensor off when fifo is turned off
  - delete timestamp channel reading
  - move timestamp state in IIO device private data
  - allow only 1 ODR change in a batch of data
  - add driver-open-drain in devicetree YAML and delete spi options
v3
  - delete const pointer cast for iio_device_get_drvdata
  - change gyro and accel init to return the allocated iio_dev structure
  - delete manual parent device assignment
  - correct style and improve readability
  - add commentaries about IIO buffer and watermark complex computation
  - add timestamp alignment in IIO buffer structure
  - wrap lines 80 columns for dt bindings
  - add ABI documentation for calibbias values in SI units
v4
  - return high resolution 16 bits temperature as raw data when polled with the
    corresponding scale and offset.
  - for data buffer return temperature in the same 16 bits using the same
    scale and offset. Convert low resolution temperature FIFO data to high
    resolution format.
  - explicitely zero out data buffer before copying to iio buffer.

This series add a new driver for managing InvenSense ICM-426xx 6-axis IMUs.
This next generation of chips includes new generations of 3-axis gyroscope
and 3-axis accelerometer, support of I3C in addition to I2C and SPI, and
intelligent MotionTracking features like pedometer, tilt detection, and
tap detection.

This series is delivering a driver supporting gyroscope, accelerometer and
temperature data, with polling and buffering using hwfifo and watermark,
on I2C and SPI busses.

Gyroscope and accelerometer sensors are completely independent and can have
different ODRs. Since there is only a single FIFO a specific value is used to
mark invalid data. For keeping the device standard we are de-multiplexing data
from the FIFO to 2 IIO devices with 2 buffers, 1 for the accelerometer and 1
for the gyroscope. This architecture also enables to easily turn each sensor
on/off without impacting the other. The device interrupt is used to read the
FIFO and launch parsing of accelerometer and gyroscope data. A complex
timestamping mechanism is added to handle correctly FIFO watermark and dynamic
changes of settings.



Jean-Baptiste Maneyrol (13):
  iio: imu: inv_icm42600: add core of new inv_icm42600 driver
  iio: imu: inv_icm42600: add I2C driver for inv_icm42600 driver
  iio: imu: inv_icm42600: add SPI driver for inv_icm42600 driver
  iio: imu: inv_icm42600: add gyroscope IIO device
  iio: imu: inv_icm42600: add accelerometer IIO device
  iio: imu: inv_icm42600: add temperature sensor support
  iio: imu: add Kconfig and Makefile for inv_icm42600 driver
  Documentation: ABI: add specific icm42600 documentation
  iio: imu: inv_icm42600: add device interrupt
  iio: imu: inv_icm42600: add buffer support in iio devices
  iio: imu: inv_icm42600: add accurate timestamping
  dt-bindings: iio: imu: Add inv_icm42600 documentation
  MAINTAINERS: add entry for inv_icm42600 6-axis imu sensor

 .../ABI/testing/sysfs-bus-iio-icm42600        |  20 +
 .../bindings/iio/imu/invensense,icm42600.yaml |  90 ++
 MAINTAINERS                                   |   8 +
 drivers/iio/imu/Kconfig                       |   1 +
 drivers/iio/imu/Makefile                      |   1 +
 drivers/iio/imu/inv_icm42600/Kconfig          |  29 +
 drivers/iio/imu/inv_icm42600/Makefile         |  15 +
 drivers/iio/imu/inv_icm42600/inv_icm42600.h   | 395 +++++++++
 .../iio/imu/inv_icm42600/inv_icm42600_accel.c | 787 +++++++++++++++++
 .../imu/inv_icm42600/inv_icm42600_buffer.c    | 601 +++++++++++++
 .../imu/inv_icm42600/inv_icm42600_buffer.h    |  98 +++
 .../iio/imu/inv_icm42600/inv_icm42600_core.c  | 786 +++++++++++++++++
 .../iio/imu/inv_icm42600/inv_icm42600_gyro.c  | 798 ++++++++++++++++++
 .../iio/imu/inv_icm42600/inv_icm42600_i2c.c   | 101 +++
 .../iio/imu/inv_icm42600/inv_icm42600_spi.c   | 100 +++
 .../iio/imu/inv_icm42600/inv_icm42600_temp.c  |  84 ++
 .../iio/imu/inv_icm42600/inv_icm42600_temp.h  |  30 +
 .../imu/inv_icm42600/inv_icm42600_timestamp.c | 195 +++++
 .../imu/inv_icm42600/inv_icm42600_timestamp.h |  85 ++
 19 files changed, 4224 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-icm42600
 create mode 100644 Documentation/devicetree/bindings/iio/imu/invensense,icm42600.yaml
 create mode 100644 drivers/iio/imu/inv_icm42600/Kconfig
 create mode 100644 drivers/iio/imu/inv_icm42600/Makefile
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600.h
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_temp.h
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.c
 create mode 100644 drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.h

Comments

Jonathan Cameron Nov. 14, 2020, 3:23 p.m. UTC | #1
On Mon, 22 Jun 2020 17:37:24 +0200
Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> wrote:

> Hardware offset available as calibscale sysfs attributes are real

> physical values exprimed in SI units.

> 

> calibscale_available sysfs attributes represents the range of

> acceptable values.

> 

> Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>


Hi Jean-Baptiste. 

This is causing us some issues as the ABI docs are now added to the
generated html docs for the kernel.  It's been a while, so I've kind
of forgotten why we have this file.  Was the issue that these are
in SI units as opposed to most calibbias controls which are offsets
applied to the raw analog reading hitting the ADC?

Would you mind if we moved this into the main doc as a note for this
particular device?

i.e. something in sysfs-bus-iio saying

icm42600: Hardware applied calibration offset is in SI units (rad/s or m/s^2 as appropriate)

?

Thanks,

Jonathan
 
> ---

>  .../ABI/testing/sysfs-bus-iio-icm42600        | 20 +++++++++++++++++++

>  1 file changed, 20 insertions(+)

>  create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-icm42600

> 

> diff --git a/Documentation/ABI/testing/sysfs-bus-iio-icm42600 b/Documentation/ABI/testing/sysfs-bus-iio-icm42600

> new file mode 100644

> index 000000000000..0bf1fd4f5bf1

> --- /dev/null

> +++ b/Documentation/ABI/testing/sysfs-bus-iio-icm42600

> @@ -0,0 +1,20 @@

> +What:		/sys/bus/iio/devices/iio:deviceX/in_accel_x_calibbias

> +What:		/sys/bus/iio/devices/iio:deviceX/in_accel_y_calibbias

> +What:		/sys/bus/iio/devices/iio:deviceX/in_accel_z_calibbias

> +What:		/sys/bus/iio/devices/iio:deviceX/in_anglvel_x_calibbias

> +What:		/sys/bus/iio/devices/iio:deviceX/in_anglvel_y_calibbias

> +What:		/sys/bus/iio/devices/iio:deviceX/in_anglvel_z_calibbias

> +KernelVersion:  5.8

> +Contact:        linux-iio@vger.kernel.org

> +Description:

> +		Hardware applied calibration offset (assumed to fix production

> +		inaccuracies). Values represent a real physical offset expressed

> +		in SI units (m/s^2 for accelerometer and rad/s for gyroscope).

> +

> +What:		/sys/bus/iio/devices/iio:deviceX/in_accel_calibbias_available

> +What:		/sys/bus/iio/devices/iio:deviceX/in_anglvel_calibbias_available

> +KernelVersion:  5.8

> +Contact:        linux-iio@vger.kernel.org

> +Description:

> +		Range of available values for hardware offset. Values in SI

> +		units (m/s^2 for accelerometer and rad/s for gyroscope).
Jean-Baptiste Maneyrol Nov. 16, 2020, 9:25 a.m. UTC | #2
Hello Jonathan,

no problem for me, you can move it wherever you see fit.

Thank you.
JB


From: Jonathan Cameron <jic23@kernel.org>
Sent: Saturday, November 14, 2020 16:23
To: Jean-Baptiste Maneyrol <JManeyrol@invensense.com>
Cc: robh+dt@kernel.org <robh+dt@kernel.org>; robh@kernel.org <robh@kernel.org>; mchehab+huawei@kernel.org <mchehab+huawei@kernel.org>; davem@davemloft.net <davem@davemloft.net>; gregkh@linuxfoundation.org <gregkh@linuxfoundation.org>; linux-iio@vger.kernel.org <linux-iio@vger.kernel.org>; devicetree@vger.kernel.org <devicetree@vger.kernel.org>; linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v4 08/13] Documentation: ABI: add specific icm42600 documentation 
 
 CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe.

On Mon, 22 Jun 2020 17:37:24 +0200
Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> wrote:

> Hardware offset available as calibscale sysfs attributes are real
> physical values exprimed in SI units.
> 
> calibscale_available sysfs attributes represents the range of
> acceptable values.
> 
> Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>

Hi Jean-Baptiste. 

This is causing us some issues as the ABI docs are now added to the
generated html docs for the kernel.  It's been a while, so I've kind
of forgotten why we have this file.  Was the issue that these are
in SI units as opposed to most calibbias controls which are offsets
applied to the raw analog reading hitting the ADC?

Would you mind if we moved this into the main doc as a note for this
particular device?

i.e. something in sysfs-bus-iio saying

icm42600: Hardware applied calibration offset is in SI units (rad/s or m/s^2 as appropriate)

?

Thanks,

Jonathan
 
> ---
>  .../ABI/testing/sysfs-bus-iio-icm42600        | 20 +++++++++++++++++++
>  1 file changed, 20 insertions(+)
>  create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-icm42600
> 
> diff --git a/Documentation/ABI/testing/sysfs-bus-iio-icm42600 b/Documentation/ABI/testing/sysfs-bus-iio-icm42600
> new file mode 100644
> index 000000000000..0bf1fd4f5bf1
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-bus-iio-icm42600
> @@ -0,0 +1,20 @@
> +What:                /sys/bus/iio/devices/iio:deviceX/in_accel_x_calibbias
> +What:                /sys/bus/iio/devices/iio:deviceX/in_accel_y_calibbias
> +What:                /sys/bus/iio/devices/iio:deviceX/in_accel_z_calibbias
> +What:                /sys/bus/iio/devices/iio:deviceX/in_anglvel_x_calibbias
> +What:                /sys/bus/iio/devices/iio:deviceX/in_anglvel_y_calibbias
> +What:                /sys/bus/iio/devices/iio:deviceX/in_anglvel_z_calibbias
> +KernelVersion:  5.8
> +Contact:        linux-iio@vger.kernel.org
> +Description:
> +             Hardware applied calibration offset (assumed to fix production
> +             inaccuracies). Values represent a real physical offset expressed
> +             in SI units (m/s^2 for accelerometer and rad/s for gyroscope).
> +
> +What:                /sys/bus/iio/devices/iio:deviceX/in_accel_calibbias_available
> +What:                /sys/bus/iio/devices/iio:deviceX/in_anglvel_calibbias_available
> +KernelVersion:  5.8
> +Contact:        linux-iio@vger.kernel.org
> +Description:
> +             Range of available values for hardware offset. Values in SI
> +             units (m/s^2 for accelerometer and rad/s for gyroscope).