b1fbf19a71f39d90ee0785dede547d6bdf0239e0
[firefly-linux-kernel-4.4.55.git] / drivers / staging / iio / accel / adis16209_core.c
1 /*
2  * ADIS16209 Programmable Digital Vibration Sensor driver
3  *
4  * Copyright 2010 Analog Devices Inc.
5  *
6  * Licensed under the GPL-2 or later.
7  */
8
9 #include <linux/delay.h>
10 #include <linux/mutex.h>
11 #include <linux/device.h>
12 #include <linux/kernel.h>
13 #include <linux/spi/spi.h>
14 #include <linux/slab.h>
15 #include <linux/sysfs.h>
16 #include <linux/list.h>
17 #include <linux/module.h>
18
19 #include "../iio.h"
20 #include "../sysfs.h"
21 #include "../buffer.h"
22
23 #include "adis16209.h"
24
25 #define DRIVER_NAME             "adis16209"
26
27 /**
28  * adis16209_spi_write_reg_8() - write single byte to a register
29  * @indio_dev: iio device associated with actual device
30  * @reg_address: the address of the register to be written
31  * @val: the value to write
32  **/
33 static int adis16209_spi_write_reg_8(struct iio_dev *indio_dev,
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  **/
57 static 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  **/
101 static 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
139 error_ret:
140         mutex_unlock(&st->buf_lock);
141         return ret;
142 }
143
144 static 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
156 static ssize_t adis16209_write_reset(struct device *dev,
157                 struct device_attribute *attr,
158                 const char *buf, size_t len)
159 {
160         struct iio_dev *indio_dev = dev_get_drvdata(dev);
161
162         if (len < 1)
163                 return -EINVAL;
164         switch (buf[0]) {
165         case '1':
166         case 'y':
167         case 'Y':
168                 return adis16209_reset(indio_dev);
169         }
170         return -EINVAL;
171 }
172
173 int adis16209_set_irq(struct iio_dev *indio_dev, bool enable)
174 {
175         int ret = 0;
176         u16 msc;
177
178         ret = adis16209_spi_read_reg_16(indio_dev, ADIS16209_MSC_CTRL, &msc);
179         if (ret)
180                 goto error_ret;
181
182         msc |= ADIS16209_MSC_CTRL_ACTIVE_HIGH;
183         msc &= ~ADIS16209_MSC_CTRL_DATA_RDY_DIO2;
184         if (enable)
185                 msc |= ADIS16209_MSC_CTRL_DATA_RDY_EN;
186         else
187                 msc &= ~ADIS16209_MSC_CTRL_DATA_RDY_EN;
188
189         ret = adis16209_spi_write_reg_16(indio_dev, ADIS16209_MSC_CTRL, msc);
190
191 error_ret:
192         return ret;
193 }
194
195 static int adis16209_check_status(struct iio_dev *indio_dev)
196 {
197         u16 status;
198         int ret;
199
200         ret = adis16209_spi_read_reg_16(indio_dev,
201                                         ADIS16209_DIAG_STAT, &status);
202         if (ret < 0) {
203                 dev_err(&indio_dev->dev, "Reading status failed\n");
204                 goto error_ret;
205         }
206         ret = status & 0x1F;
207
208         if (status & ADIS16209_DIAG_STAT_SELFTEST_FAIL)
209                 dev_err(&indio_dev->dev, "Self test failure\n");
210         if (status & ADIS16209_DIAG_STAT_SPI_FAIL)
211                 dev_err(&indio_dev->dev, "SPI failure\n");
212         if (status & ADIS16209_DIAG_STAT_FLASH_UPT)
213                 dev_err(&indio_dev->dev, "Flash update failed\n");
214         if (status & ADIS16209_DIAG_STAT_POWER_HIGH)
215                 dev_err(&indio_dev->dev, "Power supply above 3.625V\n");
216         if (status & ADIS16209_DIAG_STAT_POWER_LOW)
217                 dev_err(&indio_dev->dev, "Power supply below 3.15V\n");
218
219 error_ret:
220         return ret;
221 }
222
223 static int adis16209_self_test(struct iio_dev *indio_dev)
224 {
225         int ret;
226         ret = adis16209_spi_write_reg_16(indio_dev,
227                         ADIS16209_MSC_CTRL,
228                         ADIS16209_MSC_CTRL_SELF_TEST_EN);
229         if (ret) {
230                 dev_err(&indio_dev->dev, "problem starting self test");
231                 goto err_ret;
232         }
233
234         adis16209_check_status(indio_dev);
235
236 err_ret:
237         return ret;
238 }
239
240 static int adis16209_initial_setup(struct iio_dev *indio_dev)
241 {
242         int ret;
243
244         /* Disable IRQ */
245         ret = adis16209_set_irq(indio_dev, false);
246         if (ret) {
247                 dev_err(&indio_dev->dev, "disable irq failed");
248                 goto err_ret;
249         }
250
251         /* Do self test */
252         ret = adis16209_self_test(indio_dev);
253         if (ret) {
254                 dev_err(&indio_dev->dev, "self test failure");
255                 goto err_ret;
256         }
257
258         /* Read status register to check the result */
259         ret = adis16209_check_status(indio_dev);
260         if (ret) {
261                 adis16209_reset(indio_dev);
262                 dev_err(&indio_dev->dev, "device not playing ball -> reset");
263                 msleep(ADIS16209_STARTUP_DELAY);
264                 ret = adis16209_check_status(indio_dev);
265                 if (ret) {
266                         dev_err(&indio_dev->dev, "giving up");
267                         goto err_ret;
268                 }
269         }
270
271 err_ret:
272         return ret;
273 }
274
275 enum adis16209_chan {
276         in_supply,
277         temp,
278         accel_x,
279         accel_y,
280         incli_x,
281         incli_y,
282         in_aux,
283         rot,
284 };
285
286 static const u8 adis16209_addresses[8][2] = {
287         [in_supply] = { ADIS16209_SUPPLY_OUT },
288         [in_aux] = { ADIS16209_AUX_ADC },
289         [accel_x] = { ADIS16209_XACCL_OUT, ADIS16209_XACCL_NULL },
290         [accel_y] = { ADIS16209_YACCL_OUT, ADIS16209_YACCL_NULL },
291         [incli_x] = { ADIS16209_XINCL_OUT, ADIS16209_XINCL_NULL },
292         [incli_y] = { ADIS16209_YINCL_OUT, ADIS16209_YINCL_NULL },
293         [rot] = { ADIS16209_ROT_OUT },
294         [temp] = { ADIS16209_TEMP_OUT },
295 };
296
297 static int adis16209_write_raw(struct iio_dev *indio_dev,
298                                struct iio_chan_spec const *chan,
299                                int val,
300                                int val2,
301                                long mask)
302 {
303         int bits;
304         s16 val16;
305         u8 addr;
306         switch (mask) {
307         case IIO_CHAN_INFO_CALIBBIAS:
308                 switch (chan->type) {
309                 case IIO_ACCEL:
310                 case IIO_INCLI:
311                         bits = 14;
312                         break;
313                 default:
314                         return -EINVAL;
315                 };
316                 val16 = val & ((1 << bits) - 1);
317                 addr = adis16209_addresses[chan->address][1];
318                 return adis16209_spi_write_reg_16(indio_dev, addr, val16);
319         }
320         return -EINVAL;
321 }
322
323 static int adis16209_read_raw(struct iio_dev *indio_dev,
324                               struct iio_chan_spec const *chan,
325                               int *val, int *val2,
326                               long mask)
327 {
328         int ret;
329         int bits;
330         u8 addr;
331         s16 val16;
332
333         switch (mask) {
334         case IIO_CHAN_INFO_RAW:
335                 mutex_lock(&indio_dev->mlock);
336                 addr = adis16209_addresses[chan->address][0];
337                 ret = adis16209_spi_read_reg_16(indio_dev, addr, &val16);
338                 if (ret) {
339                         mutex_unlock(&indio_dev->mlock);
340                         return ret;
341                 }
342
343                 if (val16 & ADIS16209_ERROR_ACTIVE) {
344                         ret = adis16209_check_status(indio_dev);
345                         if (ret) {
346                                 mutex_unlock(&indio_dev->mlock);
347                                 return ret;
348                         }
349                 }
350                 val16 = val16 & ((1 << chan->scan_type.realbits) - 1);
351                 if (chan->scan_type.sign == 's')
352                         val16 = (s16)(val16 <<
353                                       (16 - chan->scan_type.realbits)) >>
354                                 (16 - chan->scan_type.realbits);
355                 *val = val16;
356                 mutex_unlock(&indio_dev->mlock);
357                 return IIO_VAL_INT;
358         case IIO_CHAN_INFO_SCALE:
359                 switch (chan->type) {
360                 case IIO_VOLTAGE:
361                         *val = 0;
362                         if (chan->channel == 0)
363                                 *val2 = 305180;
364                         else
365                                 *val2 = 610500;
366                         return IIO_VAL_INT_PLUS_MICRO;
367                 case IIO_TEMP:
368                         *val = 0;
369                         *val2 = -470000;
370                         return IIO_VAL_INT_PLUS_MICRO;
371                 case IIO_ACCEL:
372                         *val = 0;
373                         *val2 = 2394;
374                         return IIO_VAL_INT_PLUS_MICRO;
375                 case IIO_INCLI:
376                         *val = 0;
377                         *val2 = 436;
378                         return IIO_VAL_INT_PLUS_MICRO;
379                 default:
380                         return -EINVAL;
381                 }
382                 break;
383         case IIO_CHAN_INFO_OFFSET:
384                 *val = 25;
385                 return IIO_VAL_INT;
386         case IIO_CHAN_INFO_CALIBBIAS:
387                 switch (chan->type) {
388                 case IIO_ACCEL:
389                         bits = 14;
390                         break;
391                 default:
392                         return -EINVAL;
393                 };
394                 mutex_lock(&indio_dev->mlock);
395                 addr = adis16209_addresses[chan->address][1];
396                 ret = adis16209_spi_read_reg_16(indio_dev, addr, &val16);
397                 if (ret) {
398                         mutex_unlock(&indio_dev->mlock);
399                         return ret;
400                 }
401                 val16 &= (1 << bits) - 1;
402                 val16 = (s16)(val16 << (16 - bits)) >> (16 - bits);
403                 *val = val16;
404                 mutex_unlock(&indio_dev->mlock);
405                 return IIO_VAL_INT;
406         }
407         return -EINVAL;
408 }
409
410 static struct iio_chan_spec adis16209_channels[] = {
411         {
412                 .type = IIO_VOLTAGE,
413                 .indexed = 1,
414                 .channel = 0,
415                 .extend_name = "supply",
416                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
417                 IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
418                 .address = in_supply,
419                 .scan_index = ADIS16209_SCAN_SUPPLY,
420                 .scan_type = {
421                         .sign = 'u',
422                         .realbits = 14,
423                         .storagebits = 16,
424                 },
425         }, {
426                 .type = IIO_TEMP,
427                 .indexed = 0,
428                 .channel = 0,
429                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
430                 IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
431                 IIO_CHAN_INFO_OFFSET_SEPARATE_BIT,
432                 .address = temp,
433                 .scan_index = ADIS16209_SCAN_TEMP,
434                 .scan_type = {
435                         .sign = 'u',
436                         .realbits = 12,
437                         .storagebits = 16,
438                 },
439         }, {
440                 .type = IIO_ACCEL,
441                 .modified = 1,
442                 .channel2 = IIO_MOD_X,
443                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
444                 IIO_CHAN_INFO_SCALE_SHARED_BIT |
445                 IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
446                 .address = accel_x,
447                 .scan_index = ADIS16209_SCAN_ACC_X,
448                 .scan_type = {
449                         .sign = 's',
450                         .realbits = 14,
451                         .storagebits = 16,
452                 },
453         }, {
454                 .type = IIO_ACCEL,
455                 .modified = 1,
456                 .channel2 = IIO_MOD_Y,
457                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
458                 IIO_CHAN_INFO_SCALE_SHARED_BIT |
459                 IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT,
460                 .address = accel_y,
461                 .scan_index = ADIS16209_SCAN_ACC_Y,
462                 .scan_type = {
463                         .sign = 's',
464                         .realbits = 14,
465                         .storagebits = 16,
466                 },
467         }, {
468                 .type = IIO_VOLTAGE,
469                 .indexed = 1,
470                 .channel = 1,
471                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
472                 IIO_CHAN_INFO_SCALE_SEPARATE_BIT,
473                 .address = in_aux,
474                 .scan_index = ADIS16209_SCAN_AUX_ADC,
475                 .scan_type = {
476                         .sign = 'u',
477                         .realbits = 12,
478                         .storagebits = 16,
479                 },
480         }, {
481                 .type = IIO_INCLI,
482                 .modified = 1,
483                 .channel2 = IIO_MOD_X,
484                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
485                 IIO_CHAN_INFO_SCALE_SHARED_BIT,
486                 .address = incli_x,
487                 .scan_index = ADIS16209_SCAN_INCLI_X,
488                 .scan_type = {
489                         .sign = 's',
490                         .realbits = 14,
491                         .storagebits = 16,
492                 },
493         }, {
494                 .type = IIO_INCLI,
495                 .modified = 1,
496                 .channel2 = IIO_MOD_Y,
497                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
498                 IIO_CHAN_INFO_SCALE_SHARED_BIT,
499                 .address = incli_y,
500                 .scan_index = ADIS16209_SCAN_INCLI_Y,
501                 .scan_type = {
502                         .sign = 's',
503                         .realbits = 14,
504                         .storagebits = 16,
505                 },
506         }, {
507                 .type = IIO_ROT,
508                 .modified = 1,
509                 .channel2 = IIO_MOD_X,
510                 .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
511                 .address = rot,
512                 .scan_index = ADIS16209_SCAN_ROT,
513                 .scan_type = {
514                         .sign = 's',
515                         .realbits = 14,
516                         .storagebits = 16,
517                 },
518         },
519         IIO_CHAN_SOFT_TIMESTAMP(8)
520 };
521
522 static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16209_write_reset, 0);
523
524 static struct attribute *adis16209_attributes[] = {
525         &iio_dev_attr_reset.dev_attr.attr,
526         NULL
527 };
528
529 static const struct attribute_group adis16209_attribute_group = {
530         .attrs = adis16209_attributes,
531 };
532
533 static const struct iio_info adis16209_info = {
534         .attrs = &adis16209_attribute_group,
535         .read_raw = &adis16209_read_raw,
536         .write_raw = &adis16209_write_raw,
537         .driver_module = THIS_MODULE,
538 };
539
540 static int __devinit adis16209_probe(struct spi_device *spi)
541 {
542         int ret;
543         struct adis16209_state *st;
544         struct iio_dev *indio_dev;
545
546         /* setup the industrialio driver allocated elements */
547         indio_dev = iio_allocate_device(sizeof(*st));
548         if (indio_dev == NULL) {
549                 ret = -ENOMEM;
550                 goto error_ret;
551         }
552         st = iio_priv(indio_dev);
553         /* this is only used for removal purposes */
554         spi_set_drvdata(spi, indio_dev);
555         st->us = spi;
556         mutex_init(&st->buf_lock);
557
558         indio_dev->name = spi->dev.driver->name;
559         indio_dev->dev.parent = &spi->dev;
560         indio_dev->info = &adis16209_info;
561         indio_dev->channels = adis16209_channels;
562         indio_dev->num_channels = ARRAY_SIZE(adis16209_channels);
563         indio_dev->modes = INDIO_DIRECT_MODE;
564
565         ret = adis16209_configure_ring(indio_dev);
566         if (ret)
567                 goto error_free_dev;
568
569         ret = iio_buffer_register(indio_dev,
570                                   adis16209_channels,
571                                   ARRAY_SIZE(adis16209_channels));
572         if (ret) {
573                 printk(KERN_ERR "failed to initialize the ring\n");
574                 goto error_unreg_ring_funcs;
575         }
576
577         if (spi->irq) {
578                 ret = adis16209_probe_trigger(indio_dev);
579                 if (ret)
580                         goto error_uninitialize_ring;
581         }
582
583         /* Get the device into a sane initial state */
584         ret = adis16209_initial_setup(indio_dev);
585         if (ret)
586                 goto error_remove_trigger;
587         ret = iio_device_register(indio_dev);
588         if (ret)
589                 goto error_remove_trigger;
590
591         return 0;
592
593 error_remove_trigger:
594         adis16209_remove_trigger(indio_dev);
595 error_uninitialize_ring:
596         iio_buffer_unregister(indio_dev);
597 error_unreg_ring_funcs:
598         adis16209_unconfigure_ring(indio_dev);
599 error_free_dev:
600         iio_free_device(indio_dev);
601 error_ret:
602         return ret;
603 }
604
605 static int adis16209_remove(struct spi_device *spi)
606 {
607         struct iio_dev *indio_dev = spi_get_drvdata(spi);
608
609         flush_scheduled_work();
610
611         iio_device_unregister(indio_dev);
612         adis16209_remove_trigger(indio_dev);
613         iio_buffer_unregister(indio_dev);
614         adis16209_unconfigure_ring(indio_dev);
615         iio_free_device(indio_dev);
616
617         return 0;
618 }
619
620 static struct spi_driver adis16209_driver = {
621         .driver = {
622                 .name = "adis16209",
623                 .owner = THIS_MODULE,
624         },
625         .probe = adis16209_probe,
626         .remove = __devexit_p(adis16209_remove),
627 };
628 module_spi_driver(adis16209_driver);
629
630 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
631 MODULE_DESCRIPTION("Analog Devices ADIS16209 Digital Vibration Sensor driver");
632 MODULE_LICENSE("GPL v2");
633 MODULE_ALIAS("spi:adis16209");