Commit f259f896 authored by Marco Felsch's avatar Marco Felsch Committed by Linus Walleij

pinctrl: mcp23s08: fix irq and irqchip setup order

Since 'commit 02e389e6 ("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 02e389e6 ("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: 82039d24 ("pinctrl: mcp23s08: add pinconf support")
Fixes: 02e389e6 ("pinctrl: mcp23s08: fix irq setup order")
Signed-off-by: default avatarMarco Felsch <m.felsch@pengutronix.de>
Tested-by: default avatarPhil Reid <preid@electromag.com.au>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 0238df64
...@@ -636,6 +636,14 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp) ...@@ -636,6 +636,14 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
return err; 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, err = gpiochip_irqchip_add_nested(chip,
&mcp23s08_irq_chip, &mcp23s08_irq_chip,
0, 0,
...@@ -912,7 +920,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, ...@@ -912,7 +920,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
} }
if (mcp->irq && mcp->irq_controller) { if (mcp->irq && mcp->irq_controller) {
ret = mcp23s08_irq_setup(mcp); ret = mcp23s08_irqchip_setup(mcp);
if (ret) if (ret)
goto fail; goto fail;
} }
...@@ -944,6 +952,9 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, ...@@ -944,6 +952,9 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
goto fail; goto fail;
} }
if (mcp->irq)
ret = mcp23s08_irq_setup(mcp);
fail: fail:
if (ret < 0) if (ret < 0)
dev_dbg(dev, "can't setup chip %d, --> %d\n", addr, ret); dev_dbg(dev, "can't setup chip %d, --> %d\n", addr, ret);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment