pandora: defconfig: update
[pandora-kernel.git] / drivers / staging / iio / adc / ad7476_ring.c
1 /*
2  * Copyright 2010 Analog Devices Inc.
3  * Copyright (C) 2008 Jonathan Cameron
4  *
5  * Licensed under the GPL-2 or later.
6  *
7  * ad7476_ring.c
8  */
9
10 #include <linux/interrupt.h>
11 #include <linux/device.h>
12 #include <linux/kernel.h>
13 #include <linux/slab.h>
14 #include <linux/spi/spi.h>
15
16 #include "../iio.h"
17 #include "../buffer_generic.h"
18 #include "../ring_sw.h"
19 #include "../trigger_consumer.h"
20
21 #include "ad7476.h"
22
23 int ad7476_scan_from_ring(struct iio_dev *indio_dev)
24 {
25         struct iio_buffer *ring = indio_dev->buffer;
26         int ret;
27         u8 *ring_data;
28
29         ring_data = kmalloc(ring->access->get_bytes_per_datum(ring),
30                             GFP_KERNEL);
31         if (ring_data == NULL) {
32                 ret = -ENOMEM;
33                 goto error_ret;
34         }
35         ret = ring->access->read_last(ring, ring_data);
36         if (ret)
37                 goto error_free_ring_data;
38
39         ret = (ring_data[0] << 8) | ring_data[1];
40
41 error_free_ring_data:
42         kfree(ring_data);
43 error_ret:
44         return ret;
45 }
46
47 /**
48  * ad7476_ring_preenable() setup the parameters of the ring before enabling
49  *
50  * The complex nature of the setting of the nuber of bytes per datum is due
51  * to this driver currently ensuring that the timestamp is stored at an 8
52  * byte boundary.
53  **/
54 static int ad7476_ring_preenable(struct iio_dev *indio_dev)
55 {
56         struct ad7476_state *st = iio_priv(indio_dev);
57         struct iio_buffer *ring = indio_dev->buffer;
58
59         st->d_size = ring->scan_count *
60                 st->chip_info->channel[0].scan_type.storagebits / 8;
61
62         if (ring->scan_timestamp) {
63                 st->d_size += sizeof(s64);
64
65                 if (st->d_size % sizeof(s64))
66                         st->d_size += sizeof(s64) - (st->d_size % sizeof(s64));
67         }
68
69         if (indio_dev->buffer->access->set_bytes_per_datum)
70                 indio_dev->buffer->access->
71                         set_bytes_per_datum(indio_dev->buffer, st->d_size);
72
73         return 0;
74 }
75
76 static irqreturn_t ad7476_trigger_handler(int irq, void  *p)
77 {
78         struct iio_poll_func *pf = p;
79         struct iio_dev *indio_dev = pf->indio_dev;
80         struct ad7476_state *st = iio_priv(indio_dev);
81         s64 time_ns;
82         __u8 *rxbuf;
83         int b_sent;
84
85         rxbuf = kzalloc(st->d_size, GFP_KERNEL);
86         if (rxbuf == NULL)
87                 return -ENOMEM;
88
89         b_sent = spi_read(st->spi, rxbuf,
90                           st->chip_info->channel[0].scan_type.storagebits / 8);
91         if (b_sent < 0)
92                 goto done;
93
94         time_ns = iio_get_time_ns();
95
96         if (indio_dev->buffer->scan_timestamp)
97                 memcpy(rxbuf + st->d_size - sizeof(s64),
98                         &time_ns, sizeof(time_ns));
99
100         indio_dev->buffer->access->store_to(indio_dev->buffer, rxbuf, time_ns);
101 done:
102         iio_trigger_notify_done(indio_dev->trig);
103         kfree(rxbuf);
104
105         return IRQ_HANDLED;
106 }
107
108 static const struct iio_buffer_setup_ops ad7476_ring_setup_ops = {
109         .preenable = &ad7476_ring_preenable,
110         .postenable = &iio_triggered_buffer_postenable,
111         .predisable = &iio_triggered_buffer_predisable,
112 };
113
114 int ad7476_register_ring_funcs_and_init(struct iio_dev *indio_dev)
115 {
116         struct ad7476_state *st = iio_priv(indio_dev);
117         int ret = 0;
118
119         indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
120         if (!indio_dev->buffer) {
121                 ret = -ENOMEM;
122                 goto error_ret;
123         }
124         /* Effectively select the ring buffer implementation */
125         indio_dev->buffer->access = &ring_sw_access_funcs;
126         indio_dev->pollfunc
127                 = iio_alloc_pollfunc(NULL,
128                                      &ad7476_trigger_handler,
129                                      IRQF_ONESHOT,
130                                      indio_dev,
131                                      "%s_consumer%d",
132                                      spi_get_device_id(st->spi)->name,
133                                      indio_dev->id);
134         if (indio_dev->pollfunc == NULL) {
135                 ret = -ENOMEM;
136                 goto error_deallocate_sw_rb;
137         }
138
139         /* Ring buffer functions - here trigger setup related */
140         indio_dev->buffer->setup_ops = &ad7476_ring_setup_ops;
141         indio_dev->buffer->scan_timestamp = true;
142
143         /* Flag that polled ring buffering is possible */
144         indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
145         return 0;
146
147 error_deallocate_sw_rb:
148         iio_sw_rb_free(indio_dev->buffer);
149 error_ret:
150         return ret;
151 }
152
153 void ad7476_ring_cleanup(struct iio_dev *indio_dev)
154 {
155         iio_dealloc_pollfunc(indio_dev->pollfunc);
156         iio_sw_rb_free(indio_dev->buffer);
157 }