pinctrl: mcp23s08: Use irqchip template
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 21 Jul 2020 12:52:23 +0000 (14:52 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 23 Jul 2020 13:00:17 +0000 (15:00 +0200)
This makes the driver use the irqchip template to assign
properties to the gpio_irq_chip instead of using the
explicit calls to gpiochip_irqchip_add_nested() and
gpiochip_set_nested_irqchip(). The irqchip is instead
added while adding the gpiochip.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Jan Kundrát <jan.kundrat@cesnet.cz>
Cc: Phil Reid <preid@electromag.com.au>
Cc: Lars Poeschel <poeschel@lemonage.de>
Cc: Jason Kridner <jkridner@gmail.com>
Link: https://lore.kernel.org/r/20200721125223.344411-1-linus.walleij@linaro.org
drivers/pinctrl/pinctrl-mcp23s08.c

index 151931b..42b12ea 100644 (file)
@@ -522,29 +522,6 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
        return 0;
 }
 
-static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
-{
-       struct gpio_chip *chip = &mcp->chip;
-       int err;
-
-       err =  gpiochip_irqchip_add_nested(chip,
-                                          &mcp->irq_chip,
-                                          0,
-                                          handle_simple_irq,
-                                          IRQ_TYPE_NONE);
-       if (err) {
-               dev_err(chip->parent,
-                       "could not connect irqchip to gpiochip: %d\n", err);
-               return err;
-       }
-
-       gpiochip_set_nested_irqchip(chip,
-                                   &mcp->irq_chip,
-                                   mcp->irq);
-
-       return 0;
-}
-
 /*----------------------------------------------------------------------*/
 
 int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
@@ -589,10 +566,6 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
        if (ret < 0)
                goto fail;
 
-       ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
-       if (ret < 0)
-               goto fail;
-
        mcp->irq_controller =
                device_property_read_bool(dev, "interrupt-controller");
        if (mcp->irq && mcp->irq_controller) {
@@ -629,11 +602,22 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
        }
 
        if (mcp->irq && mcp->irq_controller) {
-               ret = mcp23s08_irqchip_setup(mcp);
-               if (ret)
-                       goto fail;
+               struct gpio_irq_chip *girq = &mcp->chip.irq;
+
+               girq->chip = &mcp->irq_chip;
+               /* This will let us handle the parent IRQ in the driver */
+               girq->parent_handler = NULL;
+               girq->num_parents = 0;
+               girq->parents = NULL;
+               girq->default_type = IRQ_TYPE_NONE;
+               girq->handler = handle_simple_irq;
+               girq->threaded = true;
        }
 
+       ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
+       if (ret < 0)
+               goto fail;
+
        mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops;
        mcp->pinctrl_desc.confops = &mcp_pinconf_ops;
        mcp->pinctrl_desc.npins = mcp->chip.ngpio;