Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * adis16400.c	support Analog Devices ADIS16400/5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *		3d 2g Linear Accelerometers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  *		3d Gyroscopes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *		3d Magnetometers via SPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  * Copyright (c) 2009 Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  * Copyright (c) 2007 Jonathan Cameron <jic23@kernel.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  * Copyright (c) 2011 Analog Devices Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <linux/spi/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <linux/sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #include <linux/debugfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #include <linux/iio/iio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #include <linux/iio/sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #include <linux/iio/buffer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #include <linux/iio/trigger_consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #include <linux/iio/imu/adis.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #define ADIS16400_STARTUP_DELAY	290 /* ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #define ADIS16400_MTEST_DELAY 90 /* ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #define ADIS16400_FLASH_CNT  0x00 /* Flash memory write count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #define ADIS16400_SUPPLY_OUT 0x02 /* Power supply measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #define ADIS16400_XGYRO_OUT 0x04 /* X-axis gyroscope output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #define ADIS16400_YGYRO_OUT 0x06 /* Y-axis gyroscope output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #define ADIS16400_ZGYRO_OUT 0x08 /* Z-axis gyroscope output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #define ADIS16400_XACCL_OUT 0x0A /* X-axis accelerometer output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #define ADIS16400_YACCL_OUT 0x0C /* Y-axis accelerometer output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #define ADIS16400_ZACCL_OUT 0x0E /* Z-axis accelerometer output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #define ADIS16400_XMAGN_OUT 0x10 /* X-axis magnetometer measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #define ADIS16400_YMAGN_OUT 0x12 /* Y-axis magnetometer measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #define ADIS16400_ZMAGN_OUT 0x14 /* Z-axis magnetometer measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) #define ADIS16400_TEMP_OUT  0x16 /* Temperature output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #define ADIS16400_AUX_ADC   0x18 /* Auxiliary ADC measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #define ADIS16350_XTEMP_OUT 0x10 /* X-axis gyroscope temperature measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #define ADIS16350_YTEMP_OUT 0x12 /* Y-axis gyroscope temperature measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define ADIS16350_ZTEMP_OUT 0x14 /* Z-axis gyroscope temperature measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) #define ADIS16300_PITCH_OUT 0x12 /* X axis inclinometer output measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) #define ADIS16300_ROLL_OUT  0x14 /* Y axis inclinometer output measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #define ADIS16300_AUX_ADC   0x16 /* Auxiliary ADC measurement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #define ADIS16448_BARO_OUT	0x16 /* Barometric pressure output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) #define ADIS16448_TEMP_OUT  0x18 /* Temperature output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) /* Calibration parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #define ADIS16400_XGYRO_OFF 0x1A /* X-axis gyroscope bias offset factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) #define ADIS16400_YGYRO_OFF 0x1C /* Y-axis gyroscope bias offset factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) #define ADIS16400_ZGYRO_OFF 0x1E /* Z-axis gyroscope bias offset factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) #define ADIS16400_XACCL_OFF 0x20 /* X-axis acceleration bias offset factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) #define ADIS16400_YACCL_OFF 0x22 /* Y-axis acceleration bias offset factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) #define ADIS16400_ZACCL_OFF 0x24 /* Z-axis acceleration bias offset factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) #define ADIS16400_XMAGN_HIF 0x26 /* X-axis magnetometer, hard-iron factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #define ADIS16400_YMAGN_HIF 0x28 /* Y-axis magnetometer, hard-iron factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) #define ADIS16400_ZMAGN_HIF 0x2A /* Z-axis magnetometer, hard-iron factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) #define ADIS16400_XMAGN_SIF 0x2C /* X-axis magnetometer, soft-iron factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) #define ADIS16400_YMAGN_SIF 0x2E /* Y-axis magnetometer, soft-iron factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define ADIS16400_ZMAGN_SIF 0x30 /* Z-axis magnetometer, soft-iron factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) #define ADIS16400_GPIO_CTRL 0x32 /* Auxiliary digital input/output control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) #define ADIS16400_MSC_CTRL  0x34 /* Miscellaneous control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) #define ADIS16400_SMPL_PRD  0x36 /* Internal sample period (rate) control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) #define ADIS16400_SENS_AVG  0x38 /* Dynamic range and digital filter control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) #define ADIS16400_SLP_CNT   0x3A /* Sleep mode control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) #define ADIS16400_DIAG_STAT 0x3C /* System status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) /* Alarm functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) #define ADIS16400_GLOB_CMD  0x3E /* System command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) #define ADIS16400_ALM_MAG1  0x40 /* Alarm 1 amplitude threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) #define ADIS16400_ALM_MAG2  0x42 /* Alarm 2 amplitude threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) #define ADIS16400_ALM_SMPL1 0x44 /* Alarm 1 sample size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #define ADIS16400_ALM_SMPL2 0x46 /* Alarm 2 sample size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) #define ADIS16400_ALM_CTRL  0x48 /* Alarm control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) #define ADIS16400_AUX_DAC   0x4A /* Auxiliary DAC data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #define ADIS16334_LOT_ID1   0x52 /* Lot identification code 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) #define ADIS16334_LOT_ID2   0x54 /* Lot identification code 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) #define ADIS16400_PRODUCT_ID 0x56 /* Product identifier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #define ADIS16334_SERIAL_NUMBER 0x58 /* Serial number, lot specific */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) #define ADIS16400_ERROR_ACTIVE			(1<<14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define ADIS16400_NEW_DATA			(1<<14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) /* MSC_CTRL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #define ADIS16400_MSC_CTRL_MEM_TEST		(1<<11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define ADIS16400_MSC_CTRL_INT_SELF_TEST	(1<<10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define ADIS16400_MSC_CTRL_NEG_SELF_TEST	(1<<9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define ADIS16400_MSC_CTRL_POS_SELF_TEST	(1<<8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) #define ADIS16400_MSC_CTRL_GYRO_BIAS		(1<<7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) #define ADIS16400_MSC_CTRL_ACCL_ALIGN		(1<<6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #define ADIS16400_MSC_CTRL_DATA_RDY_EN		(1<<2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #define ADIS16400_MSC_CTRL_DATA_RDY_POL_HIGH	(1<<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) #define ADIS16400_MSC_CTRL_DATA_RDY_DIO2	(1<<0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) /* SMPL_PRD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) #define ADIS16400_SMPL_PRD_TIME_BASE	(1<<7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define ADIS16400_SMPL_PRD_DIV_MASK	0x7F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) /* DIAG_STAT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #define ADIS16400_DIAG_STAT_ZACCL_FAIL	15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) #define ADIS16400_DIAG_STAT_YACCL_FAIL	14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) #define ADIS16400_DIAG_STAT_XACCL_FAIL	13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) #define ADIS16400_DIAG_STAT_XGYRO_FAIL	12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #define ADIS16400_DIAG_STAT_YGYRO_FAIL	11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) #define ADIS16400_DIAG_STAT_ZGYRO_FAIL	10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) #define ADIS16400_DIAG_STAT_ALARM2	9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) #define ADIS16400_DIAG_STAT_ALARM1	8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) #define ADIS16400_DIAG_STAT_FLASH_CHK	6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) #define ADIS16400_DIAG_STAT_SELF_TEST	5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) #define ADIS16400_DIAG_STAT_OVERFLOW	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) #define ADIS16400_DIAG_STAT_SPI_FAIL	3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) #define ADIS16400_DIAG_STAT_FLASH_UPT	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) #define ADIS16400_DIAG_STAT_POWER_HIGH	1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) #define ADIS16400_DIAG_STAT_POWER_LOW	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) /* GLOB_CMD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) #define ADIS16400_GLOB_CMD_SW_RESET	(1<<7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) #define ADIS16400_GLOB_CMD_P_AUTO_NULL	(1<<4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #define ADIS16400_GLOB_CMD_FLASH_UPD	(1<<3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) #define ADIS16400_GLOB_CMD_DAC_LATCH	(1<<2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) #define ADIS16400_GLOB_CMD_FAC_CALIB	(1<<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) #define ADIS16400_GLOB_CMD_AUTO_NULL	(1<<0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) /* SLP_CNT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) #define ADIS16400_SLP_CNT_POWER_OFF	(1<<8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) #define ADIS16334_RATE_DIV_SHIFT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) #define ADIS16334_RATE_INT_CLK BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) #define ADIS16400_SPI_SLOW	(u32)(300 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) #define ADIS16400_SPI_BURST	(u32)(1000 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) #define ADIS16400_SPI_FAST	(u32)(2000 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #define ADIS16400_HAS_PROD_ID		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) #define ADIS16400_NO_BURST		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) #define ADIS16400_HAS_SLOW_MODE		BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #define ADIS16400_HAS_SERIAL_NUMBER	BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define ADIS16400_BURST_DIAG_STAT	BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) struct adis16400_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) struct adis16400_chip_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	const struct iio_chan_spec *channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	const struct adis_data adis_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	const int num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	const long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	unsigned int gyro_scale_micro;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	unsigned int accel_scale_micro;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	int temp_scale_nano;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	int temp_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	/* set_freq() & get_freq() need to avoid using ADIS lib's state lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	int (*set_freq)(struct adis16400_state *st, unsigned int freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	int (*get_freq)(struct adis16400_state *st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172)  * struct adis16400_state - device instance specific data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173)  * @variant:	chip variant info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174)  * @filt_int:	integer part of requested filter frequency
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175)  * @adis:	adis device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176)  * @avail_scan_mask:	NULL terminated array of bitmaps of channels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177)  *			that must be enabled together
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178)  **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) struct adis16400_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	struct adis16400_chip_info	*variant;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	int				filt_int;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	struct adis adis;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	unsigned long avail_scan_mask[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) /* At the moment triggers are only used for ring buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188)  * filling. This may change!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	ADIS16400_SCAN_SUPPLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	ADIS16400_SCAN_GYRO_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	ADIS16400_SCAN_GYRO_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	ADIS16400_SCAN_GYRO_Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	ADIS16400_SCAN_ACC_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	ADIS16400_SCAN_ACC_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	ADIS16400_SCAN_ACC_Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	ADIS16400_SCAN_MAGN_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	ADIS16400_SCAN_MAGN_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	ADIS16400_SCAN_MAGN_Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	ADIS16400_SCAN_BARO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	ADIS16350_SCAN_TEMP_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	ADIS16350_SCAN_TEMP_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	ADIS16350_SCAN_TEMP_Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	ADIS16300_SCAN_INCLI_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	ADIS16300_SCAN_INCLI_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	ADIS16400_SCAN_ADC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	ADIS16400_SCAN_TIMESTAMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) #ifdef CONFIG_DEBUG_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) static ssize_t adis16400_show_serial_number(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 		char __user *userbuf, size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 	struct adis16400_state *st = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	u16 lot1, lot2, serial_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	char buf[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	size_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	ret = adis_read_reg_16(&st->adis, ADIS16334_LOT_ID1, &lot1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	ret = adis_read_reg_16(&st->adis, ADIS16334_LOT_ID2, &lot2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	ret = adis_read_reg_16(&st->adis, ADIS16334_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 			&serial_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	len = snprintf(buf, sizeof(buf), "%.4x-%.4x-%.4x\n", lot1, lot2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 			serial_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) static const struct file_operations adis16400_serial_number_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	.open = simple_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	.read = adis16400_show_serial_number,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	.llseek = default_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	.owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) static int adis16400_show_product_id(void *arg, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	struct adis16400_state *st = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	uint16_t prod_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	ret = adis_read_reg_16(&st->adis, ADIS16400_PRODUCT_ID, &prod_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	*val = prod_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) DEFINE_DEBUGFS_ATTRIBUTE(adis16400_product_id_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	adis16400_show_product_id, NULL, "%lld\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) static int adis16400_show_flash_count(void *arg, u64 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	struct adis16400_state *st = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	uint16_t flash_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	ret = adis_read_reg_16(&st->adis, ADIS16400_FLASH_CNT, &flash_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	*val = flash_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) DEFINE_DEBUGFS_ATTRIBUTE(adis16400_flash_count_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	adis16400_show_flash_count, NULL, "%lld\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) static int adis16400_debugfs_init(struct iio_dev *indio_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	struct dentry *d = iio_get_debugfs_dentry(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	if (st->variant->flags & ADIS16400_HAS_SERIAL_NUMBER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 		debugfs_create_file_unsafe("serial_number", 0400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 				d, st, &adis16400_serial_number_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	if (st->variant->flags & ADIS16400_HAS_PROD_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 		debugfs_create_file_unsafe("product_id", 0400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 				d, st, &adis16400_product_id_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	debugfs_create_file_unsafe("flash_count", 0400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 			d, st, &adis16400_flash_count_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) static int adis16400_debugfs_init(struct iio_dev *indio_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) enum adis16400_chip_variant {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	ADIS16300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 	ADIS16334,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	ADIS16350,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	ADIS16360,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	ADIS16362,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	ADIS16364,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	ADIS16367,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	ADIS16400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	ADIS16445,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	ADIS16448,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) static int adis16334_get_freq(struct adis16400_state *st)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	uint16_t t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	ret = __adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	t >>= ADIS16334_RATE_DIV_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	return 819200 >> t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) static int adis16334_set_freq(struct adis16400_state *st, unsigned int freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	unsigned int t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	if (freq < 819200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 		t = ilog2(819200 / freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 		t = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	if (t > 0x31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 		t = 0x31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	t <<= ADIS16334_RATE_DIV_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	t |= ADIS16334_RATE_INT_CLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	return __adis_write_reg_16(&st->adis, ADIS16400_SMPL_PRD, t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) static int adis16400_get_freq(struct adis16400_state *st)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	int sps, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	uint16_t t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	ret = __adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	sps = (t & ADIS16400_SMPL_PRD_TIME_BASE) ? 52851 : 1638404;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	sps /= (t & ADIS16400_SMPL_PRD_DIV_MASK) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	return sps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) static int adis16400_set_freq(struct adis16400_state *st, unsigned int freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	unsigned int t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	uint8_t val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	t = 1638404 / freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	if (t >= 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 		val |= ADIS16400_SMPL_PRD_TIME_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 		t = 52851 / freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 		if (t >= 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 			t = 127;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	} else if (t != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 		t--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	val |= t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	if (t >= 0x0A || (val & ADIS16400_SMPL_PRD_TIME_BASE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 		st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 		st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	return __adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) static const unsigned int adis16400_3db_divisors[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	[0] = 2, /* Special case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	[1] = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	[2] = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	[3] = 25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	[4] = 50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	[5] = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	[6] = 200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	[7] = 200, /* Not a valid setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) static int __adis16400_set_filter(struct iio_dev *indio_dev, int sps, int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	uint16_t val16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	for (i = ARRAY_SIZE(adis16400_3db_divisors) - 1; i >= 1; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 		if (sps / adis16400_3db_divisors[i] >= val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	ret = __adis_read_reg_16(&st->adis, ADIS16400_SENS_AVG, &val16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	ret = __adis_write_reg_16(&st->adis, ADIS16400_SENS_AVG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 					 (val16 & ~0x07) | i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) /* Power down the device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) static int adis16400_stop_device(struct iio_dev *indio_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	ret = adis_write_reg_16(&st->adis, ADIS16400_SLP_CNT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 			ADIS16400_SLP_CNT_POWER_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 		dev_err(&indio_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 			"problem with turning device off: SLP_CNT");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) static int adis16400_initial_setup(struct iio_dev *indio_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	uint16_t prod_id, smp_prd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 	unsigned int device_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	/* use low spi speed for init if the device has a slow mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	if (st->variant->flags & ADIS16400_HAS_SLOW_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 		st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 		st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	st->adis.spi->mode = SPI_MODE_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	spi_setup(st->adis.spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	ret = adis_initial_startup(&st->adis);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	if (st->variant->flags & ADIS16400_HAS_PROD_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 		ret = adis_read_reg_16(&st->adis,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 						ADIS16400_PRODUCT_ID, &prod_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 			goto err_ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 		if (sscanf(indio_dev->name, "adis%u\n", &device_id) != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 			ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 			goto err_ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 		if (prod_id != device_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 			dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 					device_id, prod_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 		dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 			indio_dev->name, prod_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 			st->adis.spi->chip_select, st->adis.spi->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	/* use high spi speed if possible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 		ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &smp_prd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 			goto err_ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 		if ((smp_prd & ADIS16400_SMPL_PRD_DIV_MASK) < 0x0A) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 			st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 			spi_setup(st->adis.spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) err_ret:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) static const uint8_t adis16400_addresses[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 	[ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	[ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	[ADIS16400_SCAN_GYRO_Z] = ADIS16400_ZGYRO_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	[ADIS16400_SCAN_ACC_X] = ADIS16400_XACCL_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	[ADIS16400_SCAN_ACC_Y] = ADIS16400_YACCL_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	[ADIS16400_SCAN_ACC_Z] = ADIS16400_ZACCL_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) static int adis16400_write_raw(struct iio_dev *indio_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	struct iio_chan_spec const *chan, int val, int val2, long info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	struct mutex *slock = &st->adis.state_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	int ret, sps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	switch (info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	case IIO_CHAN_INFO_CALIBBIAS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 		ret = adis_write_reg_16(&st->adis,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 				adis16400_addresses[chan->scan_index], val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 		 * Need to cache values so we can update if the frequency
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 		 * changes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 		mutex_lock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 		st->filt_int = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 		/* Work out update to current value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 		sps = st->variant->get_freq(st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 		if (sps < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 			mutex_unlock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 			return sps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 		ret = __adis16400_set_filter(indio_dev, sps,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 			val * 1000 + val2 / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 		mutex_unlock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 	case IIO_CHAN_INFO_SAMP_FREQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 		sps = val * 1000 + val2 / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 		if (sps <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 		mutex_lock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 		ret = st->variant->set_freq(st, sps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 		mutex_unlock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) static int adis16400_read_raw(struct iio_dev *indio_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	struct iio_chan_spec const *chan, int *val, int *val2, long info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	struct mutex *slock = &st->adis.state_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	int16_t val16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	switch (info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	case IIO_CHAN_INFO_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 		return adis_single_conversion(indio_dev, chan, 0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	case IIO_CHAN_INFO_SCALE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 		switch (chan->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 		case IIO_ANGL_VEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 			*val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 			*val2 = st->variant->gyro_scale_micro;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 			return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		case IIO_VOLTAGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 			*val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 			if (chan->channel == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 				*val = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 				*val2 = 418000; /* 2.418 mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 				*val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 				*val2 = 805800; /* 805.8 uV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 			return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 		case IIO_ACCEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 			*val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 			*val2 = st->variant->accel_scale_micro;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 			return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 		case IIO_MAGN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 			*val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 			*val2 = 500; /* 0.5 mgauss */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 			return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 		case IIO_TEMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 			*val = st->variant->temp_scale_nano / 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 			*val2 = (st->variant->temp_scale_nano % 1000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 			return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 		case IIO_PRESSURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 			/* 20 uBar = 0.002kPascal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 			*val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 			*val2 = 2000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 			return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	case IIO_CHAN_INFO_CALIBBIAS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 		ret = adis_read_reg_16(&st->adis,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 				adis16400_addresses[chan->scan_index], &val16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 		val16 = sign_extend32(val16, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 		*val = val16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 		return IIO_VAL_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	case IIO_CHAN_INFO_OFFSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 		/* currently only temperature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 		*val = st->variant->temp_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 		return IIO_VAL_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		mutex_lock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 		/* Need both the number of taps and the sampling frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 		ret = __adis_read_reg_16(&st->adis,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 						ADIS16400_SENS_AVG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 						&val16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 		if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 			mutex_unlock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 		ret = st->variant->get_freq(st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 		mutex_unlock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 		ret /= adis16400_3db_divisors[val16 & 0x07];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 		*val = ret / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 		*val2 = (ret % 1000) * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 		return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	case IIO_CHAN_INFO_SAMP_FREQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 		mutex_lock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 		ret = st->variant->get_freq(st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 		mutex_unlock(slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 		*val = ret / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 		*val2 = (ret % 1000) * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 		return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) #if IS_ENABLED(CONFIG_IIO_BUFFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) static irqreturn_t adis16400_trigger_handler(int irq, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	struct iio_poll_func *pf = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	struct iio_dev *indio_dev = pf->indio_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	struct adis16400_state *st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	struct adis *adis = &st->adis;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	u32 old_speed_hz = st->adis.spi->max_speed_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	void *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	if (!(st->variant->flags & ADIS16400_NO_BURST) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 		st->adis.spi->max_speed_hz > ADIS16400_SPI_BURST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 		st->adis.spi->max_speed_hz = ADIS16400_SPI_BURST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 		spi_setup(st->adis.spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 	ret = spi_sync(adis->spi, &adis->msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 		dev_err(&adis->spi->dev, "Failed to read data: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	if (!(st->variant->flags & ADIS16400_NO_BURST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 		st->adis.spi->max_speed_hz = old_speed_hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 		spi_setup(st->adis.spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	if (st->variant->flags & ADIS16400_BURST_DIAG_STAT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		buffer = adis->buffer + sizeof(u16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 		buffer = adis->buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	iio_push_to_buffers_with_timestamp(indio_dev, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 		pf->timestamp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	iio_trigger_notify_done(indio_dev->trig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) #define adis16400_trigger_handler	NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) #endif /* IS_ENABLED(CONFIG_IIO_BUFFER) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) #define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 	.type = IIO_VOLTAGE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	.indexed = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	.channel = chn, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	.extend_name = name, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 		BIT(IIO_CHAN_INFO_SCALE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	.address = (addr), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	.scan_index = (si), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 		.sign = 'u', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) #define ADIS16400_SUPPLY_CHAN(addr, bits) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) #define ADIS16400_AUX_ADC_CHAN(addr, bits) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) #define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	.type = IIO_ANGL_VEL, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	.modified = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	.channel2 = IIO_MOD_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		BIT(IIO_CHAN_INFO_CALIBBIAS),		  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	.address = addr, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	.scan_index = ADIS16400_SCAN_GYRO_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 		.sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) #define ADIS16400_ACCEL_CHAN(mod, addr, bits) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	.type = IIO_ACCEL, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	.modified = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	.channel2 = IIO_MOD_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 		BIT(IIO_CHAN_INFO_CALIBBIAS), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	.address = (addr), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	.scan_index = ADIS16400_SCAN_ACC_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		.sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) #define ADIS16400_MAGN_CHAN(mod, addr, bits) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	.type = IIO_MAGN, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	.modified = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	.channel2 = IIO_MOD_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	.address = (addr), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	.scan_index = ADIS16400_SCAN_MAGN_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 		.sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) #define ADIS16400_MOD_TEMP_NAME_X "x"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) #define ADIS16400_MOD_TEMP_NAME_Y "y"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) #define ADIS16400_MOD_TEMP_NAME_Z "z"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) #define ADIS16400_MOD_TEMP_CHAN(mod, addr, bits) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	.type = IIO_TEMP, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	.indexed = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	.channel = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	.extend_name = ADIS16400_MOD_TEMP_NAME_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		BIT(IIO_CHAN_INFO_OFFSET) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 		BIT(IIO_CHAN_INFO_SCALE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	.info_mask_shared_by_type = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	.address = (addr), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	.scan_index = ADIS16350_SCAN_TEMP_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 		.sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) #define ADIS16400_TEMP_CHAN(addr, bits) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 	.type = IIO_TEMP, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 	.indexed = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 	.channel = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 		BIT(IIO_CHAN_INFO_OFFSET) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 		BIT(IIO_CHAN_INFO_SCALE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 	.address = (addr), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	.scan_index = ADIS16350_SCAN_TEMP_X, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 		.sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) #define ADIS16400_INCLI_CHAN(mod, addr, bits) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	.type = IIO_INCLI, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	.modified = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	.channel2 = IIO_MOD_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	.address = (addr), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	.scan_index = ADIS16300_SCAN_INCLI_ ## mod, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	.scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 		.sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 		.realbits = (bits), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 		.storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 		.shift = 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 		.endianness = IIO_BE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	}, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) static const struct iio_chan_spec adis16400_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 	ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 	ADIS16400_TEMP_CHAN(ADIS16400_TEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 	ADIS16400_AUX_ADC_CHAN(ADIS16400_AUX_ADC, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) static const struct iio_chan_spec adis16445_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) static const struct iio_chan_spec adis16448_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 		.type = IIO_PRESSURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 		.address = ADIS16448_BARO_OUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 		.scan_index = ADIS16400_SCAN_BARO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 		.scan_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 			.sign = 's',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 			.realbits = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 			.storagebits = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 			.endianness = IIO_BE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) static const struct iio_chan_spec adis16350_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 	ADIS16400_MAGN_CHAN(X, ADIS16400_XMAGN_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	ADIS16400_MAGN_CHAN(Y, ADIS16400_YMAGN_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	ADIS16400_MAGN_CHAN(Z, ADIS16400_ZMAGN_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	ADIS16400_MOD_TEMP_CHAN(X, ADIS16350_XTEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	ADIS16400_MOD_TEMP_CHAN(Y, ADIS16350_YTEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	ADIS16400_MOD_TEMP_CHAN(Z, ADIS16350_ZTEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) static const struct iio_chan_spec adis16300_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 	ADIS16400_SUPPLY_CHAN(ADIS16400_SUPPLY_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 	ADIS16400_AUX_ADC_CHAN(ADIS16300_AUX_ADC, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 	ADIS16400_INCLI_CHAN(X, ADIS16300_PITCH_OUT, 13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 	ADIS16400_INCLI_CHAN(Y, ADIS16300_ROLL_OUT, 13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) static const struct iio_chan_spec adis16334_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	ADIS16400_GYRO_CHAN(X, ADIS16400_XGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	ADIS16400_GYRO_CHAN(Y, ADIS16400_YGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	ADIS16400_GYRO_CHAN(Z, ADIS16400_ZGYRO_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	ADIS16400_ACCEL_CHAN(X, ADIS16400_XACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	ADIS16400_ACCEL_CHAN(Y, ADIS16400_YACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 	ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 	ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) static const char * const adis16400_status_error_msgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	[ADIS16400_DIAG_STAT_XACCL_FAIL] = "X-axis accelerometer self-test failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	[ADIS16400_DIAG_STAT_XGYRO_FAIL] = "X-axis gyroscope self-test failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	[ADIS16400_DIAG_STAT_YGYRO_FAIL] = "Y-axis gyroscope self-test failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 	[ADIS16400_DIAG_STAT_ZGYRO_FAIL] = "Z-axis gyroscope self-test failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	[ADIS16400_DIAG_STAT_ALARM2] = "Alarm 2 active",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	[ADIS16400_DIAG_STAT_ALARM1] = "Alarm 1 active",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	[ADIS16400_DIAG_STAT_FLASH_CHK] = "Flash checksum error",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 	[ADIS16400_DIAG_STAT_SELF_TEST] = "Self test error",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	[ADIS16400_DIAG_STAT_OVERFLOW] = "Sensor overrange",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	[ADIS16400_DIAG_STAT_SPI_FAIL] = "SPI failure",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	[ADIS16400_DIAG_STAT_FLASH_UPT] = "Flash update failed",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 	[ADIS16400_DIAG_STAT_POWER_HIGH] = "Power supply above 5.25V",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	[ADIS16400_DIAG_STAT_POWER_LOW] = "Power supply below 4.75V",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) #define ADIS16400_DATA(_timeouts, _burst_len)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) {									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	.msc_ctrl_reg = ADIS16400_MSC_CTRL,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	.glob_cmd_reg = ADIS16400_GLOB_CMD,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	.diag_stat_reg = ADIS16400_DIAG_STAT,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	.read_delay = 50,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	.write_delay = 50,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	.self_test_mask = ADIS16400_MSC_CTRL_MEM_TEST,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	.self_test_reg = ADIS16400_MSC_CTRL,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	.status_error_msgs = adis16400_status_error_msgs,		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	.status_error_mask = BIT(ADIS16400_DIAG_STAT_ZACCL_FAIL) |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 		BIT(ADIS16400_DIAG_STAT_YACCL_FAIL) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 		BIT(ADIS16400_DIAG_STAT_XACCL_FAIL) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 		BIT(ADIS16400_DIAG_STAT_XGYRO_FAIL) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 		BIT(ADIS16400_DIAG_STAT_YGYRO_FAIL) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 		BIT(ADIS16400_DIAG_STAT_ZGYRO_FAIL) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 		BIT(ADIS16400_DIAG_STAT_ALARM2) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 		BIT(ADIS16400_DIAG_STAT_ALARM1) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 		BIT(ADIS16400_DIAG_STAT_FLASH_CHK) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 		BIT(ADIS16400_DIAG_STAT_SELF_TEST) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 		BIT(ADIS16400_DIAG_STAT_OVERFLOW) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 		BIT(ADIS16400_DIAG_STAT_SPI_FAIL) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 		BIT(ADIS16400_DIAG_STAT_FLASH_UPT) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 		BIT(ADIS16400_DIAG_STAT_POWER_HIGH) |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 		BIT(ADIS16400_DIAG_STAT_POWER_LOW),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	.timeouts = (_timeouts),					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	.burst_reg_cmd = ADIS16400_GLOB_CMD,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	.burst_len = (_burst_len)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) static const struct adis_timeout adis16300_timeouts = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	.reset_ms = ADIS16400_STARTUP_DELAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	.sw_reset_ms = ADIS16400_STARTUP_DELAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	.self_test_ms = ADIS16400_STARTUP_DELAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) static const struct adis_timeout adis16334_timeouts = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	.reset_ms = 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	.sw_reset_ms = 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	.self_test_ms = 14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) static const struct adis_timeout adis16362_timeouts = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	.reset_ms = 130,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	.sw_reset_ms = 130,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	.self_test_ms = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) static const struct adis_timeout adis16400_timeouts = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	.reset_ms = 170,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	.sw_reset_ms = 170,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	.self_test_ms = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) static const struct adis_timeout adis16445_timeouts = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	.reset_ms = 55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	.sw_reset_ms = 55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	.self_test_ms = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static const struct adis_timeout adis16448_timeouts = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 	.reset_ms = 90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	.sw_reset_ms = 90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	.self_test_ms = 45,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) static struct adis16400_chip_info adis16400_chips[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	[ADIS16300] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 		.channels = adis16300_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 		.num_channels = ARRAY_SIZE(adis16300_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 				ADIS16400_HAS_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 		.accel_scale_micro = 5884,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 		.temp_scale_nano = 140000000, /* 0.14 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		.temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 		.adis_data = ADIS16400_DATA(&adis16300_timeouts, 18),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	[ADIS16334] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		.channels = adis16334_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 		.num_channels = ARRAY_SIZE(adis16334_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_NO_BURST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 				ADIS16400_HAS_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 		.accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 		.temp_scale_nano = 67850000, /* 0.06785 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 		.temp_offset = 25000000 / 67850, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 		.set_freq = adis16334_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 		.get_freq = adis16334_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 		.adis_data = ADIS16400_DATA(&adis16334_timeouts, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	[ADIS16350] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 		.channels = adis16350_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 		.num_channels = ARRAY_SIZE(adis16350_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(73260), /* 0.07326 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 		.accel_scale_micro = IIO_G_TO_M_S_2(2522), /* 0.002522 g */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		.temp_scale_nano = 145300000, /* 0.1453 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 		.temp_offset = 25000000 / 145300, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 		.flags = ADIS16400_NO_BURST | ADIS16400_HAS_SLOW_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 		.adis_data = ADIS16400_DATA(&adis16300_timeouts, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	[ADIS16360] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 		.channels = adis16350_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 		.num_channels = ARRAY_SIZE(adis16350_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 				ADIS16400_HAS_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 		.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 		.temp_scale_nano = 136000000, /* 0.136 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 		.adis_data = ADIS16400_DATA(&adis16300_timeouts, 28),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	[ADIS16362] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 		.channels = adis16350_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 		.num_channels = ARRAY_SIZE(adis16350_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 				ADIS16400_HAS_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 		.accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 		.temp_scale_nano = 136000000, /* 0.136 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		.adis_data = ADIS16400_DATA(&adis16362_timeouts, 28),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	[ADIS16364] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 		.channels = adis16350_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		.num_channels = ARRAY_SIZE(adis16350_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 				ADIS16400_HAS_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 		.accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		.temp_scale_nano = 136000000, /* 0.136 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 		.adis_data = ADIS16400_DATA(&adis16362_timeouts, 28),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	[ADIS16367] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 		.channels = adis16350_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 		.num_channels = ARRAY_SIZE(adis16350_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 				ADIS16400_HAS_SERIAL_NUMBER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(2000), /* 0.2 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 		.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 		.temp_scale_nano = 136000000, /* 0.136 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		.temp_offset = 25000000 / 136000, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 		.adis_data = ADIS16400_DATA(&adis16300_timeouts, 28),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 	[ADIS16400] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 		.channels = adis16400_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 		.num_channels = ARRAY_SIZE(adis16400_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 		.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 		.temp_scale_nano = 140000000, /* 0.14 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 		.temp_offset = 25000000 / 140000, /* 25 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		.set_freq = adis16400_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 		.get_freq = adis16400_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 		.adis_data = ADIS16400_DATA(&adis16400_timeouts, 24),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	[ADIS16445] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		.channels = adis16445_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 		.num_channels = ARRAY_SIZE(adis16445_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 		.flags = ADIS16400_HAS_PROD_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 				ADIS16400_HAS_SERIAL_NUMBER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 				ADIS16400_BURST_DIAG_STAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(10000), /* 0.01 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 		.accel_scale_micro = IIO_G_TO_M_S_2(250), /* 1/4000 g */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		.temp_scale_nano = 73860000, /* 0.07386 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 		.temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		.set_freq = adis16334_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 		.get_freq = adis16334_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 		.adis_data = ADIS16400_DATA(&adis16445_timeouts, 16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	[ADIS16448] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 		.channels = adis16448_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 		.num_channels = ARRAY_SIZE(adis16448_channels),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 		.flags = ADIS16400_HAS_PROD_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 				ADIS16400_HAS_SERIAL_NUMBER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 				ADIS16400_BURST_DIAG_STAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 		.gyro_scale_micro = IIO_DEGREE_TO_RAD(40000), /* 0.04 deg/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 		.accel_scale_micro = IIO_G_TO_M_S_2(833), /* 1/1200 g */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 		.temp_scale_nano = 73860000, /* 0.07386 C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 		.temp_offset = 31000000 / 73860, /* 31 C = 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 		.set_freq = adis16334_set_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 		.get_freq = adis16334_get_freq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 		.adis_data = ADIS16400_DATA(&adis16448_timeouts, 24),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) static const struct iio_info adis16400_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	.read_raw = &adis16400_read_raw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	.write_raw = &adis16400_write_raw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	.update_scan_mode = adis_update_scan_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	.debugfs_reg_access = adis_debugfs_reg_access,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) static void adis16400_setup_chan_mask(struct adis16400_state *st)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	const struct adis16400_chip_info *chip_info = st->variant;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	for (i = 0; i < chip_info->num_channels; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 		const struct iio_chan_spec *ch = &chip_info->channels[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 		if (ch->scan_index >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 		    ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 			st->avail_scan_mask[0] |= BIT(ch->scan_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) static void adis16400_stop(void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	adis16400_stop_device(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) static int adis16400_probe(struct spi_device *spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 	struct adis16400_state *st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 	struct iio_dev *indio_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	const struct adis_data *adis16400_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	if (indio_dev == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	st = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	/* this is only used for removal purposes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	spi_set_drvdata(spi, indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	/* setup the industrialio driver allocated elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	indio_dev->name = spi_get_device_id(spi)->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	indio_dev->channels = st->variant->channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 	indio_dev->num_channels = st->variant->num_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 	indio_dev->info = &adis16400_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	indio_dev->modes = INDIO_DIRECT_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	if (!(st->variant->flags & ADIS16400_NO_BURST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 		adis16400_setup_chan_mask(st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 		indio_dev->available_scan_masks = st->avail_scan_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 	adis16400_data = &st->variant->adis_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	ret = adis_init(&st->adis, indio_dev, spi, adis16400_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 	ret = devm_adis_setup_buffer_and_trigger(&st->adis, indio_dev, adis16400_trigger_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	/* Get the device into a sane initial state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	ret = adis16400_initial_setup(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	ret = devm_add_action_or_reset(&spi->dev, adis16400_stop, indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	ret = devm_iio_device_register(&spi->dev, indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	adis16400_debugfs_init(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) static const struct spi_device_id adis16400_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	{"adis16300", ADIS16300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	{"adis16305", ADIS16300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	{"adis16334", ADIS16334},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	{"adis16350", ADIS16350},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	{"adis16354", ADIS16350},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	{"adis16355", ADIS16350},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 	{"adis16360", ADIS16360},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	{"adis16362", ADIS16362},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 	{"adis16364", ADIS16364},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	{"adis16365", ADIS16360},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	{"adis16367", ADIS16367},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	{"adis16400", ADIS16400},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 	{"adis16405", ADIS16400},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	{"adis16445", ADIS16445},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	{"adis16448", ADIS16448},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) MODULE_DEVICE_TABLE(spi, adis16400_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) static struct spi_driver adis16400_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 		.name = "adis16400",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	.id_table = adis16400_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	.probe = adis16400_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) module_spi_driver(adis16400_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) MODULE_LICENSE("GPL v2");