> -----Original Message----- > From: Linus Walleij <linus.walleij@xxxxxxxxxx> > Sent: Donnerstag, 16. Juli 2020 17:05 > To: linux-gpio@xxxxxxxxxxxxxxx > Cc: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx>; Linus Walleij > <linus.walleij@xxxxxxxxxx>; Nikolaus Voss <nv@xxxxxxx>; Hennerich, Michael > <Michael.Hennerich@xxxxxxxxxx> > Subject: [PATCH] gpio: adp5588: Use irqchip template > > 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. > > Cc: Nikolaus Voss <nv@xxxxxxx> > Cc: Michael Hennerich <michael.hennerich@xxxxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> Acked-by: Michael Hennerich <michael.hennerich@xxxxxxxxxx> > --- > drivers/gpio/gpio-adp5588.c | 39 +++++++++++++++++++++++-------------- > 1 file changed, 24 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpio/gpio-adp5588.c b/drivers/gpio/gpio-adp5588.c index > 49f423d7beba..f1e4ac90e7d3 100644 > --- a/drivers/gpio/gpio-adp5588.c > +++ b/drivers/gpio/gpio-adp5588.c > @@ -272,13 +272,24 @@ static irqreturn_t adp5588_irq_handler(int irq, void > *devid) > return IRQ_HANDLED; > } > > + > +static int adp5588_irq_init_hw(struct gpio_chip *gc) { > + struct adp5588_gpio *dev = gpiochip_get_data(gc); > + /* Enable IRQs after registering chip */ > + adp5588_gpio_write(dev->client, CFG, > + ADP5588_AUTO_INC | ADP5588_INT_CFG | > ADP5588_KE_IEN); > + > + return 0; > +} > + > static int adp5588_irq_setup(struct adp5588_gpio *dev) { > struct i2c_client *client = dev->client; > int ret; > struct adp5588_gpio_platform_data *pdata = > dev_get_platdata(&client->dev); > - int irq_base = pdata ? pdata->irq_base : 0; > + struct gpio_irq_chip *girq; > > adp5588_gpio_write(client, CFG, ADP5588_AUTO_INC); > adp5588_gpio_write(client, INT_STAT, -1); /* status is W1C */ @@ - > 294,21 +305,19 @@ static int adp5588_irq_setup(struct adp5588_gpio *dev) > client->irq); > return ret; > } > - ret = gpiochip_irqchip_add_nested(&dev->gpio_chip, > - &adp5588_irq_chip, irq_base, > - handle_simple_irq, > - IRQ_TYPE_NONE); > - if (ret) { > - dev_err(&client->dev, > - "could not connect irqchip to gpiochip\n"); > - return ret; > - } > - gpiochip_set_nested_irqchip(&dev->gpio_chip, > - &adp5588_irq_chip, > - client->irq); > > - adp5588_gpio_write(client, CFG, > - ADP5588_AUTO_INC | ADP5588_INT_CFG | > ADP5588_KE_IEN); > + /* This will be registered in the call to devm_gpiochip_add_data() */ > + girq = &dev->gpio_chip.irq; > + girq->chip = &adp5588_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->first = pdata ? pdata->irq_base : 0; > + girq->default_type = IRQ_TYPE_NONE; > + girq->handler = handle_simple_irq; > + girq->init_hw = adp5588_irq_init_hw; > + girq->threaded = true; > > return 0; > } > -- > 2.26.2