xref: /linux/drivers/iio/imu/inv_icm42607/inv_icm42607.h (revision 67f8bc848ee31831336bd478e57d2f993551902e)
12871c45dSChris Morgan /* SPDX-License-Identifier: GPL-2.0-or-later */
22871c45dSChris Morgan /*
32871c45dSChris Morgan  * Copyright (C) 2026 InvenSense, Inc.
42871c45dSChris Morgan  */
52871c45dSChris Morgan 
62871c45dSChris Morgan #ifndef INV_ICM42607_H_
72871c45dSChris Morgan #define INV_ICM42607_H_
82871c45dSChris Morgan 
92871c45dSChris Morgan #include <linux/bits.h>
102871c45dSChris Morgan #include <linux/iio/iio.h>
112871c45dSChris Morgan #include <linux/mutex.h>
123007c153SChris Morgan #include <linux/pm.h>
132871c45dSChris Morgan #include <linux/regmap.h>
142871c45dSChris Morgan #include <linux/regulator/consumer.h>
152871c45dSChris Morgan #include <linux/time.h>
162871c45dSChris Morgan #include <linux/types.h>
172871c45dSChris Morgan 
182871c45dSChris Morgan #include <asm/byteorder.h>
192871c45dSChris Morgan 
202871c45dSChris Morgan /*
212871c45dSChris Morgan  * Serial bus slew rates. Rates are expressed as range between the two
222871c45dSChris Morgan  * values with the midpoint as the typical rate. For the final value of
232871c45dSChris Morgan  * 2ns, 2ns is considered the max value with no expressed minimum or
242871c45dSChris Morgan  * typical value.
252871c45dSChris Morgan  */
262871c45dSChris Morgan enum inv_icm42607_slew_rate {
272871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_20_60NS = 0,
282871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_12_36NS = 1,
292871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_6_19NS = 2,
302871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_4_14NS = 3,
312871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_2_6NS = 4,
322871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_2NS = 5,
332871c45dSChris Morgan 	INV_ICM42607_SLEW_RATE_NB
342871c45dSChris Morgan };
352871c45dSChris Morgan 
362871c45dSChris Morgan enum inv_icm42607_sensor_mode {
372871c45dSChris Morgan 	INV_ICM42607_SENSOR_MODE_OFF = 0,
382871c45dSChris Morgan 	INV_ICM42607_SENSOR_MODE_STANDBY = 1,
392871c45dSChris Morgan 	INV_ICM42607_SENSOR_MODE_LOW_POWER = 2,
402871c45dSChris Morgan 	INV_ICM42607_SENSOR_MODE_LOW_NOISE = 3,
412871c45dSChris Morgan 	INV_ICM42607_SENSOR_MODE_NB
422871c45dSChris Morgan };
432871c45dSChris Morgan 
442871c45dSChris Morgan /* gyroscope fullscale values */
452871c45dSChris Morgan enum inv_icm42607_gyro_fs {
462871c45dSChris Morgan 	INV_ICM42607_GYRO_FS_2000DPS = 0,
472871c45dSChris Morgan 	INV_ICM42607_GYRO_FS_1000DPS = 1,
482871c45dSChris Morgan 	INV_ICM42607_GYRO_FS_500DPS = 2,
492871c45dSChris Morgan 	INV_ICM42607_GYRO_FS_250DPS = 3,
502871c45dSChris Morgan 	INV_ICM42607_GYRO_FS_NB
512871c45dSChris Morgan };
522871c45dSChris Morgan 
532871c45dSChris Morgan /* accelerometer fullscale values */
542871c45dSChris Morgan enum inv_icm42607_accel_fs {
552871c45dSChris Morgan 	INV_ICM42607_ACCEL_FS_16G = 0,
562871c45dSChris Morgan 	INV_ICM42607_ACCEL_FS_8G = 1,
572871c45dSChris Morgan 	INV_ICM42607_ACCEL_FS_4G = 2,
582871c45dSChris Morgan 	INV_ICM42607_ACCEL_FS_2G = 3,
592871c45dSChris Morgan 	INV_ICM42607_ACCEL_FS_NB
602871c45dSChris Morgan };
612871c45dSChris Morgan 
622871c45dSChris Morgan /* ODR values  - Note Gyro does not support ODR less than 12.5Hz */
632871c45dSChris Morgan enum inv_icm42607_odr {
642871c45dSChris Morgan 	INV_ICM42607_ODR_1600HZ = 5,
652871c45dSChris Morgan 	INV_ICM42607_ODR_800HZ = 6,
662871c45dSChris Morgan 	INV_ICM42607_ODR_400HZ = 7,
672871c45dSChris Morgan 	INV_ICM42607_ODR_200HZ = 8,
682871c45dSChris Morgan 	INV_ICM42607_ODR_100HZ = 9,
692871c45dSChris Morgan 	INV_ICM42607_ODR_50HZ = 10,
702871c45dSChris Morgan 	INV_ICM42607_ODR_25HZ = 11,
712871c45dSChris Morgan 	INV_ICM42607_ODR_12_5HZ = 12,
722871c45dSChris Morgan 	INV_ICM42607_ODR_6_25HZ_LP = 13,
732871c45dSChris Morgan 	INV_ICM42607_ODR_3_125HZ_LP = 14,
742871c45dSChris Morgan 	INV_ICM42607_ODR_1_5625HZ_LP = 15,
752871c45dSChris Morgan 	INV_ICM42607_ODR_NB
762871c45dSChris Morgan };
772871c45dSChris Morgan 
782871c45dSChris Morgan /* Low-Noise mode sensor data filter (bandwidth) */
792871c45dSChris Morgan enum inv_icm42607_filter_bw {
802871c45dSChris Morgan 	INV_ICM42607_FILTER_BYPASS = 0,
812871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_180HZ = 1,
822871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_121HZ = 2,
832871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_73HZ = 3,
842871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_53HZ = 4,
852871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_34HZ = 5,
862871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_25HZ = 6,
872871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_16HZ = 7,
882871c45dSChris Morgan 	INV_ICM42607_FILTER_BW_NB
892871c45dSChris Morgan };
902871c45dSChris Morgan 
91cbf99241SChris Morgan /* Low-Power mode sensor data filter (averaging) */
92cbf99241SChris Morgan enum inv_icm42607_filter_avg {
93cbf99241SChris Morgan 	INV_ICM42607_FILTER_AVG_2X = 0,
94cbf99241SChris Morgan 	INV_ICM42607_FILTER_AVG_4X = 1,
95cbf99241SChris Morgan 	INV_ICM42607_FILTER_AVG_8X = 2,
96cbf99241SChris Morgan 	INV_ICM42607_FILTER_AVG_16X = 3,
97cbf99241SChris Morgan 	INV_ICM42607_FILTER_AVG_32X = 4,
98cbf99241SChris Morgan 	INV_ICM42607_FILTER_AVG_64X = 5,
99cbf99241SChris Morgan 	/* values 6 and 7 also correspond to 64x. */
100cbf99241SChris Morgan };
101cbf99241SChris Morgan 
1022871c45dSChris Morgan /* Temperature sensor data filter (bandwidth) */
1032871c45dSChris Morgan enum inv_icm42607_temp_filter_bw {
1042871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BYPASS = 0,
1052871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BW_180HZ = 1,
1062871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BW_72HZ = 2,
1072871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BW_34HZ = 3,
1082871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BW_16HZ = 4,
1092871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BW_8HZ = 5,
1102871c45dSChris Morgan 	INV_ICM42607_TEMP_FILTER_BW_4HZ = 6,
1112871c45dSChris Morgan 	/* value 7 also corresponds to 4Hz */
1122871c45dSChris Morgan };
1132871c45dSChris Morgan 
1142871c45dSChris Morgan /* Signed so that negative values can signify an invalid condition. */
1152871c45dSChris Morgan struct inv_icm42607_sensor_conf {
1162871c45dSChris Morgan 	int mode;
1172871c45dSChris Morgan 	int fs;
1182871c45dSChris Morgan 	int odr;
1192871c45dSChris Morgan 	int filter;
1202871c45dSChris Morgan };
121cbf99241SChris Morgan #define INV_ICM42607_SENSOR_CONF_INIT		{ -1, -1, -1, -1 }
1222871c45dSChris Morgan 
1232871c45dSChris Morgan struct inv_icm42607_conf {
1242871c45dSChris Morgan 	struct inv_icm42607_sensor_conf gyro;
1252871c45dSChris Morgan 	struct inv_icm42607_sensor_conf accel;
1262871c45dSChris Morgan 	ktime_t gyro_stop; /* earliest time to stop the gyro */
1272871c45dSChris Morgan };
1282871c45dSChris Morgan 
1292871c45dSChris Morgan struct inv_icm42607_hw {
1302871c45dSChris Morgan 	const char *name;
1312871c45dSChris Morgan 	const struct inv_icm42607_conf *conf;
1322871c45dSChris Morgan 	u8 whoami;
1332871c45dSChris Morgan };
1342871c45dSChris Morgan 
1352871c45dSChris Morgan /**
1362871c45dSChris Morgan  *  struct inv_icm42607_state - driver state variables
1372871c45dSChris Morgan  *  @hw:		Hardware specific data.
1382871c45dSChris Morgan  *  @lock:		lock for serializing multiple registers access.
1392871c45dSChris Morgan  *  @map:		regmap pointer.
140cbf99241SChris Morgan  *  @indio_accel:	accelerometer IIO device.
141*55abd7edSChris Morgan  *  @indio_gyro:	gyroscope IIO device.
1422871c45dSChris Morgan  *  @vddio_supply:	I/O voltage regulator for the chip.
1433007c153SChris Morgan  *  @vddio_en:		I/O voltage status for runtime PM.
1442871c45dSChris Morgan  *  @conf:		chip sensors configurations.
1452871c45dSChris Morgan  *  @orientation:	sensor chip orientation relative to main hardware.
1462871c45dSChris Morgan  */
1472871c45dSChris Morgan struct inv_icm42607_state {
1482871c45dSChris Morgan 	const struct inv_icm42607_hw *hw;
1492871c45dSChris Morgan 	struct mutex lock;
1502871c45dSChris Morgan 	struct regmap *map;
151cbf99241SChris Morgan 	struct iio_dev *indio_accel;
152*55abd7edSChris Morgan 	struct iio_dev *indio_gyro;
1532871c45dSChris Morgan 	struct regulator *vddio_supply;
1543007c153SChris Morgan 	bool vddio_en;
1552871c45dSChris Morgan 	struct inv_icm42607_conf conf;
1562871c45dSChris Morgan 	struct iio_mount_matrix orientation;
1572871c45dSChris Morgan };
1582871c45dSChris Morgan 
159cbf99241SChris Morgan /**
160cbf99241SChris Morgan  * struct inv_icm42607_sensor_state - sensor state variables
161cbf99241SChris Morgan  * @power_mode:		sensor requested power mode (for common frequencies)
162cbf99241SChris Morgan  * @filter:		sensor filter.
163cbf99241SChris Morgan  */
164cbf99241SChris Morgan struct inv_icm42607_sensor_state {
165cbf99241SChris Morgan 	enum inv_icm42607_sensor_mode power_mode;
166cbf99241SChris Morgan 	int filter;
167cbf99241SChris Morgan };
168cbf99241SChris Morgan 
1692871c45dSChris Morgan /* Virtual register addresses: @bank on MSB (4 upper bits), @address on LSB */
1702871c45dSChris Morgan 
1712871c45dSChris Morgan /* Register Map for User Bank 0 */
1722871c45dSChris Morgan #define INV_ICM42607_REG_MCLK_RDY			0x00
1732871c45dSChris Morgan 
1742871c45dSChris Morgan #define INV_ICM42607_REG_DEVICE_CONFIG			0x01
1752871c45dSChris Morgan #define INV_ICM42607_DEVICE_CONFIG_SPI_AP_4WIRE		BIT(2)
1762871c45dSChris Morgan #define INV_ICM42607_DEVICE_CONFIG_SPI_MODE		BIT(0)
1772871c45dSChris Morgan 
1782871c45dSChris Morgan #define INV_ICM42607_REG_SIGNAL_PATH_RESET		0x02
1792871c45dSChris Morgan #define INV_ICM42607_SIGNAL_PATH_RESET_SOFT_RESET	BIT(4)
1802871c45dSChris Morgan #define INV_ICM42607_SIGNAL_PATH_RESET_FIFO_FLUSH	BIT(2)
1812871c45dSChris Morgan 
1822871c45dSChris Morgan #define INV_ICM42607_REG_DRIVE_CONFIG1			0x03
1832871c45dSChris Morgan #define INV_ICM42607_DRIVE_CONFIG1_I3C_DDR_MASK		GENMASK(5, 3)
1842871c45dSChris Morgan #define INV_ICM42607_DRIVE_CONFIG1_I3C_SDR_MASK		GENMASK(2, 0)
1852871c45dSChris Morgan 
1862871c45dSChris Morgan #define INV_ICM42607_REG_DRIVE_CONFIG2			0x04
1872871c45dSChris Morgan #define INV_ICM42607_DRIVE_CONFIG2_I2C_MASK		GENMASK(5, 3)
1882871c45dSChris Morgan #define INV_ICM42607_DRIVE_CONFIG2_ALL_MASK		GENMASK(2, 0)
1892871c45dSChris Morgan 
1902871c45dSChris Morgan #define INV_ICM42607_REG_DRIVE_CONFIG3			0x05
1912871c45dSChris Morgan #define INV_ICM42607_DRIVE_CONFIG3_SPI_MASK		GENMASK(2, 0)
1922871c45dSChris Morgan 
1932871c45dSChris Morgan #define INV_ICM42607_REG_INT_CONFIG			0x06
1942871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT2_LATCHED		BIT(5)
1952871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT2_PUSH_PULL		BIT(4)
1962871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT2_ACTIVE_HIGH	BIT(3)
1972871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT2_ACTIVE_LOW		0x00
1982871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT1_LATCHED		BIT(2)
1992871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT1_PUSH_PULL		BIT(1)
2002871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT1_ACTIVE_HIGH	BIT(0)
2012871c45dSChris Morgan #define INV_ICM42607_INT_CONFIG_INT1_ACTIVE_LOW		0x00
2022871c45dSChris Morgan 
2032871c45dSChris Morgan /* all sensor data are 16 bits (2 registers wide) in big-endian */
2042871c45dSChris Morgan #define INV_ICM42607_REG_TEMP_DATA1			0x09
2052871c45dSChris Morgan #define INV_ICM42607_REG_TEMP_DATA0			0x0A
2062871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_DATA_X1			0x0B
2072871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_DATA_X0			0x0C
2082871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_DATA_Y1			0x0D
2092871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_DATA_Y0			0x0E
2102871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_DATA_Z1			0x0F
2112871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_DATA_Z0			0x10
2122871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_DATA_X1			0x11
2132871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_DATA_X0			0x12
2142871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_DATA_Y1			0x13
2152871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_DATA_Y0			0x14
2162871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_DATA_Z1			0x15
2172871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_DATA_Z0			0x16
2182871c45dSChris Morgan #define INV_ICM42607_DATA_INVALID			-32768
2192871c45dSChris Morgan 
2202871c45dSChris Morgan #define INV_ICM42607_REG_TMST_FSYNCH			0x17
2212871c45dSChris Morgan #define INV_ICM42607_REG_TMST_FSYNCL			0x18
2222871c45dSChris Morgan 
2232871c45dSChris Morgan /* APEX Data Registers */
2242871c45dSChris Morgan #define INV_ICM42607_REG_APEX_DATA0			0x31
2252871c45dSChris Morgan #define INV_ICM42607_REG_APEX_DATA1			0x32
2262871c45dSChris Morgan #define INV_ICM42607_REG_APEX_DATA2			0x33
2272871c45dSChris Morgan #define INV_ICM42607_REG_APEX_DATA3			0x34
2282871c45dSChris Morgan #define INV_ICM42607_REG_APEX_DATA4			0x1D
2292871c45dSChris Morgan #define INV_ICM42607_REG_APEX_DATA5			0x1E
2302871c45dSChris Morgan 
2312871c45dSChris Morgan #define INV_ICM42607_REG_PWR_MGMT0			0x1F
2322871c45dSChris Morgan #define INV_ICM42607_PWR_MGMT0_ACCEL_LP_CLK_SEL		BIT(7)
2332871c45dSChris Morgan #define INV_ICM42607_PWR_MGMT0_IDLE			BIT(4)
2342871c45dSChris Morgan #define INV_ICM42607_PWR_MGMT0_GYRO_MODE_MASK		GENMASK(3, 2)
2352871c45dSChris Morgan #define INV_ICM42607_PWR_MGMT0_ACCEL_MODE_MASK		GENMASK(1, 0)
2362871c45dSChris Morgan 
2372871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_CONFIG0			0x20
2382871c45dSChris Morgan #define INV_ICM42607_GYRO_CONFIG0_FS_SEL_MASK		GENMASK(6, 5)
2392871c45dSChris Morgan #define INV_ICM42607_GYRO_CONFIG0_ODR_MASK		GENMASK(3, 0)
2402871c45dSChris Morgan 
2412871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_CONFIG0			0x21
2422871c45dSChris Morgan #define INV_ICM42607_ACCEL_CONFIG0_FS_SEL_MASK		GENMASK(6, 5)
2432871c45dSChris Morgan #define INV_ICM42607_ACCEL_CONFIG0_ODR_MASK		GENMASK(3, 0)
2442871c45dSChris Morgan 
2452871c45dSChris Morgan #define INV_ICM42607_REG_TEMP_CONFIG0			0x22
2462871c45dSChris Morgan #define INV_ICM42607_TEMP_CONFIG0_FILTER_MASK		GENMASK(6, 4)
2472871c45dSChris Morgan 
2482871c45dSChris Morgan #define INV_ICM42607_REG_GYRO_CONFIG1			0x23
2492871c45dSChris Morgan #define INV_ICM42607_GYRO_CONFIG1_FILTER_MASK		GENMASK(2, 0)
2502871c45dSChris Morgan 
2512871c45dSChris Morgan #define INV_ICM42607_REG_ACCEL_CONFIG1			0x24
2522871c45dSChris Morgan #define INV_ICM42607_ACCEL_CONFIG1_AVG_MASK		GENMASK(6, 4)
2532871c45dSChris Morgan #define INV_ICM42607_ACCEL_CONFIG1_FILTER_MASK		GENMASK(2, 0)
2542871c45dSChris Morgan 
2552871c45dSChris Morgan #define INV_ICM42607_REG_APEX_CONFIG0			0x25
2562871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG0_DMP_POWER_SAVE_EN	BIT(3)
2572871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG0_DMP_INIT_EN		BIT(2)
2582871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG0_DMP_MEM_RESET_EN	BIT(0)
2592871c45dSChris Morgan 
2602871c45dSChris Morgan #define INV_ICM42607_REG_APEX_CONFIG1			0x26
2612871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG1_SMD_ENABLE		BIT(6)
2622871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG1_FF_ENABLE		BIT(5)
2632871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG1_TILT_ENABLE		BIT(4)
2642871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG1_PED_ENABLE		BIT(3)
2652871c45dSChris Morgan #define INV_ICM42607_APEX_CONFIG1_DMP_ODR_MASK		GENMASK(1, 0)
2662871c45dSChris Morgan 
2672871c45dSChris Morgan #define INV_ICM42607_REG_WOM_CONFIG			0x27
2682871c45dSChris Morgan #define INV_ICM42607_WOM_CONFIG_INT_DUR_MASK		GENMASK(4, 3)
2692871c45dSChris Morgan #define INV_ICM42607_WOM_CONFIG_INT_MODE		BIT(2)
2702871c45dSChris Morgan #define INV_ICM42607_WOM_CONFIG_MODE			BIT(1)
2712871c45dSChris Morgan #define INV_ICM42607_WOM_CONFIG_EN			BIT(0)
2722871c45dSChris Morgan 
2732871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_CONFIG1			0x28
2742871c45dSChris Morgan #define INV_ICM42607_FIFO_CONFIG1_MODE			BIT(1)
2752871c45dSChris Morgan #define INV_ICM42607_FIFO_CONFIG1_BYPASS		BIT(0)
2762871c45dSChris Morgan 
2772871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_CONFIG2			0x29
2782871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_CONFIG3			0x2A
2792871c45dSChris Morgan #define INV_ICM42607_FIFO_WATERMARK_VAL(_wm)		\
2802871c45dSChris Morgan 		cpu_to_le16((_wm) & GENMASK(11, 0))
2812871c45dSChris Morgan /* FIFO is 2048 bytes, let 12 samples for reading latency */
2822871c45dSChris Morgan #define INV_ICM42607_FIFO_WATERMARK_MAX			(2048 - 12 * 16)
2832871c45dSChris Morgan #define INV_ICM42607_FIFO_1SENSOR_PACKET_SIZE		8
2842871c45dSChris Morgan #define INV_ICM42607_FIFO_2SENSORS_PACKET_SIZE		16
2852871c45dSChris Morgan 
2862871c45dSChris Morgan #define INV_ICM42607_REG_INT_SOURCE0			0x2B
2872871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_ST_INT1_EN		BIT(7)
2882871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_FSYNC_INT1_EN		BIT(6)
2892871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_PLL_RDY_INT1_EN	BIT(5)
2902871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_RESET_DONE_INT1_EN	BIT(4)
2912871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_DRDY_INT1_EN		BIT(3)
2922871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_FIFO_THS_INT1_EN	BIT(2)
2932871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_FIFO_FULL_INT1_EN	BIT(1)
2942871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE0_AGC_RDY_INT1_EN	BIT(0)
2952871c45dSChris Morgan 
2962871c45dSChris Morgan #define INV_ICM42607_REG_INT_SOURCE1			0x2C
2972871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE1_I3C_ERROR_INT1_EN	BIT(6)
2982871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE1_SMD_INT1_EN		BIT(3)
2992871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE1_WOM_INT1_EN		GENMASK(2, 0)
3002871c45dSChris Morgan 
3012871c45dSChris Morgan #define INV_ICM42607_REG_INT_SOURCE3			0x2D
3022871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_ST_INT2_EN		BIT(7)
3032871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_FSYNC_INT2_EN		BIT(6)
3042871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_PLL_RDY_INT2_EN	BIT(5)
3052871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_RESET_DONE_INT2_EN	BIT(4)
3062871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_DRDY_INT2_EN		BIT(3)
3072871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_FIFO_THS_INT2_EN	BIT(2)
3082871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_FIFO_FULL_INT2_EN	BIT(1)
3092871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE3_AGC_RDY_INT2_EN	BIT(0)
3102871c45dSChris Morgan 
3112871c45dSChris Morgan #define INV_ICM42607_REG_INT_SOURCE4			0x2E
3122871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE4_I3C_ERROR_INT2_EN	BIT(6)
3132871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE4_SMD_INT2_EN		BIT(3)
3142871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE4_WOM_Z_INT2_EN		BIT(2)
3152871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE4_WOM_Y_INT2_EN		BIT(1)
3162871c45dSChris Morgan #define INV_ICM42607_INT_SOURCE4_WOM_X_INT2_EN		BIT(0)
3172871c45dSChris Morgan 
3182871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_LOST_PKT0			0x2F
3192871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_LOST_PKT1			0x30
3202871c45dSChris Morgan 
3212871c45dSChris Morgan #define INV_ICM42607_REG_INTF_CONFIG0			0x35
3222871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG0_FIFO_COUNT_FORMAT	BIT(6)
3232871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG0_FIFO_COUNT_ENDIAN	BIT(5)
3242871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG0_SENSOR_DATA_ENDIAN	BIT(4)
3252871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG0_UI_SIFS_CFG_MASK	GENMASK(1, 0)
3262871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG0_UI_SIFS_CFG_SPI_DIS	2
3272871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG0_UI_SIFS_CFG_I2C_DIS	3
3282871c45dSChris Morgan 
3292871c45dSChris Morgan #define INV_ICM42607_REG_INTF_CONFIG1			0x36
3302871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG1_I3C_SDR_EN		BIT(3)
3312871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG1_I3C_DDR_EN		BIT(2)
3322871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG1_CLKSEL_MASK		GENMASK(1, 0)
3332871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG1_CLKSEL_INT		0
3342871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG1_CLKSEL_PLL		1
3352871c45dSChris Morgan #define INV_ICM42607_INTF_CONFIG1_CLKSEL_OFF		2
3362871c45dSChris Morgan 
3372871c45dSChris Morgan #define INV_ICM42607_REG_INT_STATUS_DRDY		0x39
3382871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_DRDY_DATA_RDY		BIT(0)
3392871c45dSChris Morgan 
3402871c45dSChris Morgan #define INV_ICM42607_REG_INT_STATUS			0x3A
3412871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_ST			BIT(7)
3422871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_FSYNC			BIT(6)
3432871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_PLL_RDY			BIT(5)
3442871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_RESET_DONE		BIT(4)
3452871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_FIFO_THS		BIT(2)
3462871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_FIFO_FULL		BIT(1)
3472871c45dSChris Morgan #define INV_ICM42607_INT_STATUS_AGC_RDY			BIT(0)
3482871c45dSChris Morgan 
3492871c45dSChris Morgan #define INV_ICM42607_REG_INT_STATUS2			0x3B
3502871c45dSChris Morgan #define INV_ICM42607_INT_STATUS2_SMD			BIT(3)
3512871c45dSChris Morgan #define INV_ICM42607_INT_STATUS2_WOM_INT		GENMASK(2, 0)
3522871c45dSChris Morgan 
3532871c45dSChris Morgan #define INV_ICM42607_REG_INT_STATUS3			0x3C
3542871c45dSChris Morgan #define INV_ICM42607_INT_STATUS3_STEP_DET		BIT(5)
3552871c45dSChris Morgan #define INV_ICM42607_INT_STATUS3_STEP_CNT_OVF		BIT(4)
3562871c45dSChris Morgan #define INV_ICM42607_INT_STATUS3_TILT_DET		BIT(3)
3572871c45dSChris Morgan #define INV_ICM42607_INT_STATUS3_FF_DET			BIT(2)
3582871c45dSChris Morgan 
3592871c45dSChris Morgan /*
3602871c45dSChris Morgan  * FIFO access registers
3612871c45dSChris Morgan  * FIFO count is 16 bits (2 registers) big-endian
3622871c45dSChris Morgan  * FIFO data is a continuous read register to read FIFO content
3632871c45dSChris Morgan  */
3642871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_COUNTH			0x3D
3652871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_COUNTL			0x3E
3662871c45dSChris Morgan #define INV_ICM42607_REG_FIFO_DATA			0x3F
3672871c45dSChris Morgan 
3682871c45dSChris Morgan #define INV_ICM42607_REG_WHOAMI				0x75
3692871c45dSChris Morgan #define INV_ICM42607P_WHOAMI				0x60
3702871c45dSChris Morgan #define INV_ICM42607_WHOAMI				0x67
3712871c45dSChris Morgan 
3722871c45dSChris Morgan /*
3732871c45dSChris Morgan  * Timings as listed in section 3 of datasheet, all values listed in datasheet
3742871c45dSChris Morgan  * in ms except temp startup time... setting all values in us and using
3752871c45dSChris Morgan  * USEC_PER_MSEC to convert from values displayed in datasheet.
3762871c45dSChris Morgan  */
3772871c45dSChris Morgan #define INV_ICM42607_POWER_UP_TIME_US			(100 * USEC_PER_MSEC)
3782871c45dSChris Morgan #define INV_ICM42607_RESET_TIME_US			(1 * USEC_PER_MSEC)
3792871c45dSChris Morgan #define INV_ICM42607_ACCEL_STARTUP_TIME_US		(10 * USEC_PER_MSEC)
3802871c45dSChris Morgan #define INV_ICM42607_GYRO_STARTUP_TIME_US		(30 * USEC_PER_MSEC)
3812871c45dSChris Morgan #define INV_ICM42607_GYRO_STOP_TIME_US			(45 * USEC_PER_MSEC)
3822871c45dSChris Morgan #define INV_ICM42607_TEMP_STARTUP_TIME_US		77
3832871c45dSChris Morgan 
3843007c153SChris Morgan /*
3853007c153SChris Morgan  * Suspend delay assumed from other icm42600 series device, not
3863007c153SChris Morgan  * documented in datasheet.
3873007c153SChris Morgan  */
3883007c153SChris Morgan #define INV_ICM42607_SUSPEND_DELAY_MS			(2 * MSEC_PER_SEC)
3893007c153SChris Morgan 
3902871c45dSChris Morgan typedef int (*inv_icm42607_bus_setup)(struct inv_icm42607_state *);
3912871c45dSChris Morgan 
3922871c45dSChris Morgan extern const struct regmap_config inv_icm42607_regmap_config;
3932871c45dSChris Morgan extern const struct inv_icm42607_hw inv_icm42607_hw_data;
3942871c45dSChris Morgan extern const struct inv_icm42607_hw inv_icm42607p_hw_data;
3953007c153SChris Morgan extern const struct dev_pm_ops inv_icm42607_pm_ops;
3963007c153SChris Morgan 
397cbf99241SChris Morgan const struct iio_mount_matrix *
398cbf99241SChris Morgan inv_icm42607_get_mount_matrix(struct iio_dev *indio_dev,
399cbf99241SChris Morgan 			      const struct iio_chan_spec *chan);
400cbf99241SChris Morgan 
4013007c153SChris Morgan int inv_icm42607_get_pwr_mgmt0(struct inv_icm42607_state *st,
4023007c153SChris Morgan 			       enum inv_icm42607_sensor_mode *gyro,
4033007c153SChris Morgan 			       enum inv_icm42607_sensor_mode *accel);
4042871c45dSChris Morgan 
405cbf99241SChris Morgan int inv_icm42607_set_sensor_conf(struct inv_icm42607_state *st,
406cbf99241SChris Morgan 				 struct inv_icm42607_sensor_conf *conf,
407cbf99241SChris Morgan 				 enum iio_chan_type chan_type);
408cbf99241SChris Morgan 
409cbf99241SChris Morgan int inv_icm42607_read_sensor(struct iio_dev *indio_dev,
410cbf99241SChris Morgan 			     struct iio_chan_spec const *chan,
411cbf99241SChris Morgan 			     s16 *val);
412cbf99241SChris Morgan 
4132871c45dSChris Morgan int inv_icm42607_core_probe(struct regmap *regmap,
4142871c45dSChris Morgan 			    const struct inv_icm42607_hw *hw,
4152871c45dSChris Morgan 			    inv_icm42607_bus_setup bus_setup);
4162871c45dSChris Morgan 
417*55abd7edSChris Morgan struct iio_dev *inv_icm42607_gyro_init(struct inv_icm42607_state *st);
418*55abd7edSChris Morgan 
419cbf99241SChris Morgan struct iio_dev *inv_icm42607_accel_init(struct inv_icm42607_state *st);
420cbf99241SChris Morgan 
4212871c45dSChris Morgan #endif
422