1 /* The industrial I/O core
3 *Copyright (c) 2008 Jonathan Cameron
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.
12 #ifndef _INDUSTRIAL_IO_SYSFS_H_
13 #define _INDUSTRIAL_IO_SYSFS_H_
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
23 struct iio_event_attr
{
24 struct device_attribute dev_attr
;
26 struct iio_event_handler_list
*listel
;
29 #define to_iio_event_attr(_dev_attr) \
30 container_of(_dev_attr, struct iio_event_attr, dev_attr)
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
39 struct device_attribute dev_attr
;
44 #define to_iio_dev_attr(_dev_attr) \
45 container_of(_dev_attr, struct iio_dev_attr, dev_attr)
47 ssize_t
iio_read_const_attr(struct device
*dev
,
48 struct device_attribute
*attr
,
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
57 struct iio_const_attr
{
59 struct device_attribute dev_attr
;
62 #define to_iio_const_attr(_dev_attr) \
63 container_of(_dev_attr, struct iio_const_attr, dev_attr)
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), \
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)
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)
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)
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)}
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 */
95 * IIO_DEV_ATTR_REV - revision number for the device
96 * @_show: output method for the attribute
98 * Very much device dependent.
100 #define IIO_DEV_ATTR_REV(_show) \
101 IIO_DEVICE_ATTR(revision, S_IRUGO, _show, NULL, 0)
104 * IIO_DEV_ATTR_NAME - chip type dependent identifier
105 * @_show: output method for the attribute
107 #define IIO_DEV_ATTR_NAME(_show) \
108 IIO_DEVICE_ATTR(name, S_IRUGO, _show, NULL, 0)
111 * IIO_CONST_ATTR_NAME - constant identifier
114 #define IIO_CONST_ATTR_NAME(_string) \
115 IIO_CONST_ATTR(name, _string)
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
123 #define IIO_DEV_ATTR_SAMP_FREQ(_mode, _show, _store) \
124 IIO_DEVICE_ATTR(sampling_frequency, _mode, _show, _store, 0)
127 * IIO_DEV_ATTR_AVAIL_SAMP_FREQ - list available sampling frequencies
128 * @_show: output method for the attribute
130 * May be mode dependent on some devices
133 #define IIO_DEV_ATTR_AVAIL_SAMP_FREQ(_show) \
134 IIO_DEVICE_ATTR(available_sampling_frequency, S_IRUGO, _show, NULL, 0)
136 #define IIO_DEV_ATTR_SAMP_FREQ_AVAIL(_show) \
137 IIO_DEVICE_ATTR(sampling_frequency_available, S_IRUGO, _show, NULL, 0)
139 * IIO_CONST_ATTR_AVAIL_SAMP_FREQ - list available sampling frequencies
140 * @_string: frequency string for the attribute
144 #define IIO_CONST_ATTR_SAMP_FREQ_AVAIL(_string) \
145 IIO_CONST_ATTR(sampling_frequency_available, _string)
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
152 * Success may be dependent on attachment of trigger previously.
154 #define IIO_DEV_ATTR_SW_RING_ENABLE(_show, _store) \
155 IIO_DEVICE_ATTR(sw_ring_enable, S_IRUGO | S_IWUSR, _show, _store, 0)
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
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.
165 #define IIO_DEV_ATTR_HW_RING_ENABLE(_show, _store) \
166 IIO_DEVICE_ATTR(hw_ring_enable, S_IRUGO | S_IWUSR, _show, _store, 0)
168 #define IIO_DEV_ATTR_TEMP_RAW(_show) \
169 IIO_DEVICE_ATTR(temp_raw, S_IRUGO, _show, NULL, 0)
171 #define IIO_CONST_ATTR_TEMP_OFFSET(_string) \
172 IIO_CONST_ATTR(temp_offset, _string)
174 #define IIO_CONST_ATTR_TEMP_SCALE(_string) \
175 IIO_CONST_ATTR(temp_scale, _string)
178 * IIO_EVENT_SH - generic shared event handler
180 * @_handler: handler function to be called
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.
186 #define IIO_EVENT_SH(_name, _handler) \
187 static struct iio_event_handler_list \
188 iio_event_##_name = { \
189 .handler = _handler, \
191 .exist_lock = __MUTEX_INITIALIZER(iio_event_##_name \
194 .next = &iio_event_##_name.list, \
195 .prev = &iio_event_##_name.list, \
200 * IIO_EVENT_ATTR_SH - generic shared event attribute
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
207 * An attribute with an associated IIO_EVENT_SH
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, \
215 .listel = &_ev_list };
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, \
223 .listel = &_ev_list };
226 * IIO_EVENT_ATTR - non-shared event attribute
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
233 #define IIO_EVENT_ATTR(_name, _show, _store, _mask, _handler) \
234 IIO_EVENT_SH(_name, _handler); \
237 iio_event_attr_##_name \
238 = { .dev_attr = __ATTR(_name, S_IRUGO | S_IWUSR, \
241 .listel = &iio_event_##_name }; \
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
250 * Not typically implemented in devices where full triggering support
251 * has been implemented.
253 #define IIO_EVENT_ATTR_DATA_RDY(_show, _store, _mask, _handler) \
254 IIO_EVENT_ATTR(data_rdy, _show, _store, _mask, _handler)
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
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
276 #define IIO_EV_TYPE_THRESH 0
277 #define IIO_EV_TYPE_MAG 1
278 #define IIO_EV_TYPE_ROC 2
280 #define IIO_EV_DIR_EITHER 0
281 #define IIO_EV_DIR_RISING 1
282 #define IIO_EV_DIR_FALLING 2
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))
289 #define IIO_MOD_EVENT_CODE(channelclass, number, modifier, \
291 IIO_EVENT_CODE(channelclass, 1, number, modifier, type, direction)
293 #define IIO_UNMOD_EVENT_CODE(channelclass, number, type, direction) \
294 IIO_EVENT_CODE(channelclass, 0, number, 0, type, direction)
297 #define IIO_BUFFER_EVENT_CODE(code) \
298 (IIO_EV_CLASS_BUFFER | (code << 8))
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
307 #define IIO_EVENT_ATTR_RING_50_FULL(_show, _store, _mask, _handler) \
308 IIO_EVENT_ATTR(ring_50_full, _show, _store, _mask, _handler)
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
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)
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
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)
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)
334 #endif /* _INDUSTRIAL_IO_SYSFS_H_ */