]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mfd: Don't use irq_create_mapping() to resolve a mapping
authorMarc Zyngier <maz@kernel.org>
Sun, 25 Jul 2021 18:07:54 +0000 (19:07 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Sep 2021 10:26:43 +0000 (12:26 +0200)
[ Upstream commit 9ff80e2de36d0554e3a6da18a171719fe8663c17 ]

Although irq_create_mapping() is able to deal with duplicate
mappings, it really isn't supposed to be a substitute for
irq_find_mapping(), and can result in allocations that take place
in atomic context if the mapping didn't exist.

Fix the handful of MFD drivers that use irq_create_mapping() in
interrupt context by using irq_find_mapping() instead.

Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/mfd/ab8500-core.c
drivers/mfd/stmpe.c
drivers/mfd/tc3589x.c
drivers/mfd/wm8994-irq.c

index 3e9dc92cb467b6e0295ecd0bbede70c14d7cc043..842de1f352dfc8a9d7487ce2285a56194553ec48 100644 (file)
@@ -493,7 +493,7 @@ static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
                if (line == AB8540_INT_GPIO43F || line == AB8540_INT_GPIO44F)
                        line += 1;
 
-               handle_nested_irq(irq_create_mapping(ab8500->domain, line));
+               handle_nested_irq(irq_find_mapping(ab8500->domain, line));
        }
 
        return 0;
index 1aee3b3253fc99f094e17af03a196c3bef01a43f..508349399f8afeb55f2b6394c578e97d9537b2ed 100644 (file)
@@ -1091,7 +1091,7 @@ static irqreturn_t stmpe_irq(int irq, void *data)
 
        if (variant->id_val == STMPE801_ID ||
            variant->id_val == STMPE1600_ID) {
-               int base = irq_create_mapping(stmpe->domain, 0);
+               int base = irq_find_mapping(stmpe->domain, 0);
 
                handle_nested_irq(base);
                return IRQ_HANDLED;
@@ -1119,7 +1119,7 @@ static irqreturn_t stmpe_irq(int irq, void *data)
                while (status) {
                        int bit = __ffs(status);
                        int line = bank * 8 + bit;
-                       int nestedirq = irq_create_mapping(stmpe->domain, line);
+                       int nestedirq = irq_find_mapping(stmpe->domain, line);
 
                        handle_nested_irq(nestedirq);
                        status &= ~(1 << bit);
index 67c9995bb1aa65667e7a465a26864d234dcf44a1..23cfbd050120d0a923cbc69425fe84e68c7d7497 100644 (file)
@@ -187,7 +187,7 @@ again:
 
        while (status) {
                int bit = __ffs(status);
-               int virq = irq_create_mapping(tc3589x->domain, bit);
+               int virq = irq_find_mapping(tc3589x->domain, bit);
 
                handle_nested_irq(virq);
                status &= ~(1 << bit);
index 6c3a619e262868fa8f45c4545da856a17392f535..651a028bc519a200db07c24418200445f1146d34 100644 (file)
@@ -154,7 +154,7 @@ static irqreturn_t wm8994_edge_irq(int irq, void *data)
        struct wm8994 *wm8994 = data;
 
        while (gpio_get_value_cansleep(wm8994->pdata.irq_gpio))
-               handle_nested_irq(irq_create_mapping(wm8994->edge_irq, 0));
+               handle_nested_irq(irq_find_mapping(wm8994->edge_irq, 0));
 
        return IRQ_HANDLED;
 }