1
2
3
4
5
6
7
8
9#ifndef GPIOLIB_H
10#define GPIOLIB_H
11
12#include <linux/gpio/driver.h>
13#include <linux/gpio/consumer.h>
14#include <linux/err.h>
15#include <linux/device.h>
16#include <linux/module.h>
17#include <linux/cdev.h>
18
19enum of_gpio_flags;
20struct acpi_device;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47struct gpio_device {
48 int id;
49 struct device dev;
50 struct cdev chrdev;
51 struct device *mockdev;
52 struct module *owner;
53 struct gpio_chip *chip;
54 struct gpio_desc *descs;
55 int base;
56 u16 ngpio;
57 const char *label;
58 void *data;
59 struct list_head list;
60
61#ifdef CONFIG_PINCTRL
62
63
64
65
66
67
68 struct list_head pin_ranges;
69#endif
70};
71
72
73
74
75
76
77
78
79
80
81
82struct acpi_gpio_info {
83 struct acpi_device *adev;
84 enum gpiod_flags flags;
85 bool gpioint;
86 int pin_config;
87 int polarity;
88 int triggering;
89 unsigned int quirks;
90};
91
92
93static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" };
94
95#ifdef CONFIG_OF_GPIO
96struct gpio_desc *of_find_gpio(struct device *dev,
97 const char *con_id,
98 unsigned int idx,
99 unsigned long *lookupflags);
100struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
101 const char *list_name, int index, enum of_gpio_flags *flags);
102int of_gpiochip_add(struct gpio_chip *gc);
103void of_gpiochip_remove(struct gpio_chip *gc);
104#else
105static inline struct gpio_desc *of_find_gpio(struct device *dev,
106 const char *con_id,
107 unsigned int idx,
108 unsigned long *lookupflags)
109{
110 return ERR_PTR(-ENOENT);
111}
112static inline struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
113 const char *list_name, int index, enum of_gpio_flags *flags)
114{
115 return ERR_PTR(-ENOENT);
116}
117static inline int of_gpiochip_add(struct gpio_chip *gc) { return 0; }
118static inline void of_gpiochip_remove(struct gpio_chip *gc) { }
119#endif
120
121#ifdef CONFIG_ACPI
122void acpi_gpiochip_add(struct gpio_chip *chip);
123void acpi_gpiochip_remove(struct gpio_chip *chip);
124
125void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);
126void acpi_gpiochip_free_interrupts(struct gpio_chip *chip);
127
128int acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags,
129 struct acpi_gpio_info *info);
130int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags,
131 struct acpi_gpio_info *info);
132
133struct gpio_desc *acpi_find_gpio(struct device *dev,
134 const char *con_id,
135 unsigned int idx,
136 enum gpiod_flags *dflags,
137 unsigned long *lookupflags);
138struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode,
139 const char *propname, int index,
140 struct acpi_gpio_info *info);
141
142int acpi_gpio_count(struct device *dev, const char *con_id);
143
144bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id);
145#else
146static inline void acpi_gpiochip_add(struct gpio_chip *chip) { }
147static inline void acpi_gpiochip_remove(struct gpio_chip *chip) { }
148
149static inline void
150acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { }
151
152static inline void
153acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { }
154
155static inline int
156acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
157{
158 return 0;
159}
160static inline int
161acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags,
162 struct acpi_gpio_info *info)
163{
164 return 0;
165}
166
167static inline struct gpio_desc *
168acpi_find_gpio(struct device *dev, const char *con_id,
169 unsigned int idx, enum gpiod_flags *dflags,
170 unsigned long *lookupflags)
171{
172 return ERR_PTR(-ENOENT);
173}
174static inline struct gpio_desc *
175acpi_node_get_gpiod(struct fwnode_handle *fwnode, const char *propname,
176 int index, struct acpi_gpio_info *info)
177{
178 return ERR_PTR(-ENXIO);
179}
180static inline int acpi_gpio_count(struct device *dev, const char *con_id)
181{
182 return -ENODEV;
183}
184
185static inline bool acpi_can_fallback_to_crs(struct acpi_device *adev,
186 const char *con_id)
187{
188 return false;
189}
190#endif
191
192struct gpio_array {
193 struct gpio_desc **desc;
194 unsigned int size;
195 struct gpio_chip *chip;
196 unsigned long *get_mask;
197 unsigned long *set_mask;
198 unsigned long invert_mask[];
199};
200
201struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum);
202int gpiod_get_array_value_complex(bool raw, bool can_sleep,
203 unsigned int array_size,
204 struct gpio_desc **desc_array,
205 struct gpio_array *array_info,
206 unsigned long *value_bitmap);
207int gpiod_set_array_value_complex(bool raw, bool can_sleep,
208 unsigned int array_size,
209 struct gpio_desc **desc_array,
210 struct gpio_array *array_info,
211 unsigned long *value_bitmap);
212
213extern spinlock_t gpio_lock;
214extern struct list_head gpio_devices;
215
216struct gpio_desc {
217 struct gpio_device *gdev;
218 unsigned long flags;
219
220#define FLAG_REQUESTED 0
221#define FLAG_IS_OUT 1
222#define FLAG_EXPORT 2
223#define FLAG_SYSFS 3
224#define FLAG_ACTIVE_LOW 6
225#define FLAG_OPEN_DRAIN 7
226#define FLAG_OPEN_SOURCE 8
227#define FLAG_USED_AS_IRQ 9
228#define FLAG_IRQ_IS_ENABLED 10
229#define FLAG_IS_HOGGED 11
230#define FLAG_TRANSITORY 12
231#define FLAG_PULL_UP 13
232#define FLAG_PULL_DOWN 14
233
234
235 const char *label;
236
237 const char *name;
238};
239
240int gpiod_request(struct gpio_desc *desc, const char *label);
241void gpiod_free(struct gpio_desc *desc);
242int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
243 unsigned long lflags, enum gpiod_flags dflags);
244int gpiod_hog(struct gpio_desc *desc, const char *name,
245 unsigned long lflags, enum gpiod_flags dflags);
246
247
248
249
250static inline int gpio_chip_hwgpio(const struct gpio_desc *desc)
251{
252 return desc - &desc->gdev->descs[0];
253}
254
255
256
257#define gpiod_emerg(desc, fmt, ...) \
258 pr_emerg("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\
259 ##__VA_ARGS__)
260#define gpiod_crit(desc, fmt, ...) \
261 pr_crit("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
262 ##__VA_ARGS__)
263#define gpiod_err(desc, fmt, ...) \
264 pr_err("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
265 ##__VA_ARGS__)
266#define gpiod_warn(desc, fmt, ...) \
267 pr_warn("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
268 ##__VA_ARGS__)
269#define gpiod_info(desc, fmt, ...) \
270 pr_info("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
271 ##__VA_ARGS__)
272#define gpiod_dbg(desc, fmt, ...) \
273 pr_debug("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\
274 ##__VA_ARGS__)
275
276
277
278#define chip_emerg(chip, fmt, ...) \
279 dev_emerg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__)
280#define chip_crit(chip, fmt, ...) \
281 dev_crit(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__)
282#define chip_err(chip, fmt, ...) \
283 dev_err(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__)
284#define chip_warn(chip, fmt, ...) \
285 dev_warn(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__)
286#define chip_info(chip, fmt, ...) \
287 dev_info(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__)
288#define chip_dbg(chip, fmt, ...) \
289 dev_dbg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__)
290
291#ifdef CONFIG_GPIO_SYSFS
292
293int gpiochip_sysfs_register(struct gpio_device *gdev);
294void gpiochip_sysfs_unregister(struct gpio_device *gdev);
295
296#else
297
298static inline int gpiochip_sysfs_register(struct gpio_device *gdev)
299{
300 return 0;
301}
302
303static inline void gpiochip_sysfs_unregister(struct gpio_device *gdev)
304{
305}
306
307#endif
308
309#endif
310