summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/pinctrl/pinctrl-mcp23s08.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c
index 586f2f67c617..b89b3169e8be 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08.c
@@ -664,6 +664,15 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
if (mcp->irq && mcp->irq_controller) {
struct gpio_irq_chip *girq = &mcp->chip.irq;
+ /*
+ * Disable all pin interrupts, to prevent the interrupt handler from
+ * calling nested handlers for any currently-enabled interrupts that
+ * do not (yet) have an actual handler.
+ */
+ ret = mcp_write(mcp, MCP_GPINTEN, 0);
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "can't disable interrupts\n");
+
gpio_irq_chip_set_chip(girq, &mcp23s08_irq_chip);
/* This will let us handle the parent IRQ in the driver */
girq->parent_handler = NULL;