1
2
3
4
5
6
7
8
9
10
11#include <linux/interrupt.h>
12#include <linux/gpio.h>
13#include <linux/workqueue.h>
14#include <linux/device.h>
15#include <linux/slab.h>
16#include <linux/kernel.h>
17#include <linux/sysfs.h>
18#include <linux/list.h>
19#include <linux/i2c.h>
20#include <linux/bitops.h>
21
22#include "../iio.h"
23#include "../ring_generic.h"
24#include "../ring_sw.h"
25#include "../trigger.h"
26#include "../sysfs.h"
27
28#include "max1363.h"
29
30
31int max1363_single_channel_from_ring(long mask, struct max1363_state *st)
32{
33 struct iio_ring_buffer *ring = st->indio_dev->ring;
34 int count = 0, ret;
35 u8 *ring_data;
36 if (!(st->current_mode->modemask & mask)) {
37 ret = -EBUSY;
38 goto error_ret;
39 }
40
41 ring_data = kmalloc(ring->access.get_bytes_per_datum(ring), GFP_KERNEL);
42 if (ring_data == NULL) {
43 ret = -ENOMEM;
44 goto error_ret;
45 }
46 ret = ring->access.read_last(ring, ring_data);
47 if (ret)
48 goto error_free_ring_data;
49
50 mask >>= 1;
51 while (mask) {
52 if (mask & st->current_mode->modemask)
53 count++;
54 mask >>= 1;
55 }
56 if (st->chip_info->bits != 8)
57 ret = ((int)(ring_data[count*2 + 0] & 0x0F) << 8)
58 + (int)(ring_data[count*2 + 1]);
59 else
60 ret = ring_data[count];
61
62error_free_ring_data:
63 kfree(ring_data);
64error_ret:
65 return ret;
66}
67
68
69
70
71
72
73
74
75static int max1363_ring_preenable(struct iio_dev *indio_dev)
76{
77 struct max1363_state *st = indio_dev->dev_data;
78 struct iio_ring_buffer *ring = indio_dev->ring;
79 size_t d_size;
80 unsigned long numvals;
81
82
83
84
85
86 st->current_mode = max1363_match_mode(ring->scan_mask,
87 st->chip_info);
88 if (!st->current_mode)
89 return -EINVAL;
90
91 max1363_set_scan_mode(st);
92
93 numvals = hweight_long(st->current_mode->modemask);
94 if (ring->access.set_bytes_per_datum) {
95 if (st->chip_info->bits != 8)
96 d_size = numvals*2 + sizeof(s64);
97 else
98 d_size = numvals + sizeof(s64);
99 if (d_size % 8)
100 d_size += 8 - (d_size % 8);
101 ring->access.set_bytes_per_datum(ring, d_size);
102 }
103
104 return 0;
105}
106
107
108
109
110
111
112
113
114
115static void max1363_poll_func_th(struct iio_dev *indio_dev, s64 time)
116{
117 struct max1363_state *st = indio_dev->dev_data;
118
119 schedule_work(&st->poll_work);
120
121 return;
122}
123
124
125
126
127
128
129
130
131
132static void max1363_poll_bh_to_ring(struct work_struct *work_s)
133{
134 struct max1363_state *st = container_of(work_s, struct max1363_state,
135 poll_work);
136 struct iio_dev *indio_dev = st->indio_dev;
137 struct iio_sw_ring_buffer *sw_ring = iio_to_sw_ring(indio_dev->ring);
138 s64 time_ns;
139 __u8 *rxbuf;
140 int b_sent;
141 size_t d_size;
142 unsigned long numvals = hweight_long(st->current_mode->modemask);
143
144
145 if (st->chip_info->bits != 8)
146 d_size = numvals*2 + sizeof(s64);
147 else
148 d_size = numvals + sizeof(s64);
149 if (d_size % sizeof(s64))
150 d_size += sizeof(s64) - (d_size % sizeof(s64));
151
152
153 if (atomic_inc_return(&st->protect_ring) > 1)
154 return;
155
156
157
158
159
160 if (numvals == 0)
161 return;
162
163 rxbuf = kmalloc(d_size, GFP_KERNEL);
164 if (rxbuf == NULL)
165 return;
166 if (st->chip_info->bits != 8)
167 b_sent = i2c_master_recv(st->client, rxbuf, numvals*2);
168 else
169 b_sent = i2c_master_recv(st->client, rxbuf, numvals);
170 if (b_sent < 0)
171 goto done;
172
173 time_ns = iio_get_time_ns();
174
175 memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns));
176
177 indio_dev->ring->access.store_to(&sw_ring->buf, rxbuf, time_ns);
178done:
179 kfree(rxbuf);
180 atomic_dec(&st->protect_ring);
181}
182
183
184int max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev)
185{
186 struct max1363_state *st = indio_dev->dev_data;
187 int ret = 0;
188
189 indio_dev->ring = iio_sw_rb_allocate(indio_dev);
190 if (!indio_dev->ring) {
191 ret = -ENOMEM;
192 goto error_ret;
193 }
194
195 iio_ring_sw_register_funcs(&indio_dev->ring->access);
196 ret = iio_alloc_pollfunc(indio_dev, NULL, &max1363_poll_func_th);
197 if (ret)
198 goto error_deallocate_sw_rb;
199
200
201 indio_dev->ring->scan_el_attrs = st->chip_info->scan_attrs;
202 indio_dev->ring->postenable = &iio_triggered_ring_postenable;
203 indio_dev->ring->preenable = &max1363_ring_preenable;
204 indio_dev->ring->predisable = &iio_triggered_ring_predisable;
205 INIT_WORK(&st->poll_work, &max1363_poll_bh_to_ring);
206
207
208 indio_dev->modes |= INDIO_RING_TRIGGERED;
209 return 0;
210error_deallocate_sw_rb:
211 iio_sw_rb_free(indio_dev->ring);
212error_ret:
213 return ret;
214}
215
216void max1363_ring_cleanup(struct iio_dev *indio_dev)
217{
218
219 if (indio_dev->trig) {
220 iio_put_trigger(indio_dev->trig);
221 iio_trigger_dettach_poll_func(indio_dev->trig,
222 indio_dev->pollfunc);
223 }
224 kfree(indio_dev->pollfunc);
225 iio_sw_rb_free(indio_dev->ring);
226}
227