1 #ifndef __LINUX_GPIO_CONSUMER_H
2 #define __LINUX_GPIO_CONSUMER_H
3 
4 #include <linux/bug.h>
5 #include <linux/err.h>
6 #include <linux/kernel.h>
7 
8 struct device;
9 
10 /**
11  * Opaque descriptor for a GPIO. These are obtained using gpiod_get() and are
12  * preferable to the old integer-based handles.
13  *
14  * Contrary to integers, a pointer to a gpio_desc is guaranteed to be valid
15  * until the GPIO is released.
16  */
17 struct gpio_desc;
18 
19 /**
20  * Struct containing an array of descriptors that can be obtained using
21  * gpiod_get_array().
22  */
23 struct gpio_descs {
24 	unsigned int ndescs;
25 	struct gpio_desc *desc[];
26 };
27 
28 #define GPIOD_FLAGS_BIT_DIR_SET		BIT(0)
29 #define GPIOD_FLAGS_BIT_DIR_OUT		BIT(1)
30 #define GPIOD_FLAGS_BIT_DIR_VAL		BIT(2)
31 
32 /**
33  * Optional flags that can be passed to one of gpiod_* to configure direction
34  * and output value. These values cannot be OR'd.
35  */
36 enum gpiod_flags {
37 	GPIOD_ASIS	= 0,
38 	GPIOD_IN	= GPIOD_FLAGS_BIT_DIR_SET,
39 	GPIOD_OUT_LOW	= GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT,
40 	GPIOD_OUT_HIGH	= GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
41 			  GPIOD_FLAGS_BIT_DIR_VAL,
42 };
43 
44 #ifdef CONFIG_GPIOLIB
45 
46 /* Return the number of GPIOs associated with a device / function */
47 int gpiod_count(struct device *dev, const char *con_id);
48 
49 /* Acquire and dispose GPIOs */
50 struct gpio_desc *__must_check __gpiod_get(struct device *dev,
51 					 const char *con_id,
52 					 enum gpiod_flags flags);
53 struct gpio_desc *__must_check __gpiod_get_index(struct device *dev,
54 					       const char *con_id,
55 					       unsigned int idx,
56 					       enum gpiod_flags flags);
57 struct gpio_desc *__must_check __gpiod_get_optional(struct device *dev,
58 						  const char *con_id,
59 						  enum gpiod_flags flags);
60 struct gpio_desc *__must_check __gpiod_get_index_optional(struct device *dev,
61 							const char *con_id,
62 							unsigned int index,
63 							enum gpiod_flags flags);
64 struct gpio_descs *__must_check gpiod_get_array(struct device *dev,
65 						const char *con_id,
66 						enum gpiod_flags flags);
67 struct gpio_descs *__must_check gpiod_get_array_optional(struct device *dev,
68 							const char *con_id,
69 							enum gpiod_flags flags);
70 void gpiod_put(struct gpio_desc *desc);
71 void gpiod_put_array(struct gpio_descs *descs);
72 
73 struct gpio_desc *__must_check __devm_gpiod_get(struct device *dev,
74 					      const char *con_id,
75 					      enum gpiod_flags flags);
76 struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev,
77 						    const char *con_id,
78 						    unsigned int idx,
79 						    enum gpiod_flags flags);
80 struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev,
81 						       const char *con_id,
82 						       enum gpiod_flags flags);
83 struct gpio_desc *__must_check
84 __devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
85 			      unsigned int index, enum gpiod_flags flags);
86 struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev,
87 						     const char *con_id,
88 						     enum gpiod_flags flags);
89 struct gpio_descs *__must_check
90 devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
91 			      enum gpiod_flags flags);
92 void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
93 void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs);
94 
95 int gpiod_get_direction(struct gpio_desc *desc);
96 int gpiod_direction_input(struct gpio_desc *desc);
97 int gpiod_direction_output(struct gpio_desc *desc, int value);
98 int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
99 
100 /* Value get/set from non-sleeping context */
101 int gpiod_get_value(const struct gpio_desc *desc);
102 void gpiod_set_value(struct gpio_desc *desc, int value);
103 void gpiod_set_array(unsigned int array_size,
104 		     struct gpio_desc **desc_array, int *value_array);
105 int gpiod_get_raw_value(const struct gpio_desc *desc);
106 void gpiod_set_raw_value(struct gpio_desc *desc, int value);
107 void gpiod_set_raw_array(unsigned int array_size,
108 			 struct gpio_desc **desc_array, int *value_array);
109 
110 /* Value get/set from sleeping context */
111 int gpiod_get_value_cansleep(const struct gpio_desc *desc);
112 void gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
113 void gpiod_set_array_cansleep(unsigned int array_size,
114 			      struct gpio_desc **desc_array,
115 			      int *value_array);
116 int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
117 void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
118 void gpiod_set_raw_array_cansleep(unsigned int array_size,
119 				  struct gpio_desc **desc_array,
120 				  int *value_array);
121 
122 int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
123 
124 int gpiod_is_active_low(const struct gpio_desc *desc);
125 int gpiod_cansleep(const struct gpio_desc *desc);
126 
127 int gpiod_to_irq(const struct gpio_desc *desc);
128 
129 /* Convert between the old gpio_ and new gpiod_ interfaces */
130 struct gpio_desc *gpio_to_desc(unsigned gpio);
131 int desc_to_gpio(const struct gpio_desc *desc);
132 
133 /* Child properties interface */
134 struct fwnode_handle;
135 
136 struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
137 					 const char *propname);
138 struct gpio_desc *devm_get_gpiod_from_child(struct device *dev,
139 					    const char *con_id,
140 					    struct fwnode_handle *child);
141 #else /* CONFIG_GPIOLIB */
142 
gpiod_count(struct device * dev,const char * con_id)143 static inline int gpiod_count(struct device *dev, const char *con_id)
144 {
145 	return 0;
146 }
147 
__gpiod_get(struct device * dev,const char * con_id,enum gpiod_flags flags)148 static inline struct gpio_desc *__must_check __gpiod_get(struct device *dev,
149 						const char *con_id,
150 						enum gpiod_flags flags)
151 {
152 	return ERR_PTR(-ENOSYS);
153 }
154 static inline struct gpio_desc *__must_check
__gpiod_get_index(struct device * dev,const char * con_id,unsigned int idx,enum gpiod_flags flags)155 __gpiod_get_index(struct device *dev,
156 		  const char *con_id,
157 		  unsigned int idx,
158 		  enum gpiod_flags flags)
159 {
160 	return ERR_PTR(-ENOSYS);
161 }
162 
163 static inline struct gpio_desc *__must_check
__gpiod_get_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)164 __gpiod_get_optional(struct device *dev, const char *con_id,
165 		     enum gpiod_flags flags)
166 {
167 	return ERR_PTR(-ENOSYS);
168 }
169 
170 static inline struct gpio_desc *__must_check
__gpiod_get_index_optional(struct device * dev,const char * con_id,unsigned int index,enum gpiod_flags flags)171 __gpiod_get_index_optional(struct device *dev, const char *con_id,
172 			   unsigned int index, enum gpiod_flags flags)
173 {
174 	return ERR_PTR(-ENOSYS);
175 }
176 
177 static inline struct gpio_descs *__must_check
gpiod_get_array(struct device * dev,const char * con_id,enum gpiod_flags flags)178 gpiod_get_array(struct device *dev, const char *con_id,
179 		enum gpiod_flags flags)
180 {
181 	return ERR_PTR(-ENOSYS);
182 }
183 
184 static inline struct gpio_descs *__must_check
gpiod_get_array_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)185 gpiod_get_array_optional(struct device *dev, const char *con_id,
186 			 enum gpiod_flags flags)
187 {
188 	return ERR_PTR(-ENOSYS);
189 }
190 
gpiod_put(struct gpio_desc * desc)191 static inline void gpiod_put(struct gpio_desc *desc)
192 {
193 	might_sleep();
194 
195 	/* GPIO can never have been requested */
196 	WARN_ON(1);
197 }
198 
gpiod_put_array(struct gpio_descs * descs)199 static inline void gpiod_put_array(struct gpio_descs *descs)
200 {
201 	might_sleep();
202 
203 	/* GPIO can never have been requested */
204 	WARN_ON(1);
205 }
206 
207 static inline struct gpio_desc *__must_check
__devm_gpiod_get(struct device * dev,const char * con_id,enum gpiod_flags flags)208 __devm_gpiod_get(struct device *dev,
209 		 const char *con_id,
210 		 enum gpiod_flags flags)
211 {
212 	return ERR_PTR(-ENOSYS);
213 }
214 static inline
215 struct gpio_desc *__must_check
__devm_gpiod_get_index(struct device * dev,const char * con_id,unsigned int idx,enum gpiod_flags flags)216 __devm_gpiod_get_index(struct device *dev,
217 		       const char *con_id,
218 		       unsigned int idx,
219 		       enum gpiod_flags flags)
220 {
221 	return ERR_PTR(-ENOSYS);
222 }
223 
224 static inline struct gpio_desc *__must_check
__devm_gpiod_get_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)225 __devm_gpiod_get_optional(struct device *dev, const char *con_id,
226 			  enum gpiod_flags flags)
227 {
228 	return ERR_PTR(-ENOSYS);
229 }
230 
231 static inline struct gpio_desc *__must_check
__devm_gpiod_get_index_optional(struct device * dev,const char * con_id,unsigned int index,enum gpiod_flags flags)232 __devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
233 				unsigned int index, enum gpiod_flags flags)
234 {
235 	return ERR_PTR(-ENOSYS);
236 }
237 
238 static inline struct gpio_descs *__must_check
devm_gpiod_get_array(struct device * dev,const char * con_id,enum gpiod_flags flags)239 devm_gpiod_get_array(struct device *dev, const char *con_id,
240 		     enum gpiod_flags flags)
241 {
242 	return ERR_PTR(-ENOSYS);
243 }
244 
245 static inline struct gpio_descs *__must_check
devm_gpiod_get_array_optional(struct device * dev,const char * con_id,enum gpiod_flags flags)246 devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
247 			      enum gpiod_flags flags)
248 {
249 	return ERR_PTR(-ENOSYS);
250 }
251 
devm_gpiod_put(struct device * dev,struct gpio_desc * desc)252 static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
253 {
254 	might_sleep();
255 
256 	/* GPIO can never have been requested */
257 	WARN_ON(1);
258 }
259 
devm_gpiod_put_array(struct device * dev,struct gpio_descs * descs)260 static inline void devm_gpiod_put_array(struct device *dev,
261 					struct gpio_descs *descs)
262 {
263 	might_sleep();
264 
265 	/* GPIO can never have been requested */
266 	WARN_ON(1);
267 }
268 
269 
gpiod_get_direction(const struct gpio_desc * desc)270 static inline int gpiod_get_direction(const struct gpio_desc *desc)
271 {
272 	/* GPIO can never have been requested */
273 	WARN_ON(1);
274 	return -ENOSYS;
275 }
gpiod_direction_input(struct gpio_desc * desc)276 static inline int gpiod_direction_input(struct gpio_desc *desc)
277 {
278 	/* GPIO can never have been requested */
279 	WARN_ON(1);
280 	return -ENOSYS;
281 }
gpiod_direction_output(struct gpio_desc * desc,int value)282 static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
283 {
284 	/* GPIO can never have been requested */
285 	WARN_ON(1);
286 	return -ENOSYS;
287 }
gpiod_direction_output_raw(struct gpio_desc * desc,int value)288 static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
289 {
290 	/* GPIO can never have been requested */
291 	WARN_ON(1);
292 	return -ENOSYS;
293 }
294 
295 
gpiod_get_value(const struct gpio_desc * desc)296 static inline int gpiod_get_value(const struct gpio_desc *desc)
297 {
298 	/* GPIO can never have been requested */
299 	WARN_ON(1);
300 	return 0;
301 }
gpiod_set_value(struct gpio_desc * desc,int value)302 static inline void gpiod_set_value(struct gpio_desc *desc, int value)
303 {
304 	/* GPIO can never have been requested */
305 	WARN_ON(1);
306 }
gpiod_set_array(unsigned int array_size,struct gpio_desc ** desc_array,int * value_array)307 static inline void gpiod_set_array(unsigned int array_size,
308 				   struct gpio_desc **desc_array,
309 				   int *value_array)
310 {
311 	/* GPIO can never have been requested */
312 	WARN_ON(1);
313 }
gpiod_get_raw_value(const struct gpio_desc * desc)314 static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
315 {
316 	/* GPIO can never have been requested */
317 	WARN_ON(1);
318 	return 0;
319 }
gpiod_set_raw_value(struct gpio_desc * desc,int value)320 static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
321 {
322 	/* GPIO can never have been requested */
323 	WARN_ON(1);
324 }
gpiod_set_raw_array(unsigned int array_size,struct gpio_desc ** desc_array,int * value_array)325 static inline void gpiod_set_raw_array(unsigned int array_size,
326 				       struct gpio_desc **desc_array,
327 				       int *value_array)
328 {
329 	/* GPIO can never have been requested */
330 	WARN_ON(1);
331 }
332 
gpiod_get_value_cansleep(const struct gpio_desc * desc)333 static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
334 {
335 	/* GPIO can never have been requested */
336 	WARN_ON(1);
337 	return 0;
338 }
gpiod_set_value_cansleep(struct gpio_desc * desc,int value)339 static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
340 {
341 	/* GPIO can never have been requested */
342 	WARN_ON(1);
343 }
gpiod_set_array_cansleep(unsigned int array_size,struct gpio_desc ** desc_array,int * value_array)344 static inline void gpiod_set_array_cansleep(unsigned int array_size,
345 					    struct gpio_desc **desc_array,
346 					    int *value_array)
347 {
348 	/* GPIO can never have been requested */
349 	WARN_ON(1);
350 }
gpiod_get_raw_value_cansleep(const struct gpio_desc * desc)351 static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
352 {
353 	/* GPIO can never have been requested */
354 	WARN_ON(1);
355 	return 0;
356 }
gpiod_set_raw_value_cansleep(struct gpio_desc * desc,int value)357 static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
358 						int value)
359 {
360 	/* GPIO can never have been requested */
361 	WARN_ON(1);
362 }
gpiod_set_raw_array_cansleep(unsigned int array_size,struct gpio_desc ** desc_array,int * value_array)363 static inline void gpiod_set_raw_array_cansleep(unsigned int array_size,
364 						struct gpio_desc **desc_array,
365 						int *value_array)
366 {
367 	/* GPIO can never have been requested */
368 	WARN_ON(1);
369 }
370 
gpiod_set_debounce(struct gpio_desc * desc,unsigned debounce)371 static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
372 {
373 	/* GPIO can never have been requested */
374 	WARN_ON(1);
375 	return -ENOSYS;
376 }
377 
gpiod_is_active_low(const struct gpio_desc * desc)378 static inline int gpiod_is_active_low(const struct gpio_desc *desc)
379 {
380 	/* GPIO can never have been requested */
381 	WARN_ON(1);
382 	return 0;
383 }
gpiod_cansleep(const struct gpio_desc * desc)384 static inline int gpiod_cansleep(const struct gpio_desc *desc)
385 {
386 	/* GPIO can never have been requested */
387 	WARN_ON(1);
388 	return 0;
389 }
390 
gpiod_to_irq(const struct gpio_desc * desc)391 static inline int gpiod_to_irq(const struct gpio_desc *desc)
392 {
393 	/* GPIO can never have been requested */
394 	WARN_ON(1);
395 	return -EINVAL;
396 }
397 
gpio_to_desc(unsigned gpio)398 static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
399 {
400 	return ERR_PTR(-EINVAL);
401 }
desc_to_gpio(const struct gpio_desc * desc)402 static inline int desc_to_gpio(const struct gpio_desc *desc)
403 {
404 	/* GPIO can never have been requested */
405 	WARN_ON(1);
406 	return -EINVAL;
407 }
408 
409 /* Child properties interface */
410 struct fwnode_handle;
411 
fwnode_get_named_gpiod(struct fwnode_handle * fwnode,const char * propname)412 static inline struct gpio_desc *fwnode_get_named_gpiod(
413 	struct fwnode_handle *fwnode, const char *propname)
414 {
415 	return ERR_PTR(-ENOSYS);
416 }
417 
devm_get_gpiod_from_child(struct device * dev,const char * con_id,struct fwnode_handle * child)418 static inline struct gpio_desc *devm_get_gpiod_from_child(
419 	struct device *dev, const char *con_id, struct fwnode_handle *child)
420 {
421 	return ERR_PTR(-ENOSYS);
422 }
423 
424 #endif /* CONFIG_GPIOLIB */
425 
426 /*
427  * Vararg-hacks! This is done to transition the kernel to always pass
428  * the options flags argument to the below functions. During a transition
429  * phase these vararg macros make both old-and-newstyle code compile,
430  * but when all calls to the elder API are removed, these should go away
431  * and the __gpiod_get() etc functions above be renamed just gpiod_get()
432  * etc.
433  */
434 #define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags)
435 #define gpiod_get(varargs...) __gpiod_get(varargs, GPIOD_ASIS)
436 #define __gpiod_get_index(dev, con_id, index, flags, ...)		\
437 	__gpiod_get_index(dev, con_id, index, flags)
438 #define gpiod_get_index(varargs...) __gpiod_get_index(varargs, GPIOD_ASIS)
439 #define __gpiod_get_optional(dev, con_id, flags, ...)			\
440 	__gpiod_get_optional(dev, con_id, flags)
441 #define gpiod_get_optional(varargs...) __gpiod_get_optional(varargs, GPIOD_ASIS)
442 #define __gpiod_get_index_optional(dev, con_id, index, flags, ...)	\
443 	__gpiod_get_index_optional(dev, con_id, index, flags)
444 #define gpiod_get_index_optional(varargs...)				\
445 	__gpiod_get_index_optional(varargs, GPIOD_ASIS)
446 #define __devm_gpiod_get(dev, con_id, flags, ...)			\
447 	__devm_gpiod_get(dev, con_id, flags)
448 #define devm_gpiod_get(varargs...) __devm_gpiod_get(varargs, GPIOD_ASIS)
449 #define __devm_gpiod_get_index(dev, con_id, index, flags, ...)		\
450 	__devm_gpiod_get_index(dev, con_id, index, flags)
451 #define devm_gpiod_get_index(varargs...)				\
452 	__devm_gpiod_get_index(varargs, GPIOD_ASIS)
453 #define __devm_gpiod_get_optional(dev, con_id, flags, ...)		\
454 	__devm_gpiod_get_optional(dev, con_id, flags)
455 #define devm_gpiod_get_optional(varargs...)				\
456 	__devm_gpiod_get_optional(varargs, GPIOD_ASIS)
457 #define __devm_gpiod_get_index_optional(dev, con_id, index, flags, ...)	\
458 	__devm_gpiod_get_index_optional(dev, con_id, index, flags)
459 #define devm_gpiod_get_index_optional(varargs...)			\
460 	__devm_gpiod_get_index_optional(varargs, GPIOD_ASIS)
461 
462 #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
463 
464 int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
465 int gpiod_export_link(struct device *dev, const char *name,
466 		      struct gpio_desc *desc);
467 int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value);
468 void gpiod_unexport(struct gpio_desc *desc);
469 
470 #else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
471 
gpiod_export(struct gpio_desc * desc,bool direction_may_change)472 static inline int gpiod_export(struct gpio_desc *desc,
473 			       bool direction_may_change)
474 {
475 	return -ENOSYS;
476 }
477 
gpiod_export_link(struct device * dev,const char * name,struct gpio_desc * desc)478 static inline int gpiod_export_link(struct device *dev, const char *name,
479 				    struct gpio_desc *desc)
480 {
481 	return -ENOSYS;
482 }
483 
gpiod_sysfs_set_active_low(struct gpio_desc * desc,int value)484 static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
485 {
486 	return -ENOSYS;
487 }
488 
gpiod_unexport(struct gpio_desc * desc)489 static inline void gpiod_unexport(struct gpio_desc *desc)
490 {
491 }
492 
493 #endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
494 
495 #endif
496