Pull GPIO fix from Linus Walleij: "A single lockdep fix, nothing else going on. This makes lockdep noiseless and work properly with threaded GPIO IRQchips. Summary: Fix a lockdep issue: the threaded irqchips also need their unique key, and take this opportunity to get rid of the horrible macro and replace it with a static inline" * tag 'gpio-v4.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: gpio: provide lockdep keys for nested/unnested irqchips
Showing the changes to include/linux (1 of 2 files). Show all
Unified · Split
| @@ -274,37 +274,67 @@ void gpiochip_set_nested_irqchip(struct gpio_chip *gpiochip, · 273 unmodified lines | |||
| 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 | ||