On Tue, Jul 21, 2020 at 3:53 PM Linus Walleij <linus.walleij@xxxxxxxxxx> wrote: > > 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. For the code Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> I can't test right now, though. > Cc: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Cc: Jan Kundrát <jan.kundrat@xxxxxxxxx> > Cc: Phil Reid <preid@xxxxxxxxxxxxxxxxx> > Cc: Lars Poeschel <poeschel@xxxxxxxxxxx> > Cc: Jason Kridner <jkridner@xxxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > drivers/pinctrl/pinctrl-mcp23s08.c | 44 ++++++++++-------------------- > 1 file changed, 14 insertions(+), 30 deletions(-) > > diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c > index 151931b593f6..42b12ea14d6b 100644 > --- a/drivers/pinctrl/pinctrl-mcp23s08.c > +++ b/drivers/pinctrl/pinctrl-mcp23s08.c > @@ -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; > -- > 2.26.2 > -- With Best Regards, Andy Shevchenko