1 #ifndef _ASM_GENERIC_GPIO_H
2 #define _ASM_GENERIC_GPIO_H
3 
4 #include <linux/kernel.h>
5 #include <linux/types.h>
6 #include <linux/errno.h>
7 #include <linux/of.h>
8 
9 #ifdef CONFIG_GPIOLIB
10 
11 #include <linux/compiler.h>
12 #include <linux/gpio/driver.h>
13 #include <linux/gpio/consumer.h>
14 
15 /* Platforms may implement their GPIO interface with library code,
16  * at a small performance cost for non-inlined operations and some
17  * extra memory (for code and for per-GPIO table entries).
18  *
19  * While the GPIO programming interface defines valid GPIO numbers
20  * to be in the range 0..MAX_INT, this library restricts them to the
21  * smaller range 0..ARCH_NR_GPIOS-1.
22  *
23  * ARCH_NR_GPIOS is somewhat arbitrary; it usually reflects the sum of
24  * builtin/SoC GPIOs plus a number of GPIOs on expanders; the latter is
25  * actually an estimate of a board-specific value.
26  */
27 
28 #ifndef ARCH_NR_GPIOS
29 #define ARCH_NR_GPIOS		512
30 #endif
31 
32 /*
33  * "valid" GPIO numbers are nonnegative and may be passed to
34  * setup routines like gpio_request().  only some valid numbers
35  * can successfully be requested and used.
36  *
37  * Invalid GPIO numbers are useful for indicating no-such-GPIO in
38  * platform data and other tables.
39  */
40 
gpio_is_valid(int number)41 static inline bool gpio_is_valid(int number)
42 {
43 	return number >= 0 && number < ARCH_NR_GPIOS;
44 }
45 
46 struct device;
47 struct gpio;
48 struct seq_file;
49 struct module;
50 struct device_node;
51 struct gpio_desc;
52 
53 /* caller holds gpio_lock *OR* gpio is marked as requested */
gpio_to_chip(unsigned gpio)54 static inline struct gpio_chip *gpio_to_chip(unsigned gpio)
55 {
56 	return gpiod_to_chip(gpio_to_desc(gpio));
57 }
58 
59 /* Always use the library code for GPIO management calls,
60  * or when sleeping may be involved.
61  */
62 extern int gpio_request(unsigned gpio, const char *label);
63 extern void gpio_free(unsigned gpio);
64 
gpio_direction_input(unsigned gpio)65 static inline int gpio_direction_input(unsigned gpio)
66 {
67 	return gpiod_direction_input(gpio_to_desc(gpio));
68 }
gpio_direction_output(unsigned gpio,int value)69 static inline int gpio_direction_output(unsigned gpio, int value)
70 {
71 	return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
72 }
73 
gpio_set_debounce(unsigned gpio,unsigned debounce)74 static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
75 {
76 	return gpiod_set_debounce(gpio_to_desc(gpio), debounce);
77 }
78 
gpio_get_value_cansleep(unsigned gpio)79 static inline int gpio_get_value_cansleep(unsigned gpio)
80 {
81 	return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio));
82 }
gpio_set_value_cansleep(unsigned gpio,int value)83 static inline void gpio_set_value_cansleep(unsigned gpio, int value)
84 {
85 	return gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value);
86 }
87 
88 
89 /* A platform's <asm/gpio.h> code may want to inline the I/O calls when
90  * the GPIO is constant and refers to some always-present controller,
91  * giving direct access to chip registers and tight bitbanging loops.
92  */
__gpio_get_value(unsigned gpio)93 static inline int __gpio_get_value(unsigned gpio)
94 {
95 	return gpiod_get_raw_value(gpio_to_desc(gpio));
96 }
__gpio_set_value(unsigned gpio,int value)97 static inline void __gpio_set_value(unsigned gpio, int value)
98 {
99 	return gpiod_set_raw_value(gpio_to_desc(gpio), value);
100 }
101 
__gpio_cansleep(unsigned gpio)102 static inline int __gpio_cansleep(unsigned gpio)
103 {
104 	return gpiod_cansleep(gpio_to_desc(gpio));
105 }
106 
__gpio_to_irq(unsigned gpio)107 static inline int __gpio_to_irq(unsigned gpio)
108 {
109 	return gpiod_to_irq(gpio_to_desc(gpio));
110 }
111 
112 extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
113 extern int gpio_request_array(const struct gpio *array, size_t num);
114 extern void gpio_free_array(const struct gpio *array, size_t num);
115 
116 /*
117  * A sysfs interface can be exported by individual drivers if they want,
118  * but more typically is configured entirely from userspace.
119  */
gpio_export(unsigned gpio,bool direction_may_change)120 static inline int gpio_export(unsigned gpio, bool direction_may_change)
121 {
122 	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
123 }
124 
gpio_export_link(struct device * dev,const char * name,unsigned gpio)125 static inline int gpio_export_link(struct device *dev, const char *name,
126 				   unsigned gpio)
127 {
128 	return gpiod_export_link(dev, name, gpio_to_desc(gpio));
129 }
130 
gpio_sysfs_set_active_low(unsigned gpio,int value)131 static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
132 {
133 	return gpiod_sysfs_set_active_low(gpio_to_desc(gpio), value);
134 }
135 
gpio_unexport(unsigned gpio)136 static inline void gpio_unexport(unsigned gpio)
137 {
138 	gpiod_unexport(gpio_to_desc(gpio));
139 }
140 
141 #else	/* !CONFIG_GPIOLIB */
142 
gpio_is_valid(int number)143 static inline bool gpio_is_valid(int number)
144 {
145 	/* only non-negative numbers are valid */
146 	return number >= 0;
147 }
148 
149 /* platforms that don't directly support access to GPIOs through I2C, SPI,
150  * or other blocking infrastructure can use these wrappers.
151  */
152 
gpio_cansleep(unsigned gpio)153 static inline int gpio_cansleep(unsigned gpio)
154 {
155 	return 0;
156 }
157 
gpio_get_value_cansleep(unsigned gpio)158 static inline int gpio_get_value_cansleep(unsigned gpio)
159 {
160 	might_sleep();
161 	return __gpio_get_value(gpio);
162 }
163 
gpio_set_value_cansleep(unsigned gpio,int value)164 static inline void gpio_set_value_cansleep(unsigned gpio, int value)
165 {
166 	might_sleep();
167 	__gpio_set_value(gpio, value);
168 }
169 
170 #endif /* !CONFIG_GPIOLIB */
171 
172 #endif /* _ASM_GENERIC_GPIO_H */
173