.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0 */ |
---|
1 | 2 | /* |
---|
2 | 3 | * Internal GPIO functions. |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2013, Intel Corporation |
---|
5 | 6 | * Author: Mika Westerberg <mika.westerberg@linux.intel.com> |
---|
6 | | - * |
---|
7 | | - * This program is free software; you can redistribute it and/or modify |
---|
8 | | - * it under the terms of the GNU General Public License version 2 as |
---|
9 | | - * published by the Free Software Foundation. |
---|
10 | 7 | */ |
---|
11 | 8 | |
---|
12 | 9 | #ifndef GPIOLIB_H |
---|
.. | .. |
---|
19 | 16 | #include <linux/module.h> |
---|
20 | 17 | #include <linux/cdev.h> |
---|
21 | 18 | |
---|
22 | | -enum of_gpio_flags; |
---|
23 | | -enum gpio_lookup_flags; |
---|
24 | | -struct acpi_device; |
---|
| 19 | +#define GPIOCHIP_NAME "gpiochip" |
---|
25 | 20 | |
---|
26 | 21 | /** |
---|
27 | 22 | * struct gpio_device - internal state container for GPIO devices |
---|
.. | .. |
---|
61 | 56 | const char *label; |
---|
62 | 57 | void *data; |
---|
63 | 58 | struct list_head list; |
---|
| 59 | + struct blocking_notifier_head notifier; |
---|
64 | 60 | |
---|
65 | 61 | #ifdef CONFIG_PINCTRL |
---|
66 | 62 | /* |
---|
.. | .. |
---|
73 | 69 | #endif |
---|
74 | 70 | }; |
---|
75 | 71 | |
---|
76 | | -/** |
---|
77 | | - * struct acpi_gpio_info - ACPI GPIO specific information |
---|
78 | | - * @adev: reference to ACPI device which consumes GPIO resource |
---|
79 | | - * @flags: GPIO initialization flags |
---|
80 | | - * @gpioint: if %true this GPIO is of type GpioInt otherwise type is GpioIo |
---|
81 | | - * @polarity: interrupt polarity as provided by ACPI |
---|
82 | | - * @triggering: triggering type as provided by ACPI |
---|
83 | | - * @quirks: Linux specific quirks as provided by struct acpi_gpio_mapping |
---|
84 | | - */ |
---|
85 | | -struct acpi_gpio_info { |
---|
86 | | - struct acpi_device *adev; |
---|
87 | | - enum gpiod_flags flags; |
---|
88 | | - bool gpioint; |
---|
89 | | - int polarity; |
---|
90 | | - int triggering; |
---|
91 | | - unsigned int quirks; |
---|
92 | | -}; |
---|
93 | | - |
---|
94 | 72 | /* gpio suffixes used for ACPI and device tree lookup */ |
---|
95 | 73 | static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" }; |
---|
96 | 74 | |
---|
97 | | -#ifdef CONFIG_OF_GPIO |
---|
98 | | -struct gpio_desc *of_find_gpio(struct device *dev, |
---|
99 | | - const char *con_id, |
---|
100 | | - unsigned int idx, |
---|
101 | | - enum gpio_lookup_flags *flags); |
---|
102 | | -struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np, |
---|
103 | | - const char *list_name, int index, enum of_gpio_flags *flags); |
---|
104 | | -int of_gpiochip_add(struct gpio_chip *gc); |
---|
105 | | -void of_gpiochip_remove(struct gpio_chip *gc); |
---|
106 | | -#else |
---|
107 | | -static inline struct gpio_desc *of_find_gpio(struct device *dev, |
---|
108 | | - const char *con_id, |
---|
109 | | - unsigned int idx, |
---|
110 | | - enum gpio_lookup_flags *flags) |
---|
111 | | -{ |
---|
112 | | - return ERR_PTR(-ENOENT); |
---|
113 | | -} |
---|
114 | | -static inline struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np, |
---|
115 | | - const char *list_name, int index, enum of_gpio_flags *flags) |
---|
116 | | -{ |
---|
117 | | - return ERR_PTR(-ENOENT); |
---|
118 | | -} |
---|
119 | | -static inline int of_gpiochip_add(struct gpio_chip *gc) { return 0; } |
---|
120 | | -static inline void of_gpiochip_remove(struct gpio_chip *gc) { } |
---|
121 | | -#endif /* CONFIG_OF_GPIO */ |
---|
| 75 | +struct gpio_array { |
---|
| 76 | + struct gpio_desc **desc; |
---|
| 77 | + unsigned int size; |
---|
| 78 | + struct gpio_chip *chip; |
---|
| 79 | + unsigned long *get_mask; |
---|
| 80 | + unsigned long *set_mask; |
---|
| 81 | + unsigned long invert_mask[]; |
---|
| 82 | +}; |
---|
122 | 83 | |
---|
123 | | -#ifdef CONFIG_ACPI |
---|
124 | | -void acpi_gpiochip_add(struct gpio_chip *chip); |
---|
125 | | -void acpi_gpiochip_remove(struct gpio_chip *chip); |
---|
126 | | - |
---|
127 | | -void acpi_gpiochip_request_interrupts(struct gpio_chip *chip); |
---|
128 | | -void acpi_gpiochip_free_interrupts(struct gpio_chip *chip); |
---|
129 | | - |
---|
130 | | -int acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, |
---|
131 | | - struct acpi_gpio_info *info); |
---|
132 | | - |
---|
133 | | -struct gpio_desc *acpi_find_gpio(struct device *dev, |
---|
134 | | - const char *con_id, |
---|
135 | | - unsigned int idx, |
---|
136 | | - enum gpiod_flags *dflags, |
---|
137 | | - enum gpio_lookup_flags *lookupflags); |
---|
138 | | -struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, |
---|
139 | | - const char *propname, int index, |
---|
140 | | - struct acpi_gpio_info *info); |
---|
141 | | - |
---|
142 | | -int acpi_gpio_count(struct device *dev, const char *con_id); |
---|
143 | | - |
---|
144 | | -bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id); |
---|
145 | | -#else |
---|
146 | | -static inline void acpi_gpiochip_add(struct gpio_chip *chip) { } |
---|
147 | | -static inline void acpi_gpiochip_remove(struct gpio_chip *chip) { } |
---|
148 | | - |
---|
149 | | -static inline void |
---|
150 | | -acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { } |
---|
151 | | - |
---|
152 | | -static inline void |
---|
153 | | -acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { } |
---|
154 | | - |
---|
155 | | -static inline int |
---|
156 | | -acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info) |
---|
157 | | -{ |
---|
158 | | - return 0; |
---|
159 | | -} |
---|
160 | | - |
---|
161 | | -static inline struct gpio_desc * |
---|
162 | | -acpi_find_gpio(struct device *dev, const char *con_id, |
---|
163 | | - unsigned int idx, enum gpiod_flags *dflags, |
---|
164 | | - enum gpio_lookup_flags *lookupflags) |
---|
165 | | -{ |
---|
166 | | - return ERR_PTR(-ENOENT); |
---|
167 | | -} |
---|
168 | | -static inline struct gpio_desc * |
---|
169 | | -acpi_node_get_gpiod(struct fwnode_handle *fwnode, const char *propname, |
---|
170 | | - int index, struct acpi_gpio_info *info) |
---|
171 | | -{ |
---|
172 | | - return ERR_PTR(-ENXIO); |
---|
173 | | -} |
---|
174 | | -static inline int acpi_gpio_count(struct device *dev, const char *con_id) |
---|
175 | | -{ |
---|
176 | | - return -ENODEV; |
---|
177 | | -} |
---|
178 | | - |
---|
179 | | -static inline bool acpi_can_fallback_to_crs(struct acpi_device *adev, |
---|
180 | | - const char *con_id) |
---|
181 | | -{ |
---|
182 | | - return false; |
---|
183 | | -} |
---|
184 | | -#endif |
---|
185 | | - |
---|
186 | | -struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum); |
---|
| 84 | +struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc, unsigned int hwnum); |
---|
187 | 85 | int gpiod_get_array_value_complex(bool raw, bool can_sleep, |
---|
188 | 86 | unsigned int array_size, |
---|
189 | 87 | struct gpio_desc **desc_array, |
---|
190 | | - int *value_array); |
---|
| 88 | + struct gpio_array *array_info, |
---|
| 89 | + unsigned long *value_bitmap); |
---|
191 | 90 | int gpiod_set_array_value_complex(bool raw, bool can_sleep, |
---|
192 | | - unsigned int array_size, |
---|
193 | | - struct gpio_desc **desc_array, |
---|
194 | | - int *value_array); |
---|
| 91 | + unsigned int array_size, |
---|
| 92 | + struct gpio_desc **desc_array, |
---|
| 93 | + struct gpio_array *array_info, |
---|
| 94 | + unsigned long *value_bitmap); |
---|
195 | 95 | |
---|
196 | | -/* This is just passed between gpiolib and devres */ |
---|
197 | | -struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, |
---|
198 | | - const char *propname, int index, |
---|
199 | | - enum gpiod_flags dflags, |
---|
200 | | - const char *label); |
---|
201 | | - |
---|
202 | | -extern struct spinlock gpio_lock; |
---|
| 96 | +extern spinlock_t gpio_lock; |
---|
203 | 97 | extern struct list_head gpio_devices; |
---|
204 | 98 | |
---|
205 | 99 | struct gpio_desc { |
---|
.. | .. |
---|
214 | 108 | #define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ |
---|
215 | 109 | #define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ |
---|
216 | 110 | #define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ |
---|
| 111 | +#define FLAG_IRQ_IS_ENABLED 10 /* GPIO is connected to an enabled IRQ */ |
---|
217 | 112 | #define FLAG_IS_HOGGED 11 /* GPIO is hogged */ |
---|
218 | 113 | #define FLAG_TRANSITORY 12 /* GPIO may lose value in sleep or reset */ |
---|
| 114 | +#define FLAG_PULL_UP 13 /* GPIO has pull up enabled */ |
---|
| 115 | +#define FLAG_PULL_DOWN 14 /* GPIO has pull down enabled */ |
---|
| 116 | +#define FLAG_BIAS_DISABLE 15 /* GPIO has pull disabled */ |
---|
| 117 | +#define FLAG_EDGE_RISING 16 /* GPIO CDEV detects rising edge events */ |
---|
| 118 | +#define FLAG_EDGE_FALLING 17 /* GPIO CDEV detects falling edge events */ |
---|
219 | 119 | |
---|
220 | 120 | /* Connection label */ |
---|
221 | 121 | const char *label; |
---|
222 | 122 | /* Name of the GPIO */ |
---|
223 | 123 | const char *name; |
---|
| 124 | +#ifdef CONFIG_OF_DYNAMIC |
---|
| 125 | + struct device_node *hog; |
---|
| 126 | +#endif |
---|
| 127 | +#ifdef CONFIG_GPIO_CDEV |
---|
| 128 | + /* debounce period in microseconds */ |
---|
| 129 | + unsigned int debounce_period_us; |
---|
| 130 | +#endif |
---|
224 | 131 | }; |
---|
225 | 132 | |
---|
226 | 133 | int gpiod_request(struct gpio_desc *desc, const char *label); |
---|
.. | .. |
---|
237 | 144 | { |
---|
238 | 145 | return desc - &desc->gdev->descs[0]; |
---|
239 | 146 | } |
---|
240 | | - |
---|
241 | | -void devprop_gpiochip_set_names(struct gpio_chip *chip, |
---|
242 | | - const struct fwnode_handle *fwnode); |
---|
243 | 147 | |
---|
244 | 148 | /* With descriptor prefix */ |
---|
245 | 149 | |
---|
.. | .. |
---|
264 | 168 | |
---|
265 | 169 | /* With chip prefix */ |
---|
266 | 170 | |
---|
267 | | -#define chip_emerg(chip, fmt, ...) \ |
---|
268 | | - dev_emerg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) |
---|
269 | | -#define chip_crit(chip, fmt, ...) \ |
---|
270 | | - dev_crit(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) |
---|
271 | | -#define chip_err(chip, fmt, ...) \ |
---|
272 | | - dev_err(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) |
---|
273 | | -#define chip_warn(chip, fmt, ...) \ |
---|
274 | | - dev_warn(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) |
---|
275 | | -#define chip_info(chip, fmt, ...) \ |
---|
276 | | - dev_info(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) |
---|
277 | | -#define chip_dbg(chip, fmt, ...) \ |
---|
278 | | - dev_dbg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) |
---|
279 | | - |
---|
280 | | -#ifdef CONFIG_GPIO_SYSFS |
---|
281 | | - |
---|
282 | | -int gpiochip_sysfs_register(struct gpio_device *gdev); |
---|
283 | | -void gpiochip_sysfs_unregister(struct gpio_device *gdev); |
---|
284 | | - |
---|
285 | | -#else |
---|
286 | | - |
---|
287 | | -static inline int gpiochip_sysfs_register(struct gpio_device *gdev) |
---|
288 | | -{ |
---|
289 | | - return 0; |
---|
290 | | -} |
---|
291 | | - |
---|
292 | | -static inline void gpiochip_sysfs_unregister(struct gpio_device *gdev) |
---|
293 | | -{ |
---|
294 | | -} |
---|
295 | | - |
---|
296 | | -#endif /* CONFIG_GPIO_SYSFS */ |
---|
| 171 | +#define chip_emerg(gc, fmt, ...) \ |
---|
| 172 | + dev_emerg(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
---|
| 173 | +#define chip_crit(gc, fmt, ...) \ |
---|
| 174 | + dev_crit(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
---|
| 175 | +#define chip_err(gc, fmt, ...) \ |
---|
| 176 | + dev_err(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
---|
| 177 | +#define chip_warn(gc, fmt, ...) \ |
---|
| 178 | + dev_warn(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
---|
| 179 | +#define chip_info(gc, fmt, ...) \ |
---|
| 180 | + dev_info(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
---|
| 181 | +#define chip_dbg(gc, fmt, ...) \ |
---|
| 182 | + dev_dbg(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
---|
297 | 183 | |
---|
298 | 184 | #endif /* GPIOLIB_H */ |
---|