1
2
3
4
5
6
7
8
9
10
11#ifndef _INDUSTRIAL_IO_H_
12#define _INDUSTRIAL_IO_H_
13
14#include <linux/device.h>
15#include <linux/cdev.h>
16
17
18
19
20
21
22
23enum iio_data_type {
24 IIO_RAW,
25 IIO_PROCESSED,
26};
27
28enum iio_chan_type {
29
30 IIO_VOLTAGE,
31 IIO_CURRENT,
32 IIO_POWER,
33 IIO_ACCEL,
34 IIO_ANGL_VEL,
35 IIO_MAGN,
36 IIO_LIGHT,
37 IIO_INTENSITY,
38 IIO_PROXIMITY,
39 IIO_TEMP,
40 IIO_INCLI,
41 IIO_ROT,
42 IIO_ANGL,
43 IIO_TIMESTAMP,
44 IIO_CAPACITANCE,
45};
46
47enum iio_modifier {
48 IIO_NO_MOD,
49 IIO_MOD_X,
50 IIO_MOD_Y,
51 IIO_MOD_Z,
52 IIO_MOD_X_AND_Y,
53 IIO_MOD_X_ANX_Z,
54 IIO_MOD_Y_AND_Z,
55 IIO_MOD_X_AND_Y_AND_Z,
56 IIO_MOD_X_OR_Y,
57 IIO_MOD_X_OR_Z,
58 IIO_MOD_Y_OR_Z,
59 IIO_MOD_X_OR_Y_OR_Z,
60 IIO_MOD_LIGHT_BOTH,
61 IIO_MOD_LIGHT_IR,
62};
63
64
65enum iio_chan_info_enum {
66 IIO_CHAN_INFO_SCALE_SHARED,
67 IIO_CHAN_INFO_SCALE_SEPARATE,
68 IIO_CHAN_INFO_OFFSET_SHARED,
69 IIO_CHAN_INFO_OFFSET_SEPARATE,
70 IIO_CHAN_INFO_CALIBSCALE_SHARED,
71 IIO_CHAN_INFO_CALIBSCALE_SEPARATE,
72 IIO_CHAN_INFO_CALIBBIAS_SHARED,
73 IIO_CHAN_INFO_CALIBBIAS_SEPARATE,
74 IIO_CHAN_INFO_PEAK_SHARED,
75 IIO_CHAN_INFO_PEAK_SEPARATE,
76 IIO_CHAN_INFO_PEAK_SCALE_SHARED,
77 IIO_CHAN_INFO_PEAK_SCALE_SEPARATE,
78 IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SHARED,
79 IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE,
80 IIO_CHAN_INFO_AVERAGE_RAW_SHARED,
81 IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE,
82};
83
84enum iio_endian {
85 IIO_CPU,
86 IIO_BE,
87 IIO_LE,
88};
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124struct iio_chan_spec {
125 enum iio_chan_type type;
126 int channel;
127 int channel2;
128 unsigned long address;
129 int scan_index;
130 struct {
131 char sign;
132 u8 realbits;
133 u8 storagebits;
134 u8 shift;
135 enum iio_endian endianness;
136 } scan_type;
137 long info_mask;
138 long event_mask;
139 char *extend_name;
140 unsigned processed_val:1;
141 unsigned modified:1;
142 unsigned indexed:1;
143 unsigned output:1;
144 unsigned differential:1;
145};
146
147#define IIO_ST(si, rb, sb, sh) \
148 { .sign = si, .realbits = rb, .storagebits = sb, .shift = sh }
149
150
151#define IIO_CHAN(_type, _mod, _indexed, _proc, _name, _chan, _chan2, \
152 _inf_mask, _address, _si, _stype, _event_mask) \
153 { .type = _type, \
154 .output = 0, \
155 .modified = _mod, \
156 .indexed = _indexed, \
157 .processed_val = _proc, \
158 .extend_name = _name, \
159 .channel = _chan, \
160 .channel2 = _chan2, \
161 .info_mask = _inf_mask, \
162 .address = _address, \
163 .scan_index = _si, \
164 .scan_type = _stype, \
165 .event_mask = _event_mask }
166
167#define IIO_CHAN_SOFT_TIMESTAMP(_si) \
168 { .type = IIO_TIMESTAMP, .channel = -1, \
169 .scan_index = _si, .scan_type = IIO_ST('s', 64, 64, 0) }
170
171
172
173
174static inline s64 iio_get_time_ns(void)
175{
176 struct timespec ts;
177
178
179
180
181 ktime_get_real_ts(&ts);
182
183 return timespec_to_ns(&ts);
184}
185
186
187#define INDIO_DIRECT_MODE 0x01
188#define INDIO_BUFFER_TRIGGERED 0x02
189#define INDIO_BUFFER_HARDWARE 0x08
190
191#define INDIO_ALL_BUFFER_MODES \
192 (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE)
193
194
195
196#define IIO_VAL_INT 1
197#define IIO_VAL_INT_PLUS_MICRO 2
198#define IIO_VAL_INT_PLUS_NANO 3
199
200struct iio_trigger;
201struct iio_dev;
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228struct iio_info {
229 struct module *driver_module;
230 struct attribute_group *event_attrs;
231 const struct attribute_group *attrs;
232
233 int (*read_raw)(struct iio_dev *indio_dev,
234 struct iio_chan_spec const *chan,
235 int *val,
236 int *val2,
237 long mask);
238
239 int (*write_raw)(struct iio_dev *indio_dev,
240 struct iio_chan_spec const *chan,
241 int val,
242 int val2,
243 long mask);
244
245 int (*write_raw_get_fmt)(struct iio_dev *indio_dev,
246 struct iio_chan_spec const *chan,
247 long mask);
248
249 int (*read_event_config)(struct iio_dev *indio_dev,
250 u64 event_code);
251
252 int (*write_event_config)(struct iio_dev *indio_dev,
253 u64 event_code,
254 int state);
255
256 int (*read_event_value)(struct iio_dev *indio_dev,
257 u64 event_code,
258 int *val);
259 int (*write_event_value)(struct iio_dev *indio_dev,
260 u64 event_code,
261 int val);
262 int (*validate_trigger)(struct iio_dev *indio_dev,
263 struct iio_trigger *trig);
264
265};
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294struct iio_dev {
295 int id;
296
297 int modes;
298 int currentmode;
299 struct device dev;
300
301 struct iio_event_interface *event_interface;
302
303 struct iio_buffer *buffer;
304 struct mutex mlock;
305
306 unsigned long *available_scan_masks;
307 unsigned masklength;
308 struct iio_trigger *trig;
309 struct iio_poll_func *pollfunc;
310
311 struct iio_chan_spec const *channels;
312 int num_channels;
313
314 struct list_head channel_attr_list;
315 struct attribute_group chan_attr_group;
316 const char *name;
317 const struct iio_info *info;
318 struct cdev chrdev;
319#define IIO_MAX_GROUPS 6
320 const struct attribute_group *groups[IIO_MAX_GROUPS + 1];
321 int groupcounter;
322};
323
324
325
326
327
328int iio_device_register(struct iio_dev *indio_dev);
329
330
331
332
333
334void iio_device_unregister(struct iio_dev *indio_dev);
335
336
337
338
339
340
341
342int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp);
343
344extern struct bus_type iio_bus_type;
345
346
347
348
349
350static inline void iio_put_device(struct iio_dev *indio_dev)
351{
352 if (indio_dev)
353 put_device(&indio_dev->dev);
354};
355
356
357#define IIO_ALIGN L1_CACHE_BYTES
358
359
360
361
362struct iio_dev *iio_allocate_device(int sizeof_priv);
363
364static inline void *iio_priv(const struct iio_dev *indio_dev)
365{
366 return (char *)indio_dev + ALIGN(sizeof(struct iio_dev), IIO_ALIGN);
367}
368
369static inline struct iio_dev *iio_priv_to_dev(void *priv)
370{
371 return (struct iio_dev *)((char *)priv -
372 ALIGN(sizeof(struct iio_dev), IIO_ALIGN));
373}
374
375
376
377
378
379void iio_free_device(struct iio_dev *indio_dev);
380
381
382
383
384
385static inline bool iio_buffer_enabled(struct iio_dev *indio_dev)
386{
387 return indio_dev->currentmode
388 & (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE);
389};
390
391#endif
392