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