Commit 6731ca39 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Jonathan Cameron
Browse files

iio: st_sensors: Add lsm9ds0 IMU support

We can utilize separate drivers for accelerometer and magnetometer,
so here is the glue driver to enable LSM9DS0 IMU support.

The idea was suggested by Crestez Dan Leonard in [1]. The proposed change
was sent as RFC due to race condition concerns, which are indeed possible.

In order to amend the initial change, I went further by providing a specific
multi-instantiate probe driver that reuses existing accelerometer and
magnetometer.

[1]: https://lore.kernel.org/patchwork/patch/670353/



Suggested-by: default avatarCrestez Dan Leonard <leonard.crestez@intel.com>
Cc: mr.lahorde@laposte.net
Cc: Matija Podravec <matija_podravec@fastmail.fm>
Cc: Sergey Borishchenko <borischenko.sergey@gmail.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210414195454.84183-6-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent d61881ef
Loading
Loading
Loading
Loading
+88 −1
Original line number Diff line number Diff line
@@ -980,7 +980,94 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
		.multi_read_bit = true,
		.bootime = 2,
	},

	{
		.wai = 0x49,
		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
		.sensors_supported = {
			[0] = LSM9DS0_IMU_DEV_NAME,
		},
		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
		.odr = {
			.addr = 0x20,
			.mask = GENMASK(7, 4),
			.odr_avl = {
				{ 3, 0x01, },
				{ 6, 0x02, },
				{ 12, 0x03, },
				{ 25, 0x04, },
				{ 50, 0x05, },
				{ 100, 0x06, },
				{ 200, 0x07, },
				{ 400, 0x08, },
				{ 800, 0x09, },
				{ 1600, 0x0a, },
			},
		},
		.pw = {
			.addr = 0x20,
			.mask = GENMASK(7, 4),
			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
		},
		.enable_axis = {
			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
		},
		.fs = {
			.addr = 0x21,
			.mask = GENMASK(5, 3),
			.fs_avl = {
				[0] = {
					.num = ST_ACCEL_FS_AVL_2G,
					.value = 0x00,
					.gain = IIO_G_TO_M_S_2(61),
				},
				[1] = {
					.num = ST_ACCEL_FS_AVL_4G,
					.value = 0x01,
					.gain = IIO_G_TO_M_S_2(122),
				},
				[2] = {
					.num = ST_ACCEL_FS_AVL_6G,
					.value = 0x02,
					.gain = IIO_G_TO_M_S_2(183),
				},
				[3] = {
					.num = ST_ACCEL_FS_AVL_8G,
					.value = 0x03,
					.gain = IIO_G_TO_M_S_2(244),
				},
				[4] = {
					.num = ST_ACCEL_FS_AVL_16G,
					.value = 0x04,
					.gain = IIO_G_TO_M_S_2(732),
				},
			},
		},
		.bdu = {
			.addr = 0x20,
			.mask = BIT(3),
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
				.mask = BIT(2),
			},
			.int2 = {
				.addr = 0x23,
				.mask = BIT(3),
			},
			.stat_drdy = {
				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
				.mask = GENMASK(2, 0),
			},
		},
		.sim = {
			.addr = 0x21,
			.value = BIT(0),
		},
		.multi_read_bit = true,
		.bootime = 2,
	},
};

/* Default accel DRDY is available on INT1 pin */
+1 −0
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ config KMX61
source "drivers/iio/imu/inv_icm42600/Kconfig"
source "drivers/iio/imu/inv_mpu6050/Kconfig"
source "drivers/iio/imu/st_lsm6dsx/Kconfig"
source "drivers/iio/imu/st_lsm9ds0/Kconfig"

endmenu

+1 −0
Original line number Diff line number Diff line
@@ -26,3 +26,4 @@ obj-y += inv_mpu6050/
obj-$(CONFIG_KMX61) += kmx61.o

obj-y += st_lsm6dsx/
obj-y += st_lsm9ds0/
+28 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only

config IIO_ST_LSM9DS0
	tristate "STMicroelectronics LSM9DS0 IMU driver"
	depends on (I2C || SPI_MASTER) && SYSFS
	depends on !SENSORS_LIS3_I2C
	depends on !SENSORS_LIS3_SPI
	select IIO_ST_LSM9DS0_I2C if I2C
	select IIO_ST_LSM9DS0_SPI if SPI_MASTER
	select IIO_ST_ACCEL_3AXIS
	select IIO_ST_MAGN_3AXIS

	help
	  Say yes here to build support for STMicroelectronics LSM9DS0 IMU
	  sensor. Supported devices: accelerometer/magnetometer of lsm9ds0.

	  To compile this driver as a module, choose M here: the module
	  will be called st_lsm9ds0.

config IIO_ST_LSM9DS0_I2C
	tristate
	depends on IIO_ST_LSM9DS0
	select REGMAP_I2C

config IIO_ST_LSM9DS0_SPI
	tristate
	depends on IIO_ST_LSM9DS0
	select REGMAP_SPI
+5 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_IIO_ST_LSM9DS0) += st_lsm9ds0.o
st_lsm9ds0-y := st_lsm9ds0_core.o
obj-$(CONFIG_IIO_ST_LSM9DS0_I2C) += st_lsm9ds0_i2c.o
obj-$(CONFIG_IIO_ST_LSM9DS0_SPI) += st_lsm9ds0_spi.o
Loading