xref: /OK3568_Linux_fs/kernel/drivers/iio/imu/adis16475.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * ADIS16475 IMU driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2019 Analog Devices Inc.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #include <linux/bitfield.h>
8*4882a593Smuzhiyun #include <linux/bitops.h>
9*4882a593Smuzhiyun #include <linux/clk.h>
10*4882a593Smuzhiyun #include <linux/debugfs.h>
11*4882a593Smuzhiyun #include <linux/delay.h>
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/kernel.h>
14*4882a593Smuzhiyun #include <linux/iio/buffer.h>
15*4882a593Smuzhiyun #include <linux/iio/iio.h>
16*4882a593Smuzhiyun #include <linux/iio/imu/adis.h>
17*4882a593Smuzhiyun #include <linux/iio/sysfs.h>
18*4882a593Smuzhiyun #include <linux/iio/trigger_consumer.h>
19*4882a593Smuzhiyun #include <linux/irq.h>
20*4882a593Smuzhiyun #include <linux/module.h>
21*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
22*4882a593Smuzhiyun #include <linux/property.h>
23*4882a593Smuzhiyun #include <linux/spi/spi.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define ADIS16475_REG_DIAG_STAT		0x02
26*4882a593Smuzhiyun #define ADIS16475_REG_X_GYRO_L		0x04
27*4882a593Smuzhiyun #define ADIS16475_REG_Y_GYRO_L		0x08
28*4882a593Smuzhiyun #define ADIS16475_REG_Z_GYRO_L		0x0C
29*4882a593Smuzhiyun #define ADIS16475_REG_X_ACCEL_L		0x10
30*4882a593Smuzhiyun #define ADIS16475_REG_Y_ACCEL_L		0x14
31*4882a593Smuzhiyun #define ADIS16475_REG_Z_ACCEL_L		0x18
32*4882a593Smuzhiyun #define ADIS16475_REG_TEMP_OUT		0x1c
33*4882a593Smuzhiyun #define ADIS16475_REG_X_GYRO_BIAS_L	0x40
34*4882a593Smuzhiyun #define ADIS16475_REG_Y_GYRO_BIAS_L	0x44
35*4882a593Smuzhiyun #define ADIS16475_REG_Z_GYRO_BIAS_L	0x48
36*4882a593Smuzhiyun #define ADIS16475_REG_X_ACCEL_BIAS_L	0x4c
37*4882a593Smuzhiyun #define ADIS16475_REG_Y_ACCEL_BIAS_L	0x50
38*4882a593Smuzhiyun #define ADIS16475_REG_Z_ACCEL_BIAS_L	0x54
39*4882a593Smuzhiyun #define ADIS16475_REG_FILT_CTRL		0x5c
40*4882a593Smuzhiyun #define ADIS16475_FILT_CTRL_MASK	GENMASK(2, 0)
41*4882a593Smuzhiyun #define ADIS16475_FILT_CTRL(x)		FIELD_PREP(ADIS16475_FILT_CTRL_MASK, x)
42*4882a593Smuzhiyun #define ADIS16475_REG_MSG_CTRL		0x60
43*4882a593Smuzhiyun #define ADIS16475_MSG_CTRL_DR_POL_MASK	BIT(0)
44*4882a593Smuzhiyun #define ADIS16475_MSG_CTRL_DR_POL(x) \
45*4882a593Smuzhiyun 				FIELD_PREP(ADIS16475_MSG_CTRL_DR_POL_MASK, x)
46*4882a593Smuzhiyun #define ADIS16475_SYNC_MODE_MASK	GENMASK(4, 2)
47*4882a593Smuzhiyun #define ADIS16475_SYNC_MODE(x)		FIELD_PREP(ADIS16475_SYNC_MODE_MASK, x)
48*4882a593Smuzhiyun #define ADIS16475_REG_UP_SCALE		0x62
49*4882a593Smuzhiyun #define ADIS16475_REG_DEC_RATE		0x64
50*4882a593Smuzhiyun #define ADIS16475_REG_GLOB_CMD		0x68
51*4882a593Smuzhiyun #define ADIS16475_REG_FIRM_REV		0x6c
52*4882a593Smuzhiyun #define ADIS16475_REG_FIRM_DM		0x6e
53*4882a593Smuzhiyun #define ADIS16475_REG_FIRM_Y		0x70
54*4882a593Smuzhiyun #define ADIS16475_REG_PROD_ID		0x72
55*4882a593Smuzhiyun #define ADIS16475_REG_SERIAL_NUM	0x74
56*4882a593Smuzhiyun #define ADIS16475_REG_FLASH_CNT		0x7c
57*4882a593Smuzhiyun #define ADIS16500_BURST32_MASK		BIT(9)
58*4882a593Smuzhiyun #define ADIS16500_BURST32(x)		FIELD_PREP(ADIS16500_BURST32_MASK, x)
59*4882a593Smuzhiyun /* number of data elements in burst mode */
60*4882a593Smuzhiyun #define ADIS16475_BURST32_MAX_DATA	32
61*4882a593Smuzhiyun #define ADIS16475_BURST_MAX_DATA	20
62*4882a593Smuzhiyun #define ADIS16475_MAX_SCAN_DATA		20
63*4882a593Smuzhiyun /* spi max speed in brust mode */
64*4882a593Smuzhiyun #define ADIS16475_BURST_MAX_SPEED	1000000
65*4882a593Smuzhiyun #define ADIS16475_LSB_DEC_MASK		BIT(0)
66*4882a593Smuzhiyun #define ADIS16475_LSB_FIR_MASK		BIT(1)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun enum {
69*4882a593Smuzhiyun 	ADIS16475_SYNC_DIRECT = 1,
70*4882a593Smuzhiyun 	ADIS16475_SYNC_SCALED,
71*4882a593Smuzhiyun 	ADIS16475_SYNC_OUTPUT,
72*4882a593Smuzhiyun 	ADIS16475_SYNC_PULSE = 5,
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct adis16475_sync {
76*4882a593Smuzhiyun 	u16 sync_mode;
77*4882a593Smuzhiyun 	u16 min_rate;
78*4882a593Smuzhiyun 	u16 max_rate;
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct adis16475_chip_info {
82*4882a593Smuzhiyun 	const struct iio_chan_spec *channels;
83*4882a593Smuzhiyun 	const struct adis16475_sync *sync;
84*4882a593Smuzhiyun 	const struct adis_data adis_data;
85*4882a593Smuzhiyun 	const char *name;
86*4882a593Smuzhiyun 	u32 num_channels;
87*4882a593Smuzhiyun 	u32 gyro_max_val;
88*4882a593Smuzhiyun 	u32 gyro_max_scale;
89*4882a593Smuzhiyun 	u32 accel_max_val;
90*4882a593Smuzhiyun 	u32 accel_max_scale;
91*4882a593Smuzhiyun 	u32 temp_scale;
92*4882a593Smuzhiyun 	u32 int_clk;
93*4882a593Smuzhiyun 	u16 max_dec;
94*4882a593Smuzhiyun 	u8 num_sync;
95*4882a593Smuzhiyun 	bool has_burst32;
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun struct adis16475 {
99*4882a593Smuzhiyun 	const struct adis16475_chip_info *info;
100*4882a593Smuzhiyun 	struct adis adis;
101*4882a593Smuzhiyun 	u32 clk_freq;
102*4882a593Smuzhiyun 	bool burst32;
103*4882a593Smuzhiyun 	unsigned long lsb_flag;
104*4882a593Smuzhiyun 	/* Alignment needed for the timestamp */
105*4882a593Smuzhiyun 	__be16 data[ADIS16475_MAX_SCAN_DATA] __aligned(8);
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun enum {
109*4882a593Smuzhiyun 	ADIS16475_SCAN_GYRO_X,
110*4882a593Smuzhiyun 	ADIS16475_SCAN_GYRO_Y,
111*4882a593Smuzhiyun 	ADIS16475_SCAN_GYRO_Z,
112*4882a593Smuzhiyun 	ADIS16475_SCAN_ACCEL_X,
113*4882a593Smuzhiyun 	ADIS16475_SCAN_ACCEL_Y,
114*4882a593Smuzhiyun 	ADIS16475_SCAN_ACCEL_Z,
115*4882a593Smuzhiyun 	ADIS16475_SCAN_TEMP,
116*4882a593Smuzhiyun 	ADIS16475_SCAN_DIAG_S_FLAGS,
117*4882a593Smuzhiyun 	ADIS16475_SCAN_CRC_FAILURE,
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS
adis16475_show_firmware_revision(struct file * file,char __user * userbuf,size_t count,loff_t * ppos)121*4882a593Smuzhiyun static ssize_t adis16475_show_firmware_revision(struct file *file,
122*4882a593Smuzhiyun 						char __user *userbuf,
123*4882a593Smuzhiyun 						size_t count, loff_t *ppos)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun 	struct adis16475 *st = file->private_data;
126*4882a593Smuzhiyun 	char buf[7];
127*4882a593Smuzhiyun 	size_t len;
128*4882a593Smuzhiyun 	u16 rev;
129*4882a593Smuzhiyun 	int ret;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_FIRM_REV, &rev);
132*4882a593Smuzhiyun 	if (ret)
133*4882a593Smuzhiyun 		return ret;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	len = scnprintf(buf, sizeof(buf), "%x.%x\n", rev >> 8, rev & 0xff);
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun static const struct file_operations adis16475_firmware_revision_fops = {
141*4882a593Smuzhiyun 	.open = simple_open,
142*4882a593Smuzhiyun 	.read = adis16475_show_firmware_revision,
143*4882a593Smuzhiyun 	.llseek = default_llseek,
144*4882a593Smuzhiyun 	.owner = THIS_MODULE,
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
adis16475_show_firmware_date(struct file * file,char __user * userbuf,size_t count,loff_t * ppos)147*4882a593Smuzhiyun static ssize_t adis16475_show_firmware_date(struct file *file,
148*4882a593Smuzhiyun 					    char __user *userbuf,
149*4882a593Smuzhiyun 					    size_t count, loff_t *ppos)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	struct adis16475 *st = file->private_data;
152*4882a593Smuzhiyun 	u16 md, year;
153*4882a593Smuzhiyun 	char buf[12];
154*4882a593Smuzhiyun 	size_t len;
155*4882a593Smuzhiyun 	int ret;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_FIRM_Y, &year);
158*4882a593Smuzhiyun 	if (ret)
159*4882a593Smuzhiyun 		return ret;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_FIRM_DM, &md);
162*4882a593Smuzhiyun 	if (ret)
163*4882a593Smuzhiyun 		return ret;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	len = snprintf(buf, sizeof(buf), "%.2x-%.2x-%.4x\n", md >> 8, md & 0xff,
166*4882a593Smuzhiyun 		       year);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun static const struct file_operations adis16475_firmware_date_fops = {
172*4882a593Smuzhiyun 	.open = simple_open,
173*4882a593Smuzhiyun 	.read = adis16475_show_firmware_date,
174*4882a593Smuzhiyun 	.llseek = default_llseek,
175*4882a593Smuzhiyun 	.owner = THIS_MODULE,
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
adis16475_show_serial_number(void * arg,u64 * val)178*4882a593Smuzhiyun static int adis16475_show_serial_number(void *arg, u64 *val)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	struct adis16475 *st = arg;
181*4882a593Smuzhiyun 	u16 serial;
182*4882a593Smuzhiyun 	int ret;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_SERIAL_NUM, &serial);
185*4882a593Smuzhiyun 	if (ret)
186*4882a593Smuzhiyun 		return ret;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	*val = serial;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	return 0;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun DEFINE_DEBUGFS_ATTRIBUTE(adis16475_serial_number_fops,
193*4882a593Smuzhiyun 			 adis16475_show_serial_number, NULL, "0x%.4llx\n");
194*4882a593Smuzhiyun 
adis16475_show_product_id(void * arg,u64 * val)195*4882a593Smuzhiyun static int adis16475_show_product_id(void *arg, u64 *val)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun 	struct adis16475 *st = arg;
198*4882a593Smuzhiyun 	u16 prod_id;
199*4882a593Smuzhiyun 	int ret;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_PROD_ID, &prod_id);
202*4882a593Smuzhiyun 	if (ret)
203*4882a593Smuzhiyun 		return ret;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	*val = prod_id;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	return 0;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun DEFINE_DEBUGFS_ATTRIBUTE(adis16475_product_id_fops,
210*4882a593Smuzhiyun 			 adis16475_show_product_id, NULL, "%llu\n");
211*4882a593Smuzhiyun 
adis16475_show_flash_count(void * arg,u64 * val)212*4882a593Smuzhiyun static int adis16475_show_flash_count(void *arg, u64 *val)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun 	struct adis16475 *st = arg;
215*4882a593Smuzhiyun 	u32 flash_count;
216*4882a593Smuzhiyun 	int ret;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	ret = adis_read_reg_32(&st->adis, ADIS16475_REG_FLASH_CNT,
219*4882a593Smuzhiyun 			       &flash_count);
220*4882a593Smuzhiyun 	if (ret)
221*4882a593Smuzhiyun 		return ret;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	*val = flash_count;
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	return 0;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun DEFINE_DEBUGFS_ATTRIBUTE(adis16475_flash_count_fops,
228*4882a593Smuzhiyun 			 adis16475_show_flash_count, NULL, "%lld\n");
229*4882a593Smuzhiyun 
adis16475_debugfs_init(struct iio_dev * indio_dev)230*4882a593Smuzhiyun static void adis16475_debugfs_init(struct iio_dev *indio_dev)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun 	struct adis16475 *st = iio_priv(indio_dev);
233*4882a593Smuzhiyun 	struct dentry *d = iio_get_debugfs_dentry(indio_dev);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	debugfs_create_file_unsafe("serial_number", 0400,
236*4882a593Smuzhiyun 				   d, st, &adis16475_serial_number_fops);
237*4882a593Smuzhiyun 	debugfs_create_file_unsafe("product_id", 0400,
238*4882a593Smuzhiyun 				   d, st, &adis16475_product_id_fops);
239*4882a593Smuzhiyun 	debugfs_create_file_unsafe("flash_count", 0400,
240*4882a593Smuzhiyun 				   d, st, &adis16475_flash_count_fops);
241*4882a593Smuzhiyun 	debugfs_create_file("firmware_revision", 0400,
242*4882a593Smuzhiyun 			    d, st, &adis16475_firmware_revision_fops);
243*4882a593Smuzhiyun 	debugfs_create_file("firmware_date", 0400, d,
244*4882a593Smuzhiyun 			    st, &adis16475_firmware_date_fops);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun #else
adis16475_debugfs_init(struct iio_dev * indio_dev)247*4882a593Smuzhiyun static void adis16475_debugfs_init(struct iio_dev *indio_dev)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun #endif
251*4882a593Smuzhiyun 
adis16475_get_freq(struct adis16475 * st,u32 * freq)252*4882a593Smuzhiyun static int adis16475_get_freq(struct adis16475 *st, u32 *freq)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun 	int ret;
255*4882a593Smuzhiyun 	u16 dec;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_DEC_RATE, &dec);
258*4882a593Smuzhiyun 	if (ret)
259*4882a593Smuzhiyun 		return -EINVAL;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	*freq = DIV_ROUND_CLOSEST(st->clk_freq, dec + 1);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	return 0;
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun 
adis16475_set_freq(struct adis16475 * st,const u32 freq)266*4882a593Smuzhiyun static int adis16475_set_freq(struct adis16475 *st, const u32 freq)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun 	u16 dec;
269*4882a593Smuzhiyun 	int ret;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	if (!freq)
272*4882a593Smuzhiyun 		return -EINVAL;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	dec = DIV_ROUND_CLOSEST(st->clk_freq, freq);
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	if (dec)
277*4882a593Smuzhiyun 		dec--;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	if (dec > st->info->max_dec)
280*4882a593Smuzhiyun 		dec = st->info->max_dec;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	ret = adis_write_reg_16(&st->adis, ADIS16475_REG_DEC_RATE, dec);
283*4882a593Smuzhiyun 	if (ret)
284*4882a593Smuzhiyun 		return ret;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	/*
287*4882a593Smuzhiyun 	 * If decimation is used, then gyro and accel data will have meaningful
288*4882a593Smuzhiyun 	 * bits on the LSB registers. This info is used on the trigger handler.
289*4882a593Smuzhiyun 	 */
290*4882a593Smuzhiyun 	assign_bit(ADIS16475_LSB_DEC_MASK, &st->lsb_flag, dec);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	return 0;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun /* The values are approximated. */
296*4882a593Smuzhiyun static const u32 adis16475_3db_freqs[] = {
297*4882a593Smuzhiyun 	[0] = 720, /* Filter disabled, full BW (~720Hz) */
298*4882a593Smuzhiyun 	[1] = 360,
299*4882a593Smuzhiyun 	[2] = 164,
300*4882a593Smuzhiyun 	[3] = 80,
301*4882a593Smuzhiyun 	[4] = 40,
302*4882a593Smuzhiyun 	[5] = 20,
303*4882a593Smuzhiyun 	[6] = 10,
304*4882a593Smuzhiyun };
305*4882a593Smuzhiyun 
adis16475_get_filter(struct adis16475 * st,u32 * filter)306*4882a593Smuzhiyun static int adis16475_get_filter(struct adis16475 *st, u32 *filter)
307*4882a593Smuzhiyun {
308*4882a593Smuzhiyun 	u16 filter_sz;
309*4882a593Smuzhiyun 	int ret;
310*4882a593Smuzhiyun 	const int mask = ADIS16475_FILT_CTRL_MASK;
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	ret = adis_read_reg_16(&st->adis, ADIS16475_REG_FILT_CTRL, &filter_sz);
313*4882a593Smuzhiyun 	if (ret)
314*4882a593Smuzhiyun 		return ret;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	*filter = adis16475_3db_freqs[filter_sz & mask];
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	return 0;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
adis16475_set_filter(struct adis16475 * st,const u32 filter)321*4882a593Smuzhiyun static int adis16475_set_filter(struct adis16475 *st, const u32 filter)
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun 	int i = ARRAY_SIZE(adis16475_3db_freqs);
324*4882a593Smuzhiyun 	int ret;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	while (--i) {
327*4882a593Smuzhiyun 		if (adis16475_3db_freqs[i] >= filter)
328*4882a593Smuzhiyun 			break;
329*4882a593Smuzhiyun 	}
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	ret = adis_write_reg_16(&st->adis, ADIS16475_REG_FILT_CTRL,
332*4882a593Smuzhiyun 				ADIS16475_FILT_CTRL(i));
333*4882a593Smuzhiyun 	if (ret)
334*4882a593Smuzhiyun 		return ret;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	/*
337*4882a593Smuzhiyun 	 * If FIR is used, then gyro and accel data will have meaningful
338*4882a593Smuzhiyun 	 * bits on the LSB registers. This info is used on the trigger handler.
339*4882a593Smuzhiyun 	 */
340*4882a593Smuzhiyun 	assign_bit(ADIS16475_LSB_FIR_MASK, &st->lsb_flag, i);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	return 0;
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun static const u32 adis16475_calib_regs[] = {
346*4882a593Smuzhiyun 	[ADIS16475_SCAN_GYRO_X] = ADIS16475_REG_X_GYRO_BIAS_L,
347*4882a593Smuzhiyun 	[ADIS16475_SCAN_GYRO_Y] = ADIS16475_REG_Y_GYRO_BIAS_L,
348*4882a593Smuzhiyun 	[ADIS16475_SCAN_GYRO_Z] = ADIS16475_REG_Z_GYRO_BIAS_L,
349*4882a593Smuzhiyun 	[ADIS16475_SCAN_ACCEL_X] = ADIS16475_REG_X_ACCEL_BIAS_L,
350*4882a593Smuzhiyun 	[ADIS16475_SCAN_ACCEL_Y] = ADIS16475_REG_Y_ACCEL_BIAS_L,
351*4882a593Smuzhiyun 	[ADIS16475_SCAN_ACCEL_Z] = ADIS16475_REG_Z_ACCEL_BIAS_L,
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun 
adis16475_read_raw(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,int * val,int * val2,long info)354*4882a593Smuzhiyun static int adis16475_read_raw(struct iio_dev *indio_dev,
355*4882a593Smuzhiyun 			      const struct iio_chan_spec *chan,
356*4882a593Smuzhiyun 			      int *val, int *val2, long info)
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun 	struct adis16475 *st = iio_priv(indio_dev);
359*4882a593Smuzhiyun 	int ret;
360*4882a593Smuzhiyun 	u32 tmp;
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 	switch (info) {
363*4882a593Smuzhiyun 	case IIO_CHAN_INFO_RAW:
364*4882a593Smuzhiyun 		return adis_single_conversion(indio_dev, chan, 0, val);
365*4882a593Smuzhiyun 	case IIO_CHAN_INFO_SCALE:
366*4882a593Smuzhiyun 		switch (chan->type) {
367*4882a593Smuzhiyun 		case IIO_ANGL_VEL:
368*4882a593Smuzhiyun 			*val = st->info->gyro_max_val;
369*4882a593Smuzhiyun 			*val2 = st->info->gyro_max_scale;
370*4882a593Smuzhiyun 			return IIO_VAL_FRACTIONAL;
371*4882a593Smuzhiyun 		case IIO_ACCEL:
372*4882a593Smuzhiyun 			*val = st->info->accel_max_val;
373*4882a593Smuzhiyun 			*val2 = st->info->accel_max_scale;
374*4882a593Smuzhiyun 			return IIO_VAL_FRACTIONAL;
375*4882a593Smuzhiyun 		case IIO_TEMP:
376*4882a593Smuzhiyun 			*val = st->info->temp_scale;
377*4882a593Smuzhiyun 			return IIO_VAL_INT;
378*4882a593Smuzhiyun 		default:
379*4882a593Smuzhiyun 			return -EINVAL;
380*4882a593Smuzhiyun 		}
381*4882a593Smuzhiyun 	case IIO_CHAN_INFO_CALIBBIAS:
382*4882a593Smuzhiyun 		ret = adis_read_reg_32(&st->adis,
383*4882a593Smuzhiyun 				       adis16475_calib_regs[chan->scan_index],
384*4882a593Smuzhiyun 				       val);
385*4882a593Smuzhiyun 		if (ret)
386*4882a593Smuzhiyun 			return ret;
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 		return IIO_VAL_INT;
389*4882a593Smuzhiyun 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
390*4882a593Smuzhiyun 		ret = adis16475_get_filter(st, val);
391*4882a593Smuzhiyun 		if (ret)
392*4882a593Smuzhiyun 			return ret;
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 		return IIO_VAL_INT;
395*4882a593Smuzhiyun 	case IIO_CHAN_INFO_SAMP_FREQ:
396*4882a593Smuzhiyun 		ret = adis16475_get_freq(st, &tmp);
397*4882a593Smuzhiyun 		if (ret)
398*4882a593Smuzhiyun 			return ret;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 		*val = tmp / 1000;
401*4882a593Smuzhiyun 		*val2 = (tmp % 1000) * 1000;
402*4882a593Smuzhiyun 		return IIO_VAL_INT_PLUS_MICRO;
403*4882a593Smuzhiyun 	default:
404*4882a593Smuzhiyun 		return -EINVAL;
405*4882a593Smuzhiyun 	}
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
adis16475_write_raw(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,int val,int val2,long info)408*4882a593Smuzhiyun static int adis16475_write_raw(struct iio_dev *indio_dev,
409*4882a593Smuzhiyun 			       const struct iio_chan_spec *chan,
410*4882a593Smuzhiyun 			       int val, int val2, long info)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	struct adis16475 *st = iio_priv(indio_dev);
413*4882a593Smuzhiyun 	u32 tmp;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	switch (info) {
416*4882a593Smuzhiyun 	case IIO_CHAN_INFO_SAMP_FREQ:
417*4882a593Smuzhiyun 		tmp = val * 1000 + val2 / 1000;
418*4882a593Smuzhiyun 		return adis16475_set_freq(st, tmp);
419*4882a593Smuzhiyun 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
420*4882a593Smuzhiyun 		return adis16475_set_filter(st, val);
421*4882a593Smuzhiyun 	case IIO_CHAN_INFO_CALIBBIAS:
422*4882a593Smuzhiyun 		return adis_write_reg_32(&st->adis,
423*4882a593Smuzhiyun 					 adis16475_calib_regs[chan->scan_index],
424*4882a593Smuzhiyun 					 val);
425*4882a593Smuzhiyun 	default:
426*4882a593Smuzhiyun 		return -EINVAL;
427*4882a593Smuzhiyun 	}
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun #define ADIS16475_MOD_CHAN(_type, _mod, _address, _si, _r_bits, _s_bits) \
431*4882a593Smuzhiyun 	{ \
432*4882a593Smuzhiyun 		.type = (_type), \
433*4882a593Smuzhiyun 		.modified = 1, \
434*4882a593Smuzhiyun 		.channel2 = (_mod), \
435*4882a593Smuzhiyun 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
436*4882a593Smuzhiyun 			BIT(IIO_CHAN_INFO_CALIBBIAS), \
437*4882a593Smuzhiyun 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
438*4882a593Smuzhiyun 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
439*4882a593Smuzhiyun 			BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
440*4882a593Smuzhiyun 		.address = (_address), \
441*4882a593Smuzhiyun 		.scan_index = (_si), \
442*4882a593Smuzhiyun 		.scan_type = { \
443*4882a593Smuzhiyun 			.sign = 's', \
444*4882a593Smuzhiyun 			.realbits = (_r_bits), \
445*4882a593Smuzhiyun 			.storagebits = (_s_bits), \
446*4882a593Smuzhiyun 			.endianness = IIO_BE, \
447*4882a593Smuzhiyun 		}, \
448*4882a593Smuzhiyun 	}
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun #define ADIS16475_GYRO_CHANNEL(_mod) \
451*4882a593Smuzhiyun 	ADIS16475_MOD_CHAN(IIO_ANGL_VEL, IIO_MOD_ ## _mod, \
452*4882a593Smuzhiyun 			   ADIS16475_REG_ ## _mod ## _GYRO_L, \
453*4882a593Smuzhiyun 			   ADIS16475_SCAN_GYRO_ ## _mod, 32, 32)
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun #define ADIS16475_ACCEL_CHANNEL(_mod) \
456*4882a593Smuzhiyun 	ADIS16475_MOD_CHAN(IIO_ACCEL, IIO_MOD_ ## _mod, \
457*4882a593Smuzhiyun 			   ADIS16475_REG_ ## _mod ## _ACCEL_L, \
458*4882a593Smuzhiyun 			   ADIS16475_SCAN_ACCEL_ ## _mod, 32, 32)
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun #define ADIS16475_TEMP_CHANNEL() { \
461*4882a593Smuzhiyun 		.type = IIO_TEMP, \
462*4882a593Smuzhiyun 		.indexed = 1, \
463*4882a593Smuzhiyun 		.channel = 0, \
464*4882a593Smuzhiyun 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
465*4882a593Smuzhiyun 			BIT(IIO_CHAN_INFO_SCALE), \
466*4882a593Smuzhiyun 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
467*4882a593Smuzhiyun 			BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
468*4882a593Smuzhiyun 		.address = ADIS16475_REG_TEMP_OUT, \
469*4882a593Smuzhiyun 		.scan_index = ADIS16475_SCAN_TEMP, \
470*4882a593Smuzhiyun 		.scan_type = { \
471*4882a593Smuzhiyun 			.sign = 's', \
472*4882a593Smuzhiyun 			.realbits = 16, \
473*4882a593Smuzhiyun 			.storagebits = 16, \
474*4882a593Smuzhiyun 			.endianness = IIO_BE, \
475*4882a593Smuzhiyun 		}, \
476*4882a593Smuzhiyun 	}
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun static const struct iio_chan_spec adis16475_channels[] = {
479*4882a593Smuzhiyun 	ADIS16475_GYRO_CHANNEL(X),
480*4882a593Smuzhiyun 	ADIS16475_GYRO_CHANNEL(Y),
481*4882a593Smuzhiyun 	ADIS16475_GYRO_CHANNEL(Z),
482*4882a593Smuzhiyun 	ADIS16475_ACCEL_CHANNEL(X),
483*4882a593Smuzhiyun 	ADIS16475_ACCEL_CHANNEL(Y),
484*4882a593Smuzhiyun 	ADIS16475_ACCEL_CHANNEL(Z),
485*4882a593Smuzhiyun 	ADIS16475_TEMP_CHANNEL(),
486*4882a593Smuzhiyun 	IIO_CHAN_SOFT_TIMESTAMP(7)
487*4882a593Smuzhiyun };
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun enum adis16475_variant {
490*4882a593Smuzhiyun 	ADIS16470,
491*4882a593Smuzhiyun 	ADIS16475_1,
492*4882a593Smuzhiyun 	ADIS16475_2,
493*4882a593Smuzhiyun 	ADIS16475_3,
494*4882a593Smuzhiyun 	ADIS16477_1,
495*4882a593Smuzhiyun 	ADIS16477_2,
496*4882a593Smuzhiyun 	ADIS16477_3,
497*4882a593Smuzhiyun 	ADIS16465_1,
498*4882a593Smuzhiyun 	ADIS16465_2,
499*4882a593Smuzhiyun 	ADIS16465_3,
500*4882a593Smuzhiyun 	ADIS16467_1,
501*4882a593Smuzhiyun 	ADIS16467_2,
502*4882a593Smuzhiyun 	ADIS16467_3,
503*4882a593Smuzhiyun 	ADIS16500,
504*4882a593Smuzhiyun 	ADIS16505_1,
505*4882a593Smuzhiyun 	ADIS16505_2,
506*4882a593Smuzhiyun 	ADIS16505_3,
507*4882a593Smuzhiyun 	ADIS16507_1,
508*4882a593Smuzhiyun 	ADIS16507_2,
509*4882a593Smuzhiyun 	ADIS16507_3,
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun enum {
513*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_DATA_PATH = 1,
514*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_FLASH_MEM,
515*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_SPI,
516*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_STANDBY,
517*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_SENSOR,
518*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_MEMORY,
519*4882a593Smuzhiyun 	ADIS16475_DIAG_STAT_CLK,
520*4882a593Smuzhiyun };
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun static const char * const adis16475_status_error_msgs[] = {
523*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_DATA_PATH] = "Data Path Overrun",
524*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_FLASH_MEM] = "Flash memory update failure",
525*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_SPI] = "SPI communication error",
526*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_STANDBY] = "Standby mode",
527*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_SENSOR] = "Sensor failure",
528*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_MEMORY] = "Memory failure",
529*4882a593Smuzhiyun 	[ADIS16475_DIAG_STAT_CLK] = "Clock error",
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun 
adis16475_enable_irq(struct adis * adis,bool enable)532*4882a593Smuzhiyun static int adis16475_enable_irq(struct adis *adis, bool enable)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	/*
535*4882a593Smuzhiyun 	 * There is no way to gate the data-ready signal internally inside the
536*4882a593Smuzhiyun 	 * ADIS16475. We can only control it's polarity...
537*4882a593Smuzhiyun 	 */
538*4882a593Smuzhiyun 	if (enable)
539*4882a593Smuzhiyun 		enable_irq(adis->spi->irq);
540*4882a593Smuzhiyun 	else
541*4882a593Smuzhiyun 		disable_irq(adis->spi->irq);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	return 0;
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun #define ADIS16475_DATA(_prod_id, _timeouts)				\
547*4882a593Smuzhiyun {									\
548*4882a593Smuzhiyun 	.msc_ctrl_reg = ADIS16475_REG_MSG_CTRL,				\
549*4882a593Smuzhiyun 	.glob_cmd_reg = ADIS16475_REG_GLOB_CMD,				\
550*4882a593Smuzhiyun 	.diag_stat_reg = ADIS16475_REG_DIAG_STAT,			\
551*4882a593Smuzhiyun 	.prod_id_reg = ADIS16475_REG_PROD_ID,				\
552*4882a593Smuzhiyun 	.prod_id = (_prod_id),						\
553*4882a593Smuzhiyun 	.self_test_mask = BIT(2),					\
554*4882a593Smuzhiyun 	.self_test_reg = ADIS16475_REG_GLOB_CMD,			\
555*4882a593Smuzhiyun 	.cs_change_delay = 16,						\
556*4882a593Smuzhiyun 	.read_delay = 5,						\
557*4882a593Smuzhiyun 	.write_delay = 5,						\
558*4882a593Smuzhiyun 	.status_error_msgs = adis16475_status_error_msgs,		\
559*4882a593Smuzhiyun 	.status_error_mask = BIT(ADIS16475_DIAG_STAT_DATA_PATH) |	\
560*4882a593Smuzhiyun 		BIT(ADIS16475_DIAG_STAT_FLASH_MEM) |			\
561*4882a593Smuzhiyun 		BIT(ADIS16475_DIAG_STAT_SPI) |				\
562*4882a593Smuzhiyun 		BIT(ADIS16475_DIAG_STAT_STANDBY) |			\
563*4882a593Smuzhiyun 		BIT(ADIS16475_DIAG_STAT_SENSOR) |			\
564*4882a593Smuzhiyun 		BIT(ADIS16475_DIAG_STAT_MEMORY) |			\
565*4882a593Smuzhiyun 		BIT(ADIS16475_DIAG_STAT_CLK),				\
566*4882a593Smuzhiyun 	.enable_irq = adis16475_enable_irq,				\
567*4882a593Smuzhiyun 	.timeouts = (_timeouts),					\
568*4882a593Smuzhiyun 	.burst_reg_cmd = ADIS16475_REG_GLOB_CMD,			\
569*4882a593Smuzhiyun 	.burst_len = ADIS16475_BURST_MAX_DATA,				\
570*4882a593Smuzhiyun 	.burst_max_len = ADIS16475_BURST32_MAX_DATA			\
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun static const struct adis16475_sync adis16475_sync_mode[] = {
574*4882a593Smuzhiyun 	{ ADIS16475_SYNC_OUTPUT },
575*4882a593Smuzhiyun 	{ ADIS16475_SYNC_DIRECT, 1900, 2100 },
576*4882a593Smuzhiyun 	{ ADIS16475_SYNC_SCALED, 1, 128 },
577*4882a593Smuzhiyun 	{ ADIS16475_SYNC_PULSE, 1000, 2100 },
578*4882a593Smuzhiyun };
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun static const struct adis_timeout adis16475_timeouts = {
581*4882a593Smuzhiyun 	.reset_ms = 200,
582*4882a593Smuzhiyun 	.sw_reset_ms = 200,
583*4882a593Smuzhiyun 	.self_test_ms = 20,
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun static const struct adis_timeout adis1650x_timeouts = {
587*4882a593Smuzhiyun 	.reset_ms = 260,
588*4882a593Smuzhiyun 	.sw_reset_ms = 260,
589*4882a593Smuzhiyun 	.self_test_ms = 30,
590*4882a593Smuzhiyun };
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun static const struct adis16475_chip_info adis16475_chip_info[] = {
593*4882a593Smuzhiyun 	[ADIS16470] = {
594*4882a593Smuzhiyun 		.name = "adis16470",
595*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
596*4882a593Smuzhiyun 		.channels = adis16475_channels,
597*4882a593Smuzhiyun 		.gyro_max_val = 1,
598*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
599*4882a593Smuzhiyun 		.accel_max_val = 1,
600*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
601*4882a593Smuzhiyun 		.temp_scale = 100,
602*4882a593Smuzhiyun 		.int_clk = 2000,
603*4882a593Smuzhiyun 		.max_dec = 1999,
604*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
605*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
606*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16470, &adis16475_timeouts),
607*4882a593Smuzhiyun 	},
608*4882a593Smuzhiyun 	[ADIS16475_1] = {
609*4882a593Smuzhiyun 		.name = "adis16475-1",
610*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
611*4882a593Smuzhiyun 		.channels = adis16475_channels,
612*4882a593Smuzhiyun 		.gyro_max_val = 1,
613*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(160 << 16),
614*4882a593Smuzhiyun 		.accel_max_val = 1,
615*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
616*4882a593Smuzhiyun 		.temp_scale = 100,
617*4882a593Smuzhiyun 		.int_clk = 2000,
618*4882a593Smuzhiyun 		.max_dec = 1999,
619*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
620*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
621*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16475, &adis16475_timeouts),
622*4882a593Smuzhiyun 	},
623*4882a593Smuzhiyun 	[ADIS16475_2] = {
624*4882a593Smuzhiyun 		.name = "adis16475-2",
625*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
626*4882a593Smuzhiyun 		.channels = adis16475_channels,
627*4882a593Smuzhiyun 		.gyro_max_val = 1,
628*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(40 << 16),
629*4882a593Smuzhiyun 		.accel_max_val = 1,
630*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
631*4882a593Smuzhiyun 		.temp_scale = 100,
632*4882a593Smuzhiyun 		.int_clk = 2000,
633*4882a593Smuzhiyun 		.max_dec = 1999,
634*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
635*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
636*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16475, &adis16475_timeouts),
637*4882a593Smuzhiyun 	},
638*4882a593Smuzhiyun 	[ADIS16475_3] = {
639*4882a593Smuzhiyun 		.name = "adis16475-3",
640*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
641*4882a593Smuzhiyun 		.channels = adis16475_channels,
642*4882a593Smuzhiyun 		.gyro_max_val = 1,
643*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
644*4882a593Smuzhiyun 		.accel_max_val = 1,
645*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
646*4882a593Smuzhiyun 		.temp_scale = 100,
647*4882a593Smuzhiyun 		.int_clk = 2000,
648*4882a593Smuzhiyun 		.max_dec = 1999,
649*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
650*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
651*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16475, &adis16475_timeouts),
652*4882a593Smuzhiyun 	},
653*4882a593Smuzhiyun 	[ADIS16477_1] = {
654*4882a593Smuzhiyun 		.name = "adis16477-1",
655*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
656*4882a593Smuzhiyun 		.channels = adis16475_channels,
657*4882a593Smuzhiyun 		.gyro_max_val = 1,
658*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(160 << 16),
659*4882a593Smuzhiyun 		.accel_max_val = 1,
660*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
661*4882a593Smuzhiyun 		.temp_scale = 100,
662*4882a593Smuzhiyun 		.int_clk = 2000,
663*4882a593Smuzhiyun 		.max_dec = 1999,
664*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
665*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
666*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16477, &adis16475_timeouts),
667*4882a593Smuzhiyun 	},
668*4882a593Smuzhiyun 	[ADIS16477_2] = {
669*4882a593Smuzhiyun 		.name = "adis16477-2",
670*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
671*4882a593Smuzhiyun 		.channels = adis16475_channels,
672*4882a593Smuzhiyun 		.gyro_max_val = 1,
673*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(40 << 16),
674*4882a593Smuzhiyun 		.accel_max_val = 1,
675*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
676*4882a593Smuzhiyun 		.temp_scale = 100,
677*4882a593Smuzhiyun 		.int_clk = 2000,
678*4882a593Smuzhiyun 		.max_dec = 1999,
679*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
680*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
681*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16477, &adis16475_timeouts),
682*4882a593Smuzhiyun 	},
683*4882a593Smuzhiyun 	[ADIS16477_3] = {
684*4882a593Smuzhiyun 		.name = "adis16477-3",
685*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
686*4882a593Smuzhiyun 		.channels = adis16475_channels,
687*4882a593Smuzhiyun 		.gyro_max_val = 1,
688*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
689*4882a593Smuzhiyun 		.accel_max_val = 1,
690*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
691*4882a593Smuzhiyun 		.temp_scale = 100,
692*4882a593Smuzhiyun 		.int_clk = 2000,
693*4882a593Smuzhiyun 		.max_dec = 1999,
694*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
695*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
696*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16477, &adis16475_timeouts),
697*4882a593Smuzhiyun 	},
698*4882a593Smuzhiyun 	[ADIS16465_1] = {
699*4882a593Smuzhiyun 		.name = "adis16465-1",
700*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
701*4882a593Smuzhiyun 		.channels = adis16475_channels,
702*4882a593Smuzhiyun 		.gyro_max_val = 1,
703*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(160 << 16),
704*4882a593Smuzhiyun 		.accel_max_val = 1,
705*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
706*4882a593Smuzhiyun 		.temp_scale = 100,
707*4882a593Smuzhiyun 		.int_clk = 2000,
708*4882a593Smuzhiyun 		.max_dec = 1999,
709*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
710*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
711*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16465, &adis16475_timeouts),
712*4882a593Smuzhiyun 	},
713*4882a593Smuzhiyun 	[ADIS16465_2] = {
714*4882a593Smuzhiyun 		.name = "adis16465-2",
715*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
716*4882a593Smuzhiyun 		.channels = adis16475_channels,
717*4882a593Smuzhiyun 		.gyro_max_val = 1,
718*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(40 << 16),
719*4882a593Smuzhiyun 		.accel_max_val = 1,
720*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
721*4882a593Smuzhiyun 		.temp_scale = 100,
722*4882a593Smuzhiyun 		.int_clk = 2000,
723*4882a593Smuzhiyun 		.max_dec = 1999,
724*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
725*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
726*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16465, &adis16475_timeouts),
727*4882a593Smuzhiyun 	},
728*4882a593Smuzhiyun 	[ADIS16465_3] = {
729*4882a593Smuzhiyun 		.name = "adis16465-3",
730*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
731*4882a593Smuzhiyun 		.channels = adis16475_channels,
732*4882a593Smuzhiyun 		.gyro_max_val = 1,
733*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
734*4882a593Smuzhiyun 		.accel_max_val = 1,
735*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
736*4882a593Smuzhiyun 		.temp_scale = 100,
737*4882a593Smuzhiyun 		.int_clk = 2000,
738*4882a593Smuzhiyun 		.max_dec = 1999,
739*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
740*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
741*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16465, &adis16475_timeouts),
742*4882a593Smuzhiyun 	},
743*4882a593Smuzhiyun 	[ADIS16467_1] = {
744*4882a593Smuzhiyun 		.name = "adis16467-1",
745*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
746*4882a593Smuzhiyun 		.channels = adis16475_channels,
747*4882a593Smuzhiyun 		.gyro_max_val = 1,
748*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(160 << 16),
749*4882a593Smuzhiyun 		.accel_max_val = 1,
750*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
751*4882a593Smuzhiyun 		.temp_scale = 100,
752*4882a593Smuzhiyun 		.int_clk = 2000,
753*4882a593Smuzhiyun 		.max_dec = 1999,
754*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
755*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
756*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16467, &adis16475_timeouts),
757*4882a593Smuzhiyun 	},
758*4882a593Smuzhiyun 	[ADIS16467_2] = {
759*4882a593Smuzhiyun 		.name = "adis16467-2",
760*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
761*4882a593Smuzhiyun 		.channels = adis16475_channels,
762*4882a593Smuzhiyun 		.gyro_max_val = 1,
763*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(40 << 16),
764*4882a593Smuzhiyun 		.accel_max_val = 1,
765*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
766*4882a593Smuzhiyun 		.temp_scale = 100,
767*4882a593Smuzhiyun 		.int_clk = 2000,
768*4882a593Smuzhiyun 		.max_dec = 1999,
769*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
770*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
771*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16467, &adis16475_timeouts),
772*4882a593Smuzhiyun 	},
773*4882a593Smuzhiyun 	[ADIS16467_3] = {
774*4882a593Smuzhiyun 		.name = "adis16467-3",
775*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
776*4882a593Smuzhiyun 		.channels = adis16475_channels,
777*4882a593Smuzhiyun 		.gyro_max_val = 1,
778*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
779*4882a593Smuzhiyun 		.accel_max_val = 1,
780*4882a593Smuzhiyun 		.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
781*4882a593Smuzhiyun 		.temp_scale = 100,
782*4882a593Smuzhiyun 		.int_clk = 2000,
783*4882a593Smuzhiyun 		.max_dec = 1999,
784*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
785*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode),
786*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16467, &adis16475_timeouts),
787*4882a593Smuzhiyun 	},
788*4882a593Smuzhiyun 	[ADIS16500] = {
789*4882a593Smuzhiyun 		.name = "adis16500",
790*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
791*4882a593Smuzhiyun 		.channels = adis16475_channels,
792*4882a593Smuzhiyun 		.gyro_max_val = 1,
793*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
794*4882a593Smuzhiyun 		.accel_max_val = 392,
795*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
796*4882a593Smuzhiyun 		.temp_scale = 100,
797*4882a593Smuzhiyun 		.int_clk = 2000,
798*4882a593Smuzhiyun 		.max_dec = 1999,
799*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
800*4882a593Smuzhiyun 		/* pulse sync not supported */
801*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
802*4882a593Smuzhiyun 		.has_burst32 = true,
803*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16500, &adis1650x_timeouts),
804*4882a593Smuzhiyun 	},
805*4882a593Smuzhiyun 	[ADIS16505_1] = {
806*4882a593Smuzhiyun 		.name = "adis16505-1",
807*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
808*4882a593Smuzhiyun 		.channels = adis16475_channels,
809*4882a593Smuzhiyun 		.gyro_max_val = 1,
810*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(160 << 16),
811*4882a593Smuzhiyun 		.accel_max_val = 78,
812*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
813*4882a593Smuzhiyun 		.temp_scale = 100,
814*4882a593Smuzhiyun 		.int_clk = 2000,
815*4882a593Smuzhiyun 		.max_dec = 1999,
816*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
817*4882a593Smuzhiyun 		/* pulse sync not supported */
818*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
819*4882a593Smuzhiyun 		.has_burst32 = true,
820*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16505, &adis1650x_timeouts),
821*4882a593Smuzhiyun 	},
822*4882a593Smuzhiyun 	[ADIS16505_2] = {
823*4882a593Smuzhiyun 		.name = "adis16505-2",
824*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
825*4882a593Smuzhiyun 		.channels = adis16475_channels,
826*4882a593Smuzhiyun 		.gyro_max_val = 1,
827*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(40 << 16),
828*4882a593Smuzhiyun 		.accel_max_val = 78,
829*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
830*4882a593Smuzhiyun 		.temp_scale = 100,
831*4882a593Smuzhiyun 		.int_clk = 2000,
832*4882a593Smuzhiyun 		.max_dec = 1999,
833*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
834*4882a593Smuzhiyun 		/* pulse sync not supported */
835*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
836*4882a593Smuzhiyun 		.has_burst32 = true,
837*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16505, &adis1650x_timeouts),
838*4882a593Smuzhiyun 	},
839*4882a593Smuzhiyun 	[ADIS16505_3] = {
840*4882a593Smuzhiyun 		.name = "adis16505-3",
841*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
842*4882a593Smuzhiyun 		.channels = adis16475_channels,
843*4882a593Smuzhiyun 		.gyro_max_val = 1,
844*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
845*4882a593Smuzhiyun 		.accel_max_val = 78,
846*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
847*4882a593Smuzhiyun 		.temp_scale = 100,
848*4882a593Smuzhiyun 		.int_clk = 2000,
849*4882a593Smuzhiyun 		.max_dec = 1999,
850*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
851*4882a593Smuzhiyun 		/* pulse sync not supported */
852*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
853*4882a593Smuzhiyun 		.has_burst32 = true,
854*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16505, &adis1650x_timeouts),
855*4882a593Smuzhiyun 	},
856*4882a593Smuzhiyun 	[ADIS16507_1] = {
857*4882a593Smuzhiyun 		.name = "adis16507-1",
858*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
859*4882a593Smuzhiyun 		.channels = adis16475_channels,
860*4882a593Smuzhiyun 		.gyro_max_val = 1,
861*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(160 << 16),
862*4882a593Smuzhiyun 		.accel_max_val = 392,
863*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
864*4882a593Smuzhiyun 		.temp_scale = 100,
865*4882a593Smuzhiyun 		.int_clk = 2000,
866*4882a593Smuzhiyun 		.max_dec = 1999,
867*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
868*4882a593Smuzhiyun 		/* pulse sync not supported */
869*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
870*4882a593Smuzhiyun 		.has_burst32 = true,
871*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16507, &adis1650x_timeouts),
872*4882a593Smuzhiyun 	},
873*4882a593Smuzhiyun 	[ADIS16507_2] = {
874*4882a593Smuzhiyun 		.name = "adis16507-2",
875*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
876*4882a593Smuzhiyun 		.channels = adis16475_channels,
877*4882a593Smuzhiyun 		.gyro_max_val = 1,
878*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(40 << 16),
879*4882a593Smuzhiyun 		.accel_max_val = 392,
880*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
881*4882a593Smuzhiyun 		.temp_scale = 100,
882*4882a593Smuzhiyun 		.int_clk = 2000,
883*4882a593Smuzhiyun 		.max_dec = 1999,
884*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
885*4882a593Smuzhiyun 		/* pulse sync not supported */
886*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
887*4882a593Smuzhiyun 		.has_burst32 = true,
888*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16507, &adis1650x_timeouts),
889*4882a593Smuzhiyun 	},
890*4882a593Smuzhiyun 	[ADIS16507_3] = {
891*4882a593Smuzhiyun 		.name = "adis16507-3",
892*4882a593Smuzhiyun 		.num_channels = ARRAY_SIZE(adis16475_channels),
893*4882a593Smuzhiyun 		.channels = adis16475_channels,
894*4882a593Smuzhiyun 		.gyro_max_val = 1,
895*4882a593Smuzhiyun 		.gyro_max_scale = IIO_RAD_TO_DEGREE(10 << 16),
896*4882a593Smuzhiyun 		.accel_max_val = 392,
897*4882a593Smuzhiyun 		.accel_max_scale = 32000 << 16,
898*4882a593Smuzhiyun 		.temp_scale = 100,
899*4882a593Smuzhiyun 		.int_clk = 2000,
900*4882a593Smuzhiyun 		.max_dec = 1999,
901*4882a593Smuzhiyun 		.sync = adis16475_sync_mode,
902*4882a593Smuzhiyun 		/* pulse sync not supported */
903*4882a593Smuzhiyun 		.num_sync = ARRAY_SIZE(adis16475_sync_mode) - 1,
904*4882a593Smuzhiyun 		.has_burst32 = true,
905*4882a593Smuzhiyun 		.adis_data = ADIS16475_DATA(16507, &adis1650x_timeouts),
906*4882a593Smuzhiyun 	},
907*4882a593Smuzhiyun };
908*4882a593Smuzhiyun 
909*4882a593Smuzhiyun static const struct iio_info adis16475_info = {
910*4882a593Smuzhiyun 	.read_raw = &adis16475_read_raw,
911*4882a593Smuzhiyun 	.write_raw = &adis16475_write_raw,
912*4882a593Smuzhiyun 	.update_scan_mode = adis_update_scan_mode,
913*4882a593Smuzhiyun 	.debugfs_reg_access = adis_debugfs_reg_access,
914*4882a593Smuzhiyun };
915*4882a593Smuzhiyun 
adis16475_validate_crc(const u8 * buffer,u16 crc,const bool burst32)916*4882a593Smuzhiyun static bool adis16475_validate_crc(const u8 *buffer, u16 crc,
917*4882a593Smuzhiyun 				   const bool burst32)
918*4882a593Smuzhiyun {
919*4882a593Smuzhiyun 	int i;
920*4882a593Smuzhiyun 	/* extra 6 elements for low gyro and accel */
921*4882a593Smuzhiyun 	const u16 sz = burst32 ? ADIS16475_BURST32_MAX_DATA :
922*4882a593Smuzhiyun 		ADIS16475_BURST_MAX_DATA;
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	for (i = 0; i < sz - 2; i++)
925*4882a593Smuzhiyun 		crc -= buffer[i];
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	return crc == 0;
928*4882a593Smuzhiyun }
929*4882a593Smuzhiyun 
adis16475_burst32_check(struct adis16475 * st)930*4882a593Smuzhiyun static void adis16475_burst32_check(struct adis16475 *st)
931*4882a593Smuzhiyun {
932*4882a593Smuzhiyun 	int ret;
933*4882a593Smuzhiyun 	struct adis *adis = &st->adis;
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun 	if (!st->info->has_burst32)
936*4882a593Smuzhiyun 		return;
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	if (st->lsb_flag && !st->burst32) {
939*4882a593Smuzhiyun 		const u16 en = ADIS16500_BURST32(1);
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun 		ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
942*4882a593Smuzhiyun 					 ADIS16500_BURST32_MASK, en);
943*4882a593Smuzhiyun 		if (ret)
944*4882a593Smuzhiyun 			return;
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 		st->burst32 = true;
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 		/*
949*4882a593Smuzhiyun 		 * In 32-bit mode we need extra 2 bytes for all gyro
950*4882a593Smuzhiyun 		 * and accel channels.
951*4882a593Smuzhiyun 		 */
952*4882a593Smuzhiyun 		adis->burst_extra_len = 6 * sizeof(u16);
953*4882a593Smuzhiyun 		adis->xfer[1].len += 6 * sizeof(u16);
954*4882a593Smuzhiyun 		dev_dbg(&adis->spi->dev, "Enable burst32 mode, xfer:%d",
955*4882a593Smuzhiyun 			adis->xfer[1].len);
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun 	} else if (!st->lsb_flag && st->burst32) {
958*4882a593Smuzhiyun 		const u16 en = ADIS16500_BURST32(0);
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 		ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
961*4882a593Smuzhiyun 					 ADIS16500_BURST32_MASK, en);
962*4882a593Smuzhiyun 		if (ret)
963*4882a593Smuzhiyun 			return;
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 		st->burst32 = false;
966*4882a593Smuzhiyun 
967*4882a593Smuzhiyun 		/* Remove the extra bits */
968*4882a593Smuzhiyun 		adis->burst_extra_len = 0;
969*4882a593Smuzhiyun 		adis->xfer[1].len -= 6 * sizeof(u16);
970*4882a593Smuzhiyun 		dev_dbg(&adis->spi->dev, "Disable burst32 mode, xfer:%d\n",
971*4882a593Smuzhiyun 			adis->xfer[1].len);
972*4882a593Smuzhiyun 	}
973*4882a593Smuzhiyun }
974*4882a593Smuzhiyun 
adis16475_trigger_handler(int irq,void * p)975*4882a593Smuzhiyun static irqreturn_t adis16475_trigger_handler(int irq, void *p)
976*4882a593Smuzhiyun {
977*4882a593Smuzhiyun 	struct iio_poll_func *pf = p;
978*4882a593Smuzhiyun 	struct iio_dev *indio_dev = pf->indio_dev;
979*4882a593Smuzhiyun 	struct adis16475 *st = iio_priv(indio_dev);
980*4882a593Smuzhiyun 	struct adis *adis = &st->adis;
981*4882a593Smuzhiyun 	int ret, bit, i = 0;
982*4882a593Smuzhiyun 	__be16 *buffer;
983*4882a593Smuzhiyun 	u16 crc;
984*4882a593Smuzhiyun 	bool valid;
985*4882a593Smuzhiyun 	/* offset until the first element after gyro and accel */
986*4882a593Smuzhiyun 	const u8 offset = st->burst32 ? 13 : 7;
987*4882a593Smuzhiyun 	const u32 cached_spi_speed_hz = adis->spi->max_speed_hz;
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun 	adis->spi->max_speed_hz = ADIS16475_BURST_MAX_SPEED;
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun 	ret = spi_sync(adis->spi, &adis->msg);
992*4882a593Smuzhiyun 	if (ret)
993*4882a593Smuzhiyun 		goto check_burst32;
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun 	adis->spi->max_speed_hz = cached_spi_speed_hz;
996*4882a593Smuzhiyun 	buffer = adis->buffer;
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun 	crc = be16_to_cpu(buffer[offset + 2]);
999*4882a593Smuzhiyun 	valid = adis16475_validate_crc(adis->buffer, crc, st->burst32);
1000*4882a593Smuzhiyun 	if (!valid) {
1001*4882a593Smuzhiyun 		dev_err(&adis->spi->dev, "Invalid crc\n");
1002*4882a593Smuzhiyun 		goto check_burst32;
1003*4882a593Smuzhiyun 	}
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun 	for_each_set_bit(bit, indio_dev->active_scan_mask,
1006*4882a593Smuzhiyun 			 indio_dev->masklength) {
1007*4882a593Smuzhiyun 		/*
1008*4882a593Smuzhiyun 		 * When burst mode is used, system flags is the first data
1009*4882a593Smuzhiyun 		 * channel in the sequence, but the scan index is 7.
1010*4882a593Smuzhiyun 		 */
1011*4882a593Smuzhiyun 		switch (bit) {
1012*4882a593Smuzhiyun 		case ADIS16475_SCAN_TEMP:
1013*4882a593Smuzhiyun 			st->data[i++] = buffer[offset];
1014*4882a593Smuzhiyun 			break;
1015*4882a593Smuzhiyun 		case ADIS16475_SCAN_GYRO_X ... ADIS16475_SCAN_ACCEL_Z:
1016*4882a593Smuzhiyun 			/*
1017*4882a593Smuzhiyun 			 * The first 2 bytes on the received data are the
1018*4882a593Smuzhiyun 			 * DIAG_STAT reg, hence the +1 offset here...
1019*4882a593Smuzhiyun 			 */
1020*4882a593Smuzhiyun 			if (st->burst32) {
1021*4882a593Smuzhiyun 				/* upper 16 */
1022*4882a593Smuzhiyun 				st->data[i++] = buffer[bit * 2 + 2];
1023*4882a593Smuzhiyun 				/* lower 16 */
1024*4882a593Smuzhiyun 				st->data[i++] = buffer[bit * 2 + 1];
1025*4882a593Smuzhiyun 			} else {
1026*4882a593Smuzhiyun 				st->data[i++] = buffer[bit + 1];
1027*4882a593Smuzhiyun 				/*
1028*4882a593Smuzhiyun 				 * Don't bother in doing the manual read if the
1029*4882a593Smuzhiyun 				 * device supports burst32. burst32 will be
1030*4882a593Smuzhiyun 				 * enabled in the next call to
1031*4882a593Smuzhiyun 				 * adis16475_burst32_check()...
1032*4882a593Smuzhiyun 				 */
1033*4882a593Smuzhiyun 				if (st->lsb_flag && !st->info->has_burst32) {
1034*4882a593Smuzhiyun 					u16 val = 0;
1035*4882a593Smuzhiyun 					const u32 reg = ADIS16475_REG_X_GYRO_L +
1036*4882a593Smuzhiyun 						bit * 4;
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun 					adis_read_reg_16(adis, reg, &val);
1039*4882a593Smuzhiyun 					st->data[i++] = cpu_to_be16(val);
1040*4882a593Smuzhiyun 				} else {
1041*4882a593Smuzhiyun 					/* lower not used */
1042*4882a593Smuzhiyun 					st->data[i++] = 0;
1043*4882a593Smuzhiyun 				}
1044*4882a593Smuzhiyun 			}
1045*4882a593Smuzhiyun 			break;
1046*4882a593Smuzhiyun 		}
1047*4882a593Smuzhiyun 	}
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun 	iio_push_to_buffers_with_timestamp(indio_dev, st->data, pf->timestamp);
1050*4882a593Smuzhiyun check_burst32:
1051*4882a593Smuzhiyun 	/*
1052*4882a593Smuzhiyun 	 * We only check the burst mode at the end of the current capture since
1053*4882a593Smuzhiyun 	 * it takes a full data ready cycle for the device to update the burst
1054*4882a593Smuzhiyun 	 * array.
1055*4882a593Smuzhiyun 	 */
1056*4882a593Smuzhiyun 	adis16475_burst32_check(st);
1057*4882a593Smuzhiyun 	iio_trigger_notify_done(indio_dev->trig);
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	return IRQ_HANDLED;
1060*4882a593Smuzhiyun }
1061*4882a593Smuzhiyun 
adis16475_disable_clk(void * data)1062*4882a593Smuzhiyun static void adis16475_disable_clk(void *data)
1063*4882a593Smuzhiyun {
1064*4882a593Smuzhiyun 	clk_disable_unprepare((struct clk *)data);
1065*4882a593Smuzhiyun }
1066*4882a593Smuzhiyun 
adis16475_config_sync_mode(struct adis16475 * st)1067*4882a593Smuzhiyun static int adis16475_config_sync_mode(struct adis16475 *st)
1068*4882a593Smuzhiyun {
1069*4882a593Smuzhiyun 	int ret;
1070*4882a593Smuzhiyun 	struct device *dev = &st->adis.spi->dev;
1071*4882a593Smuzhiyun 	const struct adis16475_sync *sync;
1072*4882a593Smuzhiyun 	u32 sync_mode;
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun 	/* default to internal clk */
1075*4882a593Smuzhiyun 	st->clk_freq = st->info->int_clk * 1000;
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun 	ret = device_property_read_u32(dev, "adi,sync-mode", &sync_mode);
1078*4882a593Smuzhiyun 	if (ret)
1079*4882a593Smuzhiyun 		return 0;
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun 	if (sync_mode >= st->info->num_sync) {
1082*4882a593Smuzhiyun 		dev_err(dev, "Invalid sync mode: %u for %s\n", sync_mode,
1083*4882a593Smuzhiyun 			st->info->name);
1084*4882a593Smuzhiyun 		return -EINVAL;
1085*4882a593Smuzhiyun 	}
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun 	sync = &st->info->sync[sync_mode];
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 	/* All the other modes require external input signal */
1090*4882a593Smuzhiyun 	if (sync->sync_mode != ADIS16475_SYNC_OUTPUT) {
1091*4882a593Smuzhiyun 		struct clk *clk = devm_clk_get(dev, NULL);
1092*4882a593Smuzhiyun 
1093*4882a593Smuzhiyun 		if (IS_ERR(clk))
1094*4882a593Smuzhiyun 			return PTR_ERR(clk);
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 		ret = clk_prepare_enable(clk);
1097*4882a593Smuzhiyun 		if (ret)
1098*4882a593Smuzhiyun 			return ret;
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun 		ret = devm_add_action_or_reset(dev, adis16475_disable_clk, clk);
1101*4882a593Smuzhiyun 		if (ret)
1102*4882a593Smuzhiyun 			return ret;
1103*4882a593Smuzhiyun 
1104*4882a593Smuzhiyun 		st->clk_freq = clk_get_rate(clk);
1105*4882a593Smuzhiyun 		if (st->clk_freq < sync->min_rate ||
1106*4882a593Smuzhiyun 		    st->clk_freq > sync->max_rate) {
1107*4882a593Smuzhiyun 			dev_err(dev,
1108*4882a593Smuzhiyun 				"Clk rate:%u not in a valid range:[%u %u]\n",
1109*4882a593Smuzhiyun 				st->clk_freq, sync->min_rate, sync->max_rate);
1110*4882a593Smuzhiyun 			return -EINVAL;
1111*4882a593Smuzhiyun 		}
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun 		if (sync->sync_mode == ADIS16475_SYNC_SCALED) {
1114*4882a593Smuzhiyun 			u16 up_scale;
1115*4882a593Smuzhiyun 			u32 scaled_out_freq = 0;
1116*4882a593Smuzhiyun 			/*
1117*4882a593Smuzhiyun 			 * If we are in scaled mode, we must have an up_scale.
1118*4882a593Smuzhiyun 			 * In scaled mode the allowable input clock range is
1119*4882a593Smuzhiyun 			 * 1 Hz to 128 Hz, and the allowable output range is
1120*4882a593Smuzhiyun 			 * 1900 to 2100 Hz. Hence, a scale must be given to
1121*4882a593Smuzhiyun 			 * get the allowable output.
1122*4882a593Smuzhiyun 			 */
1123*4882a593Smuzhiyun 			ret = device_property_read_u32(dev,
1124*4882a593Smuzhiyun 						       "adi,scaled-output-hz",
1125*4882a593Smuzhiyun 						       &scaled_out_freq);
1126*4882a593Smuzhiyun 			if (ret) {
1127*4882a593Smuzhiyun 				dev_err(dev, "adi,scaled-output-hz must be given when in scaled sync mode");
1128*4882a593Smuzhiyun 				return -EINVAL;
1129*4882a593Smuzhiyun 			} else if (scaled_out_freq < 1900 ||
1130*4882a593Smuzhiyun 				   scaled_out_freq > 2100) {
1131*4882a593Smuzhiyun 				dev_err(dev, "Invalid value: %u for adi,scaled-output-hz",
1132*4882a593Smuzhiyun 					scaled_out_freq);
1133*4882a593Smuzhiyun 				return -EINVAL;
1134*4882a593Smuzhiyun 			}
1135*4882a593Smuzhiyun 
1136*4882a593Smuzhiyun 			up_scale = DIV_ROUND_CLOSEST(scaled_out_freq,
1137*4882a593Smuzhiyun 						     st->clk_freq);
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 			ret = __adis_write_reg_16(&st->adis,
1140*4882a593Smuzhiyun 						  ADIS16475_REG_UP_SCALE,
1141*4882a593Smuzhiyun 						  up_scale);
1142*4882a593Smuzhiyun 			if (ret)
1143*4882a593Smuzhiyun 				return ret;
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun 			st->clk_freq = scaled_out_freq;
1146*4882a593Smuzhiyun 		}
1147*4882a593Smuzhiyun 
1148*4882a593Smuzhiyun 		st->clk_freq *= 1000;
1149*4882a593Smuzhiyun 	}
1150*4882a593Smuzhiyun 	/*
1151*4882a593Smuzhiyun 	 * Keep in mind that the mask for the clk modes in adis1650*
1152*4882a593Smuzhiyun 	 * chips is different (1100 instead of 11100). However, we
1153*4882a593Smuzhiyun 	 * are not configuring BIT(4) in these chips and the default
1154*4882a593Smuzhiyun 	 * value is 0, so we are fine in doing the below operations.
1155*4882a593Smuzhiyun 	 * I'm keeping this for simplicity and avoiding extra variables
1156*4882a593Smuzhiyun 	 * in chip_info.
1157*4882a593Smuzhiyun 	 */
1158*4882a593Smuzhiyun 	ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
1159*4882a593Smuzhiyun 				 ADIS16475_SYNC_MODE_MASK, sync->sync_mode);
1160*4882a593Smuzhiyun 	if (ret)
1161*4882a593Smuzhiyun 		return ret;
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 	usleep_range(250, 260);
1164*4882a593Smuzhiyun 
1165*4882a593Smuzhiyun 	return 0;
1166*4882a593Smuzhiyun }
1167*4882a593Smuzhiyun 
adis16475_config_irq_pin(struct adis16475 * st)1168*4882a593Smuzhiyun static int adis16475_config_irq_pin(struct adis16475 *st)
1169*4882a593Smuzhiyun {
1170*4882a593Smuzhiyun 	int ret;
1171*4882a593Smuzhiyun 	struct irq_data *desc;
1172*4882a593Smuzhiyun 	u32 irq_type;
1173*4882a593Smuzhiyun 	u16 val = 0;
1174*4882a593Smuzhiyun 	u8 polarity;
1175*4882a593Smuzhiyun 	struct spi_device *spi = st->adis.spi;
1176*4882a593Smuzhiyun 
1177*4882a593Smuzhiyun 	desc = irq_get_irq_data(spi->irq);
1178*4882a593Smuzhiyun 	if (!desc) {
1179*4882a593Smuzhiyun 		dev_err(&spi->dev, "Could not find IRQ %d\n", spi->irq);
1180*4882a593Smuzhiyun 		return -EINVAL;
1181*4882a593Smuzhiyun 	}
1182*4882a593Smuzhiyun 	/*
1183*4882a593Smuzhiyun 	 * It is possible to configure the data ready polarity. Furthermore, we
1184*4882a593Smuzhiyun 	 * need to update the adis struct if we want data ready as active low.
1185*4882a593Smuzhiyun 	 */
1186*4882a593Smuzhiyun 	irq_type = irqd_get_trigger_type(desc);
1187*4882a593Smuzhiyun 	if (irq_type == IRQ_TYPE_EDGE_RISING) {
1188*4882a593Smuzhiyun 		polarity = 1;
1189*4882a593Smuzhiyun 		st->adis.irq_flag = IRQF_TRIGGER_RISING;
1190*4882a593Smuzhiyun 	} else if (irq_type == IRQ_TYPE_EDGE_FALLING) {
1191*4882a593Smuzhiyun 		polarity = 0;
1192*4882a593Smuzhiyun 		st->adis.irq_flag = IRQF_TRIGGER_FALLING;
1193*4882a593Smuzhiyun 	} else {
1194*4882a593Smuzhiyun 		dev_err(&spi->dev, "Invalid interrupt type 0x%x specified\n",
1195*4882a593Smuzhiyun 			irq_type);
1196*4882a593Smuzhiyun 		return -EINVAL;
1197*4882a593Smuzhiyun 	}
1198*4882a593Smuzhiyun 
1199*4882a593Smuzhiyun 	val = ADIS16475_MSG_CTRL_DR_POL(polarity);
1200*4882a593Smuzhiyun 	ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
1201*4882a593Smuzhiyun 				 ADIS16475_MSG_CTRL_DR_POL_MASK, val);
1202*4882a593Smuzhiyun 	if (ret)
1203*4882a593Smuzhiyun 		return ret;
1204*4882a593Smuzhiyun 	/*
1205*4882a593Smuzhiyun 	 * There is a delay writing to any bits written to the MSC_CTRL
1206*4882a593Smuzhiyun 	 * register. It should not be bigger than 200us, so 250 should be more
1207*4882a593Smuzhiyun 	 * than enough!
1208*4882a593Smuzhiyun 	 */
1209*4882a593Smuzhiyun 	usleep_range(250, 260);
1210*4882a593Smuzhiyun 
1211*4882a593Smuzhiyun 	return 0;
1212*4882a593Smuzhiyun }
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun static const struct of_device_id adis16475_of_match[] = {
1215*4882a593Smuzhiyun 	{ .compatible = "adi,adis16470",
1216*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16470] },
1217*4882a593Smuzhiyun 	{ .compatible = "adi,adis16475-1",
1218*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16475_1] },
1219*4882a593Smuzhiyun 	{ .compatible = "adi,adis16475-2",
1220*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16475_2] },
1221*4882a593Smuzhiyun 	{ .compatible = "adi,adis16475-3",
1222*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16475_3] },
1223*4882a593Smuzhiyun 	{ .compatible = "adi,adis16477-1",
1224*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16477_1] },
1225*4882a593Smuzhiyun 	{ .compatible = "adi,adis16477-2",
1226*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16477_2] },
1227*4882a593Smuzhiyun 	{ .compatible = "adi,adis16477-3",
1228*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16477_3] },
1229*4882a593Smuzhiyun 	{ .compatible = "adi,adis16465-1",
1230*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16465_1] },
1231*4882a593Smuzhiyun 	{ .compatible = "adi,adis16465-2",
1232*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16465_2] },
1233*4882a593Smuzhiyun 	{ .compatible = "adi,adis16465-3",
1234*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16465_3] },
1235*4882a593Smuzhiyun 	{ .compatible = "adi,adis16467-1",
1236*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16467_1] },
1237*4882a593Smuzhiyun 	{ .compatible = "adi,adis16467-2",
1238*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16467_2] },
1239*4882a593Smuzhiyun 	{ .compatible = "adi,adis16467-3",
1240*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16467_3] },
1241*4882a593Smuzhiyun 	{ .compatible = "adi,adis16500",
1242*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16500] },
1243*4882a593Smuzhiyun 	{ .compatible = "adi,adis16505-1",
1244*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16505_1] },
1245*4882a593Smuzhiyun 	{ .compatible = "adi,adis16505-2",
1246*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16505_2] },
1247*4882a593Smuzhiyun 	{ .compatible = "adi,adis16505-3",
1248*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16505_3] },
1249*4882a593Smuzhiyun 	{ .compatible = "adi,adis16507-1",
1250*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16507_1] },
1251*4882a593Smuzhiyun 	{ .compatible = "adi,adis16507-2",
1252*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16507_2] },
1253*4882a593Smuzhiyun 	{ .compatible = "adi,adis16507-3",
1254*4882a593Smuzhiyun 		.data = &adis16475_chip_info[ADIS16507_3] },
1255*4882a593Smuzhiyun 	{ },
1256*4882a593Smuzhiyun };
1257*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, adis16475_of_match);
1258*4882a593Smuzhiyun 
adis16475_probe(struct spi_device * spi)1259*4882a593Smuzhiyun static int adis16475_probe(struct spi_device *spi)
1260*4882a593Smuzhiyun {
1261*4882a593Smuzhiyun 	struct iio_dev *indio_dev;
1262*4882a593Smuzhiyun 	struct adis16475 *st;
1263*4882a593Smuzhiyun 	int ret;
1264*4882a593Smuzhiyun 
1265*4882a593Smuzhiyun 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
1266*4882a593Smuzhiyun 	if (!indio_dev)
1267*4882a593Smuzhiyun 		return -ENOMEM;
1268*4882a593Smuzhiyun 
1269*4882a593Smuzhiyun 	st = iio_priv(indio_dev);
1270*4882a593Smuzhiyun 	spi_set_drvdata(spi, indio_dev);
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun 	st->info = device_get_match_data(&spi->dev);
1273*4882a593Smuzhiyun 	if (!st->info)
1274*4882a593Smuzhiyun 		return -EINVAL;
1275*4882a593Smuzhiyun 
1276*4882a593Smuzhiyun 	ret = adis_init(&st->adis, indio_dev, spi, &st->info->adis_data);
1277*4882a593Smuzhiyun 	if (ret)
1278*4882a593Smuzhiyun 		return ret;
1279*4882a593Smuzhiyun 
1280*4882a593Smuzhiyun 	indio_dev->name = st->info->name;
1281*4882a593Smuzhiyun 	indio_dev->channels = st->info->channels;
1282*4882a593Smuzhiyun 	indio_dev->num_channels = st->info->num_channels;
1283*4882a593Smuzhiyun 	indio_dev->info = &adis16475_info;
1284*4882a593Smuzhiyun 	indio_dev->modes = INDIO_DIRECT_MODE;
1285*4882a593Smuzhiyun 
1286*4882a593Smuzhiyun 	ret = __adis_initial_startup(&st->adis);
1287*4882a593Smuzhiyun 	if (ret)
1288*4882a593Smuzhiyun 		return ret;
1289*4882a593Smuzhiyun 
1290*4882a593Smuzhiyun 	ret = adis16475_config_irq_pin(st);
1291*4882a593Smuzhiyun 	if (ret)
1292*4882a593Smuzhiyun 		return ret;
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun 	ret = adis16475_config_sync_mode(st);
1295*4882a593Smuzhiyun 	if (ret)
1296*4882a593Smuzhiyun 		return ret;
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun 	ret = devm_adis_setup_buffer_and_trigger(&st->adis, indio_dev,
1299*4882a593Smuzhiyun 						 adis16475_trigger_handler);
1300*4882a593Smuzhiyun 	if (ret)
1301*4882a593Smuzhiyun 		return ret;
1302*4882a593Smuzhiyun 
1303*4882a593Smuzhiyun 	adis16475_enable_irq(&st->adis, false);
1304*4882a593Smuzhiyun 
1305*4882a593Smuzhiyun 	ret = devm_iio_device_register(&spi->dev, indio_dev);
1306*4882a593Smuzhiyun 	if (ret)
1307*4882a593Smuzhiyun 		return ret;
1308*4882a593Smuzhiyun 
1309*4882a593Smuzhiyun 	adis16475_debugfs_init(indio_dev);
1310*4882a593Smuzhiyun 
1311*4882a593Smuzhiyun 	return 0;
1312*4882a593Smuzhiyun }
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun static struct spi_driver adis16475_driver = {
1315*4882a593Smuzhiyun 	.driver = {
1316*4882a593Smuzhiyun 		.name = "adis16475",
1317*4882a593Smuzhiyun 		.of_match_table = adis16475_of_match,
1318*4882a593Smuzhiyun 	},
1319*4882a593Smuzhiyun 	.probe = adis16475_probe,
1320*4882a593Smuzhiyun };
1321*4882a593Smuzhiyun module_spi_driver(adis16475_driver);
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");
1324*4882a593Smuzhiyun MODULE_DESCRIPTION("Analog Devices ADIS16475 IMU driver");
1325*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1326