gpio: intel-mid: Pass irqchip when adding gpiochip
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 11 Aug 2019 08:05:39 +0000 (10:05 +0200)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 12 Aug 2019 17:39:26 +0000 (20:39 +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.

Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: David Cohen <david.a.cohen@linux.intel.com>
Cc: Thierry Reding <treding@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/gpio/gpio-intel-mid.c

index 4e803ba..4d835f9 100644 (file)
@@ -329,6 +329,7 @@ static int intel_gpio_probe(struct pci_dev *pdev,
        u32 gpio_base;
        u32 irq_base;
        int retval;
+       struct gpio_irq_chip *girq;
        struct intel_mid_gpio_ddata *ddata =
                                (struct intel_mid_gpio_ddata *)id->driver_data;
 
@@ -369,6 +370,22 @@ static int intel_gpio_probe(struct pci_dev *pdev,
 
        spin_lock_init(&priv->lock);
 
+       girq = &priv->chip.irq;
+       girq->chip = &intel_mid_irqchip;
+       girq->parent_handler = intel_mid_irq_handler;
+       girq->num_parents = 1;
+       girq->parents = devm_kcalloc(&pdev->dev, girq->num_parents,
+                                    sizeof(*girq->parents),
+                                    GFP_KERNEL);
+       if (!girq->parents)
+               return -ENOMEM;
+       girq->parents[0] = pdev->irq;
+       girq->first = irq_base;
+       girq->default_type = IRQ_TYPE_NONE;
+       girq->handler = handle_simple_irq;
+
+       intel_mid_irq_init_hw(priv);
+
        pci_set_drvdata(pdev, priv);
        retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv);
        if (retval) {
@@ -376,24 +393,6 @@ static int intel_gpio_probe(struct pci_dev *pdev,
                return retval;
        }
 
-       retval = gpiochip_irqchip_add(&priv->chip,
-                                     &intel_mid_irqchip,
-                                     irq_base,
-                                     handle_simple_irq,
-                                     IRQ_TYPE_NONE);
-       if (retval) {
-               dev_err(&pdev->dev,
-                       "could not connect irqchip to gpiochip\n");
-               return retval;
-       }
-
-       intel_mid_irq_init_hw(priv);
-
-       gpiochip_set_chained_irqchip(&priv->chip,
-                                    &intel_mid_irqchip,
-                                    pdev->irq,
-                                    intel_mid_irq_handler);
-
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_allow(&pdev->dev);