On Wed, Oct 23, 2019 at 12:03 AM Linus Walleij <linus.walleij@xxxxxxxxxx> wrote: > > We need to convert all old gpio irqchips to pass the irqchip > setup along when adding the gpio_chip. For more info see > drivers/gpio/TODO. > > For chained irqchips this is a pretty straight-forward > conversion. This driver requests the IRQ directly in the driver > so it needs to pass a NULL parent handler. We may revisit this > code later and pull reqular shared IRQ handler into > gpiolib, so leave a FIXME. > Thanks! Code looks fine to me, though I will wait for Hans to confirm it doesn't break anything. > Cc: Hans de Goede <hdegoede@xxxxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > drivers/platform/x86/intel_int0002_vgpio.c | 28 +++++++++++----------- > 1 file changed, 14 insertions(+), 14 deletions(-) > > diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c > index af233b7b77f2..f14e2c5f9da5 100644 > --- a/drivers/platform/x86/intel_int0002_vgpio.c > +++ b/drivers/platform/x86/intel_int0002_vgpio.c > @@ -164,8 +164,8 @@ static int int0002_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > const struct x86_cpu_id *cpu_id; > - struct irq_chip *irq_chip; > struct gpio_chip *chip; > + struct gpio_irq_chip *girq; > int irq, ret; > > /* Menlow has a different INT0002 device? <sigh> */ > @@ -192,15 +192,11 @@ static int int0002_probe(struct platform_device *pdev) > chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1; > chip->irq.init_valid_mask = int0002_init_irq_valid_mask; > > - ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL); > - if (ret) { > - dev_err(dev, "Error adding gpio chip: %d\n", ret); > - return ret; > - } > - > /* > - * We manually request the irq here instead of passing a flow-handler > + * We directly request the irq here instead of passing a flow-handler > * to gpiochip_set_chained_irqchip, because the irq is shared. > + * FIXME: augment this if we managed to pull handling of shared > + * IRQs into gpiolib. > */ > ret = devm_request_irq(dev, irq, int0002_irq, > IRQF_SHARED, "INT0002", chip); > @@ -209,17 +205,21 @@ static int int0002_probe(struct platform_device *pdev) > return ret; > } > > - irq_chip = (struct irq_chip *)cpu_id->driver_data; > + girq = &chip->irq; > + girq->chip = (struct irq_chip *)cpu_id->driver_data; > + /* This 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_edge_irq; > > - ret = gpiochip_irqchip_add(chip, irq_chip, 0, handle_edge_irq, > - IRQ_TYPE_NONE); > + ret = devm_gpiochip_add_data(dev, chip, NULL); > if (ret) { > - dev_err(dev, "Error adding irqchip: %d\n", ret); > + dev_err(dev, "Error adding gpio chip: %d\n", ret); > return ret; > } > > - gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL); > - > device_init_wakeup(dev, true); > return 0; > } > -- > 2.21.0 > -- With Best Regards, Andy Shevchenko