staging: iio: sca3000 move to new event code scheme and add combined orientations
[pandora-kernel.git] / 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 /* Generic attributes of onetype or another */
89
90 /**
91  * IIO_DEV_ATTR_REV - revision number for the device
92  * @_show: output method for the attribute
93  *
94  * Very much device dependent.
95  **/
96 #define IIO_DEV_ATTR_REV(_show)                 \
97         IIO_DEVICE_ATTR(revision, S_IRUGO, _show, NULL, 0)
98
99 /**
100  * IIO_DEV_ATTR_NAME - chip type dependent identifier
101  * @_show: output method for the attribute
102  **/
103 #define IIO_DEV_ATTR_NAME(_show)                                \
104         IIO_DEVICE_ATTR(name, S_IRUGO, _show, NULL, 0)
105
106 /**
107  * IIO_CONST_ATTR_NAME - constant identifier
108  * @_string: the name
109  **/
110 #define IIO_CONST_ATTR_NAME(_string)                            \
111         IIO_CONST_ATTR(name, _string)
112
113 /**
114  * IIO_DEV_ATTR_SAMP_FREQ - sets any internal clock frequency
115  * @_mode: sysfs file mode/permissions
116  * @_show: output method for the attribute
117  * @_store: input method for the attribute
118  **/
119 #define IIO_DEV_ATTR_SAMP_FREQ(_mode, _show, _store)                    \
120         IIO_DEVICE_ATTR(sampling_frequency, _mode, _show, _store, 0)
121
122 /**
123  * IIO_DEV_ATTR_AVAIL_SAMP_FREQ - list available sampling frequencies
124  * @_show: output method for the attribute
125  *
126  * May be mode dependent on some devices
127  **/
128 /* Deprecated */
129 #define IIO_DEV_ATTR_AVAIL_SAMP_FREQ(_show)                             \
130         IIO_DEVICE_ATTR(available_sampling_frequency, S_IRUGO, _show, NULL, 0)
131
132 #define IIO_DEV_ATTR_SAMP_FREQ_AVAIL(_show)                             \
133         IIO_DEVICE_ATTR(sampling_frequency_available, S_IRUGO, _show, NULL, 0)
134 /**
135  * IIO_CONST_ATTR_AVAIL_SAMP_FREQ - list available sampling frequencies
136  * @_string: frequency string for the attribute
137  *
138  * Constant version
139  **/
140 #define IIO_CONST_ATTR_SAMP_FREQ_AVAIL(_string)                 \
141         IIO_CONST_ATTR(sampling_frequency_available, _string)
142
143 /**
144  * IIO_DEV_ATTR_SW_RING_ENABLE - enable software ring buffer
145  * @_show: output method for the attribute
146  * @_store: input method for the attribute
147  *
148  * Success may be dependent on attachment of trigger previously.
149  **/
150 #define IIO_DEV_ATTR_SW_RING_ENABLE(_show, _store)                      \
151         IIO_DEVICE_ATTR(sw_ring_enable, S_IRUGO | S_IWUSR, _show, _store, 0)
152
153 /**
154  * IIO_DEV_ATTR_HW_RING_ENABLE - enable hardware ring buffer
155  * @_show: output method for the attribute
156  * @_store: input method for the attribute
157  *
158  * This is a different attribute from the software one as one can envision
159  * schemes where a combination of the two may be used.
160  **/
161 #define IIO_DEV_ATTR_HW_RING_ENABLE(_show, _store)                      \
162         IIO_DEVICE_ATTR(hw_ring_enable, S_IRUGO | S_IWUSR, _show, _store, 0)
163
164 #define IIO_DEV_ATTR_TEMP_RAW(_show)                    \
165         IIO_DEVICE_ATTR(temp_raw, S_IRUGO, _show, NULL, 0)
166
167 #define IIO_CONST_ATTR_TEMP_OFFSET(_string)             \
168         IIO_CONST_ATTR(temp_offset, _string)
169
170 #define IIO_CONST_ATTR_TEMP_SCALE(_string)              \
171         IIO_CONST_ATTR(temp_scale, _string)
172
173 /**
174  * IIO_EVENT_SH - generic shared event handler
175  * @_name: event name
176  * @_handler: handler function to be called
177  *
178  * This is used in cases where more than one event may result from a single
179  * handler.  Often the case that some alarm register must be read and multiple
180  * alarms may have been triggered.
181  **/
182 #define IIO_EVENT_SH(_name, _handler)                                   \
183         static struct iio_event_handler_list                            \
184         iio_event_##_name = {                                           \
185                 .handler = _handler,                                    \
186                 .refcount = 0,                                          \
187                 .exist_lock = __MUTEX_INITIALIZER(iio_event_##_name     \
188                                                   .exist_lock),         \
189                 .list = {                                               \
190                         .next = &iio_event_##_name.list,                \
191                         .prev = &iio_event_##_name.list,                \
192                 },                                                      \
193         };
194
195 /**
196  * IIO_EVENT_ATTR_SH - generic shared event attribute
197  * @_name: event name
198  * @_ev_list: event handler list
199  * @_show: output method for the attribute
200  * @_store: input method for the attribute
201  * @_mask: mask used when detecting the event
202  *
203  * An attribute with an associated IIO_EVENT_SH
204  **/
205 #define IIO_EVENT_ATTR_SH(_name, _ev_list, _show, _store, _mask)        \
206         static struct iio_event_attr                                    \
207         iio_event_attr_##_name                                          \
208         = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR,                \
209                                _show, _store),                          \
210             .mask = _mask,                                              \
211             .listel = &_ev_list };
212
213 #define IIO_EVENT_ATTR_NAMED_SH(_vname, _name, _ev_list, _show, _store, _mask) \
214         static struct iio_event_attr                                    \
215         iio_event_attr_##_vname                                         \
216         = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR,                \
217                                _show, _store),                          \
218             .mask = _mask,                                              \
219             .listel = &_ev_list };
220
221 /**
222  * IIO_EVENT_ATTR - non-shared event attribute
223  * @_name: event name
224  * @_show: output method for the attribute
225  * @_store: input method for the attribute
226  * @_mask: mask used when detecting the event
227  * @_handler: handler function to be called
228  **/
229 #define IIO_EVENT_ATTR(_name, _show, _store, _mask, _handler)           \
230         IIO_EVENT_SH(_name, _handler);                                  \
231         static struct                                                   \
232         iio_event_attr                                                  \
233         iio_event_attr_##_name                                          \
234         = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR,                \
235                                _show, _store),                          \
236             .mask = _mask,                                              \
237             .listel = &iio_event_##_name };                             \
238
239 /**
240  * IIO_EVENT_ATTR_DATA_RDY - event driven by data ready signal
241  * @_show: output method for the attribute
242  * @_store: input method for the attribute
243  * @_mask: mask used when detecting the event
244  * @_handler: handler function to be called
245  *
246  * Not typically implemented in devices where full triggering support
247  * has been implemented.
248  **/
249 #define IIO_EVENT_ATTR_DATA_RDY(_show, _store, _mask, _handler) \
250         IIO_EVENT_ATTR(data_rdy, _show, _store, _mask, _handler)
251
252 #define IIO_EV_CLASS_BUFFER             0
253 #define IIO_EV_CLASS_IN                 1
254 #define IIO_EV_CLASS_ACCEL              2
255 #define IIO_EV_CLASS_GYRO               3
256 #define IIO_EV_CLASS_MAGN               4
257 #define IIO_EV_CLASS_LIGHT              5
258 #define IIO_EV_CLASS_PROXIMITY          6
259
260 #define IIO_EV_MOD_X                    0
261 #define IIO_EV_MOD_Y                    1
262 #define IIO_EV_MOD_Z                    2
263 #define IIO_EV_MOD_X_AND_Y              3
264 #define IIO_EV_MOD_X_ANX_Z              4
265 #define IIO_EV_MOD_Y_AND_Z              5
266 #define IIO_EV_MOD_X_AND_Y_AND_Z        6
267 #define IIO_EV_MOD_X_OR_Y               7
268 #define IIO_EV_MOD_X_OR_Z               8
269 #define IIO_EV_MOD_Y_OR_Z               9
270 #define IIO_EV_MOD_X_OR_Y_OR_Z          10
271
272 #define IIO_EV_TYPE_THRESH              0
273 #define IIO_EV_TYPE_MAG                 1
274 #define IIO_EV_TYPE_ROC                 2
275
276 #define IIO_EV_DIR_EITHER               0
277 #define IIO_EV_DIR_RISING               1
278 #define IIO_EV_DIR_FALLING              2
279
280 #define IIO_EVENT_CODE(channelclass, orient_bit, number,                \
281                        modifier, type, direction)                       \
282         (channelclass | (orient_bit << 8) | ((number) << 9) |           \
283          ((modifier) << 13) | ((type) << 16) | ((direction) << 24))
284
285 #define IIO_MOD_EVENT_CODE(channelclass, number, modifier,              \
286                            type, direction)                             \
287         IIO_EVENT_CODE(channelclass, 1, number, modifier, type, direction)
288
289 #define IIO_UNMOD_EVENT_CODE(channelclass, number, type, direction)     \
290         IIO_EVENT_CODE(channelclass, 0, number, 0, type, direction)
291
292 #define IIO_EVENT_CODE_DATA_RDY         100
293 #define IIO_EVENT_CODE_RING_BASE        200
294 #define IIO_EVENT_CODE_ACCEL_BASE       300
295 #define IIO_EVENT_CODE_GYRO_BASE        400
296 #define IIO_EVENT_CODE_MISC_BASE        600
297 #define IIO_EVENT_CODE_LIGHT_BASE       700
298
299 #define IIO_EVENT_CODE_DEVICE_SPECIFIC  1000
300
301 /**
302  * IIO_EVENT_ATTR_RING_50_FULL - ring buffer event to indicate 50% full
303  * @_show: output method for the attribute
304  * @_store: input method for the attribute
305  * @_mask: mask used when detecting the event
306  * @_handler: handler function to be called
307  **/
308 #define IIO_EVENT_ATTR_RING_50_FULL(_show, _store, _mask, _handler)     \
309         IIO_EVENT_ATTR(ring_50_full, _show, _store, _mask, _handler)
310
311 /**
312  * IIO_EVENT_ATTR_RING_50_FULL_SH - shared ring event to indicate 50% full
313  * @_evlist: event handler list
314  * @_show: output method for the attribute
315  * @_store: input method for the attribute
316  * @_mask: mask used when detecting the event
317  **/
318 #define IIO_EVENT_ATTR_RING_50_FULL_SH(_evlist, _show, _store, _mask)   \
319         IIO_EVENT_ATTR_SH(ring_50_full, _evlist, _show, _store, _mask)
320
321 /**
322  * IIO_EVENT_ATTR_RING_75_FULL_SH - shared ring event to indicate 75% full
323  * @_evlist: event handler list
324  * @_show: output method for the attribute
325  * @_store: input method for the attribute
326  * @_mask: mask used when detecting the event
327  **/
328 #define IIO_EVENT_ATTR_RING_75_FULL_SH(_evlist, _show, _store, _mask)   \
329         IIO_EVENT_ATTR_SH(ring_75_full, _evlist, _show, _store, _mask)
330
331 #define IIO_EVENT_CODE_RING_50_FULL     IIO_EVENT_CODE_RING_BASE
332 #define IIO_EVENT_CODE_RING_75_FULL     (IIO_EVENT_CODE_RING_BASE + 1)
333 #define IIO_EVENT_CODE_RING_100_FULL    (IIO_EVENT_CODE_RING_BASE + 2)
334
335 #endif /* _INDUSTRIAL_IO_SYSFS_H_ */