blob: 12f146fa660434731df9ed2d8c2f6929dcc46217 [file] [log] [blame]
Alexandre Courbot79a9bec2013-10-17 10:21:36 -07001#ifndef __LINUX_GPIO_CONSUMER_H
2#define __LINUX_GPIO_CONSUMER_H
3
Arnd Bergmanncdf86cd22014-05-08 15:42:25 +02004#include <linux/bug.h>
Alexandre Courbot79a9bec2013-10-17 10:21:36 -07005#include <linux/err.h>
6#include <linux/kernel.h>
7
Alexandre Courbot79a9bec2013-10-17 10:21:36 -07008struct device;
Alexandre Courbot79a9bec2013-10-17 10:21:36 -07009
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
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090019#define GPIOD_FLAGS_BIT_DIR_SET BIT(0)
20#define GPIOD_FLAGS_BIT_DIR_OUT BIT(1)
21#define GPIOD_FLAGS_BIT_DIR_VAL BIT(2)
22
23/**
24 * Optional flags that can be passed to one of gpiod_* to configure direction
25 * and output value. These values cannot be OR'd.
26 */
27enum gpiod_flags {
28 GPIOD_ASIS = 0,
29 GPIOD_IN = GPIOD_FLAGS_BIT_DIR_SET,
30 GPIOD_OUT_LOW = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT,
31 GPIOD_OUT_HIGH = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
32 GPIOD_FLAGS_BIT_DIR_VAL,
33};
34
Linus Walleij58b84f62014-08-19 12:00:53 -050035#ifdef CONFIG_GPIOLIB
36
Alexandre Courbotbae48da2013-10-17 10:21:38 -070037/* Acquire and dispose GPIOs */
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090038struct gpio_desc *__must_check __gpiod_get(struct device *dev,
39 const char *con_id,
40 enum gpiod_flags flags);
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090041struct gpio_desc *__must_check __gpiod_get_index(struct device *dev,
Alexandre Courbotbae48da2013-10-17 10:21:38 -070042 const char *con_id,
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090043 unsigned int idx,
44 enum gpiod_flags flags);
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090045struct gpio_desc *__must_check __gpiod_get_optional(struct device *dev,
46 const char *con_id,
47 enum gpiod_flags flags);
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090048struct gpio_desc *__must_check __gpiod_get_index_optional(struct device *dev,
Thierry Reding29a1f2332014-04-25 17:10:06 +020049 const char *con_id,
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090050 unsigned int index,
51 enum gpiod_flags flags);
Alexandre Courbotbae48da2013-10-17 10:21:38 -070052void gpiod_put(struct gpio_desc *desc);
53
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090054struct gpio_desc *__must_check __devm_gpiod_get(struct device *dev,
55 const char *con_id,
56 enum gpiod_flags flags);
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090057struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev,
Alexandre Courbotbae48da2013-10-17 10:21:38 -070058 const char *con_id,
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090059 unsigned int idx,
60 enum gpiod_flags flags);
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090061struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev,
62 const char *con_id,
63 enum gpiod_flags flags);
Thierry Reding29a1f2332014-04-25 17:10:06 +020064struct gpio_desc *__must_check
Alexandre Courbot39b2bbe2014-07-25 23:38:36 +090065__devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
66 unsigned int index, enum gpiod_flags flags);
Alexandre Courbotbae48da2013-10-17 10:21:38 -070067void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
68
Alexandre Courbot79a9bec2013-10-17 10:21:36 -070069int gpiod_get_direction(const struct gpio_desc *desc);
70int gpiod_direction_input(struct gpio_desc *desc);
71int gpiod_direction_output(struct gpio_desc *desc, int value);
Philipp Zabelef70bbe2014-01-07 12:34:11 +010072int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
Alexandre Courbot79a9bec2013-10-17 10:21:36 -070073
74/* Value get/set from non-sleeping context */
75int gpiod_get_value(const struct gpio_desc *desc);
76void gpiod_set_value(struct gpio_desc *desc, int value);
77int gpiod_get_raw_value(const struct gpio_desc *desc);
78void gpiod_set_raw_value(struct gpio_desc *desc, int value);
79
80/* Value get/set from sleeping context */
81int gpiod_get_value_cansleep(const struct gpio_desc *desc);
82void gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
83int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
84void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
85
86int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
87
88int gpiod_is_active_low(const struct gpio_desc *desc);
89int gpiod_cansleep(const struct gpio_desc *desc);
90
91int gpiod_to_irq(const struct gpio_desc *desc);
92
93/* Convert between the old gpio_ and new gpiod_ interfaces */
94struct gpio_desc *gpio_to_desc(unsigned gpio);
95int desc_to_gpio(const struct gpio_desc *desc);
Alexandre Courbot79a9bec2013-10-17 10:21:36 -070096
97#else /* CONFIG_GPIOLIB */
98
Linus Walleij0dbc8b72014-09-01 15:15:40 +020099static inline struct gpio_desc *__must_check __gpiod_get(struct device *dev,
100 const char *con_id,
101 enum gpiod_flags flags)
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700102{
103 return ERR_PTR(-ENOSYS);
104}
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200105static inline struct gpio_desc *__must_check
106__gpiod_get_index(struct device *dev,
107 const char *con_id,
108 unsigned int idx,
109 enum gpiod_flags flags)
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700110{
111 return ERR_PTR(-ENOSYS);
112}
Thierry Reding29a1f2332014-04-25 17:10:06 +0200113
114static inline struct gpio_desc *__must_check
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200115__gpiod_get_optional(struct device *dev, const char *con_id,
116 enum gpiod_flags flags)
Thierry Reding29a1f2332014-04-25 17:10:06 +0200117{
118 return ERR_PTR(-ENOSYS);
119}
120
121static inline struct gpio_desc *__must_check
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200122__gpiod_get_index_optional(struct device *dev, const char *con_id,
123 unsigned int index, enum gpiod_flags flags)
Thierry Reding29a1f2332014-04-25 17:10:06 +0200124{
125 return ERR_PTR(-ENOSYS);
126}
127
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700128static inline void gpiod_put(struct gpio_desc *desc)
129{
130 might_sleep();
131
132 /* GPIO can never have been requested */
133 WARN_ON(1);
134}
135
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200136static inline struct gpio_desc *__must_check
137__devm_gpiod_get(struct device *dev,
138 const char *con_id,
139 enum gpiod_flags flags)
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700140{
141 return ERR_PTR(-ENOSYS);
142}
143static inline
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200144struct gpio_desc *__must_check
145__devm_gpiod_get_index(struct device *dev,
146 const char *con_id,
147 unsigned int idx,
148 enum gpiod_flags flags)
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700149{
150 return ERR_PTR(-ENOSYS);
151}
Thierry Reding29a1f2332014-04-25 17:10:06 +0200152
153static inline struct gpio_desc *__must_check
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200154__devm_gpiod_get_optional(struct device *dev, const char *con_id,
155 enum gpiod_flags flags)
Thierry Reding29a1f2332014-04-25 17:10:06 +0200156{
157 return ERR_PTR(-ENOSYS);
158}
159
160static inline struct gpio_desc *__must_check
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200161__devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
162 unsigned int index, enum gpiod_flags flags)
Thierry Reding29a1f2332014-04-25 17:10:06 +0200163{
164 return ERR_PTR(-ENOSYS);
165}
166
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700167static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
168{
169 might_sleep();
170
171 /* GPIO can never have been requested */
172 WARN_ON(1);
173}
174
175
176static inline int gpiod_get_direction(const struct gpio_desc *desc)
177{
178 /* GPIO can never have been requested */
179 WARN_ON(1);
180 return -ENOSYS;
181}
182static inline int gpiod_direction_input(struct gpio_desc *desc)
183{
184 /* GPIO can never have been requested */
185 WARN_ON(1);
186 return -ENOSYS;
187}
188static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
189{
190 /* GPIO can never have been requested */
191 WARN_ON(1);
192 return -ENOSYS;
193}
Philipp Zabelef70bbe2014-01-07 12:34:11 +0100194static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
195{
196 /* GPIO can never have been requested */
197 WARN_ON(1);
198 return -ENOSYS;
199}
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700200
201
202static inline int gpiod_get_value(const struct gpio_desc *desc)
203{
204 /* GPIO can never have been requested */
205 WARN_ON(1);
206 return 0;
207}
208static inline void gpiod_set_value(struct gpio_desc *desc, int value)
209{
210 /* GPIO can never have been requested */
211 WARN_ON(1);
212}
213static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
214{
215 /* GPIO can never have been requested */
216 WARN_ON(1);
217 return 0;
218}
219static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
220{
221 /* GPIO can never have been requested */
222 WARN_ON(1);
223}
224
225static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
226{
227 /* GPIO can never have been requested */
228 WARN_ON(1);
229 return 0;
230}
231static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
232{
233 /* GPIO can never have been requested */
234 WARN_ON(1);
235}
236static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
237{
238 /* GPIO can never have been requested */
239 WARN_ON(1);
240 return 0;
241}
242static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
243 int value)
244{
245 /* GPIO can never have been requested */
246 WARN_ON(1);
247}
248
249static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
250{
251 /* GPIO can never have been requested */
252 WARN_ON(1);
253 return -ENOSYS;
254}
255
256static inline int gpiod_is_active_low(const struct gpio_desc *desc)
257{
258 /* GPIO can never have been requested */
259 WARN_ON(1);
260 return 0;
261}
262static inline int gpiod_cansleep(const struct gpio_desc *desc)
263{
264 /* GPIO can never have been requested */
265 WARN_ON(1);
266 return 0;
267}
268
269static inline int gpiod_to_irq(const struct gpio_desc *desc)
270{
271 /* GPIO can never have been requested */
272 WARN_ON(1);
273 return -EINVAL;
274}
275
276static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
277{
278 return ERR_PTR(-EINVAL);
279}
280static inline int desc_to_gpio(const struct gpio_desc *desc)
281{
282 /* GPIO can never have been requested */
283 WARN_ON(1);
284 return -EINVAL;
285}
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700286
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700287#endif /* CONFIG_GPIOLIB */
288
Linus Walleij0dbc8b72014-09-01 15:15:40 +0200289/*
290 * Vararg-hacks! This is done to transition the kernel to always pass
291 * the options flags argument to the below functions. During a transition
292 * phase these vararg macros make both old-and-newstyle code compile,
293 * but when all calls to the elder API are removed, these should go away
294 * and the __gpiod_get() etc functions above be renamed just gpiod_get()
295 * etc.
296 */
297#define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags)
298#define gpiod_get(varargs...) __gpiod_get(varargs, 0)
299#define __gpiod_get_index(dev, con_id, index, flags, ...) \
300 __gpiod_get_index(dev, con_id, index, flags)
301#define gpiod_get_index(varargs...) __gpiod_get_index(varargs, 0)
302#define __gpiod_get_optional(dev, con_id, flags, ...) \
303 __gpiod_get_optional(dev, con_id, flags)
304#define gpiod_get_optional(varargs...) __gpiod_get_optional(varargs, 0)
305#define __gpiod_get_index_optional(dev, con_id, index, flags, ...) \
306 __gpiod_get_index_optional(dev, con_id, index, flags)
307#define gpiod_get_index_optional(varargs...) \
308 __gpiod_get_index_optional(varargs, 0)
309#define __devm_gpiod_get(dev, con_id, flags, ...) \
310 __devm_gpiod_get(dev, con_id, flags)
311#define devm_gpiod_get(varargs...) __devm_gpiod_get(varargs, 0)
312#define __devm_gpiod_get_index(dev, con_id, index, flags, ...) \
313 __devm_gpiod_get_index(dev, con_id, index, flags)
314#define devm_gpiod_get_index(varargs...) __devm_gpiod_get_index(varargs, 0)
315#define __devm_gpiod_get_optional(dev, con_id, flags, ...) \
316 __devm_gpiod_get_optional(dev, con_id, flags)
317#define devm_gpiod_get_optional(varargs...) \
318 __devm_gpiod_get_optional(varargs, 0)
319#define __devm_gpiod_get_index_optional(dev, con_id, index, flags, ...) \
320 __devm_gpiod_get_index_optional(dev, con_id, index, flags)
321#define devm_gpiod_get_index_optional(varargs...) \
322 __devm_gpiod_get_index_optional(varargs, 0)
323
Alexandre Courbot79a9bec2013-10-17 10:21:36 -0700324#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
325
326int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
327int gpiod_export_link(struct device *dev, const char *name,
328 struct gpio_desc *desc);
329int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value);
330void gpiod_unexport(struct gpio_desc *desc);
331
332#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
333
334static inline int gpiod_export(struct gpio_desc *desc,
335 bool direction_may_change)
336{
337 return -ENOSYS;
338}
339
340static inline int gpiod_export_link(struct device *dev, const char *name,
341 struct gpio_desc *desc)
342{
343 return -ENOSYS;
344}
345
346static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
347{
348 return -ENOSYS;
349}
350
351static inline void gpiod_unexport(struct gpio_desc *desc)
352{
353}
354
355#endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
356
357#endif