[PATCH v6 0/7] imu: st_lsm6dsx: Add support for rotation sensor
From: Francesco Lavra
Date: Wed Feb 25 2026 - 05:05:55 EST
This series adds support for the rotation sensor functionality present in
some chips from the ST LSM6DSX IMU family.
The IIO ABI has been amended to allow the use of floating-point data and
custom (driver-specific) channels in IIO buffers.
Tested on LSM6DSV16X.
Changes from v5 [5]:
- cleaned up FIFO data representation in st_lsm6dsx_read_tagged_fifo() to
avoid casting (Andy, Jonathan)
- renamed 'sign' field to `format` in struct iio_scan_type
- added support for IEEE 754 floating-point format in buffer scan elements
- added custom data type in the ABI (IIO_CUSTOM in enum iio_chan_type)
(Jonathan)
- added driver document in Documentation/iio/ (Jonathan)
Changes from v4 [4]:
- changed data parameter in st_lsm6dsx_push_tagged_data() to __le16 *
(Andy)
Changes from v3 [3]:
- added patch 3 (Andy)
- removed unneeded checks for negative return values in st_lsm6dsx_fusion.c
(Andy)
- replaced st_lsm6dsx_sf_set_page function with
st_lsm6dsx_sf_page_enable/disable (Andy)
- used reversed xmas tree ordering for local variables (Andy)
- added parentheses to MILLI / MICRO in st_lsm6dsx_sf_write_raw (Andy)
- added check for string truncation in st_lsm6dsx_sf_probe (Andy)
Changes from v2 [2]:
- amended description of patch 2 to point out that there are no supported
gyro events (Jonathan)
- removed superfluous parentheses in st_lsm6dsx_fifo_setup (Lorenzo)
- added Lorenzo's acked-by tag to patch 3
- added missing checks of st_lsm6dsx_sf_set_page() return value (Jonathan)
- added comment in st_lsm6dsx_sf_write_raw (Jonathan)
Changes from v1 [1]:
- swapped patches 1 and 2 (Jonathan)
- miscellaneous stylistic changes (Andy)
- fixed usage of MICRO and MILLI constants in st_lsm6dsx_sf_read_raw and
st_lsm6dsx_sf_write_raw (Andy)
- replaced scnprintf() with sysfs_emit_at() in
st_lsm6dsx_sf_sampling_freq_avail (Andy)
- replaced scnprintf() with snprintf() in st_lsm6dsx_sf_probe (Andy)
- clarified in a comment in st_lsm6dsx_set_fifo_odr() that only internal
sensors have a FIFO ODR configuration register (Jonathan)
- modified patch 3 description to explain justification for the extra IIO
device (Jonathan)
- moved page lock from st_lsm6dsx_sf_set_page() to the callers (Jonathan)
- s/magnetometer/gyroscope/ in patch 2 description
[1] https://lore.kernel.org/linux-iio/20260109181528.154127-1-flavra@xxxxxxxxxxxx/T/
[2] https://lore.kernel.org/linux-iio/20260115122431.1014630-1-flavra@xxxxxxxxxxxx/T/
[3] https://lore.kernel.org/linux-iio/20260119100449.1559624-1-flavra@xxxxxxxxxxxx/T/
[4] https://lore.kernel.org/linux-iio/20260121112758.1831077-1-flavra@xxxxxxxxxxxx/T/
[5] https://lore.kernel.org/linux-iio/20260122162335.2020006-1-flavra@xxxxxxxxxxxx/T/
Francesco Lavra (7):
iio: imu: st_lsm6dsx: Set FIFO ODR for accelerometer and gyroscope
only
iio: imu: st_lsm6dsx: Set buffer sampling frequency for accelerometer
only
iio: imu: st_lsm6dsx: Fix check for invalid samples from FIFO
iio: Rename 'sign' field to `format` in struct iio_scan_type
iio: ABI: Add support for floating-point numbers in buffer scan
elements
iio: ABI: Add custom data type
iio: imu: st_lsm6dsx: Add support for rotation sensor
Documentation/ABI/testing/sysfs-bus-iio | 52 ++--
Documentation/driver-api/iio/buffers.rst | 9 +-
Documentation/iio/iio_devbuf.rst | 3 +-
drivers/iio/accel/adxl313_core.c | 2 +-
drivers/iio/accel/adxl345_core.c | 2 +-
drivers/iio/accel/adxl355_core.c | 4 +-
drivers/iio/accel/adxl367.c | 4 +-
drivers/iio/accel/adxl372.c | 2 +-
drivers/iio/accel/adxl380.c | 4 +-
drivers/iio/accel/bma180.c | 10 +-
drivers/iio/accel/bma220_core.c | 2 +-
drivers/iio/accel/bma400_core.c | 4 +-
drivers/iio/accel/bmc150-accel-core.c | 2 +-
drivers/iio/accel/cros_ec_accel_legacy.c | 2 +-
drivers/iio/accel/fxls8962af-core.c | 4 +-
drivers/iio/accel/hid-sensor-accel-3d.c | 2 +-
drivers/iio/accel/kionix-kx022a.c | 2 +-
drivers/iio/accel/kxcjk-1013.c | 2 +-
drivers/iio/accel/kxsd9.c | 4 +-
drivers/iio/accel/mma7455_core.c | 2 +-
drivers/iio/accel/mma8452.c | 4 +-
drivers/iio/accel/msa311.c | 2 +-
drivers/iio/accel/mxc4005.c | 2 +-
drivers/iio/accel/sca3000.c | 4 +-
drivers/iio/accel/sca3300.c | 6 +-
drivers/iio/accel/stk8312.c | 2 +-
drivers/iio/accel/stk8ba50.c | 2 +-
drivers/iio/adc/ad4000.c | 8 +-
drivers/iio/adc/ad4030.c | 10 +-
drivers/iio/adc/ad4062.c | 8 +-
drivers/iio/adc/ad4080.c | 2 +-
drivers/iio/adc/ad4130.c | 2 +-
drivers/iio/adc/ad4170-4.c | 12 +-
drivers/iio/adc/ad4695.c | 24 +-
drivers/iio/adc/ad4851.c | 12 +-
drivers/iio/adc/ad7124.c | 4 +-
drivers/iio/adc/ad7173.c | 6 +-
drivers/iio/adc/ad7191.c | 6 +-
drivers/iio/adc/ad7192.c | 2 +-
drivers/iio/adc/ad7266.c | 6 +-
drivers/iio/adc/ad7280a.c | 4 +-
drivers/iio/adc/ad7298.c | 4 +-
drivers/iio/adc/ad7380.c | 44 ++--
drivers/iio/adc/ad7405.c | 2 +-
drivers/iio/adc/ad7476.c | 2 +-
drivers/iio/adc/ad7606.c | 14 +-
drivers/iio/adc/ad7625.c | 2 +-
drivers/iio/adc/ad7766.c | 2 +-
drivers/iio/adc/ad7768-1.c | 8 +-
drivers/iio/adc/ad7779.c | 2 +-
drivers/iio/adc/ad7780.c | 2 +-
drivers/iio/adc/ad7791.c | 2 +-
drivers/iio/adc/ad7793.c | 2 +-
drivers/iio/adc/ad7887.c | 2 +-
drivers/iio/adc/ad7923.c | 2 +-
drivers/iio/adc/ad7944.c | 8 +-
drivers/iio/adc/ad799x.c | 2 +-
drivers/iio/adc/ad9467.c | 4 +-
drivers/iio/adc/ade9000.c | 4 +-
drivers/iio/adc/at91-sama5d2_adc.c | 10 +-
drivers/iio/adc/at91_adc.c | 4 +-
drivers/iio/adc/cc10001_adc.c | 4 +-
drivers/iio/adc/cpcap-adc.c | 2 +-
drivers/iio/adc/dln2-adc.c | 4 +-
drivers/iio/adc/hx711.c | 4 +-
drivers/iio/adc/ina2xx-adc.c | 8 +-
drivers/iio/adc/ingenic-adc.c | 12 +-
drivers/iio/adc/max1027.c | 4 +-
drivers/iio/adc/max1118.c | 2 +-
drivers/iio/adc/max11205.c | 2 +-
drivers/iio/adc/max11410.c | 2 +-
drivers/iio/adc/max1363.c | 4 +-
drivers/iio/adc/mcp3911.c | 2 +-
drivers/iio/adc/mt6359-auxadc.c | 2 +-
drivers/iio/adc/mt6360-adc.c | 2 +-
drivers/iio/adc/mxs-lradc-adc.c | 6 +-
drivers/iio/adc/nxp-sar-adc.c | 2 +-
drivers/iio/adc/pac1921.c | 8 +-
drivers/iio/adc/pac1934.c | 32 +--
drivers/iio/adc/rockchip_saradc.c | 2 +-
drivers/iio/adc/rtq6056.c | 16 +-
drivers/iio/adc/sd_adc_modulator.c | 2 +-
drivers/iio/adc/stm32-adc.c | 4 +-
drivers/iio/adc/stm32-dfsdm-adc.c | 2 +-
drivers/iio/adc/ti-adc081c.c | 2 +-
drivers/iio/adc/ti-adc0832.c | 4 +-
drivers/iio/adc/ti-adc084s021.c | 2 +-
drivers/iio/adc/ti-adc108s102.c | 2 +-
drivers/iio/adc/ti-adc12138.c | 4 +-
drivers/iio/adc/ti-adc161s626.c | 4 +-
drivers/iio/adc/ti-ads1015.c | 4 +-
drivers/iio/adc/ti-ads1018.c | 6 +-
drivers/iio/adc/ti-ads1100.c | 2 +-
drivers/iio/adc/ti-ads1119.c | 2 +-
drivers/iio/adc/ti-ads124s08.c | 2 +-
drivers/iio/adc/ti-ads1298.c | 2 +-
drivers/iio/adc/ti-ads131e08.c | 2 +-
drivers/iio/adc/ti-ads7950.c | 2 +-
drivers/iio/adc/ti-ads8688.c | 2 +-
drivers/iio/adc/ti-lmp92064.c | 4 +-
drivers/iio/adc/ti-tlc4541.c | 2 +-
drivers/iio/adc/ti-tsc2046.c | 2 +-
drivers/iio/adc/ti_am335x_adc.c | 2 +-
drivers/iio/adc/vf610_adc.c | 4 +-
drivers/iio/adc/xilinx-ams.c | 2 +-
drivers/iio/adc/xilinx-xadc-core.c | 10 +-
drivers/iio/addac/ad74115.c | 2 +-
drivers/iio/addac/ad74413r.c | 2 +-
drivers/iio/chemical/atlas-ezo-sensor.c | 4 +-
drivers/iio/chemical/atlas-sensor.c | 12 +-
drivers/iio/chemical/bme680_core.c | 8 +-
drivers/iio/chemical/ccs811.c | 4 +-
drivers/iio/chemical/ens160_core.c | 4 +-
drivers/iio/chemical/pms7003.c | 2 +-
drivers/iio/chemical/scd30_core.c | 2 +-
drivers/iio/chemical/scd4x.c | 6 +-
drivers/iio/chemical/sps30.c | 2 +-
.../common/cros_ec_sensors/cros_ec_activity.c | 2 +-
.../cros_ec_sensors/cros_ec_lid_angle.c | 2 +-
.../common/cros_ec_sensors/cros_ec_sensors.c | 4 +-
drivers/iio/common/scmi_sensors/scmi_iio.c | 4 +-
.../iio/common/ssp_sensors/ssp_iio_sensor.h | 4 +-
drivers/iio/dac/ad3552r-hs.c | 2 +-
drivers/iio/dac/ad3552r.c | 2 +-
drivers/iio/dac/ad5064.c | 2 +-
drivers/iio/dac/ad5360.c | 2 +-
drivers/iio/dac/ad5380.c | 2 +-
drivers/iio/dac/ad5421.c | 2 +-
drivers/iio/dac/ad5446.h | 2 +-
drivers/iio/dac/ad5449.c | 2 +-
drivers/iio/dac/ad5504.c | 2 +-
drivers/iio/dac/ad5592r-base.c | 2 +-
drivers/iio/dac/ad5624r_spi.c | 2 +-
drivers/iio/dac/ad5686.c | 2 +-
drivers/iio/dac/ad5755.c | 2 +-
drivers/iio/dac/ad5761.c | 2 +-
drivers/iio/dac/ad5764.c | 2 +-
drivers/iio/dac/ad5766.c | 2 +-
drivers/iio/dac/ad5791.c | 4 +-
drivers/iio/dac/ad7303.c | 2 +-
drivers/iio/dac/ad8460.c | 2 +-
drivers/iio/dac/ad9739a.c | 2 +-
drivers/iio/dac/ltc1660.c | 2 +-
drivers/iio/dac/max5522.c | 2 +-
drivers/iio/dac/mcp4922.c | 2 +-
drivers/iio/dac/stm32-dac.c | 2 +-
drivers/iio/dummy/iio_simple_dummy.c | 8 +-
drivers/iio/gyro/adis16136.c | 4 +-
drivers/iio/gyro/adxrs290.c | 4 +-
drivers/iio/gyro/bmg160_core.c | 2 +-
drivers/iio/gyro/fxas21002c_core.c | 2 +-
drivers/iio/gyro/hid-sensor-gyro-3d.c | 2 +-
drivers/iio/gyro/itg3200_core.c | 2 +-
drivers/iio/gyro/mpu3050-core.c | 4 +-
drivers/iio/health/afe440x.h | 2 +-
drivers/iio/health/max30100.c | 4 +-
drivers/iio/health/max30102.c | 2 +-
drivers/iio/humidity/am2315.c | 4 +-
drivers/iio/humidity/hdc100x.c | 4 +-
drivers/iio/humidity/hid-sensor-humidity.c | 2 +-
drivers/iio/humidity/hts221_core.c | 4 +-
drivers/iio/imu/adis.c | 2 +-
drivers/iio/imu/adis16400.c | 16 +-
drivers/iio/imu/adis16460.c | 4 +-
drivers/iio/imu/adis16475.c | 6 +-
drivers/iio/imu/adis16480.c | 6 +-
drivers/iio/imu/adis16550.c | 6 +-
drivers/iio/imu/bmi160/bmi160_core.c | 2 +-
drivers/iio/imu/bmi270/bmi270_core.c | 4 +-
drivers/iio/imu/bmi323/bmi323_core.c | 4 +-
drivers/iio/imu/bno055/bno055.c | 2 +-
.../iio/imu/inv_icm42600/inv_icm42600_accel.c | 2 +-
.../iio/imu/inv_icm42600/inv_icm42600_gyro.c | 2 +-
.../iio/imu/inv_icm42600/inv_icm42600_temp.h | 2 +-
drivers/iio/imu/inv_icm45600/inv_icm45600.h | 2 +-
.../iio/imu/inv_icm45600/inv_icm45600_accel.c | 2 +-
.../iio/imu/inv_icm45600/inv_icm45600_gyro.c | 2 +-
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 6 +-
drivers/iio/imu/kmx61.c | 4 +-
drivers/iio/imu/smi240.c | 4 +-
drivers/iio/imu/smi330/smi330_core.c | 6 +-
drivers/iio/imu/st_lsm6dsx/Makefile | 2 +-
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 30 ++-
.../iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 45 +++-
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 58 +++++
.../iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c | 235 ++++++++++++++++++
drivers/iio/industrialio-buffer.c | 4 +-
drivers/iio/industrialio-core.c | 1 +
drivers/iio/light/acpi-als.c | 2 +-
drivers/iio/light/adjd_s311.c | 2 +-
drivers/iio/light/apds9960.c | 2 +-
drivers/iio/light/as73211.c | 6 +-
drivers/iio/light/bh1745.c | 2 +-
drivers/iio/light/cros_ec_light_prox.c | 4 +-
drivers/iio/light/gp2ap020a00f.c | 6 +-
drivers/iio/light/hid-sensor-als.c | 2 +-
drivers/iio/light/hid-sensor-prox.c | 2 +-
drivers/iio/light/isl29125.c | 2 +-
drivers/iio/light/ltr501.c | 4 +-
drivers/iio/light/max44000.c | 4 +-
drivers/iio/light/opt4060.c | 4 +-
drivers/iio/light/rohm-bu27034.c | 4 +-
drivers/iio/light/rpr0521.c | 6 +-
drivers/iio/light/si1145.c | 2 +-
drivers/iio/light/st_uvis25_core.c | 2 +-
drivers/iio/light/tcs3414.c | 2 +-
drivers/iio/light/tcs3472.c | 2 +-
drivers/iio/light/vcnl4000.c | 2 +-
drivers/iio/light/vcnl4035.c | 4 +-
drivers/iio/light/veml6030.c | 8 +-
drivers/iio/light/veml6046x00.c | 8 +-
drivers/iio/light/vl6180.c | 6 +-
drivers/iio/magnetometer/af8133j.c | 2 +-
drivers/iio/magnetometer/ak8974.c | 2 +-
drivers/iio/magnetometer/ak8975.c | 2 +-
drivers/iio/magnetometer/als31300.c | 4 +-
drivers/iio/magnetometer/bmc150_magn.c | 2 +-
drivers/iio/magnetometer/hid-sensor-magn-3d.c | 2 +-
drivers/iio/magnetometer/hmc5843_core.c | 4 +-
drivers/iio/magnetometer/mag3110.c | 4 +-
drivers/iio/magnetometer/rm3100-core.c | 2 +-
drivers/iio/magnetometer/tlv493d.c | 4 +-
drivers/iio/magnetometer/tmag5273.c | 8 +-
drivers/iio/magnetometer/yamaha-yas530.c | 4 +-
drivers/iio/orientation/hid-sensor-incl-3d.c | 2 +-
drivers/iio/orientation/hid-sensor-rotation.c | 2 +-
.../position/hid-sensor-custom-intel-hinge.c | 6 +-
drivers/iio/potentiostat/lmp91000.c | 2 +-
drivers/iio/pressure/abp2030pa.c | 4 +-
drivers/iio/pressure/bmp280-core.c | 18 +-
drivers/iio/pressure/cros_ec_baro.c | 4 +-
drivers/iio/pressure/dlhl60d.c | 4 +-
drivers/iio/pressure/hid-sensor-press.c | 2 +-
drivers/iio/pressure/hsc030pa.c | 4 +-
drivers/iio/pressure/mpl3115.c | 4 +-
drivers/iio/pressure/mprls0025pa.c | 2 +-
drivers/iio/pressure/ms5611_core.c | 4 +-
drivers/iio/pressure/rohm-bm1390.c | 4 +-
drivers/iio/pressure/st_pressure_core.c | 12 +-
drivers/iio/pressure/zpa2326.c | 4 +-
drivers/iio/proximity/as3935.c | 2 +-
drivers/iio/proximity/hx9023s.c | 2 +-
drivers/iio/proximity/irsd200.c | 2 +-
drivers/iio/proximity/isl29501.c | 2 +-
drivers/iio/proximity/mb1232.c | 2 +-
.../iio/proximity/pulsedlight-lidar-lite-v2.c | 2 +-
drivers/iio/proximity/srf08.c | 2 +-
drivers/iio/proximity/sx9310.c | 2 +-
drivers/iio/proximity/sx9324.c | 2 +-
drivers/iio/proximity/sx9360.c | 4 +-
drivers/iio/proximity/sx9500.c | 2 +-
drivers/iio/proximity/vl53l0x-i2c.c | 2 +-
drivers/iio/resolver/ad2s1210.c | 4 +-
.../iio/temperature/hid-sensor-temperature.c | 2 +-
drivers/iio/temperature/maxim_thermocouple.c | 6 +-
drivers/iio/temperature/tmp006.c | 4 +-
include/linux/iio/common/st_sensors.h | 2 +-
include/linux/iio/iio.h | 6 +-
include/linux/iio/imu/adis.h | 6 +-
include/uapi/linux/iio/types.h | 1 +
260 files changed, 905 insertions(+), 545 deletions(-)
create mode 100644 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c
--
2.39.5