diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2013-01-16 07:48:00 -0500 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2013-01-26 05:07:50 -0500 |
commit | d6b09bd85d57752395c6407bd8a9b32eb7b279ff (patch) | |
tree | 0ad920d6cd805a5e3a357bb678fcd0a1678fc9ea /drivers/iio/imu/adis16400.h | |
parent | f4c6d64bcf5b4bd868c53c6943d9b9bdd65eaa48 (diff) |
staging:iio: Move adis16400 out of staging
This adis16400 driver is in pretty good shape now, so move it out of staging.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio/imu/adis16400.h')
-rw-r--r-- | drivers/iio/imu/adis16400.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/drivers/iio/imu/adis16400.h b/drivers/iio/imu/adis16400.h new file mode 100644 index 000000000000..a3b9e56c5bd1 --- /dev/null +++ b/drivers/iio/imu/adis16400.h | |||
@@ -0,0 +1,204 @@ | |||
1 | /* | ||
2 | * adis16400.h support Analog Devices ADIS16400 | ||
3 | * 3d 18g accelerometers, | ||
4 | * 3d gyroscopes, | ||
5 | * 3d 2.5gauss magnetometers via SPI | ||
6 | * | ||
7 | * Copyright (c) 2009 Manuel Stahl <manuel.stahl@iis.fraunhofer.de> | ||
8 | * Copyright (c) 2007 Jonathan Cameron <jic23@kernel.org> | ||
9 | * | ||
10 | * Loosely based upon lis3l02dq.h | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #ifndef SPI_ADIS16400_H_ | ||
18 | #define SPI_ADIS16400_H_ | ||
19 | |||
20 | #include <linux/iio/imu/adis.h> | ||
21 | |||
22 | #define ADIS16400_STARTUP_DELAY 290 /* ms */ | ||
23 | #define ADIS16400_MTEST_DELAY 90 /* ms */ | ||
24 | |||
25 | #define ADIS16400_FLASH_CNT 0x00 /* Flash memory write count */ | ||
26 | #define ADIS16400_SUPPLY_OUT 0x02 /* Power supply measurement */ | ||
27 | #define ADIS16400_XGYRO_OUT 0x04 /* X-axis gyroscope output */ | ||
28 | #define ADIS16400_YGYRO_OUT 0x06 /* Y-axis gyroscope output */ | ||
29 | #define ADIS16400_ZGYRO_OUT 0x08 /* Z-axis gyroscope output */ | ||
30 | #define ADIS16400_XACCL_OUT 0x0A /* X-axis accelerometer output */ | ||
31 | #define ADIS16400_YACCL_OUT 0x0C /* Y-axis accelerometer output */ | ||
32 | #define ADIS16400_ZACCL_OUT 0x0E /* Z-axis accelerometer output */ | ||
33 | #define ADIS16400_XMAGN_OUT 0x10 /* X-axis magnetometer measurement */ | ||
34 | #define ADIS16400_YMAGN_OUT 0x12 /* Y-axis magnetometer measurement */ | ||
35 | #define ADIS16400_ZMAGN_OUT 0x14 /* Z-axis magnetometer measurement */ | ||
36 | #define ADIS16400_TEMP_OUT 0x16 /* Temperature output */ | ||
37 | #define ADIS16400_AUX_ADC 0x18 /* Auxiliary ADC measurement */ | ||
38 | |||
39 | #define ADIS16350_XTEMP_OUT 0x10 /* X-axis gyroscope temperature measurement */ | ||
40 | #define ADIS16350_YTEMP_OUT 0x12 /* Y-axis gyroscope temperature measurement */ | ||
41 | #define ADIS16350_ZTEMP_OUT 0x14 /* Z-axis gyroscope temperature measurement */ | ||
42 | |||
43 | #define ADIS16300_PITCH_OUT 0x12 /* X axis inclinometer output measurement */ | ||
44 | #define ADIS16300_ROLL_OUT 0x14 /* Y axis inclinometer output measurement */ | ||
45 | #define ADIS16300_AUX_ADC 0x16 /* Auxiliary ADC measurement */ | ||
46 | |||
47 | /* Calibration parameters */ | ||
48 | #define ADIS16400_XGYRO_OFF 0x1A /* X-axis gyroscope bias offset factor */ | ||
49 | #define ADIS16400_YGYRO_OFF 0x1C /* Y-axis gyroscope bias offset factor */ | ||
50 | #define ADIS16400_ZGYRO_OFF 0x1E /* Z-axis gyroscope bias offset factor */ | ||
51 | #define ADIS16400_XACCL_OFF 0x20 /* X-axis acceleration bias offset factor */ | ||
52 | #define ADIS16400_YACCL_OFF 0x22 /* Y-axis acceleration bias offset factor */ | ||
53 | #define ADIS16400_ZACCL_OFF 0x24 /* Z-axis acceleration bias offset factor */ | ||
54 | #define ADIS16400_XMAGN_HIF 0x26 /* X-axis magnetometer, hard-iron factor */ | ||
55 | #define ADIS16400_YMAGN_HIF 0x28 /* Y-axis magnetometer, hard-iron factor */ | ||
56 | #define ADIS16400_ZMAGN_HIF 0x2A /* Z-axis magnetometer, hard-iron factor */ | ||
57 | #define ADIS16400_XMAGN_SIF 0x2C /* X-axis magnetometer, soft-iron factor */ | ||
58 | #define ADIS16400_YMAGN_SIF 0x2E /* Y-axis magnetometer, soft-iron factor */ | ||
59 | #define ADIS16400_ZMAGN_SIF 0x30 /* Z-axis magnetometer, soft-iron factor */ | ||
60 | |||
61 | #define ADIS16400_GPIO_CTRL 0x32 /* Auxiliary digital input/output control */ | ||
62 | #define ADIS16400_MSC_CTRL 0x34 /* Miscellaneous control */ | ||
63 | #define ADIS16400_SMPL_PRD 0x36 /* Internal sample period (rate) control */ | ||
64 | #define ADIS16400_SENS_AVG 0x38 /* Dynamic range and digital filter control */ | ||
65 | #define ADIS16400_SLP_CNT 0x3A /* Sleep mode control */ | ||
66 | #define ADIS16400_DIAG_STAT 0x3C /* System status */ | ||
67 | |||
68 | /* Alarm functions */ | ||
69 | #define ADIS16400_GLOB_CMD 0x3E /* System command */ | ||
70 | #define ADIS16400_ALM_MAG1 0x40 /* Alarm 1 amplitude threshold */ | ||
71 | #define ADIS16400_ALM_MAG2 0x42 /* Alarm 2 amplitude threshold */ | ||
72 | #define ADIS16400_ALM_SMPL1 0x44 /* Alarm 1 sample size */ | ||
73 | #define ADIS16400_ALM_SMPL2 0x46 /* Alarm 2 sample size */ | ||
74 | #define ADIS16400_ALM_CTRL 0x48 /* Alarm control */ | ||
75 | #define ADIS16400_AUX_DAC 0x4A /* Auxiliary DAC data */ | ||
76 | |||
77 | #define ADIS16400_PRODUCT_ID 0x56 /* Product identifier */ | ||
78 | |||
79 | #define ADIS16400_ERROR_ACTIVE (1<<14) | ||
80 | #define ADIS16400_NEW_DATA (1<<14) | ||
81 | |||
82 | /* MSC_CTRL */ | ||
83 | #define ADIS16400_MSC_CTRL_MEM_TEST (1<<11) | ||
84 | #define ADIS16400_MSC_CTRL_INT_SELF_TEST (1<<10) | ||
85 | #define ADIS16400_MSC_CTRL_NEG_SELF_TEST (1<<9) | ||
86 | #define ADIS16400_MSC_CTRL_POS_SELF_TEST (1<<8) | ||
87 | #define ADIS16400_MSC_CTRL_GYRO_BIAS (1<<7) | ||
88 | #define ADIS16400_MSC_CTRL_ACCL_ALIGN (1<<6) | ||
89 | #define ADIS16400_MSC_CTRL_DATA_RDY_EN (1<<2) | ||
90 | #define ADIS16400_MSC_CTRL_DATA_RDY_POL_HIGH (1<<1) | ||
91 | #define ADIS16400_MSC_CTRL_DATA_RDY_DIO2 (1<<0) | ||
92 | |||
93 | /* SMPL_PRD */ | ||
94 | #define ADIS16400_SMPL_PRD_TIME_BASE (1<<7) | ||
95 | #define ADIS16400_SMPL_PRD_DIV_MASK 0x7F | ||
96 | |||
97 | /* DIAG_STAT */ | ||
98 | #define ADIS16400_DIAG_STAT_ZACCL_FAIL 15 | ||
99 | #define ADIS16400_DIAG_STAT_YACCL_FAIL 14 | ||
100 | #define ADIS16400_DIAG_STAT_XACCL_FAIL 13 | ||
101 | #define ADIS16400_DIAG_STAT_XGYRO_FAIL 12 | ||
102 | #define ADIS16400_DIAG_STAT_YGYRO_FAIL 11 | ||
103 | #define ADIS16400_DIAG_STAT_ZGYRO_FAIL 10 | ||
104 | #define ADIS16400_DIAG_STAT_ALARM2 9 | ||
105 | #define ADIS16400_DIAG_STAT_ALARM1 8 | ||
106 | #define ADIS16400_DIAG_STAT_FLASH_CHK 6 | ||
107 | #define ADIS16400_DIAG_STAT_SELF_TEST 5 | ||
108 | #define ADIS16400_DIAG_STAT_OVERFLOW 4 | ||
109 | #define ADIS16400_DIAG_STAT_SPI_FAIL 3 | ||
110 | #define ADIS16400_DIAG_STAT_FLASH_UPT 2 | ||
111 | #define ADIS16400_DIAG_STAT_POWER_HIGH 1 | ||
112 | #define ADIS16400_DIAG_STAT_POWER_LOW 0 | ||
113 | |||
114 | /* GLOB_CMD */ | ||
115 | #define ADIS16400_GLOB_CMD_SW_RESET (1<<7) | ||
116 | #define ADIS16400_GLOB_CMD_P_AUTO_NULL (1<<4) | ||
117 | #define ADIS16400_GLOB_CMD_FLASH_UPD (1<<3) | ||
118 | #define ADIS16400_GLOB_CMD_DAC_LATCH (1<<2) | ||
119 | #define ADIS16400_GLOB_CMD_FAC_CALIB (1<<1) | ||
120 | #define ADIS16400_GLOB_CMD_AUTO_NULL (1<<0) | ||
121 | |||
122 | /* SLP_CNT */ | ||
123 | #define ADIS16400_SLP_CNT_POWER_OFF (1<<8) | ||
124 | |||
125 | #define ADIS16334_RATE_DIV_SHIFT 8 | ||
126 | #define ADIS16334_RATE_INT_CLK BIT(0) | ||
127 | |||
128 | #define ADIS16400_SPI_SLOW (u32)(300 * 1000) | ||
129 | #define ADIS16400_SPI_BURST (u32)(1000 * 1000) | ||
130 | #define ADIS16400_SPI_FAST (u32)(2000 * 1000) | ||
131 | |||
132 | #define ADIS16400_HAS_PROD_ID BIT(0) | ||
133 | #define ADIS16400_NO_BURST BIT(1) | ||
134 | #define ADIS16400_HAS_SLOW_MODE BIT(2) | ||
135 | |||
136 | struct adis16400_state; | ||
137 | |||
138 | struct adis16400_chip_info { | ||
139 | const struct iio_chan_spec *channels; | ||
140 | const int num_channels; | ||
141 | const long flags; | ||
142 | unsigned int gyro_scale_micro; | ||
143 | unsigned int accel_scale_micro; | ||
144 | int temp_scale_nano; | ||
145 | int temp_offset; | ||
146 | int (*set_freq)(struct adis16400_state *st, unsigned int freq); | ||
147 | int (*get_freq)(struct adis16400_state *st); | ||
148 | }; | ||
149 | |||
150 | /** | ||
151 | * struct adis16400_state - device instance specific data | ||
152 | * @variant: chip variant info | ||
153 | * @filt_int: integer part of requested filter frequency | ||
154 | * @adis: adis device | ||
155 | **/ | ||
156 | struct adis16400_state { | ||
157 | struct adis16400_chip_info *variant; | ||
158 | int filt_int; | ||
159 | |||
160 | struct adis adis; | ||
161 | }; | ||
162 | |||
163 | /* At the moment triggers are only used for ring buffer | ||
164 | * filling. This may change! | ||
165 | */ | ||
166 | |||
167 | enum { | ||
168 | ADIS16400_SCAN_SUPPLY, | ||
169 | ADIS16400_SCAN_GYRO_X, | ||
170 | ADIS16400_SCAN_GYRO_Y, | ||
171 | ADIS16400_SCAN_GYRO_Z, | ||
172 | ADIS16400_SCAN_ACC_X, | ||
173 | ADIS16400_SCAN_ACC_Y, | ||
174 | ADIS16400_SCAN_ACC_Z, | ||
175 | ADIS16400_SCAN_MAGN_X, | ||
176 | ADIS16400_SCAN_MAGN_Y, | ||
177 | ADIS16400_SCAN_MAGN_Z, | ||
178 | ADIS16350_SCAN_TEMP_X, | ||
179 | ADIS16350_SCAN_TEMP_Y, | ||
180 | ADIS16350_SCAN_TEMP_Z, | ||
181 | ADIS16300_SCAN_INCLI_X, | ||
182 | ADIS16300_SCAN_INCLI_Y, | ||
183 | ADIS16400_SCAN_ADC, | ||
184 | }; | ||
185 | |||
186 | #ifdef CONFIG_IIO_BUFFER | ||
187 | |||
188 | ssize_t adis16400_read_data_from_ring(struct device *dev, | ||
189 | struct device_attribute *attr, | ||
190 | char *buf); | ||
191 | |||
192 | |||
193 | int adis16400_update_scan_mode(struct iio_dev *indio_dev, | ||
194 | const unsigned long *scan_mask); | ||
195 | irqreturn_t adis16400_trigger_handler(int irq, void *p); | ||
196 | |||
197 | #else /* CONFIG_IIO_BUFFER */ | ||
198 | |||
199 | #define adis16400_update_scan_mode NULL | ||
200 | #define adis16400_trigger_handler NULL | ||
201 | |||
202 | #endif /* CONFIG_IIO_BUFFER */ | ||
203 | |||
204 | #endif /* SPI_ADIS16400_H_ */ | ||