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
8struct 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 */
17struct gpio_desc;
18
19/**
20 * Struct containing an array of descriptors that can be obtained using
21 * gpiod_get_array().
22 */
23struct 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 */
36enum 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 */
47int gpiod_count(struct device *dev, const char *con_id);
48
49/* Acquire and dispose GPIOs */
50struct gpio_desc *__must_check __gpiod_get(struct device *dev,
51					 const char *con_id,
52					 enum gpiod_flags flags);
53struct gpio_desc *__must_check __gpiod_get_index(struct device *dev,
54					       const char *con_id,
55					       unsigned int idx,
56					       enum gpiod_flags flags);
57struct gpio_desc *__must_check __gpiod_get_optional(struct device *dev,
58						  const char *con_id,
59						  enum gpiod_flags flags);
60struct 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);
64struct gpio_descs *__must_check gpiod_get_array(struct device *dev,
65						const char *con_id,
66						enum gpiod_flags flags);
67struct gpio_descs *__must_check gpiod_get_array_optional(struct device *dev,
68							const char *con_id,
69							enum gpiod_flags flags);
70void gpiod_put(struct gpio_desc *desc);
71void gpiod_put_array(struct gpio_descs *descs);
72
73struct gpio_desc *__must_check __devm_gpiod_get(struct device *dev,
74					      const char *con_id,
75					      enum gpiod_flags flags);
76struct 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);
80struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev,
81						       const char *con_id,
82						       enum gpiod_flags flags);
83struct 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);
86struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev,
87						     const char *con_id,
88						     enum gpiod_flags flags);
89struct gpio_descs *__must_check
90devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
91			      enum gpiod_flags flags);
92void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
93void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs);
94
95int gpiod_get_direction(struct gpio_desc *desc);
96int gpiod_direction_input(struct gpio_desc *desc);
97int gpiod_direction_output(struct gpio_desc *desc, int value);
98int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
99
100/* Value get/set from non-sleeping context */
101int gpiod_get_value(const struct gpio_desc *desc);
102void gpiod_set_value(struct gpio_desc *desc, int value);
103void gpiod_set_array(unsigned int array_size,
104		     struct gpio_desc **desc_array, int *value_array);
105int gpiod_get_raw_value(const struct gpio_desc *desc);
106void gpiod_set_raw_value(struct gpio_desc *desc, int value);
107void 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 */
111int gpiod_get_value_cansleep(const struct gpio_desc *desc);
112void gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
113void gpiod_set_array_cansleep(unsigned int array_size,
114			      struct gpio_desc **desc_array,
115			      int *value_array);
116int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
117void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
118void gpiod_set_raw_array_cansleep(unsigned int array_size,
119				  struct gpio_desc **desc_array,
120				  int *value_array);
121
122int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
123
124int gpiod_is_active_low(const struct gpio_desc *desc);
125int gpiod_cansleep(const struct gpio_desc *desc);
126
127int gpiod_to_irq(const struct gpio_desc *desc);
128
129/* Convert between the old gpio_ and new gpiod_ interfaces */
130struct gpio_desc *gpio_to_desc(unsigned gpio);
131int desc_to_gpio(const struct gpio_desc *desc);
132
133/* Child properties interface */
134struct fwnode_handle;
135
136struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
137					 const char *propname);
138struct 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
143static inline int gpiod_count(struct device *dev, const char *con_id)
144{
145	return 0;
146}
147
148static 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}
154static inline struct gpio_desc *__must_check
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
163static inline struct gpio_desc *__must_check
164__gpiod_get_optional(struct device *dev, const char *con_id,
165		     enum gpiod_flags flags)
166{
167	return ERR_PTR(-ENOSYS);
168}
169
170static inline struct gpio_desc *__must_check
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
177static inline struct gpio_descs *__must_check
178gpiod_get_array(struct device *dev, const char *con_id,
179		enum gpiod_flags flags)
180{
181	return ERR_PTR(-ENOSYS);
182}
183
184static inline struct gpio_descs *__must_check
185gpiod_get_array_optional(struct device *dev, const char *con_id,
186			 enum gpiod_flags flags)
187{
188	return ERR_PTR(-ENOSYS);
189}
190
191static 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
199static 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
207static inline struct gpio_desc *__must_check
208__devm_gpiod_get(struct device *dev,
209		 const char *con_id,
210		 enum gpiod_flags flags)
211{
212	return ERR_PTR(-ENOSYS);
213}
214static inline
215struct gpio_desc *__must_check
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
224static inline struct gpio_desc *__must_check
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
231static inline struct gpio_desc *__must_check
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
238static inline struct gpio_descs *__must_check
239devm_gpiod_get_array(struct device *dev, const char *con_id,
240		     enum gpiod_flags flags)
241{
242	return ERR_PTR(-ENOSYS);
243}
244
245static inline struct gpio_descs *__must_check
246devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
247			      enum gpiod_flags flags)
248{
249	return ERR_PTR(-ENOSYS);
250}
251
252static 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
260static 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
270static 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}
276static 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}
282static 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}
288static 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
296static 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}
302static inline void gpiod_set_value(struct gpio_desc *desc, int value)
303{
304	/* GPIO can never have been requested */
305	WARN_ON(1);
306}
307static 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}
314static 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}
320static 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}
325static 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
333static 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}
339static 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}
344static 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}
351static 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}
357static 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}
363static 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
371static 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
378static 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}
384static 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
391static 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
398static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
399{
400	return ERR_PTR(-EINVAL);
401}
402static 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 */
410struct fwnode_handle;
411
412static inline struct gpio_desc *fwnode_get_named_gpiod(
413	struct fwnode_handle *fwnode, const char *propname)
414{
415	return ERR_PTR(-ENOSYS);
416}
417
418static 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
464int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
465int gpiod_export_link(struct device *dev, const char *name,
466		      struct gpio_desc *desc);
467int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value);
468void gpiod_unexport(struct gpio_desc *desc);
469
470#else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
471
472static inline int gpiod_export(struct gpio_desc *desc,
473			       bool direction_may_change)
474{
475	return -ENOSYS;
476}
477
478static inline int gpiod_export_link(struct device *dev, const char *name,
479				    struct gpio_desc *desc)
480{
481	return -ENOSYS;
482}
483
484static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
485{
486	return -ENOSYS;
487}
488
489static inline void gpiod_unexport(struct gpio_desc *desc)
490{
491}
492
493#endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
494
495#endif
496