diff options
author | Andrew Lunn <andrew@lunn.ch> | 2017-12-02 12:11:04 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-12-28 06:26:35 -0500 |
commit | 39c3fd58952d7599d367c84c1330b785d91d6088 (patch) | |
tree | 156853f464f0148928514478abf3aeca86e30397 /drivers/gpio/gpiolib.c | |
parent | beacbc68ac3e23821a681adb30b45dc55b17488d (diff) |
kernel/irq: Extend lockdep class for request mutex
The IRQ code already has support for lockdep class for the lock mutex
in an interrupt descriptor. Extend this to add a second class for the
request mutex in the descriptor. Not having a class is resulting in
false positive splats in some code paths.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: linus.walleij@linaro.org
Cc: grygorii.strashko@ti.com
Cc: f.fainelli@gmail.com
Link: https://lkml.kernel.org/r/1512234664-21555-1-git-send-email-andrew@lunn.ch
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r-- | drivers/gpio/gpiolib.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index aad84a6306c4..44332b793718 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -73,7 +73,8 @@ LIST_HEAD(gpio_devices); | |||
73 | 73 | ||
74 | static void gpiochip_free_hogs(struct gpio_chip *chip); | 74 | static void gpiochip_free_hogs(struct gpio_chip *chip); |
75 | static int gpiochip_add_irqchip(struct gpio_chip *gpiochip, | 75 | static int gpiochip_add_irqchip(struct gpio_chip *gpiochip, |
76 | struct lock_class_key *key); | 76 | struct lock_class_key *lock_key, |
77 | struct lock_class_key *request_key); | ||
77 | static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip); | 78 | static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip); |
78 | static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip); | 79 | static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip); |
79 | static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip); | 80 | static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip); |
@@ -1100,7 +1101,8 @@ static void gpiochip_setup_devs(void) | |||
1100 | } | 1101 | } |
1101 | 1102 | ||
1102 | int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, | 1103 | int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, |
1103 | struct lock_class_key *key) | 1104 | struct lock_class_key *lock_key, |
1105 | struct lock_class_key *request_key) | ||
1104 | { | 1106 | { |
1105 | unsigned long flags; | 1107 | unsigned long flags; |
1106 | int status = 0; | 1108 | int status = 0; |
@@ -1246,7 +1248,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, | |||
1246 | if (status) | 1248 | if (status) |
1247 | goto err_remove_from_list; | 1249 | goto err_remove_from_list; |
1248 | 1250 | ||
1249 | status = gpiochip_add_irqchip(chip, key); | 1251 | status = gpiochip_add_irqchip(chip, lock_key, request_key); |
1250 | if (status) | 1252 | if (status) |
1251 | goto err_remove_chip; | 1253 | goto err_remove_chip; |
1252 | 1254 | ||
@@ -1632,7 +1634,7 @@ int gpiochip_irq_map(struct irq_domain *d, unsigned int irq, | |||
1632 | * This lock class tells lockdep that GPIO irqs are in a different | 1634 | * This lock class tells lockdep that GPIO irqs are in a different |
1633 | * category than their parents, so it won't report false recursion. | 1635 | * category than their parents, so it won't report false recursion. |
1634 | */ | 1636 | */ |
1635 | irq_set_lockdep_class(irq, chip->irq.lock_key); | 1637 | irq_set_lockdep_class(irq, chip->irq.lock_key, chip->irq.request_key); |
1636 | irq_set_chip_and_handler(irq, chip->irq.chip, chip->irq.handler); | 1638 | irq_set_chip_and_handler(irq, chip->irq.chip, chip->irq.handler); |
1637 | /* Chips that use nested thread handlers have them marked */ | 1639 | /* Chips that use nested thread handlers have them marked */ |
1638 | if (chip->irq.threaded) | 1640 | if (chip->irq.threaded) |
@@ -1712,10 +1714,12 @@ static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset) | |||
1712 | /** | 1714 | /** |
1713 | * gpiochip_add_irqchip() - adds an IRQ chip to a GPIO chip | 1715 | * gpiochip_add_irqchip() - adds an IRQ chip to a GPIO chip |
1714 | * @gpiochip: the GPIO chip to add the IRQ chip to | 1716 | * @gpiochip: the GPIO chip to add the IRQ chip to |
1715 | * @lock_key: lockdep class | 1717 | * @lock_key: lockdep class for IRQ lock |
1718 | * @request_key: lockdep class for IRQ request | ||
1716 | */ | 1719 | */ |
1717 | static int gpiochip_add_irqchip(struct gpio_chip *gpiochip, | 1720 | static int gpiochip_add_irqchip(struct gpio_chip *gpiochip, |
1718 | struct lock_class_key *lock_key) | 1721 | struct lock_class_key *lock_key, |
1722 | struct lock_class_key *request_key) | ||
1719 | { | 1723 | { |
1720 | struct irq_chip *irqchip = gpiochip->irq.chip; | 1724 | struct irq_chip *irqchip = gpiochip->irq.chip; |
1721 | const struct irq_domain_ops *ops; | 1725 | const struct irq_domain_ops *ops; |
@@ -1753,6 +1757,7 @@ static int gpiochip_add_irqchip(struct gpio_chip *gpiochip, | |||
1753 | gpiochip->to_irq = gpiochip_to_irq; | 1757 | gpiochip->to_irq = gpiochip_to_irq; |
1754 | gpiochip->irq.default_type = type; | 1758 | gpiochip->irq.default_type = type; |
1755 | gpiochip->irq.lock_key = lock_key; | 1759 | gpiochip->irq.lock_key = lock_key; |
1760 | gpiochip->irq.request_key = request_key; | ||
1756 | 1761 | ||
1757 | if (gpiochip->irq.domain_ops) | 1762 | if (gpiochip->irq.domain_ops) |
1758 | ops = gpiochip->irq.domain_ops; | 1763 | ops = gpiochip->irq.domain_ops; |
@@ -1850,7 +1855,8 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) | |||
1850 | * @type: the default type for IRQs on this irqchip, pass IRQ_TYPE_NONE | 1855 | * @type: the default type for IRQs on this irqchip, pass IRQ_TYPE_NONE |
1851 | * to have the core avoid setting up any default type in the hardware. | 1856 | * to have the core avoid setting up any default type in the hardware. |
1852 | * @threaded: whether this irqchip uses a nested thread handler | 1857 | * @threaded: whether this irqchip uses a nested thread handler |
1853 | * @lock_key: lockdep class | 1858 | * @lock_key: lockdep class for IRQ lock |
1859 | * @request_key: lockdep class for IRQ request | ||
1854 | * | 1860 | * |
1855 | * This function closely associates a certain irqchip with a certain | 1861 | * This function closely associates a certain irqchip with a certain |
1856 | * gpiochip, providing an irq domain to translate the local IRQs to | 1862 | * gpiochip, providing an irq domain to translate the local IRQs to |
@@ -1872,7 +1878,8 @@ int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip, | |||
1872 | irq_flow_handler_t handler, | 1878 | irq_flow_handler_t handler, |
1873 | unsigned int type, | 1879 | unsigned int type, |
1874 | bool threaded, | 1880 | bool threaded, |
1875 | struct lock_class_key *lock_key) | 1881 | struct lock_class_key *lock_key, |
1882 | struct lock_class_key *request_key) | ||
1876 | { | 1883 | { |
1877 | struct device_node *of_node; | 1884 | struct device_node *of_node; |
1878 | 1885 | ||
@@ -1913,6 +1920,7 @@ int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip, | |||
1913 | gpiochip->irq.default_type = type; | 1920 | gpiochip->irq.default_type = type; |
1914 | gpiochip->to_irq = gpiochip_to_irq; | 1921 | gpiochip->to_irq = gpiochip_to_irq; |
1915 | gpiochip->irq.lock_key = lock_key; | 1922 | gpiochip->irq.lock_key = lock_key; |
1923 | gpiochip->irq.request_key = request_key; | ||
1916 | gpiochip->irq.domain = irq_domain_add_simple(of_node, | 1924 | gpiochip->irq.domain = irq_domain_add_simple(of_node, |
1917 | gpiochip->ngpio, first_irq, | 1925 | gpiochip->ngpio, first_irq, |
1918 | &gpiochip_domain_ops, gpiochip); | 1926 | &gpiochip_domain_ops, gpiochip); |
@@ -1940,7 +1948,8 @@ EXPORT_SYMBOL_GPL(gpiochip_irqchip_add_key); | |||
1940 | #else /* CONFIG_GPIOLIB_IRQCHIP */ | 1948 | #else /* CONFIG_GPIOLIB_IRQCHIP */ |
1941 | 1949 | ||
1942 | static inline int gpiochip_add_irqchip(struct gpio_chip *gpiochip, | 1950 | static inline int gpiochip_add_irqchip(struct gpio_chip *gpiochip, |
1943 | struct lock_class_key *key) | 1951 | struct lock_class_key *lock_key, |
1952 | struct lock_class_key *request_key) | ||
1944 | { | 1953 | { |
1945 | return 0; | 1954 | return 0; |
1946 | } | 1955 | } |