]> Pileus Git - ~andy/linux/blob - drivers/staging/iio/sysfs.h
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ecryptfs...
[~andy/linux] / drivers / staging / iio / sysfs.h
1 /* The industrial I/O core
2  *
3  *Copyright (c) 2008 Jonathan Cameron
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published by
7  * the Free Software Foundation.
8  *
9  * General attributes
10  */
11
12 #ifndef _INDUSTRIAL_IO_SYSFS_H_
13 #define _INDUSTRIAL_IO_SYSFS_H_
14
15 #include "iio.h"
16
17 /**
18  * struct iio_event_attr - event control attribute
19  * @dev_attr:   underlying device attribute
20  * @mask:       mask for the event when detecting
21  * @listel:     list header to allow addition to list of event handlers
22 */
23 struct iio_event_attr {
24         struct device_attribute dev_attr;
25         int mask;
26         struct iio_event_handler_list *listel;
27 };
28
29 #define to_iio_event_attr(_dev_attr) \
30         container_of(_dev_attr, struct iio_event_attr, dev_attr)
31
32 /**
33  * struct iio_dev_attr - iio specific device attribute
34  * @dev_attr:   underlying device attribute
35  * @address:    associated register address
36  * @val2:       secondary attribute value
37  */
38 struct iio_dev_attr {
39         struct device_attribute dev_attr;
40         int address;
41         int val2;
42 };
43
44 #define to_iio_dev_attr(_dev_attr)                              \
45         container_of(_dev_attr, struct iio_dev_attr, dev_attr)
46
47 ssize_t iio_read_const_attr(struct device *dev,
48                             struct device_attribute *attr,
49                             char *len);
50
51 /**
52  * struct iio_const_attr - constant device specific attribute
53  *                         often used for things like available modes
54  * @string:     attribute string
55  * @dev_attr:   underlying device attribute
56  */
57 struct iio_const_attr {
58         const char *string;
59         struct device_attribute dev_attr;
60 };
61
62 #define to_iio_const_attr(_dev_attr) \
63         container_of(_dev_attr, struct iio_const_attr, dev_attr)
64
65 /* Some attributes will be hard coded (device dependent) and not require an
66    address, in these cases pass a negative */
67 #define IIO_ATTR(_name, _mode, _show, _store, _addr)            \
68         { .dev_attr = __ATTR(_name, _mode, _show, _store),      \
69           .address = _addr }
70
71 #define IIO_DEVICE_ATTR(_name, _mode, _show, _store, _addr)     \
72         struct iio_dev_attr iio_dev_attr_##_name                \
73         = IIO_ATTR(_name, _mode, _show, _store, _addr)
74
75 #define IIO_DEVICE_ATTR_NAMED(_vname, _name, _mode, _show, _store, _addr) \
76         struct iio_dev_attr iio_dev_attr_##_vname                       \
77         = IIO_ATTR(_name, _mode, _show, _store, _addr)
78
79 #define IIO_DEVICE_ATTR_2(_name, _mode, _show, _store, _addr, _val2)    \
80         struct iio_dev_attr iio_dev_attr_##_name                        \
81         = IIO_ATTR_2(_name, _mode, _show, _store, _addr, _val2)
82
83 #define IIO_CONST_ATTR(_name, _string)                                  \
84         struct iio_const_attr iio_const_attr_##_name                    \
85         = { .string = _string,                                          \
86             .dev_attr = __ATTR(_name, S_IRUGO, iio_read_const_attr, NULL)}
87
88 #define IIO_CONST_ATTR_NAMED(_vname, _name, _string)                    \
89         struct iio_const_attr iio_const_attr_##_vname                   \
90         = { .string = _string,                                          \
91             .dev_attr = __ATTR(_name, S_IRUGO, iio_read_const_attr, NULL)}
92 /* Generic attributes of onetype or another */
93
94 /**
95  * IIO_DEV_ATTR_REV - revision number for the device
96  * @_show: output method for the attribute
97  *
98  * Very much device dependent.
99  **/
100 #define IIO_DEV_ATTR_REV(_show)                 \
101         IIO_DEVICE_ATTR(revision, S_IRUGO, _show, NULL, 0)
102
103 /**
104  * IIO_DEV_ATTR_NAME - chip type dependent identifier
105  * @_show: output method for the attribute
106  **/
107 #define IIO_DEV_ATTR_NAME(_show)                                \
108         IIO_DEVICE_ATTR(name, S_IRUGO, _show, NULL, 0)
109
110 /**
111  * IIO_CONST_ATTR_NAME - constant identifier
112  * @_string: the name
113  **/
114 #define IIO_CONST_ATTR_NAME(_string)                            \
115         IIO_CONST_ATTR(name, _string)
116
117 /**
118  * IIO_DEV_ATTR_SAMP_FREQ - sets any internal clock frequency
119  * @_mode: sysfs file mode/permissions
120  * @_show: output method for the attribute
121  * @_store: input method for the attribute
122  **/
123 #define IIO_DEV_ATTR_SAMP_FREQ(_mode, _show, _store)                    \
124         IIO_DEVICE_ATTR(sampling_frequency, _mode, _show, _store, 0)
125
126 /**
127  * IIO_DEV_ATTR_AVAIL_SAMP_FREQ - list available sampling frequencies
128  * @_show: output method for the attribute
129  *
130  * May be mode dependent on some devices
131  **/
132 /* Deprecated */
133 #define IIO_DEV_ATTR_AVAIL_SAMP_FREQ(_show)                             \
134         IIO_DEVICE_ATTR(available_sampling_frequency, S_IRUGO, _show, NULL, 0)
135
136 #define IIO_DEV_ATTR_SAMP_FREQ_AVAIL(_show)                             \
137         IIO_DEVICE_ATTR(sampling_frequency_available, S_IRUGO, _show, NULL, 0)
138 /**
139  * IIO_CONST_ATTR_AVAIL_SAMP_FREQ - list available sampling frequencies
140  * @_string: frequency string for the attribute
141  *
142  * Constant version
143  **/
144 #define IIO_CONST_ATTR_SAMP_FREQ_AVAIL(_string)                 \
145         IIO_CONST_ATTR(sampling_frequency_available, _string)
146
147 /**
148  * IIO_DEV_ATTR_SW_RING_ENABLE - enable software ring buffer
149  * @_show: output method for the attribute
150  * @_store: input method for the attribute
151  *
152  * Success may be dependent on attachment of trigger previously.
153  **/
154 #define IIO_DEV_ATTR_SW_RING_ENABLE(_show, _store)                      \
155         IIO_DEVICE_ATTR(sw_ring_enable, S_IRUGO | S_IWUSR, _show, _store, 0)
156
157 /**
158  * IIO_DEV_ATTR_HW_RING_ENABLE - enable hardware ring buffer
159  * @_show: output method for the attribute
160  * @_store: input method for the attribute
161  *
162  * This is a different attribute from the software one as one can envision
163  * schemes where a combination of the two may be used.
164  **/
165 #define IIO_DEV_ATTR_HW_RING_ENABLE(_show, _store)                      \
166         IIO_DEVICE_ATTR(hw_ring_enable, S_IRUGO | S_IWUSR, _show, _store, 0)
167
168 #define IIO_DEV_ATTR_TEMP_RAW(_show)                    \
169         IIO_DEVICE_ATTR(temp_raw, S_IRUGO, _show, NULL, 0)
170
171 #define IIO_CONST_ATTR_TEMP_OFFSET(_string)             \
172         IIO_CONST_ATTR(temp_offset, _string)
173
174 #define IIO_CONST_ATTR_TEMP_SCALE(_string)              \
175         IIO_CONST_ATTR(temp_scale, _string)
176
177 /**
178  * IIO_EVENT_SH - generic shared event handler
179  * @_name: event name
180  * @_handler: handler function to be called
181  *
182  * This is used in cases where more than one event may result from a single
183  * handler.  Often the case that some alarm register must be read and multiple
184  * alarms may have been triggered.
185  **/
186 #define IIO_EVENT_SH(_name, _handler)                                   \
187         static struct iio_event_handler_list                            \
188         iio_event_##_name = {                                           \
189                 .handler = _handler,                                    \
190                 .refcount = 0,                                          \
191                 .exist_lock = __MUTEX_INITIALIZER(iio_event_##_name     \
192                                                   .exist_lock),         \
193                 .list = {                                               \
194                         .next = &iio_event_##_name.list,                \
195                         .prev = &iio_event_##_name.list,                \
196                 },                                                      \
197         };
198
199 /**
200  * IIO_EVENT_ATTR_SH - generic shared event attribute
201  * @_name: event name
202  * @_ev_list: event handler list
203  * @_show: output method for the attribute
204  * @_store: input method for the attribute
205  * @_mask: mask used when detecting the event
206  *
207  * An attribute with an associated IIO_EVENT_SH
208  **/
209 #define IIO_EVENT_ATTR_SH(_name, _ev_list, _show, _store, _mask)        \
210         static struct iio_event_attr                                    \
211         iio_event_attr_##_name                                          \
212         = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR,                \
213                                _show, _store),                          \
214             .mask = _mask,                                              \
215             .listel = &_ev_list };
216
217 #define IIO_EVENT_ATTR_NAMED_SH(_vname, _name, _ev_list, _show, _store, _mask) \
218         static struct iio_event_attr                                    \
219         iio_event_attr_##_vname                                         \
220         = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR,                \
221                                _show, _store),                          \
222             .mask = _mask,                                              \
223             .listel = &_ev_list };
224
225 /**
226  * IIO_EVENT_ATTR - non-shared event attribute
227  * @_name: event name
228  * @_show: output method for the attribute
229  * @_store: input method for the attribute
230  * @_mask: mask used when detecting the event
231  * @_handler: handler function to be called
232  **/
233 #define IIO_EVENT_ATTR(_name, _show, _store, _mask, _handler)           \
234         IIO_EVENT_SH(_name, _handler);                                  \
235         static struct                                                   \
236         iio_event_attr                                                  \
237         iio_event_attr_##_name                                          \
238         = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR,                \
239                                _show, _store),                          \
240             .mask = _mask,                                              \
241             .listel = &iio_event_##_name };                             \
242
243 /**
244  * IIO_EVENT_ATTR_DATA_RDY - event driven by data ready signal
245  * @_show: output method for the attribute
246  * @_store: input method for the attribute
247  * @_mask: mask used when detecting the event
248  * @_handler: handler function to be called
249  *
250  * Not typically implemented in devices where full triggering support
251  * has been implemented.
252  **/
253 #define IIO_EVENT_ATTR_DATA_RDY(_show, _store, _mask, _handler) \
254         IIO_EVENT_ATTR(data_rdy, _show, _store, _mask, _handler)
255
256 #define IIO_EV_CLASS_BUFFER             0
257 #define IIO_EV_CLASS_IN                 1
258 #define IIO_EV_CLASS_ACCEL              2
259 #define IIO_EV_CLASS_GYRO               3
260 #define IIO_EV_CLASS_MAGN               4
261 #define IIO_EV_CLASS_LIGHT              5
262 #define IIO_EV_CLASS_PROXIMITY          6
263
264 #define IIO_EV_MOD_X                    0
265 #define IIO_EV_MOD_Y                    1
266 #define IIO_EV_MOD_Z                    2
267 #define IIO_EV_MOD_X_AND_Y              3
268 #define IIO_EV_MOD_X_ANX_Z              4
269 #define IIO_EV_MOD_Y_AND_Z              5
270 #define IIO_EV_MOD_X_AND_Y_AND_Z        6
271 #define IIO_EV_MOD_X_OR_Y               7
272 #define IIO_EV_MOD_X_OR_Z               8
273 #define IIO_EV_MOD_Y_OR_Z               9
274 #define IIO_EV_MOD_X_OR_Y_OR_Z          10
275
276 #define IIO_EV_TYPE_THRESH              0
277 #define IIO_EV_TYPE_MAG                 1
278 #define IIO_EV_TYPE_ROC                 2
279
280 #define IIO_EV_DIR_EITHER               0
281 #define IIO_EV_DIR_RISING               1
282 #define IIO_EV_DIR_FALLING              2
283
284 #define IIO_EVENT_CODE(channelclass, orient_bit, number,                \
285                        modifier, type, direction)                       \
286         (channelclass | (orient_bit << 8) | ((number) << 9) |           \
287          ((modifier) << 13) | ((type) << 16) | ((direction) << 24))
288
289 #define IIO_MOD_EVENT_CODE(channelclass, number, modifier,              \
290                            type, direction)                             \
291         IIO_EVENT_CODE(channelclass, 1, number, modifier, type, direction)
292
293 #define IIO_UNMOD_EVENT_CODE(channelclass, number, type, direction)     \
294         IIO_EVENT_CODE(channelclass, 0, number, 0, type, direction)
295
296
297 #define IIO_BUFFER_EVENT_CODE(code)             \
298         (IIO_EV_CLASS_BUFFER | (code << 8))
299
300 /**
301  * IIO_EVENT_ATTR_RING_50_FULL - ring buffer event to indicate 50% full
302  * @_show: output method for the attribute
303  * @_store: input method for the attribute
304  * @_mask: mask used when detecting the event
305  * @_handler: handler function to be called
306  **/
307 #define IIO_EVENT_ATTR_RING_50_FULL(_show, _store, _mask, _handler)     \
308         IIO_EVENT_ATTR(ring_50_full, _show, _store, _mask, _handler)
309
310 /**
311  * IIO_EVENT_ATTR_RING_50_FULL_SH - shared ring event to indicate 50% full
312  * @_evlist: event handler list
313  * @_show: output method for the attribute
314  * @_store: input method for the attribute
315  * @_mask: mask used when detecting the event
316  **/
317 #define IIO_EVENT_ATTR_RING_50_FULL_SH(_evlist, _show, _store, _mask)   \
318         IIO_EVENT_ATTR_SH(ring_50_full, _evlist, _show, _store, _mask)
319
320 /**
321  * IIO_EVENT_ATTR_RING_75_FULL_SH - shared ring event to indicate 75% full
322  * @_evlist: event handler list
323  * @_show: output method for the attribute
324  * @_store: input method for the attribute
325  * @_mask: mask used when detecting the event
326  **/
327 #define IIO_EVENT_ATTR_RING_75_FULL_SH(_evlist, _show, _store, _mask)   \
328         IIO_EVENT_ATTR_SH(ring_75_full, _evlist, _show, _store, _mask)
329
330 #define IIO_EVENT_CODE_RING_50_FULL     IIO_BUFFER_EVENT_CODE(0)
331 #define IIO_EVENT_CODE_RING_75_FULL     IIO_BUFFER_EVENT_CODE(1)
332 #define IIO_EVENT_CODE_RING_100_FULL    IIO_BUFFER_EVENT_CODE(2)
333
334 #endif /* _INDUSTRIAL_IO_SYSFS_H_ */