FILE
inv_icm45600.h
File preview with syntax highlighting.
linux-6.19.14/drivers/iio/imu/inv_icm45600/inv_icm45600.h
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* Copyright (C) 2025 Invensense, Inc. */ 3 4#ifndef INV_ICM45600_H_ 5#define INV_ICM45600_H_ 6 7#include <linux/bits.h> 8#include <linux/limits.h> 9#include <linux/mutex.h> 10#include <linux/regmap.h> 11#include <linux/regulator/consumer.h> 12#include <linux/sizes.h> 13#include <linux/types.h> 14 15#include <linux/iio/common/inv_sensors_timestamp.h> 16#include <linux/iio/iio.h> 17 18#include "inv_icm45600_buffer.h" 19 20#define INV_ICM45600_REG_BANK_MASK GENMASK(15, 8) 21#define INV_ICM45600_REG_ADDR_MASK GENMASK(7, 0) 22 23enum inv_icm45600_sensor_mode { 24 INV_ICM45600_SENSOR_MODE_OFF, 25 INV_ICM45600_SENSOR_MODE_STANDBY, 26 INV_ICM45600_SENSOR_MODE_LOW_POWER, 27 INV_ICM45600_SENSOR_MODE_LOW_NOISE, 28 INV_ICM45600_SENSOR_MODE_MAX 29}; 30 31/* gyroscope fullscale values */ 32enum inv_icm45600_gyro_fs { 33 INV_ICM45600_GYRO_FS_2000DPS, 34 INV_ICM45600_GYRO_FS_1000DPS, 35 INV_ICM45600_GYRO_FS_500DPS, 36 INV_ICM45600_GYRO_FS_250DPS, 37 INV_ICM45600_GYRO_FS_125DPS, 38 INV_ICM45600_GYRO_FS_62_5DPS, 39 INV_ICM45600_GYRO_FS_31_25DPS, 40 INV_ICM45600_GYRO_FS_15_625DPS, 41 INV_ICM45600_GYRO_FS_MAX 42}; 43 44enum inv_icm45686_gyro_fs { 45 INV_ICM45686_GYRO_FS_4000DPS, 46 INV_ICM45686_GYRO_FS_2000DPS, 47 INV_ICM45686_GYRO_FS_1000DPS, 48 INV_ICM45686_GYRO_FS_500DPS, 49 INV_ICM45686_GYRO_FS_250DPS, 50 INV_ICM45686_GYRO_FS_125DPS, 51 INV_ICM45686_GYRO_FS_62_5DPS, 52 INV_ICM45686_GYRO_FS_31_25DPS, 53 INV_ICM45686_GYRO_FS_15_625DPS, 54 INV_ICM45686_GYRO_FS_MAX 55}; 56 57/* accelerometer fullscale values */ 58enum inv_icm45600_accel_fs { 59 INV_ICM45600_ACCEL_FS_16G, 60 INV_ICM45600_ACCEL_FS_8G, 61 INV_ICM45600_ACCEL_FS_4G, 62 INV_ICM45600_ACCEL_FS_2G, 63 INV_ICM45600_ACCEL_FS_MAX 64}; 65 66enum inv_icm45686_accel_fs { 67 INV_ICM45686_ACCEL_FS_32G, 68 INV_ICM45686_ACCEL_FS_16G, 69 INV_ICM45686_ACCEL_FS_8G, 70 INV_ICM45686_ACCEL_FS_4G, 71 INV_ICM45686_ACCEL_FS_2G, 72 INV_ICM45686_ACCEL_FS_MAX 73}; 74 75/* ODR suffixed by LN or LP are Low-Noise or Low-Power mode only */ 76enum inv_icm45600_odr { 77 INV_ICM45600_ODR_6400HZ_LN = 0x03, 78 INV_ICM45600_ODR_3200HZ_LN, 79 INV_ICM45600_ODR_1600HZ_LN, 80 INV_ICM45600_ODR_800HZ_LN, 81 INV_ICM45600_ODR_400HZ, 82 INV_ICM45600_ODR_200HZ, 83 INV_ICM45600_ODR_100HZ, 84 INV_ICM45600_ODR_50HZ, 85 INV_ICM45600_ODR_25HZ, 86 INV_ICM45600_ODR_12_5HZ, 87 INV_ICM45600_ODR_6_25HZ_LP, 88 INV_ICM45600_ODR_3_125HZ_LP, 89 INV_ICM45600_ODR_1_5625HZ_LP, 90 INV_ICM45600_ODR_MAX 91}; 92 93struct inv_icm45600_sensor_conf { 94 u8 mode; 95 u8 fs; 96 u8 odr; 97 u8 filter; 98}; 99 100#define INV_ICM45600_SENSOR_CONF_KEEP_VALUES { U8_MAX, U8_MAX, U8_MAX, U8_MAX } 101 102struct inv_icm45600_conf { 103 struct inv_icm45600_sensor_conf gyro; 104 struct inv_icm45600_sensor_conf accel; 105}; 106 107struct inv_icm45600_suspended { 108 enum inv_icm45600_sensor_mode gyro; 109 enum inv_icm45600_sensor_mode accel; 110}; 111 112struct inv_icm45600_chip_info { 113 u8 whoami; 114 const char *name; 115 const struct inv_icm45600_conf *conf; 116 const int *accel_scales; 117 const int accel_scales_len; 118 const int *gyro_scales; 119 const int gyro_scales_len; 120}; 121 122extern const struct inv_icm45600_chip_info inv_icm45605_chip_info; 123extern const struct inv_icm45600_chip_info inv_icm45606_chip_info; 124extern const struct inv_icm45600_chip_info inv_icm45608_chip_info; 125extern const struct inv_icm45600_chip_info inv_icm45634_chip_info; 126extern const struct inv_icm45600_chip_info inv_icm45686_chip_info; 127extern const struct inv_icm45600_chip_info inv_icm45687_chip_info; 128extern const struct inv_icm45600_chip_info inv_icm45688p_chip_info; 129extern const struct inv_icm45600_chip_info inv_icm45689_chip_info; 130 131extern const int inv_icm45600_accel_scale[][2]; 132extern const int inv_icm45686_accel_scale[][2]; 133extern const int inv_icm45600_gyro_scale[][2]; 134extern const int inv_icm45686_gyro_scale[][2]; 135 136/** 137 * struct inv_icm45600_state - driver state variables 138 * @lock: lock for serializing multiple registers access. 139 * @map: regmap pointer. 140 * @vddio_supply: I/O voltage regulator for the chip. 141 * @orientation: sensor chip orientation relative to main hardware. 142 * @conf: chip sensors configurations. 143 * @suspended: suspended sensors configuration. 144 * @indio_gyro: gyroscope IIO device. 145 * @indio_accel: accelerometer IIO device. 146 * @chip_info: chip driver data. 147 * @timestamp: interrupt timestamps. 148 * @fifo: FIFO management structure. 149 * @buffer: data transfer buffer aligned for DMA. 150 */ 151struct inv_icm45600_state { 152 struct mutex lock; 153 struct regmap *map; 154 struct regulator *vddio_supply; 155 struct iio_mount_matrix orientation; 156 struct inv_icm45600_conf conf; 157 struct inv_icm45600_suspended suspended; 158 struct iio_dev *indio_gyro; 159 struct iio_dev *indio_accel; 160 const struct inv_icm45600_chip_info *chip_info; 161 struct { 162 s64 gyro; 163 s64 accel; 164 } timestamp; 165 struct inv_icm45600_fifo fifo; 166 union { 167 u8 buff[2]; 168 __le16 u16; 169 u8 ireg[3]; 170 } buffer __aligned(IIO_DMA_MINALIGN); 171}; 172 173/** 174 * struct inv_icm45600_sensor_state - sensor state variables 175 * @scales: table of scales. 176 * @scales_len: length (nb of items) of the scales table. 177 * @power_mode: sensor requested power mode (for common frequencies) 178 * @ts: timestamp module states. 179 */ 180struct inv_icm45600_sensor_state { 181 const int *scales; 182 size_t scales_len; 183 enum inv_icm45600_sensor_mode power_mode; 184 struct inv_sensors_timestamp ts; 185}; 186 187/* Virtual register addresses: @bank on MSB (16 bits), @address on LSB */ 188 189/* Indirect register access */ 190#define INV_ICM45600_REG_IREG_ADDR 0x7C 191#define INV_ICM45600_REG_IREG_DATA 0x7E 192 193/* Direct acces registers */ 194#define INV_ICM45600_REG_MISC2 0x007F 195#define INV_ICM45600_MISC2_SOFT_RESET BIT(1) 196 197#define INV_ICM45600_REG_DRIVE_CONFIG0 0x0032 198#define INV_ICM45600_DRIVE_CONFIG0_SPI_MASK GENMASK(3, 1) 199#define INV_ICM45600_SPI_SLEW_RATE_0_5NS 6 200#define INV_ICM45600_SPI_SLEW_RATE_4NS 5 201#define INV_ICM45600_SPI_SLEW_RATE_5NS 4 202#define INV_ICM45600_SPI_SLEW_RATE_7NS 3 203#define INV_ICM45600_SPI_SLEW_RATE_10NS 2 204#define INV_ICM45600_SPI_SLEW_RATE_14NS 1 205#define INV_ICM45600_SPI_SLEW_RATE_38NS 0 206 207#define INV_ICM45600_REG_INT1_CONFIG2 0x0018 208#define INV_ICM45600_INT1_CONFIG2_OPEN_DRAIN BIT(2) 209#define INV_ICM45600_INT1_CONFIG2_LATCHED BIT(1) 210#define INV_ICM45600_INT1_CONFIG2_ACTIVE_HIGH BIT(0) 211#define INV_ICM45600_INT1_CONFIG2_ACTIVE_LOW 0x00 212 213#define INV_ICM45600_REG_FIFO_CONFIG0 0x001D 214#define INV_ICM45600_FIFO_CONFIG0_MODE_MASK GENMASK(7, 6) 215#define INV_ICM45600_FIFO_CONFIG0_MODE_BYPASS 0 216#define INV_ICM45600_FIFO_CONFIG0_MODE_STREAM 1 217#define INV_ICM45600_FIFO_CONFIG0_MODE_STOP_ON_FULL 2 218#define INV_ICM45600_FIFO_CONFIG0_FIFO_DEPTH_MASK GENMASK(5, 0) 219#define INV_ICM45600_FIFO_CONFIG0_FIFO_DEPTH_MAX 0x1F 220 221#define INV_ICM45600_REG_FIFO_CONFIG2 0x0020 222#define INV_ICM45600_REG_FIFO_CONFIG2_FIFO_FLUSH BIT(7) 223#define INV_ICM45600_REG_FIFO_CONFIG2_WM_GT_TH BIT(3) 224 225#define INV_ICM45600_REG_FIFO_CONFIG3 0x0021 226#define INV_ICM45600_FIFO_CONFIG3_ES1_EN BIT(5) 227#define INV_ICM45600_FIFO_CONFIG3_ES0_EN BIT(4) 228#define INV_ICM45600_FIFO_CONFIG3_HIRES_EN BIT(3) 229#define INV_ICM45600_FIFO_CONFIG3_GYRO_EN BIT(2) 230#define INV_ICM45600_FIFO_CONFIG3_ACCEL_EN BIT(1) 231#define INV_ICM45600_FIFO_CONFIG3_IF_EN BIT(0) 232 233#define INV_ICM45600_REG_FIFO_CONFIG4 0x0022 234#define INV_ICM45600_FIFO_CONFIG4_COMP_EN BIT(2) 235#define INV_ICM45600_FIFO_CONFIG4_TMST_FSYNC_EN BIT(1) 236#define INV_ICM45600_FIFO_CONFIG4_ES0_9B BIT(0) 237 238/* all sensor data are 16 bits (2 registers wide) in big-endian */ 239#define INV_ICM45600_REG_TEMP_DATA 0x000C 240#define INV_ICM45600_REG_ACCEL_DATA_X 0x0000 241#define INV_ICM45600_REG_ACCEL_DATA_Y 0x0002 242#define INV_ICM45600_REG_ACCEL_DATA_Z 0x0004 243#define INV_ICM45600_REG_GYRO_DATA_X 0x0006 244#define INV_ICM45600_REG_GYRO_DATA_Y 0x0008 245#define INV_ICM45600_REG_GYRO_DATA_Z 0x000A 246 247#define INV_ICM45600_REG_INT_STATUS 0x0019 248#define INV_ICM45600_INT_STATUS_RESET_DONE BIT(7) 249#define INV_ICM45600_INT_STATUS_AUX1_AGC_RDY BIT(6) 250#define INV_ICM45600_INT_STATUS_AP_AGC_RDY BIT(5) 251#define INV_ICM45600_INT_STATUS_AP_FSYNC BIT(4) 252#define INV_ICM45600_INT_STATUS_AUX1_DRDY BIT(3) 253#define INV_ICM45600_INT_STATUS_DATA_RDY BIT(2) 254#define INV_ICM45600_INT_STATUS_FIFO_THS BIT(1) 255#define INV_ICM45600_INT_STATUS_FIFO_FULL BIT(0) 256 257/* 258 * FIFO access registers 259 * FIFO count is 16 bits (2 registers) 260 * FIFO data is a continuous read register to read FIFO content 261 */ 262#define INV_ICM45600_REG_FIFO_COUNT 0x0012 263#define INV_ICM45600_REG_FIFO_DATA 0x0014 264 265#define INV_ICM45600_REG_PWR_MGMT0 0x0010 266#define INV_ICM45600_PWR_MGMT0_GYRO_MODE_MASK GENMASK(3, 2) 267#define INV_ICM45600_PWR_MGMT0_ACCEL_MODE_MASK GENMASK(1, 0) 268 269#define INV_ICM45600_REG_ACCEL_CONFIG0 0x001B 270#define INV_ICM45600_ACCEL_CONFIG0_FS_MASK GENMASK(6, 4) 271#define INV_ICM45600_ACCEL_CONFIG0_ODR_MASK GENMASK(3, 0) 272#define INV_ICM45600_REG_GYRO_CONFIG0 0x001C 273#define INV_ICM45600_GYRO_CONFIG0_FS_MASK GENMASK(7, 4) 274#define INV_ICM45600_GYRO_CONFIG0_ODR_MASK GENMASK(3, 0) 275 276#define INV_ICM45600_REG_SMC_CONTROL_0 0xA258 277#define INV_ICM45600_SMC_CONTROL_0_ACCEL_LP_CLK_SEL BIT(4) 278#define INV_ICM45600_SMC_CONTROL_0_TMST_EN BIT(0) 279 280/* FIFO watermark is 16 bits (2 registers wide) in little-endian */ 281#define INV_ICM45600_REG_FIFO_WATERMARK 0x001E 282 283/* FIFO is configured for 8kb */ 284#define INV_ICM45600_FIFO_SIZE_MAX SZ_8K 285 286#define INV_ICM45600_REG_INT1_CONFIG0 0x0016 287#define INV_ICM45600_INT1_CONFIG0_RESET_DONE_EN BIT(7) 288#define INV_ICM45600_INT1_CONFIG0_AUX1_AGC_RDY_EN BIT(6) 289#define INV_ICM45600_INT1_CONFIG0_AP_AGC_RDY_EN BIT(5) 290#define INV_ICM45600_INT1_CONFIG0_AP_FSYNC_EN BIT(4) 291#define INV_ICM45600_INT1_CONFIG0_AUX1_DRDY_EN BIT(3) 292#define INV_ICM45600_INT1_CONFIG0_DRDY_EN BIT(2) 293#define INV_ICM45600_INT1_CONFIG0_FIFO_THS_EN BIT(1) 294#define INV_ICM45600_INT1_CONFIG0_FIFO_FULL_EN BIT(0) 295 296#define INV_ICM45600_REG_WHOAMI 0x0072 297#define INV_ICM45600_WHOAMI_ICM45605 0xE5 298#define INV_ICM45600_WHOAMI_ICM45686 0xE9 299#define INV_ICM45600_WHOAMI_ICM45688P 0xE7 300#define INV_ICM45600_WHOAMI_ICM45608 0x81 301#define INV_ICM45600_WHOAMI_ICM45634 0x82 302#define INV_ICM45600_WHOAMI_ICM45689 0x83 303#define INV_ICM45600_WHOAMI_ICM45606 0x84 304#define INV_ICM45600_WHOAMI_ICM45687 0x85 305 306/* Gyro USER offset */ 307#define INV_ICM45600_IPREG_SYS1_REG_42 0xA42A 308#define INV_ICM45600_IPREG_SYS1_REG_56 0xA438 309#define INV_ICM45600_IPREG_SYS1_REG_70 0xA446 310#define INV_ICM45600_GYRO_OFFUSER_MASK GENMASK(13, 0) 311/* Gyro Averaging filter */ 312#define INV_ICM45600_IPREG_SYS1_REG_170 0xA4AA 313#define INV_ICM45600_IPREG_SYS1_170_GYRO_LP_AVG_MASK GENMASK(4, 1) 314#define INV_ICM45600_GYRO_LP_AVG_SEL_8X 5 315#define INV_ICM45600_GYRO_LP_AVG_SEL_2X 1 316/* Accel USER offset */ 317#define INV_ICM45600_IPREG_SYS2_REG_24 0xA518 318#define INV_ICM45600_IPREG_SYS2_REG_32 0xA520 319#define INV_ICM45600_IPREG_SYS2_REG_40 0xA528 320#define INV_ICM45600_ACCEL_OFFUSER_MASK GENMASK(13, 0) 321/* Accel averaging filter */ 322#define INV_ICM45600_IPREG_SYS2_REG_129 0xA581 323#define INV_ICM45600_ACCEL_LP_AVG_SEL_1X 0x0000 324#define INV_ICM45600_ACCEL_LP_AVG_SEL_4X 0x0002 325 326/* Sleep times required by the driver */ 327#define INV_ICM45600_ACCEL_STARTUP_TIME_MS 60 328#define INV_ICM45600_GYRO_STARTUP_TIME_MS 60 329#define INV_ICM45600_GYRO_STOP_TIME_MS 150 330#define INV_ICM45600_IREG_DELAY_US 4 331 332typedef int (*inv_icm45600_bus_setup)(struct inv_icm45600_state *); 333 334extern const struct dev_pm_ops inv_icm45600_pm_ops; 335 336const struct iio_mount_matrix * 337inv_icm45600_get_mount_matrix(const struct iio_dev *indio_dev, 338 const struct iio_chan_spec *chan); 339 340#define INV_ICM45600_TEMP_CHAN(_index) \ 341 { \ 342 .type = IIO_TEMP, \ 343 .info_mask_separate = \ 344 BIT(IIO_CHAN_INFO_RAW) | \ 345 BIT(IIO_CHAN_INFO_OFFSET) | \ 346 BIT(IIO_CHAN_INFO_SCALE), \ 347 .scan_index = _index, \ 348 .scan_type = { \ 349 .sign = 's', \ 350 .realbits = 16, \ 351 .storagebits = 16, \ 352 .endianness = IIO_LE, \ 353 }, \ 354 } 355 356int inv_icm45600_temp_read_raw(struct iio_dev *indio_dev, 357 struct iio_chan_spec const *chan, 358 int *val, int *val2, long mask); 359 360u32 inv_icm45600_odr_to_period(enum inv_icm45600_odr odr); 361 362int inv_icm45600_set_accel_conf(struct inv_icm45600_state *st, 363 struct inv_icm45600_sensor_conf *conf, 364 unsigned int *sleep_ms); 365 366int inv_icm45600_set_gyro_conf(struct inv_icm45600_state *st, 367 struct inv_icm45600_sensor_conf *conf, 368 unsigned int *sleep_ms); 369 370int inv_icm45600_debugfs_reg(struct iio_dev *indio_dev, unsigned int reg, 371 unsigned int writeval, unsigned int *readval); 372 373int inv_icm45600_core_probe(struct regmap *regmap, 374 const struct inv_icm45600_chip_info *chip_info, 375 bool reset, inv_icm45600_bus_setup bus_setup); 376 377struct iio_dev *inv_icm45600_gyro_init(struct inv_icm45600_state *st); 378 379int inv_icm45600_gyro_parse_fifo(struct iio_dev *indio_dev); 380 381struct iio_dev *inv_icm45600_accel_init(struct inv_icm45600_state *st); 382 383int inv_icm45600_accel_parse_fifo(struct iio_dev *indio_dev); 384 385#endif
~/
Read-only file preview.