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