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
Unified · Split
| @@ -1723,7 +1723,7 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) · 1722 unmodified lines | ||
| 1723 | 1723 | } |
| 1724 | 1724 | |
| 1725 | 1725 | /** |
| 1726 | − * _gpiochip_irqchip_add() - adds an irqchip to a gpiochip | |
| 1726 | + * gpiochip_irqchip_add_key() - adds an irqchip to a gpiochip | |
| 1727 | 1727 | * @gpiochip: the gpiochip to add the irqchip to |
| 1728 | 1728 | * @irqchip: the irqchip to add to the gpiochip |
| 1729 | 1729 | * @first_irq: if not dynamically assigned, the base (first) IRQ to |
| @@ -1749,13 +1749,13 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) · 19 unmodified lines | ||
| 1749 | 1749 | * the pins on the gpiochip can generate a unique IRQ. Everything else |
| 1750 | 1750 | * need to be open coded. |
| 1751 | 1751 | */ |
| 1752 | −int _gpiochip_irqchip_add(struct gpio_chip *gpiochip, | |
| 1753 | − struct irq_chip *irqchip, | |
| 1754 | − unsigned int first_irq, | |
| 1755 | − irq_flow_handler_t handler, | |
| 1756 | − unsigned int type, | |
| 1757 | − bool nested, | |
| 1758 | − struct lock_class_key *lock_key) | |
| 1752 | +int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip, | |
| 1753 | + struct irq_chip *irqchip, | |
| 1754 | + unsigned int first_irq, | |
| 1755 | + irq_flow_handler_t handler, | |
| 1756 | + unsigned int type, | |
| 1757 | + bool nested, | |
| 1758 | + struct lock_class_key *lock_key) | |
| 1759 | 1759 | { |
| 1760 | 1760 | struct device_node *of_node; |
| 1761 | 1761 | bool irq_base_set = false; |
| @@ -1840,7 +1840,7 @@ int _gpiochip_irqchip_add(struct gpio_chip *gpiochip, · 78 unmodified lines | ||
| 1840 | 1840 | |
| 1841 | 1841 | return 0; |
| 1842 | 1842 | } |
| 1843 | −EXPORT_SYMBOL_GPL(_gpiochip_irqchip_add); | |
| 1843 | +EXPORT_SYMBOL_GPL(gpiochip_irqchip_add_key); | |
| 1844 | 1844 | |
| 1845 | 1845 | #else /* CONFIG_GPIOLIB_IRQCHIP */ |
| 1846 | 1846 | |
| @@ -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 | |