Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[pandora-kernel.git] / drivers / staging / iio / accel / adis16220_core.c
1 /*
2  * ADIS16220 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/interrupt.h>
10 #include <linux/irq.h>
11 #include <linux/gpio.h>
12 #include <linux/delay.h>
13 #include <linux/mutex.h>
14 #include <linux/device.h>
15 #include <linux/kernel.h>
16 #include <linux/spi/spi.h>
17 #include <linux/slab.h>
18 #include <linux/sysfs.h>
19 #include <linux/list.h>
20
21 #include "../iio.h"
22 #include "../sysfs.h"
23 #include "accel.h"
24 #include "../adc/adc.h"
25
26 #include "adis16220.h"
27
28 #define DRIVER_NAME             "adis16220"
29
30 /**
31  * adis16220_spi_write_reg_8() - write single byte to a register
32  * @dev: device associated with child of actual device (iio_dev or iio_trig)
33  * @reg_address: the address of the register to be written
34  * @val: the value to write
35  **/
36 static int adis16220_spi_write_reg_8(struct device *dev,
37                 u8 reg_address,
38                 u8 val)
39 {
40         int ret;
41         struct iio_dev *indio_dev = dev_get_drvdata(dev);
42         struct adis16220_state *st = iio_priv(indio_dev);
43
44         mutex_lock(&st->buf_lock);
45         st->tx[0] = ADIS16220_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  * adis16220_spi_write_reg_16() - write 2 bytes to a pair of registers
56  * @dev: device associated with child of actual device (iio_dev or iio_trig)
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 adis16220_spi_write_reg_16(struct device *dev,
62                 u8 lower_reg_address,
63                 u16 value)
64 {
65         int ret;
66         struct spi_message msg;
67         struct iio_dev *indio_dev = dev_get_drvdata(dev);
68         struct adis16220_state *st = iio_priv(indio_dev);
69         struct spi_transfer xfers[] = {
70                 {
71                         .tx_buf = st->tx,
72                         .bits_per_word = 8,
73                         .len = 2,
74                         .cs_change = 1,
75                         .delay_usecs = 35,
76                 }, {
77                         .tx_buf = st->tx + 2,
78                         .bits_per_word = 8,
79                         .len = 2,
80                         .cs_change = 1,
81                         .delay_usecs = 35,
82                 },
83         };
84
85         mutex_lock(&st->buf_lock);
86         st->tx[0] = ADIS16220_WRITE_REG(lower_reg_address);
87         st->tx[1] = value & 0xFF;
88         st->tx[2] = ADIS16220_WRITE_REG(lower_reg_address + 1);
89         st->tx[3] = (value >> 8) & 0xFF;
90
91         spi_message_init(&msg);
92         spi_message_add_tail(&xfers[0], &msg);
93         spi_message_add_tail(&xfers[1], &msg);
94         ret = spi_sync(st->us, &msg);
95         mutex_unlock(&st->buf_lock);
96
97         return ret;
98 }
99
100 /**
101  * adis16220_spi_read_reg_16() - read 2 bytes from a 16-bit register
102  * @dev: device associated with child of actual device (iio_dev or iio_trig)
103  * @reg_address: the address of the lower of the two registers. Second register
104  *               is assumed to have address one greater.
105  * @val: somewhere to pass back the value read
106  **/
107 static int adis16220_spi_read_reg_16(struct device *dev,
108                 u8 lower_reg_address,
109                 u16 *val)
110 {
111         struct spi_message msg;
112         struct iio_dev *indio_dev = dev_get_drvdata(dev);
113         struct adis16220_state *st = iio_priv(indio_dev);
114         int ret;
115         struct spi_transfer xfers[] = {
116                 {
117                         .tx_buf = st->tx,
118                         .bits_per_word = 8,
119                         .len = 2,
120                         .cs_change = 1,
121                         .delay_usecs = 35,
122                 }, {
123                         .rx_buf = st->rx,
124                         .bits_per_word = 8,
125                         .len = 2,
126                         .cs_change = 1,
127                         .delay_usecs = 35,
128                 },
129         };
130
131         mutex_lock(&st->buf_lock);
132         st->tx[0] = ADIS16220_READ_REG(lower_reg_address);
133         st->tx[1] = 0;
134
135         spi_message_init(&msg);
136         spi_message_add_tail(&xfers[0], &msg);
137         spi_message_add_tail(&xfers[1], &msg);
138         ret = spi_sync(st->us, &msg);
139         if (ret) {
140                 dev_err(&st->us->dev,
141                         "problem when reading 16 bit register 0x%02X",
142                         lower_reg_address);
143                 goto error_ret;
144         }
145         *val = (st->rx[0] << 8) | st->rx[1];
146
147 error_ret:
148         mutex_unlock(&st->buf_lock);
149         return ret;
150 }
151
152 static ssize_t adis16220_spi_read_signed(struct device *dev,
153                 struct device_attribute *attr,
154                 char *buf,
155                 unsigned bits)
156 {
157         int ret;
158         s16 val = 0;
159         unsigned shift = 16 - bits;
160         struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
161
162         ret = adis16220_spi_read_reg_16(dev, this_attr->address, (u16 *)&val);
163         if (ret)
164                 return ret;
165
166         val = ((s16)(val << shift) >> shift);
167         return sprintf(buf, "%d\n", val);
168 }
169
170 static ssize_t adis16220_read_12bit_unsigned(struct device *dev,
171                 struct device_attribute *attr,
172                 char *buf)
173 {
174         int ret;
175         u16 val = 0;
176         struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
177
178         ret = adis16220_spi_read_reg_16(dev, this_attr->address, &val);
179         if (ret)
180                 return ret;
181
182         return sprintf(buf, "%u\n", val & 0x0FFF);
183 }
184
185 static ssize_t adis16220_read_16bit(struct device *dev,
186                 struct device_attribute *attr,
187                 char *buf)
188 {
189         struct iio_dev *indio_dev = dev_get_drvdata(dev);
190         ssize_t ret;
191
192         /* Take the iio_dev status lock */
193         mutex_lock(&indio_dev->mlock);
194         ret =  adis16220_spi_read_signed(dev, attr, buf, 16);
195         mutex_unlock(&indio_dev->mlock);
196
197         return ret;
198 }
199
200 static ssize_t adis16220_write_16bit(struct device *dev,
201                 struct device_attribute *attr,
202                 const char *buf,
203                 size_t len)
204 {
205         struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
206         int ret;
207         long val;
208
209         ret = strict_strtol(buf, 10, &val);
210         if (ret)
211                 goto error_ret;
212         ret = adis16220_spi_write_reg_16(dev, this_attr->address, val);
213
214 error_ret:
215         return ret ? ret : len;
216 }
217
218 static int adis16220_capture(struct device *dev)
219 {
220         int ret;
221         ret = adis16220_spi_write_reg_16(dev,
222                         ADIS16220_GLOB_CMD,
223                         0xBF08); /* initiates a manual data capture */
224         if (ret)
225                 dev_err(dev, "problem beginning capture");
226
227         msleep(10); /* delay for capture to finish */
228
229         return ret;
230 }
231
232 static int adis16220_reset(struct device *dev)
233 {
234         int ret;
235         ret = adis16220_spi_write_reg_8(dev,
236                         ADIS16220_GLOB_CMD,
237                         ADIS16220_GLOB_CMD_SW_RESET);
238         if (ret)
239                 dev_err(dev, "problem resetting device");
240
241         return ret;
242 }
243
244 static ssize_t adis16220_write_reset(struct device *dev,
245                 struct device_attribute *attr,
246                 const char *buf, size_t len)
247 {
248         if (len < 1)
249                 return -1;
250         switch (buf[0]) {
251         case '1':
252         case 'y':
253         case 'Y':
254                 return adis16220_reset(dev) == 0 ? len : -EIO;
255         }
256         return -1;
257 }
258
259 static ssize_t adis16220_write_capture(struct device *dev,
260                 struct device_attribute *attr,
261                 const char *buf, size_t len)
262 {
263         if (len < 1)
264                 return -1;
265         switch (buf[0]) {
266         case '1':
267         case 'y':
268         case 'Y':
269                 return adis16220_capture(dev) == 0 ? len : -EIO;
270         }
271         return -1;
272 }
273
274 static int adis16220_check_status(struct device *dev)
275 {
276         u16 status;
277         int ret;
278
279         ret = adis16220_spi_read_reg_16(dev, ADIS16220_DIAG_STAT, &status);
280
281         if (ret < 0) {
282                 dev_err(dev, "Reading status failed\n");
283                 goto error_ret;
284         }
285         ret = status & 0x7F;
286
287         if (status & ADIS16220_DIAG_STAT_VIOLATION)
288                 dev_err(dev, "Capture period violation/interruption\n");
289         if (status & ADIS16220_DIAG_STAT_SPI_FAIL)
290                 dev_err(dev, "SPI failure\n");
291         if (status & ADIS16220_DIAG_STAT_FLASH_UPT)
292                 dev_err(dev, "Flash update failed\n");
293         if (status & ADIS16220_DIAG_STAT_POWER_HIGH)
294                 dev_err(dev, "Power supply above 3.625V\n");
295         if (status & ADIS16220_DIAG_STAT_POWER_LOW)
296                 dev_err(dev, "Power supply below 3.15V\n");
297
298 error_ret:
299         return ret;
300 }
301
302 static int adis16220_self_test(struct device *dev)
303 {
304         int ret;
305         ret = adis16220_spi_write_reg_16(dev,
306                         ADIS16220_MSC_CTRL,
307                         ADIS16220_MSC_CTRL_SELF_TEST_EN);
308         if (ret) {
309                 dev_err(dev, "problem starting self test");
310                 goto err_ret;
311         }
312
313         adis16220_check_status(dev);
314
315 err_ret:
316         return ret;
317 }
318
319 static int adis16220_initial_setup(struct iio_dev *indio_dev)
320 {
321         int ret;
322         struct device *dev = &indio_dev->dev;
323
324         /* Do self test */
325         ret = adis16220_self_test(dev);
326         if (ret) {
327                 dev_err(dev, "self test failure");
328                 goto err_ret;
329         }
330
331         /* Read status register to check the result */
332         ret = adis16220_check_status(dev);
333         if (ret) {
334                 adis16220_reset(dev);
335                 dev_err(dev, "device not playing ball -> reset");
336                 msleep(ADIS16220_STARTUP_DELAY);
337                 ret = adis16220_check_status(dev);
338                 if (ret) {
339                         dev_err(dev, "giving up");
340                         goto err_ret;
341                 }
342         }
343
344 err_ret:
345         return ret;
346 }
347
348 static ssize_t adis16220_capture_buffer_read(struct iio_dev *indio_dev,
349                                         char *buf,
350                                         loff_t off,
351                                         size_t count,
352                                         int addr)
353 {
354         struct adis16220_state *st = iio_priv(indio_dev);
355         struct spi_message msg;
356         struct spi_transfer xfers[] = {
357                 {
358                         .tx_buf = st->tx,
359                         .bits_per_word = 8,
360                         .len = 2,
361                         .cs_change = 1,
362                         .delay_usecs = 25,
363                 }, {
364                         .tx_buf = st->tx,
365                         .rx_buf = st->rx,
366                         .bits_per_word = 8,
367                         .cs_change = 1,
368                         .delay_usecs = 25,
369                 },
370         };
371         int ret;
372         int i;
373
374         if (unlikely(!count))
375                 return count;
376
377         if ((off >= ADIS16220_CAPTURE_SIZE) || (count & 1) || (off & 1))
378                 return -EINVAL;
379
380         if (off + count > ADIS16220_CAPTURE_SIZE)
381                 count = ADIS16220_CAPTURE_SIZE - off;
382
383         /* write the begin position of capture buffer */
384         ret = adis16220_spi_write_reg_16(&indio_dev->dev,
385                                         ADIS16220_CAPT_PNTR,
386                                         off > 1);
387         if (ret)
388                 return -EIO;
389
390         /* read count/2 values from capture buffer */
391         mutex_lock(&st->buf_lock);
392
393         for (i = 0; i < count; i += 2) {
394                 st->tx[i] = ADIS16220_READ_REG(addr);
395                 st->tx[i + 1] = 0;
396         }
397         xfers[1].len = count;
398
399         spi_message_init(&msg);
400         spi_message_add_tail(&xfers[0], &msg);
401         spi_message_add_tail(&xfers[1], &msg);
402         ret = spi_sync(st->us, &msg);
403         if (ret) {
404
405                 mutex_unlock(&st->buf_lock);
406                 return -EIO;
407         }
408
409         memcpy(buf, st->rx, count);
410
411         mutex_unlock(&st->buf_lock);
412         return count;
413 }
414
415 static ssize_t adis16220_accel_bin_read(struct file *filp, struct kobject *kobj,
416                                         struct bin_attribute *attr,
417                                         char *buf,
418                                         loff_t off,
419                                         size_t count)
420 {
421         struct device *dev = container_of(kobj, struct device, kobj);
422         struct iio_dev *indio_dev = dev_get_drvdata(dev);
423
424         return adis16220_capture_buffer_read(indio_dev, buf,
425                                         off, count,
426                                         ADIS16220_CAPT_BUFA);
427 }
428
429 static struct bin_attribute accel_bin = {
430         .attr = {
431                 .name = "accel_bin",
432                 .mode = S_IRUGO,
433         },
434         .read = adis16220_accel_bin_read,
435         .size = ADIS16220_CAPTURE_SIZE,
436 };
437
438 static ssize_t adis16220_adc1_bin_read(struct file *filp, struct kobject *kobj,
439                                 struct bin_attribute *attr,
440                                 char *buf, loff_t off,
441                                 size_t count)
442 {
443         struct device *dev = container_of(kobj, struct device, kobj);
444         struct iio_dev *indio_dev = dev_get_drvdata(dev);
445
446         return adis16220_capture_buffer_read(indio_dev, buf,
447                                         off, count,
448                                         ADIS16220_CAPT_BUF1);
449 }
450
451 static struct bin_attribute adc1_bin = {
452         .attr = {
453                 .name = "in0_bin",
454                 .mode = S_IRUGO,
455         },
456         .read =  adis16220_adc1_bin_read,
457         .size = ADIS16220_CAPTURE_SIZE,
458 };
459
460 static ssize_t adis16220_adc2_bin_read(struct file *filp, struct kobject *kobj,
461                                 struct bin_attribute *attr,
462                                 char *buf, loff_t off,
463                                 size_t count)
464 {
465         struct device *dev = container_of(kobj, struct device, kobj);
466         struct iio_dev *indio_dev = dev_get_drvdata(dev);
467
468         return adis16220_capture_buffer_read(indio_dev, buf,
469                                         off, count,
470                                         ADIS16220_CAPT_BUF2);
471 }
472
473
474 static struct bin_attribute adc2_bin = {
475         .attr = {
476                 .name = "in1_bin",
477                 .mode = S_IRUGO,
478         },
479         .read =  adis16220_adc2_bin_read,
480         .size = ADIS16220_CAPTURE_SIZE,
481 };
482
483 static IIO_DEV_ATTR_IN_NAMED_RAW(0, supply, adis16220_read_12bit_unsigned,
484                 ADIS16220_CAPT_SUPPLY);
485 static IIO_CONST_ATTR_IN_NAMED_SCALE(0, supply, "0.0012207");
486 static IIO_DEV_ATTR_ACCEL(adis16220_read_16bit, ADIS16220_CAPT_BUFA);
487 static IIO_DEVICE_ATTR(accel_peak_raw, S_IRUGO, adis16220_read_16bit,
488                 NULL, ADIS16220_CAPT_PEAKA);
489 static IIO_DEV_ATTR_ACCEL_OFFSET(S_IWUSR | S_IRUGO,
490                 adis16220_read_16bit,
491                 adis16220_write_16bit,
492                 ADIS16220_ACCL_NULL);
493 static IIO_CONST_ATTR_ACCEL_SCALE("0.18704223545");
494 static IIO_DEV_ATTR_TEMP_RAW(adis16220_read_12bit_unsigned);
495 static IIO_CONST_ATTR_TEMP_OFFSET("25");
496 static IIO_CONST_ATTR_TEMP_SCALE("-0.47");
497
498 static IIO_DEV_ATTR_IN_RAW(1, adis16220_read_16bit, ADIS16220_CAPT_BUF1);
499 static IIO_DEV_ATTR_IN_RAW(2, adis16220_read_16bit, ADIS16220_CAPT_BUF2);
500
501 static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL,
502                 adis16220_write_reset, 0);
503
504 #define IIO_DEV_ATTR_CAPTURE(_store)                            \
505         IIO_DEVICE_ATTR(capture, S_IWUSR, NULL, _store, 0)
506
507 static IIO_DEV_ATTR_CAPTURE(adis16220_write_capture);
508
509 #define IIO_DEV_ATTR_CAPTURE_COUNT(_mode, _show, _store, _addr)         \
510         IIO_DEVICE_ATTR(capture_count, _mode, _show, _store, _addr)
511
512 static IIO_DEV_ATTR_CAPTURE_COUNT(S_IWUSR | S_IRUGO,
513                 adis16220_read_16bit,
514                 adis16220_write_16bit,
515                 ADIS16220_CAPT_PNTR);
516
517 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("100200");
518
519 static struct attribute *adis16220_attributes[] = {
520         &iio_dev_attr_in0_supply_raw.dev_attr.attr,
521         &iio_const_attr_in0_supply_scale.dev_attr.attr,
522         &iio_dev_attr_accel_raw.dev_attr.attr,
523         &iio_dev_attr_accel_offset.dev_attr.attr,
524         &iio_dev_attr_accel_peak_raw.dev_attr.attr,
525         &iio_const_attr_accel_scale.dev_attr.attr,
526         &iio_dev_attr_temp_raw.dev_attr.attr,
527         &iio_dev_attr_in1_raw.dev_attr.attr,
528         &iio_dev_attr_in2_raw.dev_attr.attr,
529         &iio_const_attr_temp_offset.dev_attr.attr,
530         &iio_const_attr_temp_scale.dev_attr.attr,
531         &iio_const_attr_sampling_frequency_available.dev_attr.attr,
532         &iio_dev_attr_reset.dev_attr.attr,
533         &iio_dev_attr_capture.dev_attr.attr,
534         &iio_dev_attr_capture_count.dev_attr.attr,
535         NULL
536 };
537
538 static const struct attribute_group adis16220_attribute_group = {
539         .attrs = adis16220_attributes,
540 };
541
542 static const struct iio_info adis16220_info = {
543         .attrs = &adis16220_attribute_group,
544         .driver_module = THIS_MODULE,
545 };
546 static int __devinit adis16220_probe(struct spi_device *spi)
547 {
548         int ret, regdone = 0;
549         struct adis16220_state *st;
550         struct iio_dev *indio_dev;
551
552         /* setup the industrialio driver allocated elements */
553         indio_dev = iio_allocate_device(sizeof(*st));
554         if (indio_dev == NULL) {
555                 ret = -ENOMEM;
556                 goto error_ret;
557         }
558
559         st = iio_priv(indio_dev);
560         /* this is only used for removal purposes */
561         spi_set_drvdata(spi, indio_dev);
562
563         st->us = spi;
564         mutex_init(&st->buf_lock);
565
566         indio_dev->name = spi->dev.driver->name;
567         indio_dev->dev.parent = &spi->dev;
568         indio_dev->info = &adis16220_info;
569         indio_dev->modes = INDIO_DIRECT_MODE;
570
571         ret = iio_device_register(indio_dev);
572         if (ret)
573                 goto error_free_dev;
574         regdone = 1;
575
576         ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &accel_bin);
577         if (ret)
578                 goto error_free_dev;
579
580         ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &adc1_bin);
581         if (ret)
582                 goto error_rm_accel_bin;
583
584         ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &adc2_bin);
585         if (ret)
586                 goto error_rm_adc1_bin;
587
588         /* Get the device into a sane initial state */
589         ret = adis16220_initial_setup(indio_dev);
590         if (ret)
591                 goto error_rm_adc2_bin;
592         return 0;
593
594 error_rm_adc2_bin:
595         sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc2_bin);
596 error_rm_adc1_bin:
597         sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc1_bin);
598 error_rm_accel_bin:
599         sysfs_remove_bin_file(&indio_dev->dev.kobj, &accel_bin);
600 error_free_dev:
601         if (regdone)
602                 iio_device_unregister(indio_dev);
603         else
604                 iio_free_device(indio_dev);
605 error_ret:
606         return ret;
607 }
608
609 static int adis16220_remove(struct spi_device *spi)
610 {
611         struct iio_dev *indio_dev = spi_get_drvdata(spi);
612
613         flush_scheduled_work();
614
615         sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc2_bin);
616         sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc1_bin);
617         sysfs_remove_bin_file(&indio_dev->dev.kobj, &accel_bin);
618         iio_device_unregister(indio_dev);
619
620         return 0;
621 }
622
623 static struct spi_driver adis16220_driver = {
624         .driver = {
625                 .name = "adis16220",
626                 .owner = THIS_MODULE,
627         },
628         .probe = adis16220_probe,
629         .remove = __devexit_p(adis16220_remove),
630 };
631
632 static __init int adis16220_init(void)
633 {
634         return spi_register_driver(&adis16220_driver);
635 }
636 module_init(adis16220_init);
637
638 static __exit void adis16220_exit(void)
639 {
640         spi_unregister_driver(&adis16220_driver);
641 }
642 module_exit(adis16220_exit);
643
644 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
645 MODULE_DESCRIPTION("Analog Devices ADIS16220 Digital Vibration Sensor");
646 MODULE_LICENSE("GPL v2");