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 | 274 | struct irq_chip *irqchip, |
| 275 | 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 | 306 | struct irq_chip *irqchip, |
| 279 | 307 | unsigned int first_irq, |
| 280 | 308 | irq_flow_handler_t handler, |
| 281 | − unsigned int type, | |
| 282 | − bool nested, | |
| 283 | − struct lock_class_key *lock_key); | |
| 309 | + unsigned int type) | |
| 310 | +{ | |
| 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 | 328 | static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip, |
| 287 | 329 | struct irq_chip *irqchip, |
| 288 | 330 | unsigned int first_irq, |
| 289 | 331 | irq_flow_handler_t handler, |
| 290 | 332 | unsigned int type) |
| 291 | 333 | { |
| 292 | − return _gpiochip_irqchip_add(gpiochip, irqchip, first_irq, | |
| 293 | − handler, type, true, NULL); | |
| 334 | + return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq, | |
| 335 | + handler, type, true, NULL); | |
| 294 | 336 | } |
| 295 | − | |
| 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 | |
| 337 | +#endif /* CONFIG_LOCKDEP */ | |
| 308 | 338 | |
| 309 | 339 | #endif /* CONFIG_GPIOLIB_IRQCHIP */ |
| 310 | 340 | |