lkml.org 
[lkml]   [2018]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 129/135] pinctrl: mcp23s08: fix irq and irqchip setup order
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Marco Felsch <m.felsch@pengutronix.de>

    commit f259f896f2348f0302f6f88d4382378cf9d23a7e upstream.

    Since 'commit 02e389e63e35 ("pinctrl: mcp23s08: fix irq setup order")' the
    irq request isn't the last devm_* allocation. Without a deeper look at
    the irq and testing this isn't a good solution. Since this driver relies
    on the devm mechanism, requesting a interrupt should be the last thing
    to avoid memory corruptions during unbinding.

    'Commit 02e389e63e35 ("pinctrl: mcp23s08: fix irq setup order")' fixed the
    order for the interrupt-controller use case only. The
    mcp23s08_irq_setup() must be split into two to fix it for the
    interrupt-controller use case and to register the irq at last. So the
    irq will be freed first during unbind.

    Cc: stable@vger.kernel.org
    Cc: Jan Kundrát <jan.kundrat@cesnet.cz>
    Cc: Dmitry Mastykin <mastichi@gmail.com>
    Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
    Fixes: 82039d244f87 ("pinctrl: mcp23s08: add pinconf support")
    Fixes: 02e389e63e35 ("pinctrl: mcp23s08: fix irq setup order")
    Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
    Tested-by: Phil Reid <preid@electromag.com.au>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/pinctrl/pinctrl-mcp23s08.c | 13 ++++++++++++-
    1 file changed, 12 insertions(+), 1 deletion(-)

    --- a/drivers/pinctrl/pinctrl-mcp23s08.c
    +++ b/drivers/pinctrl/pinctrl-mcp23s08.c
    @@ -636,6 +636,14 @@ static int mcp23s08_irq_setup(struct mcp
    return err;
    }

    + return 0;
    +}
    +
    +static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
    +{
    + struct gpio_chip *chip = &mcp->chip;
    + int err;
    +
    err = gpiochip_irqchip_add_nested(chip,
    &mcp23s08_irq_chip,
    0,
    @@ -912,7 +920,7 @@ static int mcp23s08_probe_one(struct mcp
    }

    if (mcp->irq && mcp->irq_controller) {
    - ret = mcp23s08_irq_setup(mcp);
    + ret = mcp23s08_irqchip_setup(mcp);
    if (ret)
    goto fail;
    }
    @@ -944,6 +952,9 @@ static int mcp23s08_probe_one(struct mcp
    goto fail;
    }

    + if (mcp->irq)
    + ret = mcp23s08_irq_setup(mcp);
    +
    fail:
    if (ret < 0)
    dev_dbg(dev, "can't setup chip %d, --> %d\n", addr, ret);

    \
     
     \ /
      Last update: 2018-10-16 19:40    [W:4.832 / U:0.316 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site