diff options
Diffstat (limited to 'include/linux/iio/iio.h')
-rw-r--r-- | include/linux/iio/iio.h | 492 |
1 files changed, 492 insertions, 0 deletions
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h new file mode 100644 index 000000000000..3a4f6a3ab80d --- /dev/null +++ b/include/linux/iio/iio.h | |||
@@ -0,0 +1,492 @@ | |||
1 | |||
2 | /* The industrial I/O core | ||
3 | * | ||
4 | * Copyright (c) 2008 Jonathan Cameron | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published by | ||
8 | * the Free Software Foundation. | ||
9 | */ | ||
10 | #ifndef _INDUSTRIAL_IO_H_ | ||
11 | #define _INDUSTRIAL_IO_H_ | ||
12 | |||
13 | #include <linux/device.h> | ||
14 | #include <linux/cdev.h> | ||
15 | #include <linux/iio/types.h> | ||
16 | /* IIO TODO LIST */ | ||
17 | /* | ||
18 | * Provide means of adjusting timer accuracy. | ||
19 | * Currently assumes nano seconds. | ||
20 | */ | ||
21 | |||
22 | enum iio_chan_info_enum { | ||
23 | IIO_CHAN_INFO_RAW = 0, | ||
24 | IIO_CHAN_INFO_PROCESSED, | ||
25 | IIO_CHAN_INFO_SCALE, | ||
26 | IIO_CHAN_INFO_OFFSET, | ||
27 | IIO_CHAN_INFO_CALIBSCALE, | ||
28 | IIO_CHAN_INFO_CALIBBIAS, | ||
29 | IIO_CHAN_INFO_PEAK, | ||
30 | IIO_CHAN_INFO_PEAK_SCALE, | ||
31 | IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW, | ||
32 | IIO_CHAN_INFO_AVERAGE_RAW, | ||
33 | IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY, | ||
34 | IIO_CHAN_INFO_SAMP_FREQ, | ||
35 | IIO_CHAN_INFO_FREQUENCY, | ||
36 | IIO_CHAN_INFO_PHASE, | ||
37 | IIO_CHAN_INFO_HARDWAREGAIN, | ||
38 | }; | ||
39 | |||
40 | #define IIO_CHAN_INFO_SHARED_BIT(type) BIT(type*2) | ||
41 | #define IIO_CHAN_INFO_SEPARATE_BIT(type) BIT(type*2 + 1) | ||
42 | |||
43 | #define IIO_CHAN_INFO_RAW_SEPARATE_BIT \ | ||
44 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_RAW) | ||
45 | #define IIO_CHAN_INFO_PROCESSED_SEPARATE_BIT \ | ||
46 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PROCESSED) | ||
47 | #define IIO_CHAN_INFO_SCALE_SEPARATE_BIT \ | ||
48 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_SCALE) | ||
49 | #define IIO_CHAN_INFO_SCALE_SHARED_BIT \ | ||
50 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_SCALE) | ||
51 | #define IIO_CHAN_INFO_OFFSET_SEPARATE_BIT \ | ||
52 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_OFFSET) | ||
53 | #define IIO_CHAN_INFO_OFFSET_SHARED_BIT \ | ||
54 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_OFFSET) | ||
55 | #define IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT \ | ||
56 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_CALIBSCALE) | ||
57 | #define IIO_CHAN_INFO_CALIBSCALE_SHARED_BIT \ | ||
58 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_CALIBSCALE) | ||
59 | #define IIO_CHAN_INFO_CALIBBIAS_SEPARATE_BIT \ | ||
60 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_CALIBBIAS) | ||
61 | #define IIO_CHAN_INFO_CALIBBIAS_SHARED_BIT \ | ||
62 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_CALIBBIAS) | ||
63 | #define IIO_CHAN_INFO_PEAK_SEPARATE_BIT \ | ||
64 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PEAK) | ||
65 | #define IIO_CHAN_INFO_PEAK_SHARED_BIT \ | ||
66 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PEAK) | ||
67 | #define IIO_CHAN_INFO_PEAKSCALE_SEPARATE_BIT \ | ||
68 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PEAKSCALE) | ||
69 | #define IIO_CHAN_INFO_PEAKSCALE_SHARED_BIT \ | ||
70 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PEAKSCALE) | ||
71 | #define IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE_BIT \ | ||
72 | IIO_CHAN_INFO_SEPARATE_BIT( \ | ||
73 | IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) | ||
74 | #define IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SHARED_BIT \ | ||
75 | IIO_CHAN_INFO_SHARED_BIT( \ | ||
76 | IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW) | ||
77 | #define IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE_BIT \ | ||
78 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_AVERAGE_RAW) | ||
79 | #define IIO_CHAN_INFO_AVERAGE_RAW_SHARED_BIT \ | ||
80 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_AVERAGE_RAW) | ||
81 | #define IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SHARED_BIT \ | ||
82 | IIO_CHAN_INFO_SHARED_BIT( \ | ||
83 | IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) | ||
84 | #define IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY_SEPARATE_BIT \ | ||
85 | IIO_CHAN_INFO_SEPARATE_BIT( \ | ||
86 | IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) | ||
87 | #define IIO_CHAN_INFO_SAMP_FREQ_SEPARATE_BIT \ | ||
88 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_SAMP_FREQ) | ||
89 | #define IIO_CHAN_INFO_SAMP_FREQ_SHARED_BIT \ | ||
90 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_SAMP_FREQ) | ||
91 | #define IIO_CHAN_INFO_FREQUENCY_SEPARATE_BIT \ | ||
92 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_FREQUENCY) | ||
93 | #define IIO_CHAN_INFO_FREQUENCY_SHARED_BIT \ | ||
94 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_FREQUENCY) | ||
95 | #define IIO_CHAN_INFO_PHASE_SEPARATE_BIT \ | ||
96 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_PHASE) | ||
97 | #define IIO_CHAN_INFO_PHASE_SHARED_BIT \ | ||
98 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_PHASE) | ||
99 | #define IIO_CHAN_INFO_HARDWAREGAIN_SEPARATE_BIT \ | ||
100 | IIO_CHAN_INFO_SEPARATE_BIT(IIO_CHAN_INFO_HARDWAREGAIN) | ||
101 | #define IIO_CHAN_INFO_HARDWAREGAIN_SHARED_BIT \ | ||
102 | IIO_CHAN_INFO_SHARED_BIT(IIO_CHAN_INFO_HARDWAREGAIN) | ||
103 | |||
104 | enum iio_endian { | ||
105 | IIO_CPU, | ||
106 | IIO_BE, | ||
107 | IIO_LE, | ||
108 | }; | ||
109 | |||
110 | struct iio_chan_spec; | ||
111 | struct iio_dev; | ||
112 | |||
113 | /** | ||
114 | * struct iio_chan_spec_ext_info - Extended channel info attribute | ||
115 | * @name: Info attribute name | ||
116 | * @shared: Whether this attribute is shared between all channels. | ||
117 | * @read: Read callback for this info attribute, may be NULL. | ||
118 | * @write: Write callback for this info attribute, may be NULL. | ||
119 | * @private: Data private to the driver. | ||
120 | */ | ||
121 | struct iio_chan_spec_ext_info { | ||
122 | const char *name; | ||
123 | bool shared; | ||
124 | ssize_t (*read)(struct iio_dev *, uintptr_t private, | ||
125 | struct iio_chan_spec const *, char *buf); | ||
126 | ssize_t (*write)(struct iio_dev *, uintptr_t private, | ||
127 | struct iio_chan_spec const *, const char *buf, | ||
128 | size_t len); | ||
129 | uintptr_t private; | ||
130 | }; | ||
131 | |||
132 | /** | ||
133 | * struct iio_chan_spec - specification of a single channel | ||
134 | * @type: What type of measurement is the channel making. | ||
135 | * @channel: What number or name do we wish to assign the channel. | ||
136 | * @channel2: If there is a second number for a differential | ||
137 | * channel then this is it. If modified is set then the | ||
138 | * value here specifies the modifier. | ||
139 | * @address: Driver specific identifier. | ||
140 | * @scan_index: Monotonic index to give ordering in scans when read | ||
141 | * from a buffer. | ||
142 | * @scan_type: Sign: 's' or 'u' to specify signed or unsigned | ||
143 | * realbits: Number of valid bits of data | ||
144 | * storage_bits: Realbits + padding | ||
145 | * shift: Shift right by this before masking out | ||
146 | * realbits. | ||
147 | * endianness: little or big endian | ||
148 | * @info_mask: What information is to be exported about this channel. | ||
149 | * This includes calibbias, scale etc. | ||
150 | * @event_mask: What events can this channel produce. | ||
151 | * @ext_info: Array of extended info attributes for this channel. | ||
152 | * The array is NULL terminated, the last element should | ||
153 | * have it's name field set to NULL. | ||
154 | * @extend_name: Allows labeling of channel attributes with an | ||
155 | * informative name. Note this has no effect codes etc, | ||
156 | * unlike modifiers. | ||
157 | * @datasheet_name: A name used in in kernel mapping of channels. It should | ||
158 | * correspond to the first name that the channel is referred | ||
159 | * to by in the datasheet (e.g. IND), or the nearest | ||
160 | * possible compound name (e.g. IND-INC). | ||
161 | * @modified: Does a modifier apply to this channel. What these are | ||
162 | * depends on the channel type. Modifier is set in | ||
163 | * channel2. Examples are IIO_MOD_X for axial sensors about | ||
164 | * the 'x' axis. | ||
165 | * @indexed: Specify the channel has a numerical index. If not, | ||
166 | * the value in channel will be suppressed for attribute | ||
167 | * but not for event codes. Typically set it to 0 when | ||
168 | * the index is false. | ||
169 | * @differential: Channel is differential. | ||
170 | */ | ||
171 | struct iio_chan_spec { | ||
172 | enum iio_chan_type type; | ||
173 | int channel; | ||
174 | int channel2; | ||
175 | unsigned long address; | ||
176 | int scan_index; | ||
177 | struct { | ||
178 | char sign; | ||
179 | u8 realbits; | ||
180 | u8 storagebits; | ||
181 | u8 shift; | ||
182 | enum iio_endian endianness; | ||
183 | } scan_type; | ||
184 | long info_mask; | ||
185 | long event_mask; | ||
186 | const struct iio_chan_spec_ext_info *ext_info; | ||
187 | const char *extend_name; | ||
188 | const char *datasheet_name; | ||
189 | unsigned modified:1; | ||
190 | unsigned indexed:1; | ||
191 | unsigned output:1; | ||
192 | unsigned differential:1; | ||
193 | }; | ||
194 | |||
195 | #define IIO_ST(si, rb, sb, sh) \ | ||
196 | { .sign = si, .realbits = rb, .storagebits = sb, .shift = sh } | ||
197 | |||
198 | #define IIO_CHAN_SOFT_TIMESTAMP(_si) \ | ||
199 | { .type = IIO_TIMESTAMP, .channel = -1, \ | ||
200 | .scan_index = _si, .scan_type = IIO_ST('s', 64, 64, 0) } | ||
201 | |||
202 | /** | ||
203 | * iio_get_time_ns() - utility function to get a time stamp for events etc | ||
204 | **/ | ||
205 | static inline s64 iio_get_time_ns(void) | ||
206 | { | ||
207 | struct timespec ts; | ||
208 | /* | ||
209 | * calls getnstimeofday. | ||
210 | * If hrtimers then up to ns accurate, if not microsecond. | ||
211 | */ | ||
212 | ktime_get_real_ts(&ts); | ||
213 | |||
214 | return timespec_to_ns(&ts); | ||
215 | } | ||
216 | |||
217 | /* Device operating modes */ | ||
218 | #define INDIO_DIRECT_MODE 0x01 | ||
219 | #define INDIO_BUFFER_TRIGGERED 0x02 | ||
220 | #define INDIO_BUFFER_HARDWARE 0x08 | ||
221 | |||
222 | #define INDIO_ALL_BUFFER_MODES \ | ||
223 | (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE) | ||
224 | |||
225 | struct iio_trigger; /* forward declaration */ | ||
226 | struct iio_dev; | ||
227 | |||
228 | /** | ||
229 | * struct iio_info - constant information about device | ||
230 | * @driver_module: module structure used to ensure correct | ||
231 | * ownership of chrdevs etc | ||
232 | * @event_attrs: event control attributes | ||
233 | * @attrs: general purpose device attributes | ||
234 | * @read_raw: function to request a value from the device. | ||
235 | * mask specifies which value. Note 0 means a reading of | ||
236 | * the channel in question. Return value will specify the | ||
237 | * type of value returned by the device. val and val2 will | ||
238 | * contain the elements making up the returned value. | ||
239 | * @write_raw: function to write a value to the device. | ||
240 | * Parameters are the same as for read_raw. | ||
241 | * @write_raw_get_fmt: callback function to query the expected | ||
242 | * format/precision. If not set by the driver, write_raw | ||
243 | * returns IIO_VAL_INT_PLUS_MICRO. | ||
244 | * @read_event_config: find out if the event is enabled. | ||
245 | * @write_event_config: set if the event is enabled. | ||
246 | * @read_event_value: read a value associated with the event. Meaning | ||
247 | * is event dependant. event_code specifies which event. | ||
248 | * @write_event_value: write the value associated with the event. | ||
249 | * Meaning is event dependent. | ||
250 | * @validate_trigger: function to validate the trigger when the | ||
251 | * current trigger gets changed. | ||
252 | **/ | ||
253 | struct iio_info { | ||
254 | struct module *driver_module; | ||
255 | struct attribute_group *event_attrs; | ||
256 | const struct attribute_group *attrs; | ||
257 | |||
258 | int (*read_raw)(struct iio_dev *indio_dev, | ||
259 | struct iio_chan_spec const *chan, | ||
260 | int *val, | ||
261 | int *val2, | ||
262 | long mask); | ||
263 | |||
264 | int (*write_raw)(struct iio_dev *indio_dev, | ||
265 | struct iio_chan_spec const *chan, | ||
266 | int val, | ||
267 | int val2, | ||
268 | long mask); | ||
269 | |||
270 | int (*write_raw_get_fmt)(struct iio_dev *indio_dev, | ||
271 | struct iio_chan_spec const *chan, | ||
272 | long mask); | ||
273 | |||
274 | int (*read_event_config)(struct iio_dev *indio_dev, | ||
275 | u64 event_code); | ||
276 | |||
277 | int (*write_event_config)(struct iio_dev *indio_dev, | ||
278 | u64 event_code, | ||
279 | int state); | ||
280 | |||
281 | int (*read_event_value)(struct iio_dev *indio_dev, | ||
282 | u64 event_code, | ||
283 | int *val); | ||
284 | int (*write_event_value)(struct iio_dev *indio_dev, | ||
285 | u64 event_code, | ||
286 | int val); | ||
287 | int (*validate_trigger)(struct iio_dev *indio_dev, | ||
288 | struct iio_trigger *trig); | ||
289 | int (*update_scan_mode)(struct iio_dev *indio_dev, | ||
290 | const unsigned long *scan_mask); | ||
291 | int (*debugfs_reg_access)(struct iio_dev *indio_dev, | ||
292 | unsigned reg, unsigned writeval, | ||
293 | unsigned *readval); | ||
294 | }; | ||
295 | |||
296 | /** | ||
297 | * struct iio_buffer_setup_ops - buffer setup related callbacks | ||
298 | * @preenable: [DRIVER] function to run prior to marking buffer enabled | ||
299 | * @postenable: [DRIVER] function to run after marking buffer enabled | ||
300 | * @predisable: [DRIVER] function to run prior to marking buffer | ||
301 | * disabled | ||
302 | * @postdisable: [DRIVER] function to run after marking buffer disabled | ||
303 | */ | ||
304 | struct iio_buffer_setup_ops { | ||
305 | int (*preenable)(struct iio_dev *); | ||
306 | int (*postenable)(struct iio_dev *); | ||
307 | int (*predisable)(struct iio_dev *); | ||
308 | int (*postdisable)(struct iio_dev *); | ||
309 | }; | ||
310 | |||
311 | /** | ||
312 | * struct iio_dev - industrial I/O device | ||
313 | * @id: [INTERN] used to identify device internally | ||
314 | * @modes: [DRIVER] operating modes supported by device | ||
315 | * @currentmode: [DRIVER] current operating mode | ||
316 | * @dev: [DRIVER] device structure, should be assigned a parent | ||
317 | * and owner | ||
318 | * @event_interface: [INTERN] event chrdevs associated with interrupt lines | ||
319 | * @buffer: [DRIVER] any buffer present | ||
320 | * @scan_bytes: [INTERN] num bytes captured to be fed to buffer demux | ||
321 | * @mlock: [INTERN] lock used to prevent simultaneous device state | ||
322 | * changes | ||
323 | * @available_scan_masks: [DRIVER] optional array of allowed bitmasks | ||
324 | * @masklength: [INTERN] the length of the mask established from | ||
325 | * channels | ||
326 | * @active_scan_mask: [INTERN] union of all scan masks requested by buffers | ||
327 | * @scan_timestamp: [INTERN] set if any buffers have requested timestamp | ||
328 | * @scan_index_timestamp:[INTERN] cache of the index to the timestamp | ||
329 | * @trig: [INTERN] current device trigger (buffer modes) | ||
330 | * @pollfunc: [DRIVER] function run on trigger being received | ||
331 | * @channels: [DRIVER] channel specification structure table | ||
332 | * @num_channels: [DRIVER] number of chanels specified in @channels. | ||
333 | * @channel_attr_list: [INTERN] keep track of automatically created channel | ||
334 | * attributes | ||
335 | * @chan_attr_group: [INTERN] group for all attrs in base directory | ||
336 | * @name: [DRIVER] name of the device. | ||
337 | * @info: [DRIVER] callbacks and constant info from driver | ||
338 | * @info_exist_lock: [INTERN] lock to prevent use during removal | ||
339 | * @setup_ops: [DRIVER] callbacks to call before and after buffer | ||
340 | * enable/disable | ||
341 | * @chrdev: [INTERN] associated character device | ||
342 | * @groups: [INTERN] attribute groups | ||
343 | * @groupcounter: [INTERN] index of next attribute group | ||
344 | * @flags: [INTERN] file ops related flags including busy flag. | ||
345 | * @debugfs_dentry: [INTERN] device specific debugfs dentry. | ||
346 | * @cached_reg_addr: [INTERN] cached register address for debugfs reads. | ||
347 | */ | ||
348 | struct iio_dev { | ||
349 | int id; | ||
350 | |||
351 | int modes; | ||
352 | int currentmode; | ||
353 | struct device dev; | ||
354 | |||
355 | struct iio_event_interface *event_interface; | ||
356 | |||
357 | struct iio_buffer *buffer; | ||
358 | int scan_bytes; | ||
359 | struct mutex mlock; | ||
360 | |||
361 | const unsigned long *available_scan_masks; | ||
362 | unsigned masklength; | ||
363 | const unsigned long *active_scan_mask; | ||
364 | bool scan_timestamp; | ||
365 | unsigned scan_index_timestamp; | ||
366 | struct iio_trigger *trig; | ||
367 | struct iio_poll_func *pollfunc; | ||
368 | |||
369 | struct iio_chan_spec const *channels; | ||
370 | int num_channels; | ||
371 | |||
372 | struct list_head channel_attr_list; | ||
373 | struct attribute_group chan_attr_group; | ||
374 | const char *name; | ||
375 | const struct iio_info *info; | ||
376 | struct mutex info_exist_lock; | ||
377 | const struct iio_buffer_setup_ops *setup_ops; | ||
378 | struct cdev chrdev; | ||
379 | #define IIO_MAX_GROUPS 6 | ||
380 | const struct attribute_group *groups[IIO_MAX_GROUPS + 1]; | ||
381 | int groupcounter; | ||
382 | |||
383 | unsigned long flags; | ||
384 | #if defined(CONFIG_DEBUG_FS) | ||
385 | struct dentry *debugfs_dentry; | ||
386 | unsigned cached_reg_addr; | ||
387 | #endif | ||
388 | }; | ||
389 | |||
390 | /** | ||
391 | * iio_find_channel_from_si() - get channel from its scan index | ||
392 | * @indio_dev: device | ||
393 | * @si: scan index to match | ||
394 | */ | ||
395 | const struct iio_chan_spec | ||
396 | *iio_find_channel_from_si(struct iio_dev *indio_dev, int si); | ||
397 | |||
398 | /** | ||
399 | * iio_device_register() - register a device with the IIO subsystem | ||
400 | * @indio_dev: Device structure filled by the device driver | ||
401 | **/ | ||
402 | int iio_device_register(struct iio_dev *indio_dev); | ||
403 | |||
404 | /** | ||
405 | * iio_device_unregister() - unregister a device from the IIO subsystem | ||
406 | * @indio_dev: Device structure representing the device. | ||
407 | **/ | ||
408 | void iio_device_unregister(struct iio_dev *indio_dev); | ||
409 | |||
410 | /** | ||
411 | * iio_push_event() - try to add event to the list for userspace reading | ||
412 | * @indio_dev: IIO device structure | ||
413 | * @ev_code: What event | ||
414 | * @timestamp: When the event occurred | ||
415 | **/ | ||
416 | int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp); | ||
417 | |||
418 | extern struct bus_type iio_bus_type; | ||
419 | |||
420 | /** | ||
421 | * iio_device_put() - reference counted deallocation of struct device | ||
422 | * @dev: the iio_device containing the device | ||
423 | **/ | ||
424 | static inline void iio_device_put(struct iio_dev *indio_dev) | ||
425 | { | ||
426 | if (indio_dev) | ||
427 | put_device(&indio_dev->dev); | ||
428 | }; | ||
429 | |||
430 | /** | ||
431 | * dev_to_iio_dev() - Get IIO device struct from a device struct | ||
432 | * @dev: The device embedded in the IIO device | ||
433 | * | ||
434 | * Note: The device must be a IIO device, otherwise the result is undefined. | ||
435 | */ | ||
436 | static inline struct iio_dev *dev_to_iio_dev(struct device *dev) | ||
437 | { | ||
438 | return container_of(dev, struct iio_dev, dev); | ||
439 | } | ||
440 | |||
441 | /* Can we make this smaller? */ | ||
442 | #define IIO_ALIGN L1_CACHE_BYTES | ||
443 | /** | ||
444 | * iio_device_alloc() - allocate an iio_dev from a driver | ||
445 | * @sizeof_priv: Space to allocate for private structure. | ||
446 | **/ | ||
447 | struct iio_dev *iio_device_alloc(int sizeof_priv); | ||
448 | |||
449 | static inline void *iio_priv(const struct iio_dev *indio_dev) | ||
450 | { | ||
451 | return (char *)indio_dev + ALIGN(sizeof(struct iio_dev), IIO_ALIGN); | ||
452 | } | ||
453 | |||
454 | static inline struct iio_dev *iio_priv_to_dev(void *priv) | ||
455 | { | ||
456 | return (struct iio_dev *)((char *)priv - | ||
457 | ALIGN(sizeof(struct iio_dev), IIO_ALIGN)); | ||
458 | } | ||
459 | |||
460 | /** | ||
461 | * iio_device_free() - free an iio_dev from a driver | ||
462 | * @dev: the iio_dev associated with the device | ||
463 | **/ | ||
464 | void iio_device_free(struct iio_dev *indio_dev); | ||
465 | |||
466 | /** | ||
467 | * iio_buffer_enabled() - helper function to test if the buffer is enabled | ||
468 | * @indio_dev: IIO device info structure for device | ||
469 | **/ | ||
470 | static inline bool iio_buffer_enabled(struct iio_dev *indio_dev) | ||
471 | { | ||
472 | return indio_dev->currentmode | ||
473 | & (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE); | ||
474 | }; | ||
475 | |||
476 | /** | ||
477 | * iio_get_debugfs_dentry() - helper function to get the debugfs_dentry | ||
478 | * @indio_dev: IIO device info structure for device | ||
479 | **/ | ||
480 | #if defined(CONFIG_DEBUG_FS) | ||
481 | static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev) | ||
482 | { | ||
483 | return indio_dev->debugfs_dentry; | ||
484 | }; | ||
485 | #else | ||
486 | static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev) | ||
487 | { | ||
488 | return NULL; | ||
489 | }; | ||
490 | #endif | ||
491 | |||
492 | #endif /* _INDUSTRIAL_IO_H_ */ | ||