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