lkml.org 
[lkml]   [2021]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 167/175] mfd: Dont use irq_create_mapping() to resolve a mapping
    Date
    From: Marc Zyngier <maz@kernel.org>

    [ 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 | 2 +-
    drivers/mfd/stmpe.c | 4 ++--
    drivers/mfd/tc3589x.c | 2 +-
    drivers/mfd/wm8994-irq.c | 2 +-
    4 files changed, 5 insertions(+), 5 deletions(-)

    diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
    index 2f212bdc187a..83484c43b1dc 100644
    --- a/drivers/mfd/ab8500-core.c
    +++ b/drivers/mfd/ab8500-core.c
    @@ -489,7 +489,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;
    diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c
    index b0c7bcdaf5df..61fb4873c061 100644
    --- a/drivers/mfd/stmpe.c
    +++ b/drivers/mfd/stmpe.c
    @@ -1033,7 +1033,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;
    @@ -1061,7 +1061,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);
    diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
    index 274bf39968aa..96187c1e5f8f 100644
    --- a/drivers/mfd/tc3589x.c
    +++ b/drivers/mfd/tc3589x.c
    @@ -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);
    diff --git a/drivers/mfd/wm8994-irq.c b/drivers/mfd/wm8994-irq.c
    index 18710f3b5c53..2c58d9b99a39 100644
    --- a/drivers/mfd/wm8994-irq.c
    +++ b/drivers/mfd/wm8994-irq.c
    @@ -159,7 +159,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;
    }
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-09-20 19:10    [W:4.260 / U:0.548 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site