diff options
Diffstat (limited to 'include/linux/gpio/driver.h')
-rw-r--r-- | include/linux/gpio/driver.h | 70 |
1 files changed, 50 insertions, 20 deletions
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index c2748accea71..e973faba69dc 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h | |||
@@ -274,37 +274,67 @@ void gpiochip_set_nested_irqchip(struct gpio_chip *gpiochip, | |||
274 | struct irq_chip *irqchip, | 274 | struct irq_chip *irqchip, |
275 | int parent_irq); | 275 | int parent_irq); |
276 | 276 | ||
277 | int _gpiochip_irqchip_add(struct gpio_chip *gpiochip, | 277 | int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip, |
278 | struct irq_chip *irqchip, | ||
279 | unsigned int first_irq, | ||
280 | irq_flow_handler_t handler, | ||
281 | unsigned int type, | ||
282 | bool nested, | ||
283 | struct lock_class_key *lock_key); | ||
284 | |||
285 | #ifdef CONFIG_LOCKDEP | ||
286 | |||
287 | /* | ||
288 | * Lockdep requires that each irqchip instance be created with a | ||
289 | * unique key so as to avoid unnecessary warnings. This upfront | ||
290 | * boilerplate static inlines provides such a key for each | ||
291 | * unique instance. | ||
292 | */ | ||
293 | static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip, | ||
294 | struct irq_chip *irqchip, | ||
295 | unsigned int first_irq, | ||
296 | irq_flow_handler_t handler, | ||
297 | unsigned int type) | ||
298 | { | ||
299 | static struct lock_class_key key; | ||
300 | |||
301 | return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq, | ||
302 | handler, type, false, &key); | ||
303 | } | ||
304 | |||
305 | static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip, | ||
278 | struct irq_chip *irqchip, | 306 | struct irq_chip *irqchip, |
279 | unsigned int first_irq, | 307 | unsigned int first_irq, |
280 | irq_flow_handler_t handler, | 308 | irq_flow_handler_t handler, |
281 | unsigned int type, | 309 | unsigned int type) |
282 | bool nested, | 310 | { |
283 | struct lock_class_key *lock_key); | 311 | |
312 | static struct lock_class_key key; | ||
313 | |||
314 | return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq, | ||
315 | handler, type, true, &key); | ||
316 | } | ||
317 | #else | ||
318 | static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip, | ||
319 | struct irq_chip *irqchip, | ||
320 | unsigned int first_irq, | ||
321 | irq_flow_handler_t handler, | ||
322 | unsigned int type) | ||
323 | { | ||
324 | return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq, | ||
325 | handler, type, false, NULL); | ||
326 | } | ||
284 | 327 | ||
285 | /* FIXME: I assume threaded IRQchips do not have the lockdep problem */ | ||
286 | static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip, | 328 | static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip, |
287 | struct irq_chip *irqchip, | 329 | struct irq_chip *irqchip, |
288 | unsigned int first_irq, | 330 | unsigned int first_irq, |
289 | irq_flow_handler_t handler, | 331 | irq_flow_handler_t handler, |
290 | unsigned int type) | 332 | unsigned int type) |
291 | { | 333 | { |
292 | return _gpiochip_irqchip_add(gpiochip, irqchip, first_irq, | 334 | return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq, |
293 | handler, type, true, NULL); | 335 | handler, type, true, NULL); |
294 | } | 336 | } |
295 | 337 | #endif /* CONFIG_LOCKDEP */ | |
296 | #ifdef CONFIG_LOCKDEP | ||
297 | #define gpiochip_irqchip_add(...) \ | ||
298 | ( \ | ||
299 | ({ \ | ||
300 | static struct lock_class_key _key; \ | ||
301 | _gpiochip_irqchip_add(__VA_ARGS__, false, &_key); \ | ||
302 | }) \ | ||
303 | ) | ||
304 | #else | ||
305 | #define gpiochip_irqchip_add(...) \ | ||
306 | _gpiochip_irqchip_add(__VA_ARGS__, false, NULL) | ||
307 | #endif | ||
308 | 338 | ||
309 | #endif /* CONFIG_GPIOLIB_IRQCHIP */ | 339 | #endif /* CONFIG_GPIOLIB_IRQCHIP */ |
310 | 340 | ||