xref: /linux-6.15/include/linux/gpio/consumer.h (revision 75c34906)
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 #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  */
27 enum 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 
35 #ifdef CONFIG_GPIOLIB
36 
37 /* Acquire and dispose GPIOs */
38 struct gpio_desc *__must_check __gpiod_get(struct device *dev,
39 					 const char *con_id,
40 					 enum gpiod_flags flags);
41 #define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags)
42 #define gpiod_get(varargs...) __gpiod_get(varargs, 0)
43 struct gpio_desc *__must_check __gpiod_get_index(struct device *dev,
44 					       const char *con_id,
45 					       unsigned int idx,
46 					       enum gpiod_flags flags);
47 #define __gpiod_get_index(dev, con_id, index, flags, ...)		\
48 	__gpiod_get_index(dev, con_id, index, flags)
49 #define gpiod_get_index(varargs...) __gpiod_get_index(varargs, 0)
50 struct gpio_desc *__must_check __gpiod_get_optional(struct device *dev,
51 						  const char *con_id,
52 						  enum gpiod_flags flags);
53 #define __gpiod_get_optional(dev, con_id, flags, ...)			\
54 	__gpiod_get_optional(dev, con_id, flags)
55 #define gpiod_get_optional(varargs...) __gpiod_get_optional(varargs, 0)
56 struct gpio_desc *__must_check __gpiod_get_index_optional(struct device *dev,
57 							const char *con_id,
58 							unsigned int index,
59 							enum gpiod_flags flags);
60 #define __gpiod_get_index_optional(dev, con_id, index, flags, ...)	\
61 	__gpiod_get_index_optional(dev, con_id, index, flags)
62 #define gpiod_get_index_optional(varargs...)				\
63 	__gpiod_get_index_optional(varargs, 0)
64 
65 void gpiod_put(struct gpio_desc *desc);
66 
67 struct gpio_desc *__must_check __devm_gpiod_get(struct device *dev,
68 					      const char *con_id,
69 					      enum gpiod_flags flags);
70 #define __devm_gpiod_get(dev, con_id, flags, ...)			\
71 	__devm_gpiod_get(dev, con_id, flags)
72 #define devm_gpiod_get(varargs...) __devm_gpiod_get(varargs, 0)
73 struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev,
74 						    const char *con_id,
75 						    unsigned int idx,
76 						    enum gpiod_flags flags);
77 #define __devm_gpiod_get_index(dev, con_id, index, flags, ...)		\
78 	__devm_gpiod_get_index(dev, con_id, index, flags)
79 #define devm_gpiod_get_index(varargs...) __devm_gpiod_get_index(varargs, 0)
80 struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev,
81 						       const char *con_id,
82 						       enum gpiod_flags flags);
83 #define __devm_gpiod_get_optional(dev, con_id, flags, ...)		\
84 	__devm_gpiod_get_optional(dev, con_id, flags)
85 #define devm_gpiod_get_optional(varargs...)				\
86 	__devm_gpiod_get_optional(varargs, 0)
87 struct gpio_desc *__must_check
88 __devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
89 			      unsigned int index, enum gpiod_flags flags);
90 #define __devm_gpiod_get_index_optional(dev, con_id, index, flags, ...)	\
91 	__devm_gpiod_get_index_optional(dev, con_id, index, flags)
92 #define devm_gpiod_get_index_optional(varargs...)			\
93 	__devm_gpiod_get_index_optional(varargs, 0)
94 
95 void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
96 
97 int gpiod_get_direction(const struct gpio_desc *desc);
98 int gpiod_direction_input(struct gpio_desc *desc);
99 int gpiod_direction_output(struct gpio_desc *desc, int value);
100 int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
101 
102 /* Value get/set from non-sleeping context */
103 int gpiod_get_value(const struct gpio_desc *desc);
104 void gpiod_set_value(struct gpio_desc *desc, int value);
105 int gpiod_get_raw_value(const struct gpio_desc *desc);
106 void gpiod_set_raw_value(struct gpio_desc *desc, int value);
107 
108 /* Value get/set from sleeping context */
109 int gpiod_get_value_cansleep(const struct gpio_desc *desc);
110 void gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
111 int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
112 void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
113 
114 int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
115 
116 int gpiod_is_active_low(const struct gpio_desc *desc);
117 int gpiod_cansleep(const struct gpio_desc *desc);
118 
119 int gpiod_to_irq(const struct gpio_desc *desc);
120 
121 /* Convert between the old gpio_ and new gpiod_ interfaces */
122 struct gpio_desc *gpio_to_desc(unsigned gpio);
123 int desc_to_gpio(const struct gpio_desc *desc);
124 
125 #else /* CONFIG_GPIOLIB */
126 
127 static inline struct gpio_desc *__must_check gpiod_get(struct device *dev,
128 						       const char *con_id)
129 {
130 	return ERR_PTR(-ENOSYS);
131 }
132 static inline struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
133 							     const char *con_id,
134 							     unsigned int idx)
135 {
136 	return ERR_PTR(-ENOSYS);
137 }
138 
139 static inline struct gpio_desc *__must_check
140 gpiod_get_optional(struct device *dev, const char *con_id)
141 {
142 	return ERR_PTR(-ENOSYS);
143 }
144 
145 static inline struct gpio_desc *__must_check
146 gpiod_get_index_optional(struct device *dev, const char *con_id,
147 			 unsigned int index)
148 {
149 	return ERR_PTR(-ENOSYS);
150 }
151 
152 static inline void gpiod_put(struct gpio_desc *desc)
153 {
154 	might_sleep();
155 
156 	/* GPIO can never have been requested */
157 	WARN_ON(1);
158 }
159 
160 static inline struct gpio_desc *__must_check devm_gpiod_get(struct device *dev,
161 							    const char *con_id)
162 {
163 	return ERR_PTR(-ENOSYS);
164 }
165 static inline
166 struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev,
167 						    const char *con_id,
168 						    unsigned int idx)
169 {
170 	return ERR_PTR(-ENOSYS);
171 }
172 
173 static inline struct gpio_desc *__must_check
174 devm_gpiod_get_optional(struct device *dev, const char *con_id)
175 {
176 	return ERR_PTR(-ENOSYS);
177 }
178 
179 static inline struct gpio_desc *__must_check
180 devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
181 			      unsigned int index)
182 {
183 	return ERR_PTR(-ENOSYS);
184 }
185 
186 static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
187 {
188 	might_sleep();
189 
190 	/* GPIO can never have been requested */
191 	WARN_ON(1);
192 }
193 
194 
195 static inline int gpiod_get_direction(const struct gpio_desc *desc)
196 {
197 	/* GPIO can never have been requested */
198 	WARN_ON(1);
199 	return -ENOSYS;
200 }
201 static inline int gpiod_direction_input(struct gpio_desc *desc)
202 {
203 	/* GPIO can never have been requested */
204 	WARN_ON(1);
205 	return -ENOSYS;
206 }
207 static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
208 {
209 	/* GPIO can never have been requested */
210 	WARN_ON(1);
211 	return -ENOSYS;
212 }
213 static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
214 {
215 	/* GPIO can never have been requested */
216 	WARN_ON(1);
217 	return -ENOSYS;
218 }
219 
220 
221 static inline int gpiod_get_value(const struct gpio_desc *desc)
222 {
223 	/* GPIO can never have been requested */
224 	WARN_ON(1);
225 	return 0;
226 }
227 static inline void gpiod_set_value(struct gpio_desc *desc, int value)
228 {
229 	/* GPIO can never have been requested */
230 	WARN_ON(1);
231 }
232 static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
233 {
234 	/* GPIO can never have been requested */
235 	WARN_ON(1);
236 	return 0;
237 }
238 static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
239 {
240 	/* GPIO can never have been requested */
241 	WARN_ON(1);
242 }
243 
244 static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
245 {
246 	/* GPIO can never have been requested */
247 	WARN_ON(1);
248 	return 0;
249 }
250 static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
251 {
252 	/* GPIO can never have been requested */
253 	WARN_ON(1);
254 }
255 static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
256 {
257 	/* GPIO can never have been requested */
258 	WARN_ON(1);
259 	return 0;
260 }
261 static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
262 						int value)
263 {
264 	/* GPIO can never have been requested */
265 	WARN_ON(1);
266 }
267 
268 static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
269 {
270 	/* GPIO can never have been requested */
271 	WARN_ON(1);
272 	return -ENOSYS;
273 }
274 
275 static inline int gpiod_is_active_low(const struct gpio_desc *desc)
276 {
277 	/* GPIO can never have been requested */
278 	WARN_ON(1);
279 	return 0;
280 }
281 static inline int gpiod_cansleep(const struct gpio_desc *desc)
282 {
283 	/* GPIO can never have been requested */
284 	WARN_ON(1);
285 	return 0;
286 }
287 
288 static inline int gpiod_to_irq(const struct gpio_desc *desc)
289 {
290 	/* GPIO can never have been requested */
291 	WARN_ON(1);
292 	return -EINVAL;
293 }
294 
295 static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
296 {
297 	return ERR_PTR(-EINVAL);
298 }
299 static inline int desc_to_gpio(const struct gpio_desc *desc)
300 {
301 	/* GPIO can never have been requested */
302 	WARN_ON(1);
303 	return -EINVAL;
304 }
305 
306 
307 #endif /* CONFIG_GPIOLIB */
308 
309 #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
310 
311 int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
312 int gpiod_export_link(struct device *dev, const char *name,
313 		      struct gpio_desc *desc);
314 int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value);
315 void gpiod_unexport(struct gpio_desc *desc);
316 
317 #else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
318 
319 static inline int gpiod_export(struct gpio_desc *desc,
320 			       bool direction_may_change)
321 {
322 	return -ENOSYS;
323 }
324 
325 static inline int gpiod_export_link(struct device *dev, const char *name,
326 				    struct gpio_desc *desc)
327 {
328 	return -ENOSYS;
329 }
330 
331 static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
332 {
333 	return -ENOSYS;
334 }
335 
336 static inline void gpiod_unexport(struct gpio_desc *desc)
337 {
338 }
339 
340 #endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
341 
342 #endif
343