]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
platform/x86: intel_int0002_vgpio: Pass irqchip when adding gpiochip
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 22 Oct 2019 21:01:28 +0000 (23:01 +0200)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Sat, 26 Oct 2019 23:10:58 +0000 (02:10 +0300)
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.

Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/platform/x86/intel_int0002_vgpio.c

index af233b7b77f2841ed3ce01b53db4ff0fd0a1dc86..f14e2c5f9da544cf6dbf2e856f38d3adc4085127 100644 (file)
@@ -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;
 }