aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/iio/accel/adis16209_core.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-12-11 16:59:44 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-11 16:59:44 -0500
commit8966961b31c251b854169e9886394c2a20f2cea7 (patch)
tree248a625b23335acbd5ca4b55eb136fe0dc8ba0aa /drivers/staging/iio/accel/adis16209_core.c
parent6a5971d8fea1f4a8c33dfe0cec6a1c490f0c9cde (diff)
parent7bcb57cde66c19df378f3468ea342166a8a4504d (diff)
Merge tag 'staging-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging driver tree merge from Greg Kroah-Hartman: "Here's the big staging tree merge for 3.8-rc1 There's a lot of patches in here, the majority being the comedi rework/cleanup that has been ongoing and is causing a huge reduction in overall code size, which is amazing to watch. We also removed some older drivers (telephony and rts_pstor), and added a new one (fwserial which also came in through the tty tree due to tty api changes, take that one if you get merge conflicts.) The iio and ipack drivers are moving out of the staging area into their own part of the kernel as they have been cleaned up sufficiently and are working well. Overall, again a reduction of code: 768 files changed, 31887 insertions(+), 82166 deletions(-) All of this has been in the linux-next tree for a while. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" * tag 'staging-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (1298 commits) iio: imu: adis16480: remove duplicated include from adis16480.c iio: gyro: adis16136: remove duplicated include from adis16136.c iio:imu: adis16480: show_firmware() buffer too small iio:gyro: adis16136: divide by zero in write_frequency() iio: adc: Add Texas Instruments ADC081C021/027 support iio:ad7793: Add support for the ad7796 and ad7797 iio:ad7793: Add support for the ad7798 and ad7799 staging:iio: Move ad7793 driver out of staging staging:iio:ad7793: Implement stricter id checking staging:iio:ad7793: Move register definitions from header to source staging:iio:ad7793: Rework regulator handling staging:iio:ad7793: Rework platform data staging:iio:ad7793: Use kstrtol instead of strict_strtol staging:iio:ad7793: Use usleep_range instead of msleep staging:iio:ad7793: Fix temperature scale staging:iio:ad7793: Fix VDD monitor scale staging: gdm72xx: unlock on error in init_usb() staging: panel: pass correct lengths to keypad_send_key() staging: comedi: addi_apci_2032: fix interrupt support staging: comedi: addi_apci_2032: move i_APCI2032_ConfigDigitalOutput() ...
Diffstat (limited to 'drivers/staging/iio/accel/adis16209_core.c')
-rw-r--r--drivers/staging/iio/accel/adis16209_core.c496
1 files changed, 72 insertions, 424 deletions
diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c
index 7ee974b45d7..69c50ee44ce 100644
--- a/drivers/staging/iio/accel/adis16209_core.c
+++ b/drivers/staging/iio/accel/adis16209_core.c
@@ -19,262 +19,19 @@
19#include <linux/iio/iio.h> 19#include <linux/iio/iio.h>
20#include <linux/iio/sysfs.h> 20#include <linux/iio/sysfs.h>
21#include <linux/iio/buffer.h> 21#include <linux/iio/buffer.h>
22#include <linux/iio/imu/adis.h>
22 23
23#include "adis16209.h" 24#include "adis16209.h"
24 25
25#define DRIVER_NAME "adis16209" 26static const u8 adis16209_addresses[8][1] = {
26 27 [ADIS16209_SCAN_SUPPLY] = { },
27/** 28 [ADIS16209_SCAN_AUX_ADC] = { },
28 * adis16209_spi_write_reg_8() - write single byte to a register 29 [ADIS16209_SCAN_ACC_X] = { ADIS16209_XACCL_NULL },
29 * @indio_dev: iio device associated with actual device 30 [ADIS16209_SCAN_ACC_Y] = { ADIS16209_YACCL_NULL },
30 * @reg_address: the address of the register to be written 31 [ADIS16209_SCAN_INCLI_X] = { ADIS16209_XINCL_NULL },
31 * @val: the value to write 32 [ADIS16209_SCAN_INCLI_Y] = { ADIS16209_YINCL_NULL },
32 **/ 33 [ADIS16209_SCAN_ROT] = { },
33static int adis16209_spi_write_reg_8(struct iio_dev *indio_dev, 34 [ADIS16209_SCAN_TEMP] = { },
34 u8 reg_address,
35 u8 val)
36{
37 int ret;
38 struct adis16209_state *st = iio_priv(indio_dev);
39
40 mutex_lock(&st->buf_lock);
41 st->tx[0] = ADIS16209_WRITE_REG(reg_address);
42 st->tx[1] = val;
43
44 ret = spi_write(st->us, st->tx, 2);
45 mutex_unlock(&st->buf_lock);
46
47 return ret;
48}
49
50/**
51 * adis16209_spi_write_reg_16() - write 2 bytes to a pair of registers
52 * @indio_dev: iio device associated actual device
53 * @reg_address: the address of the lower of the two registers. Second register
54 * is assumed to have address one greater.
55 * @val: value to be written
56 **/
57static int adis16209_spi_write_reg_16(struct iio_dev *indio_dev,
58 u8 lower_reg_address,
59 u16 value)
60{
61 int ret;
62 struct spi_message msg;
63 struct adis16209_state *st = iio_priv(indio_dev);
64 struct spi_transfer xfers[] = {
65 {
66 .tx_buf = st->tx,
67 .bits_per_word = 8,
68 .len = 2,
69 .cs_change = 1,
70 .delay_usecs = 30,
71 }, {
72 .tx_buf = st->tx + 2,
73 .bits_per_word = 8,
74 .len = 2,
75 .delay_usecs = 30,
76 },
77 };
78
79 mutex_lock(&st->buf_lock);
80 st->tx[0] = ADIS16209_WRITE_REG(lower_reg_address);
81 st->tx[1] = value & 0xFF;
82 st->tx[2] = ADIS16209_WRITE_REG(lower_reg_address + 1);
83 st->tx[3] = (value >> 8) & 0xFF;
84
85 spi_message_init(&msg);
86 spi_message_add_tail(&xfers[0], &msg);
87 spi_message_add_tail(&xfers[1], &msg);
88 ret = spi_sync(st->us, &msg);
89 mutex_unlock(&st->buf_lock);
90
91 return ret;
92}
93
94/**
95 * adis16209_spi_read_reg_16() - read 2 bytes from a 16-bit register
96 * @indio_dev: iio device associated with device
97 * @reg_address: the address of the lower of the two registers. Second register
98 * is assumed to have address one greater.
99 * @val: somewhere to pass back the value read
100 **/
101static int adis16209_spi_read_reg_16(struct iio_dev *indio_dev,
102 u8 lower_reg_address,
103 u16 *val)
104{
105 struct spi_message msg;
106 struct adis16209_state *st = iio_priv(indio_dev);
107 int ret;
108 struct spi_transfer xfers[] = {
109 {
110 .tx_buf = st->tx,
111 .bits_per_word = 8,
112 .len = 2,
113 .cs_change = 1,
114 .delay_usecs = 30,
115 }, {
116 .rx_buf = st->rx,
117 .bits_per_word = 8,
118 .len = 2,
119 .delay_usecs = 30,
120 },
121 };
122
123 mutex_lock(&st->buf_lock);
124 st->tx[0] = ADIS16209_READ_REG(lower_reg_address);
125 st->tx[1] = 0;
126
127 spi_message_init(&msg);
128 spi_message_add_tail(&xfers[0], &msg);
129 spi_message_add_tail(&xfers[1], &msg);
130 ret = spi_sync(st->us, &msg);
131 if (ret) {
132 dev_err(&st->us->dev,
133 "problem when reading 16 bit register 0x%02X",
134 lower_reg_address);
135 goto error_ret;
136 }
137 *val = (st->rx[0] << 8) | st->rx[1];
138
139error_ret:
140 mutex_unlock(&st->buf_lock);
141 return ret;
142}
143
144static int adis16209_reset(struct iio_dev *indio_dev)
145{
146 int ret;
147 ret = adis16209_spi_write_reg_8(indio_dev,
148 ADIS16209_GLOB_CMD,
149 ADIS16209_GLOB_CMD_SW_RESET);
150 if (ret)
151 dev_err(&indio_dev->dev, "problem resetting device");
152
153 return ret;
154}
155
156int adis16209_set_irq(struct iio_dev *indio_dev, bool enable)
157{
158 int ret = 0;
159 u16 msc;
160
161 ret = adis16209_spi_read_reg_16(indio_dev, ADIS16209_MSC_CTRL, &msc);
162 if (ret)
163 goto error_ret;
164
165 msc |= ADIS16209_MSC_CTRL_ACTIVE_HIGH;
166 msc &= ~ADIS16209_MSC_CTRL_DATA_RDY_DIO2;
167 if (enable)
168 msc |= ADIS16209_MSC_CTRL_DATA_RDY_EN;
169 else
170 msc &= ~ADIS16209_MSC_CTRL_DATA_RDY_EN;
171
172 ret = adis16209_spi_write_reg_16(indio_dev, ADIS16209_MSC_CTRL, msc);
173
174error_ret:
175 return ret;
176}
177
178static int adis16209_check_status(struct iio_dev *indio_dev)
179{
180 u16 status;
181 int ret;
182
183 ret = adis16209_spi_read_reg_16(indio_dev,
184 ADIS16209_DIAG_STAT, &status);
185 if (ret < 0) {
186 dev_err(&indio_dev->dev, "Reading status failed\n");
187 goto error_ret;
188 }
189 ret = status & 0x1F;
190
191 if (status & ADIS16209_DIAG_STAT_SELFTEST_FAIL)
192 dev_err(&indio_dev->dev, "Self test failure\n");
193 if (status & ADIS16209_DIAG_STAT_SPI_FAIL)
194 dev_err(&indio_dev->dev, "SPI failure\n");
195 if (status & ADIS16209_DIAG_STAT_FLASH_UPT)
196 dev_err(&indio_dev->dev, "Flash update failed\n");
197 if (status & ADIS16209_DIAG_STAT_POWER_HIGH)
198 dev_err(&indio_dev->dev, "Power supply above 3.625V\n");
199 if (status & ADIS16209_DIAG_STAT_POWER_LOW)
200 dev_err(&indio_dev->dev, "Power supply below 3.15V\n");
201
202error_ret:
203 return ret;
204}
205
206static int adis16209_self_test(struct iio_dev *indio_dev)
207{
208 int ret;
209 ret = adis16209_spi_write_reg_16(indio_dev,
210 ADIS16209_MSC_CTRL,
211 ADIS16209_MSC_CTRL_SELF_TEST_EN);
212 if (ret) {
213 dev_err(&indio_dev->dev, "problem starting self test");
214 goto err_ret;
215 }
216
217 adis16209_check_status(indio_dev);
218
219err_ret:
220 return ret;
221}
222
223static int adis16209_initial_setup(struct iio_dev *indio_dev)
224{
225 int ret;
226
227 /* Disable IRQ */
228 ret = adis16209_set_irq(indio_dev, false);
229 if (ret) {
230 dev_err(&indio_dev->dev, "disable irq failed");
231 goto err_ret;
232 }
233
234 /* Do self test */
235 ret = adis16209_self_test(indio_dev);
236 if (ret) {
237 dev_err(&indio_dev->dev, "self test failure");
238 goto err_ret;
239 }
240
241 /* Read status register to check the result */
242 ret = adis16209_check_status(indio_dev);
243 if (ret) {
244 adis16209_reset(indio_dev);
245 dev_err(&indio_dev->dev, "device not playing ball -> reset");
246 msleep(ADIS16209_STARTUP_DELAY);
247 ret = adis16209_check_status(indio_dev);
248 if (ret) {
249 dev_err(&indio_dev->dev, "giving up");
250 goto err_ret;
251 }
252 }
253
254err_ret:
255 return ret;
256}
257
258enum adis16209_chan {
259 in_supply,
260 temp,
261 accel_x,
262 accel_y,
263 incli_x,
264 incli_y,
265 in_aux,
266 rot,
267};
268
269static const u8 adis16209_addresses[8][2] = {
270 [in_supply] = { ADIS16209_SUPPLY_OUT },
271 [in_aux] = { ADIS16209_AUX_ADC },
272 [accel_x] = { ADIS16209_XACCL_OUT, ADIS16209_XACCL_NULL },
273 [accel_y] = { ADIS16209_YACCL_OUT, ADIS16209_YACCL_NULL },
274 [incli_x] = { ADIS16209_XINCL_OUT, ADIS16209_XINCL_NULL },
275 [incli_y] = { ADIS16209_YINCL_OUT, ADIS16209_YINCL_NULL },
276 [rot] = { ADIS16209_ROT_OUT },
277 [temp] = { ADIS16209_TEMP_OUT },
278}; 35};
279 36
280static int adis16209_write_raw(struct iio_dev *indio_dev, 37static int adis16209_write_raw(struct iio_dev *indio_dev,
@@ -283,6 +40,7 @@ static int adis16209_write_raw(struct iio_dev *indio_dev,
283 int val2, 40 int val2,
284 long mask) 41 long mask)
285{ 42{
43 struct adis *st = iio_priv(indio_dev);
286 int bits; 44 int bits;
287 s16 val16; 45 s16 val16;
288 u8 addr; 46 u8 addr;
@@ -295,10 +53,10 @@ static int adis16209_write_raw(struct iio_dev *indio_dev,
295 break; 53 break;
296 default: 54 default:
297 return -EINVAL; 55 return -EINVAL;
298 }; 56 }
299 val16 = val & ((1 << bits) - 1); 57 val16 = val & ((1 << bits) - 1);
300 addr = adis16209_addresses[chan->address][1]; 58 addr = adis16209_addresses[chan->scan_index][0];
301 return adis16209_spi_write_reg_16(indio_dev, addr, val16); 59 return adis_write_reg_16(st, addr, val16);
302 } 60 }
303 return -EINVAL; 61 return -EINVAL;
304} 62}
@@ -308,6 +66,7 @@ static int adis16209_read_raw(struct iio_dev *indio_dev,
308 int *val, int *val2, 66 int *val, int *val2,
309 long mask) 67 long mask)
310{ 68{
69 struct adis *st = iio_priv(indio_dev);
311 int ret; 70 int ret;
312 int bits; 71 int bits;
313 u8 addr; 72 u8 addr;
@@ -315,29 +74,8 @@ static int adis16209_read_raw(struct iio_dev *indio_dev,
315 74
316 switch (mask) { 75 switch (mask) {
317 case IIO_CHAN_INFO_RAW: 76 case IIO_CHAN_INFO_RAW:
318 mutex_lock(&indio_dev->mlock); 77 return adis_single_conversion(indio_dev, chan,
319 addr = adis16209_addresses[chan->address][0]; 78 ADIS16209_ERROR_ACTIVE, val);
320 ret = adis16209_spi_read_reg_16(indio_dev, addr, &val16);
321 if (ret) {
322 mutex_unlock(&indio_dev->mlock);
323 return ret;
324 }
325
326 if (val16 & ADIS16209_ERROR_ACTIVE) {
327 ret = adis16209_check_status(indio_dev);
328 if (ret) {
329 mutex_unlock(&indio_dev->mlock);
330 return ret;
331 }
332 }
333 val16 = val16 & ((1 << chan->scan_type.realbits) - 1);
334 if (chan->scan_type.sign == 's')
335 val16 = (s16)(val16 <<
336 (16 - chan->scan_type.realbits)) >>
337 (16 - chan->scan_type.realbits);
338 *val = val16;
339 mutex_unlock(&indio_dev->mlock);
340 return IIO_VAL_INT;
341 case IIO_CHAN_INFO_SCALE: 79 case IIO_CHAN_INFO_SCALE:
342 switch (chan->type) { 80 switch (chan->type) {
343 case IIO_VOLTAGE: 81 case IIO_VOLTAGE:
@@ -374,10 +112,10 @@ static int adis16209_read_raw(struct iio_dev *indio_dev,
374 break; 112 break;
375 default: 113 default:
376 return -EINVAL; 114 return -EINVAL;
377 }; 115 }
378 mutex_lock(&indio_dev->mlock); 116 mutex_lock(&indio_dev->mlock);
379 addr = adis16209_addresses[chan->address][1]; 117 addr = adis16209_addresses[chan->scan_index][0];
380 ret = adis16209_spi_read_reg_16(indio_dev, addr, &val16); 118 ret = adis_read_reg_16(st, addr, &val16);
381 if (ret) { 119 if (ret) {
382 mutex_unlock(&indio_dev->mlock); 120 mutex_unlock(&indio_dev->mlock);
383 return ret; 121 return ret;
@@ -392,128 +130,56 @@ static int adis16209_read_raw(struct iio_dev *indio_dev,
392} 130}
393 131
394static const struct iio_chan_spec adis16209_channels[] = { 132static const struct iio_chan_spec adis16209_channels[] = {
395 { 133 ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT, ADIS16209_SCAN_SUPPLY, 14),
396 .type = IIO_VOLTAGE, 134 ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT, ADIS16209_SCAN_TEMP, 12),
397 .indexed = 1, 135 ADIS_ACCEL_CHAN(X, ADIS16209_XACCL_OUT, ADIS16209_SCAN_ACC_X,
398 .channel = 0, 136 IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT, 14),
399 .extend_name = "supply", 137 ADIS_ACCEL_CHAN(Y, ADIS16209_YACCL_OUT, ADIS16209_SCAN_ACC_Y,
400 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | 138 IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT, 14),
401 IIO_CHAN_INFO_SCALE_SEPARATE_BIT, 139 ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC, ADIS16209_SCAN_AUX_ADC, 12),
402 .address = in_supply, 140 ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT, ADIS16209_SCAN_INCLI_X, 0, 14),
403 .scan_index = ADIS16209_SCAN_SUPPLY, 141 ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT, ADIS16209_SCAN_INCLI_Y, 0, 14),
404 .scan_type = { 142 ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT, ADIS16209_SCAN_ROT, 0, 14),
405 .sign = 'u',
406 .realbits = 14,
407 .storagebits = 16,
408 },
409 }, {
410 .type = IIO_TEMP,
411 .indexed = 0,
412 .channel = 0,
413 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
414 IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
415 IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
416 .address = temp,
417 .scan_index = ADIS16209_SCAN_TEMP,
418 .scan_type = {
419 .sign = 'u',
420 .realbits = 12,
421 .storagebits = 16,
422 },
423 }, {
424 .type = IIO_ACCEL,
425 .modified = 1,
426 .channel2 = IIO_MOD_X,
427 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
428 IIO_CHAN_INFO_SCALE_SHARED_BIT |
429 IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
430 .address = accel_x,
431 .scan_index = ADIS16209_SCAN_ACC_X,
432 .scan_type = {
433 .sign = 's',
434 .realbits = 14,
435 .storagebits = 16,
436 },
437 }, {
438 .type = IIO_ACCEL,
439 .modified = 1,
440 .channel2 = IIO_MOD_Y,
441 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
442 IIO_CHAN_INFO_SCALE_SHARED_BIT |
443 IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
444 .address = accel_y,
445 .scan_index = ADIS16209_SCAN_ACC_Y,
446 .scan_type = {
447 .sign = 's',
448 .realbits = 14,
449 .storagebits = 16,
450 },
451 }, {
452 .type = IIO_VOLTAGE,
453 .indexed = 1,
454 .channel = 1,
455 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
456 IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
457 .address = in_aux,
458 .scan_index = ADIS16209_SCAN_AUX_ADC,
459 .scan_type = {
460 .sign = 'u',
461 .realbits = 12,
462 .storagebits = 16,
463 },
464 }, {
465 .type = IIO_INCLI,
466 .modified = 1,
467 .channel2 = IIO_MOD_X,
468 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
469 IIO_CHAN_INFO_SCALE_SHARED_BIT,
470 .address = incli_x,
471 .scan_index = ADIS16209_SCAN_INCLI_X,
472 .scan_type = {
473 .sign = 's',
474 .realbits = 14,
475 .storagebits = 16,
476 },
477 }, {
478 .type = IIO_INCLI,
479 .modified = 1,
480 .channel2 = IIO_MOD_Y,
481 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
482 IIO_CHAN_INFO_SCALE_SHARED_BIT,
483 .address = incli_y,
484 .scan_index = ADIS16209_SCAN_INCLI_Y,
485 .scan_type = {
486 .sign = 's',
487 .realbits = 14,
488 .storagebits = 16,
489 },
490 }, {
491 .type = IIO_ROT,
492 .modified = 1,
493 .channel2 = IIO_MOD_X,
494 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
495 IIO_CHAN_INFO_SCALE_SHARED_BIT,
496 .address = rot,
497 .scan_index = ADIS16209_SCAN_ROT,
498 .scan_type = {
499 .sign = 's',
500 .realbits = 14,
501 .storagebits = 16,
502 },
503 },
504 IIO_CHAN_SOFT_TIMESTAMP(8) 143 IIO_CHAN_SOFT_TIMESTAMP(8)
505}; 144};
506 145
507static const struct iio_info adis16209_info = { 146static const struct iio_info adis16209_info = {
508 .read_raw = &adis16209_read_raw, 147 .read_raw = &adis16209_read_raw,
509 .write_raw = &adis16209_write_raw, 148 .write_raw = &adis16209_write_raw,
149 .update_scan_mode = adis_update_scan_mode,
510 .driver_module = THIS_MODULE, 150 .driver_module = THIS_MODULE,
511}; 151};
512 152
513static int __devinit adis16209_probe(struct spi_device *spi) 153static const char * const adis16209_status_error_msgs[] = {
154 [ADIS16209_DIAG_STAT_SELFTEST_FAIL_BIT] = "Self test failure",
155 [ADIS16209_DIAG_STAT_SPI_FAIL_BIT] = "SPI failure",
156 [ADIS16209_DIAG_STAT_FLASH_UPT_BIT] = "Flash update failed",
157 [ADIS16209_DIAG_STAT_POWER_HIGH_BIT] = "Power supply above 3.625V",
158 [ADIS16209_DIAG_STAT_POWER_LOW_BIT] = "Power supply below 3.15V",
159};
160
161static const struct adis_data adis16209_data = {
162 .read_delay = 30,
163 .msc_ctrl_reg = ADIS16209_MSC_CTRL,
164 .glob_cmd_reg = ADIS16209_GLOB_CMD,
165 .diag_stat_reg = ADIS16209_DIAG_STAT,
166
167 .self_test_mask = ADIS16209_MSC_CTRL_SELF_TEST_EN,
168 .startup_delay = ADIS16209_STARTUP_DELAY,
169
170 .status_error_msgs = adis16209_status_error_msgs,
171 .status_error_mask = BIT(ADIS16209_DIAG_STAT_SELFTEST_FAIL_BIT) |
172 BIT(ADIS16209_DIAG_STAT_SPI_FAIL_BIT) |
173 BIT(ADIS16209_DIAG_STAT_FLASH_UPT_BIT) |
174 BIT(ADIS16209_DIAG_STAT_POWER_HIGH_BIT) |
175 BIT(ADIS16209_DIAG_STAT_POWER_LOW_BIT),
176};
177
178
179static int adis16209_probe(struct spi_device *spi)
514{ 180{
515 int ret; 181 int ret;
516 struct adis16209_state *st; 182 struct adis *st;
517 struct iio_dev *indio_dev; 183 struct iio_dev *indio_dev;
518 184
519 /* setup the industrialio driver allocated elements */ 185 /* setup the industrialio driver allocated elements */
@@ -525,8 +191,6 @@ static int __devinit adis16209_probe(struct spi_device *spi)
525 st = iio_priv(indio_dev); 191 st = iio_priv(indio_dev);
526 /* this is only used for removal purposes */ 192 /* this is only used for removal purposes */
527 spi_set_drvdata(spi, indio_dev); 193 spi_set_drvdata(spi, indio_dev);
528 st->us = spi;
529 mutex_init(&st->buf_lock);
530 194
531 indio_dev->name = spi->dev.driver->name; 195 indio_dev->name = spi->dev.driver->name;
532 indio_dev->dev.parent = &spi->dev; 196 indio_dev->dev.parent = &spi->dev;
@@ -535,54 +199,38 @@ static int __devinit adis16209_probe(struct spi_device *spi)
535 indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); 199 indio_dev->num_channels = ARRAY_SIZE(adis16209_channels);
536 indio_dev->modes = INDIO_DIRECT_MODE; 200 indio_dev->modes = INDIO_DIRECT_MODE;
537 201
538 ret = adis16209_configure_ring(indio_dev); 202 ret = adis_init(st, indio_dev, spi, &adis16209_data);
203 if (ret)
204 goto error_free_dev;
205 ret = adis_setup_buffer_and_trigger(st, indio_dev, NULL);
539 if (ret) 206 if (ret)
540 goto error_free_dev; 207 goto error_free_dev;
541
542 ret = iio_buffer_register(indio_dev,
543 adis16209_channels,
544 ARRAY_SIZE(adis16209_channels));
545 if (ret) {
546 printk(KERN_ERR "failed to initialize the ring\n");
547 goto error_unreg_ring_funcs;
548 }
549
550 if (spi->irq) {
551 ret = adis16209_probe_trigger(indio_dev);
552 if (ret)
553 goto error_uninitialize_ring;
554 }
555 208
556 /* Get the device into a sane initial state */ 209 /* Get the device into a sane initial state */
557 ret = adis16209_initial_setup(indio_dev); 210 ret = adis_initial_startup(st);
558 if (ret) 211 if (ret)
559 goto error_remove_trigger; 212 goto error_cleanup_buffer_trigger;
560 ret = iio_device_register(indio_dev); 213 ret = iio_device_register(indio_dev);
561 if (ret) 214 if (ret)
562 goto error_remove_trigger; 215 goto error_cleanup_buffer_trigger;
563 216
564 return 0; 217 return 0;
565 218
566error_remove_trigger: 219error_cleanup_buffer_trigger:
567 adis16209_remove_trigger(indio_dev); 220 adis_cleanup_buffer_and_trigger(st, indio_dev);
568error_uninitialize_ring:
569 iio_buffer_unregister(indio_dev);
570error_unreg_ring_funcs:
571 adis16209_unconfigure_ring(indio_dev);
572error_free_dev: 221error_free_dev:
573 iio_device_free(indio_dev); 222 iio_device_free(indio_dev);
574error_ret: 223error_ret:
575 return ret; 224 return ret;
576} 225}
577 226
578static int __devexit adis16209_remove(struct spi_device *spi) 227static int adis16209_remove(struct spi_device *spi)
579{ 228{
580 struct iio_dev *indio_dev = spi_get_drvdata(spi); 229 struct iio_dev *indio_dev = spi_get_drvdata(spi);
230 struct adis *st = iio_priv(indio_dev);
581 231
582 iio_device_unregister(indio_dev); 232 iio_device_unregister(indio_dev);
583 adis16209_remove_trigger(indio_dev); 233 adis_cleanup_buffer_and_trigger(st, indio_dev);
584 iio_buffer_unregister(indio_dev);
585 adis16209_unconfigure_ring(indio_dev);
586 iio_device_free(indio_dev); 234 iio_device_free(indio_dev);
587 235
588 return 0; 236 return 0;
@@ -594,7 +242,7 @@ static struct spi_driver adis16209_driver = {
594 .owner = THIS_MODULE, 242 .owner = THIS_MODULE,
595 }, 243 },
596 .probe = adis16209_probe, 244 .probe = adis16209_probe,
597 .remove = __devexit_p(adis16209_remove), 245 .remove = adis16209_remove,
598}; 246};
599module_spi_driver(adis16209_driver); 247module_spi_driver(adis16209_driver);
600 248