]> Pileus Git - ~andy/linux/blob - drivers/staging/iio/gyro/adis16260_core.c
drivers/staging/iio: Remove unnecessary semicolon
[~andy/linux] / drivers / staging / iio / gyro / adis16260_core.c
1 /*
2  * ADIS16260/ADIS16265 Programmable Digital Gyroscope Sensor Driver
3  *
4  * Copyright 2010 Analog Devices Inc.
5  *
6  * Licensed under the GPL-2 or later.
7  */
8
9 #include <linux/interrupt.h>
10 #include <linux/irq.h>
11 #include <linux/delay.h>
12 #include <linux/mutex.h>
13 #include <linux/device.h>
14 #include <linux/kernel.h>
15 #include <linux/spi/spi.h>
16 #include <linux/slab.h>
17 #include <linux/sysfs.h>
18 #include <linux/list.h>
19 #include <linux/module.h>
20
21 #include <linux/iio/iio.h>
22 #include <linux/iio/sysfs.h>
23 #include <linux/iio/buffer.h>
24
25 #include "adis16260.h"
26
27 #define DRIVER_NAME             "adis16260"
28
29 static int adis16260_check_status(struct iio_dev *indio_dev);
30
31 /**
32  * adis16260_spi_write_reg_8() - write single byte to a register
33  * @indio_dev: iio_dev for the device
34  * @reg_address: the address of the register to be written
35  * @val: the value to write
36  **/
37 static int adis16260_spi_write_reg_8(struct iio_dev *indio_dev,
38                 u8 reg_address,
39                 u8 val)
40 {
41         int ret;
42         struct adis16260_state *st = iio_priv(indio_dev);
43
44         mutex_lock(&st->buf_lock);
45         st->tx[0] = ADIS16260_WRITE_REG(reg_address);
46         st->tx[1] = val;
47
48         ret = spi_write(st->us, st->tx, 2);
49         mutex_unlock(&st->buf_lock);
50
51         return ret;
52 }
53
54 /**
55  * adis16260_spi_write_reg_16() - write 2 bytes to a pair of registers
56  * @indio_dev: iio_dev for the device
57  * @reg_address: the address of the lower of the two registers. Second register
58  *               is assumed to have address one greater.
59  * @val: value to be written
60  **/
61 static int adis16260_spi_write_reg_16(struct iio_dev *indio_dev,
62                 u8 lower_reg_address,
63                 u16 value)
64 {
65         int ret;
66         struct spi_message msg;
67         struct adis16260_state *st = iio_priv(indio_dev);
68         struct spi_transfer xfers[] = {
69                 {
70                         .tx_buf = st->tx,
71                         .bits_per_word = 8,
72                         .len = 2,
73                         .cs_change = 1,
74                         .delay_usecs = 20,
75                 }, {
76                         .tx_buf = st->tx + 2,
77                         .bits_per_word = 8,
78                         .len = 2,
79                         .delay_usecs = 20,
80                 },
81         };
82
83         mutex_lock(&st->buf_lock);
84         st->tx[0] = ADIS16260_WRITE_REG(lower_reg_address);
85         st->tx[1] = value & 0xFF;
86         st->tx[2] = ADIS16260_WRITE_REG(lower_reg_address + 1);
87         st->tx[3] = (value >> 8) & 0xFF;
88
89         spi_message_init(&msg);
90         spi_message_add_tail(&xfers[0], &msg);
91         spi_message_add_tail(&xfers[1], &msg);
92         ret = spi_sync(st->us, &msg);
93         mutex_unlock(&st->buf_lock);
94
95         return ret;
96 }
97
98 /**
99  * adis16260_spi_read_reg_16() - read 2 bytes from a 16-bit register
100  * @indio_dev: iio_dev for the device
101  * @reg_address: the address of the lower of the two registers. Second register
102  *               is assumed to have address one greater.
103  * @val: somewhere to pass back the value read
104  **/
105 static int adis16260_spi_read_reg_16(struct iio_dev *indio_dev,
106                 u8 lower_reg_address,
107                 u16 *val)
108 {
109         struct spi_message msg;
110         struct adis16260_state *st = iio_priv(indio_dev);
111         int ret;
112         struct spi_transfer xfers[] = {
113                 {
114                         .tx_buf = st->tx,
115                         .bits_per_word = 8,
116                         .len = 2,
117                         .cs_change = 1,
118                         .delay_usecs = 30,
119                 }, {
120                         .rx_buf = st->rx,
121                         .bits_per_word = 8,
122                         .len = 2,
123                         .delay_usecs = 30,
124                 },
125         };
126
127         mutex_lock(&st->buf_lock);
128         st->tx[0] = ADIS16260_READ_REG(lower_reg_address);
129         st->tx[1] = 0;
130
131         spi_message_init(&msg);
132         spi_message_add_tail(&xfers[0], &msg);
133         spi_message_add_tail(&xfers[1], &msg);
134         ret = spi_sync(st->us, &msg);
135         if (ret) {
136                 dev_err(&st->us->dev,
137                         "problem when reading 16 bit register 0x%02X",
138                         lower_reg_address);
139                 goto error_ret;
140         }
141         *val = (st->rx[0] << 8) | st->rx[1];
142
143 error_ret:
144         mutex_unlock(&st->buf_lock);
145         return ret;
146 }
147
148 static ssize_t adis16260_read_frequency_available(struct device *dev,
149                                                   struct device_attribute *attr,
150                                                   char *buf)
151 {
152         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
153         struct adis16260_state *st = iio_priv(indio_dev);
154         if (spi_get_device_id(st->us)->driver_data)
155                 return sprintf(buf, "%s\n", "0.129 ~ 256");
156         else
157                 return sprintf(buf, "%s\n", "256 2048");
158 }
159
160 static ssize_t adis16260_read_frequency(struct device *dev,
161                 struct device_attribute *attr,
162                 char *buf)
163 {
164         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
165         struct adis16260_state *st = iio_priv(indio_dev);
166         int ret, len = 0;
167         u16 t;
168         int sps;
169         ret = adis16260_spi_read_reg_16(indio_dev,
170                         ADIS16260_SMPL_PRD,
171                         &t);
172         if (ret)
173                 return ret;
174
175         if (spi_get_device_id(st->us)->driver_data) /* If an adis16251 */
176                 sps =  (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 8 : 256;
177         else
178                 sps =  (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048;
179         sps /= (t & ADIS16260_SMPL_PRD_DIV_MASK) + 1;
180         len = sprintf(buf, "%d SPS\n", sps);
181         return len;
182 }
183
184 static ssize_t adis16260_write_frequency(struct device *dev,
185                 struct device_attribute *attr,
186                 const char *buf,
187                 size_t len)
188 {
189         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
190         struct adis16260_state *st = iio_priv(indio_dev);
191         long val;
192         int ret;
193         u8 t;
194
195         ret = strict_strtol(buf, 10, &val);
196         if (ret)
197                 return ret;
198         if (val == 0)
199                 return -EINVAL;
200
201         mutex_lock(&indio_dev->mlock);
202         if (spi_get_device_id(st->us)) {
203                 t = (256 / val);
204                 if (t > 0)
205                         t--;
206                 t &= ADIS16260_SMPL_PRD_DIV_MASK;
207         } else {
208                 t = (2048 / val);
209                 if (t > 0)
210                         t--;
211                 t &= ADIS16260_SMPL_PRD_DIV_MASK;
212         }
213         if ((t & ADIS16260_SMPL_PRD_DIV_MASK) >= 0x0A)
214                 st->us->max_speed_hz = ADIS16260_SPI_SLOW;
215         else
216                 st->us->max_speed_hz = ADIS16260_SPI_FAST;
217         ret = adis16260_spi_write_reg_8(indio_dev,
218                         ADIS16260_SMPL_PRD,
219                         t);
220
221         mutex_unlock(&indio_dev->mlock);
222
223         return ret ? ret : len;
224 }
225
226 static int adis16260_reset(struct iio_dev *indio_dev)
227 {
228         int ret;
229         ret = adis16260_spi_write_reg_8(indio_dev,
230                         ADIS16260_GLOB_CMD,
231                         ADIS16260_GLOB_CMD_SW_RESET);
232         if (ret)
233                 dev_err(&indio_dev->dev, "problem resetting device");
234
235         return ret;
236 }
237
238 int adis16260_set_irq(struct iio_dev *indio_dev, bool enable)
239 {
240         int ret;
241         u16 msc;
242         ret = adis16260_spi_read_reg_16(indio_dev, ADIS16260_MSC_CTRL, &msc);
243         if (ret)
244                 goto error_ret;
245
246         msc |= ADIS16260_MSC_CTRL_DATA_RDY_POL_HIGH;
247         if (enable)
248                 msc |= ADIS16260_MSC_CTRL_DATA_RDY_EN;
249         else
250                 msc &= ~ADIS16260_MSC_CTRL_DATA_RDY_EN;
251
252         ret = adis16260_spi_write_reg_16(indio_dev, ADIS16260_MSC_CTRL, msc);
253         if (ret)
254                 goto error_ret;
255
256 error_ret:
257         return ret;
258 }
259
260 /* Power down the device */
261 static int adis16260_stop_device(struct iio_dev *indio_dev)
262 {
263         int ret;
264         u16 val = ADIS16260_SLP_CNT_POWER_OFF;
265
266         ret = adis16260_spi_write_reg_16(indio_dev, ADIS16260_SLP_CNT, val);
267         if (ret)
268                 dev_err(&indio_dev->dev, "problem with turning device off: SLP_CNT");
269
270         return ret;
271 }
272
273 static int adis16260_self_test(struct iio_dev *indio_dev)
274 {
275         int ret;
276         ret = adis16260_spi_write_reg_16(indio_dev,
277                         ADIS16260_MSC_CTRL,
278                         ADIS16260_MSC_CTRL_MEM_TEST);
279         if (ret) {
280                 dev_err(&indio_dev->dev, "problem starting self test");
281                 goto err_ret;
282         }
283
284         adis16260_check_status(indio_dev);
285
286 err_ret:
287         return ret;
288 }
289
290 static int adis16260_check_status(struct iio_dev *indio_dev)
291 {
292         u16 status;
293         int ret;
294         struct device *dev = &indio_dev->dev;
295
296         ret = adis16260_spi_read_reg_16(indio_dev,
297                                         ADIS16260_DIAG_STAT,
298                                         &status);
299
300         if (ret < 0) {
301                 dev_err(dev, "Reading status failed\n");
302                 goto error_ret;
303         }
304         ret = status & 0x7F;
305         if (status & ADIS16260_DIAG_STAT_FLASH_CHK)
306                 dev_err(dev, "Flash checksum error\n");
307         if (status & ADIS16260_DIAG_STAT_SELF_TEST)
308                 dev_err(dev, "Self test error\n");
309         if (status & ADIS16260_DIAG_STAT_OVERFLOW)
310                 dev_err(dev, "Sensor overrange\n");
311         if (status & ADIS16260_DIAG_STAT_SPI_FAIL)
312                 dev_err(dev, "SPI failure\n");
313         if (status & ADIS16260_DIAG_STAT_FLASH_UPT)
314                 dev_err(dev, "Flash update failed\n");
315         if (status & ADIS16260_DIAG_STAT_POWER_HIGH)
316                 dev_err(dev, "Power supply above 5.25V\n");
317         if (status & ADIS16260_DIAG_STAT_POWER_LOW)
318                 dev_err(dev, "Power supply below 4.75V\n");
319
320 error_ret:
321         return ret;
322 }
323
324 static int adis16260_initial_setup(struct iio_dev *indio_dev)
325 {
326         int ret;
327         struct device *dev = &indio_dev->dev;
328
329         /* Disable IRQ */
330         ret = adis16260_set_irq(indio_dev, false);
331         if (ret) {
332                 dev_err(dev, "disable irq failed");
333                 goto err_ret;
334         }
335
336         /* Do self test */
337         ret = adis16260_self_test(indio_dev);
338         if (ret) {
339                 dev_err(dev, "self test failure");
340                 goto err_ret;
341         }
342
343         /* Read status register to check the result */
344         ret = adis16260_check_status(indio_dev);
345         if (ret) {
346                 adis16260_reset(indio_dev);
347                 dev_err(dev, "device not playing ball -> reset");
348                 msleep(ADIS16260_STARTUP_DELAY);
349                 ret = adis16260_check_status(indio_dev);
350                 if (ret) {
351                         dev_err(dev, "giving up");
352                         goto err_ret;
353                 }
354         }
355
356 err_ret:
357         return ret;
358 }
359
360 static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
361                 adis16260_read_frequency,
362                 adis16260_write_frequency);
363
364 static IIO_DEVICE_ATTR(sampling_frequency_available,
365                        S_IRUGO, adis16260_read_frequency_available, NULL, 0);
366
367 enum adis16260_channel {
368         gyro,
369         temp,
370         in_supply,
371         in_aux,
372         angle,
373 };
374 #define ADIS16260_GYRO_CHANNEL_SET(axis, mod)                           \
375         struct iio_chan_spec adis16260_channels_##axis[] = {            \
376                 {                                                       \
377                         .type = IIO_ANGL_VEL,                           \
378                         .modified = 1,                                  \
379                         .channel2 = mod,                                \
380                         .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |   \
381                         IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT |          \
382                         IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT |         \
383                         IIO_CHAN_INFO_SCALE_SEPARATE_BIT,               \
384                         .address = gyro,                                \
385                         .scan_index = ADIS16260_SCAN_GYRO,              \
386                         .scan_type = {                                  \
387                                 .sign = 's',                            \
388                                 .realbits = 14,                         \
389                                 .storagebits = 16,                      \
390                         },                                              \
391                 }, {                                                    \
392                         .type = IIO_ANGL,                               \
393                         .modified = 1,                                  \
394                         .channel2 = mod,                                \
395                         .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,    \
396                         .address = angle,                               \
397                         .scan_index = ADIS16260_SCAN_ANGL,              \
398                         .scan_type = {                                  \
399                                 .sign = 'u',                            \
400                                 .realbits = 14,                         \
401                                 .storagebits = 16,                      \
402                         },                                              \
403                 }, {                                                    \
404                         .type = IIO_TEMP,                               \
405                         .indexed = 1,                                   \
406                         .channel = 0,                                   \
407                         .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |   \
408                         IIO_CHAN_INFO_OFFSET_SEPARATE_BIT |             \
409                         IIO_CHAN_INFO_SCALE_SEPARATE_BIT,               \
410                         .address = temp,                                \
411                         .scan_index = ADIS16260_SCAN_TEMP,              \
412                         .scan_type = {                                  \
413                                 .sign = 'u',                            \
414                                 .realbits = 12,                         \
415                                 .storagebits = 16,                      \
416                         },                                              \
417                 }, {                                                    \
418                         .type = IIO_VOLTAGE,                            \
419                         .indexed = 1,                                   \
420                         .channel = 0,                                   \
421                         .extend_name = "supply",                        \
422                         .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |   \
423                         IIO_CHAN_INFO_SCALE_SEPARATE_BIT,               \
424                         .address = in_supply,                           \
425                         .scan_index = ADIS16260_SCAN_SUPPLY,            \
426                         .scan_type = {                                  \
427                                 .sign = 'u',                            \
428                                 .realbits = 12,                         \
429                                 .storagebits = 16,                      \
430                         },                                              \
431                 }, {                                                    \
432                         .type = IIO_VOLTAGE,                            \
433                         .indexed = 1,                                   \
434                         .channel = 1,                                   \
435                         .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |   \
436                         IIO_CHAN_INFO_SCALE_SEPARATE_BIT,               \
437                         .address = in_aux,                              \
438                         .scan_index = ADIS16260_SCAN_AUX_ADC,           \
439                         .scan_type = {                                  \
440                                 .sign = 'u',                            \
441                                 .realbits = 12,                         \
442                                 .storagebits = 16,                      \
443                         },                                              \
444                 },                                                      \
445                 IIO_CHAN_SOFT_TIMESTAMP(5),                             \
446         }
447
448 static const ADIS16260_GYRO_CHANNEL_SET(x, IIO_MOD_X);
449 static const ADIS16260_GYRO_CHANNEL_SET(y, IIO_MOD_Y);
450 static const ADIS16260_GYRO_CHANNEL_SET(z, IIO_MOD_Z);
451
452 static const u8 adis16260_addresses[5][3] = {
453         [gyro] = { ADIS16260_GYRO_OUT,
454                    ADIS16260_GYRO_OFF,
455                    ADIS16260_GYRO_SCALE },
456         [angle] = { ADIS16260_ANGL_OUT },
457         [in_supply] = { ADIS16260_SUPPLY_OUT },
458         [in_aux] = { ADIS16260_AUX_ADC },
459         [temp] = { ADIS16260_TEMP_OUT },
460 };
461 static int adis16260_read_raw(struct iio_dev *indio_dev,
462                               struct iio_chan_spec const *chan,
463                               int *val, int *val2,
464                               long mask)
465 {
466         struct adis16260_state *st = iio_priv(indio_dev);
467         int ret;
468         int bits;
469         u8 addr;
470         s16 val16;
471
472         switch (mask) {
473         case IIO_CHAN_INFO_RAW:
474                 mutex_lock(&indio_dev->mlock);
475                 addr = adis16260_addresses[chan->address][0];
476                 ret = adis16260_spi_read_reg_16(indio_dev, addr, &val16);
477                 if (ret) {
478                         mutex_unlock(&indio_dev->mlock);
479                         return ret;
480                 }
481
482                 if (val16 & ADIS16260_ERROR_ACTIVE) {
483                         ret = adis16260_check_status(indio_dev);
484                         if (ret) {
485                                 mutex_unlock(&indio_dev->mlock);
486                                 return ret;
487                         }
488                 }
489                 val16 = val16 & ((1 << chan->scan_type.realbits) - 1);
490                 if (chan->scan_type.sign == 's')
491                         val16 = (s16)(val16 <<
492                                       (16 - chan->scan_type.realbits)) >>
493                                 (16 - chan->scan_type.realbits);
494                 *val = val16;
495                 mutex_unlock(&indio_dev->mlock);
496                 return IIO_VAL_INT;
497         case IIO_CHAN_INFO_SCALE:
498                 switch (chan->type) {
499                 case IIO_ANGL_VEL:
500                         *val = 0;
501                         if (spi_get_device_id(st->us)->driver_data)
502                                 *val2 = 320;
503                         else
504                                 *val2 = 1278;
505                         return IIO_VAL_INT_PLUS_MICRO;
506                 case IIO_VOLTAGE:
507                         *val = 0;
508                         if (chan->channel == 0)
509                                 *val2 = 18315;
510                         else
511                                 *val2 = 610500;
512                         return IIO_VAL_INT_PLUS_MICRO;
513                 case IIO_TEMP:
514                         *val = 0;
515                         *val2 = 145300;
516                         return IIO_VAL_INT_PLUS_MICRO;
517                 default:
518                         return -EINVAL;
519                 }
520                 break;
521         case IIO_CHAN_INFO_OFFSET:
522                 *val = 25;
523                 return IIO_VAL_INT;
524         case IIO_CHAN_INFO_CALIBBIAS:
525                 switch (chan->type) {
526                 case IIO_ANGL_VEL:
527                         bits = 12;
528                         break;
529                 default:
530                         return -EINVAL;
531                 }
532                 mutex_lock(&indio_dev->mlock);
533                 addr = adis16260_addresses[chan->address][1];
534                 ret = adis16260_spi_read_reg_16(indio_dev, addr, &val16);
535                 if (ret) {
536                         mutex_unlock(&indio_dev->mlock);
537                         return ret;
538                 }
539                 val16 &= (1 << bits) - 1;
540                 val16 = (s16)(val16 << (16 - bits)) >> (16 - bits);
541                 *val = val16;
542                 mutex_unlock(&indio_dev->mlock);
543                 return IIO_VAL_INT;
544         case IIO_CHAN_INFO_CALIBSCALE:
545                 switch (chan->type) {
546                 case IIO_ANGL_VEL:
547                         bits = 12;
548                         break;
549                 default:
550                         return -EINVAL;
551                 }
552                 mutex_lock(&indio_dev->mlock);
553                 addr = adis16260_addresses[chan->address][2];
554                 ret = adis16260_spi_read_reg_16(indio_dev, addr, &val16);
555                 if (ret) {
556                         mutex_unlock(&indio_dev->mlock);
557                         return ret;
558                 }
559                 *val = (1 << bits) - 1;
560                 mutex_unlock(&indio_dev->mlock);
561                 return IIO_VAL_INT;
562         }
563         return -EINVAL;
564 }
565
566 static int adis16260_write_raw(struct iio_dev *indio_dev,
567                                struct iio_chan_spec const *chan,
568                                int val,
569                                int val2,
570                                long mask)
571 {
572         int bits = 12;
573         s16 val16;
574         u8 addr;
575         switch (mask) {
576         case IIO_CHAN_INFO_CALIBBIAS:
577                 val16 = val & ((1 << bits) - 1);
578                 addr = adis16260_addresses[chan->address][1];
579                 return adis16260_spi_write_reg_16(indio_dev, addr, val16);
580         case IIO_CHAN_INFO_CALIBSCALE:
581                 val16 = val & ((1 << bits) - 1);
582                 addr = adis16260_addresses[chan->address][2];
583                 return adis16260_spi_write_reg_16(indio_dev, addr, val16);
584         }
585         return -EINVAL;
586 }
587
588 static struct attribute *adis16260_attributes[] = {
589         &iio_dev_attr_sampling_frequency.dev_attr.attr,
590         &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
591         NULL
592 };
593
594 static const struct attribute_group adis16260_attribute_group = {
595         .attrs = adis16260_attributes,
596 };
597
598 static const struct iio_info adis16260_info = {
599         .attrs = &adis16260_attribute_group,
600         .read_raw = &adis16260_read_raw,
601         .write_raw = &adis16260_write_raw,
602         .driver_module = THIS_MODULE,
603 };
604
605 static int __devinit adis16260_probe(struct spi_device *spi)
606 {
607         int ret;
608         struct adis16260_platform_data *pd = spi->dev.platform_data;
609         struct adis16260_state *st;
610         struct iio_dev *indio_dev;
611
612         /* setup the industrialio driver allocated elements */
613         indio_dev = iio_device_alloc(sizeof(*st));
614         if (indio_dev == NULL) {
615                 ret = -ENOMEM;
616                 goto error_ret;
617         }
618         st = iio_priv(indio_dev);
619         if (pd)
620                 st->negate = pd->negate;
621         /* this is only used for removal purposes */
622         spi_set_drvdata(spi, indio_dev);
623
624         st->us = spi;
625         mutex_init(&st->buf_lock);
626
627         indio_dev->name = spi_get_device_id(st->us)->name;
628         indio_dev->dev.parent = &spi->dev;
629         indio_dev->info = &adis16260_info;
630         indio_dev->num_channels
631                 = ARRAY_SIZE(adis16260_channels_x);
632         if (pd && pd->direction)
633                 switch (pd->direction) {
634                 case 'x':
635                         indio_dev->channels = adis16260_channels_x;
636                         break;
637                 case 'y':
638                         indio_dev->channels = adis16260_channels_y;
639                         break;
640                 case 'z':
641                         indio_dev->channels = adis16260_channels_z;
642                         break;
643                 default:
644                         return -EINVAL;
645                 }
646         else
647                 indio_dev->channels = adis16260_channels_x;
648         indio_dev->num_channels = ARRAY_SIZE(adis16260_channels_x);
649         indio_dev->modes = INDIO_DIRECT_MODE;
650
651         ret = adis16260_configure_ring(indio_dev);
652         if (ret)
653                 goto error_free_dev;
654
655         ret = iio_buffer_register(indio_dev,
656                                   indio_dev->channels,
657                                   ARRAY_SIZE(adis16260_channels_x));
658         if (ret) {
659                 printk(KERN_ERR "failed to initialize the ring\n");
660                 goto error_unreg_ring_funcs;
661         }
662         if (indio_dev->buffer) {
663                 /* Set default scan mode */
664                 iio_scan_mask_set(indio_dev, indio_dev->buffer,
665                                   ADIS16260_SCAN_SUPPLY);
666                 iio_scan_mask_set(indio_dev, indio_dev->buffer,
667                                   ADIS16260_SCAN_GYRO);
668                 iio_scan_mask_set(indio_dev, indio_dev->buffer,
669                                   ADIS16260_SCAN_AUX_ADC);
670                 iio_scan_mask_set(indio_dev, indio_dev->buffer,
671                                   ADIS16260_SCAN_TEMP);
672                 iio_scan_mask_set(indio_dev, indio_dev->buffer,
673                                   ADIS16260_SCAN_ANGL);
674         }
675         if (spi->irq) {
676                 ret = adis16260_probe_trigger(indio_dev);
677                 if (ret)
678                         goto error_uninitialize_ring;
679         }
680
681         /* Get the device into a sane initial state */
682         ret = adis16260_initial_setup(indio_dev);
683         if (ret)
684                 goto error_remove_trigger;
685         ret = iio_device_register(indio_dev);
686         if (ret)
687                 goto error_remove_trigger;
688
689         return 0;
690
691 error_remove_trigger:
692         adis16260_remove_trigger(indio_dev);
693 error_uninitialize_ring:
694         iio_buffer_unregister(indio_dev);
695 error_unreg_ring_funcs:
696         adis16260_unconfigure_ring(indio_dev);
697 error_free_dev:
698         iio_device_free(indio_dev);
699 error_ret:
700         return ret;
701 }
702
703 static int __devexit adis16260_remove(struct spi_device *spi)
704 {
705         struct iio_dev *indio_dev = spi_get_drvdata(spi);
706
707         iio_device_unregister(indio_dev);
708         adis16260_stop_device(indio_dev);
709         adis16260_remove_trigger(indio_dev);
710         iio_buffer_unregister(indio_dev);
711         adis16260_unconfigure_ring(indio_dev);
712         iio_device_free(indio_dev);
713
714         return 0;
715 }
716
717 /*
718  * These parts do not need to be differentiated until someone adds
719  * support for the on chip filtering.
720  */
721 static const struct spi_device_id adis16260_id[] = {
722         {"adis16260", 0},
723         {"adis16265", 0},
724         {"adis16250", 0},
725         {"adis16255", 0},
726         {"adis16251", 1},
727         {}
728 };
729 MODULE_DEVICE_TABLE(spi, adis16260_id);
730
731 static struct spi_driver adis16260_driver = {
732         .driver = {
733                 .name = "adis16260",
734                 .owner = THIS_MODULE,
735         },
736         .probe = adis16260_probe,
737         .remove = __devexit_p(adis16260_remove),
738         .id_table = adis16260_id,
739 };
740 module_spi_driver(adis16260_driver);
741
742 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
743 MODULE_DESCRIPTION("Analog Devices ADIS16260/5 Digital Gyroscope Sensor");
744 MODULE_LICENSE("GPL v2");