pinctrl: bcm-iproc: Pass irqchip when adding gpiochip
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 12 Aug 2019 13:25:54 +0000 (15:25 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 21 Aug 2019 07:00:16 +0000 (09:00 +0200)
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: Pramod Kumar <pramodku@broadcom.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: Thierry Reding <treding@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20190812132554.18313-1-linus.walleij@linaro.org
Acked-by: Scott Branden <scott.branden@broadcom.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/bcm/pinctrl-iproc-gpio.c

index b70058c..a6edeb9 100644 (file)
@@ -790,6 +790,25 @@ static int iproc_gpio_probe(struct platform_device *pdev)
        chip->pinmux_is_supported = of_property_read_bool(dev->of_node,
                                                        "gpio-ranges");
 
+       /* optional GPIO interrupt support */
+       irq = platform_get_irq(pdev, 0);
+       if (irq) {
+               struct gpio_irq_chip *girq;
+
+               girq = &gc->irq;
+               girq->chip = &iproc_gpio_irq_chip;
+               girq->parent_handler = iproc_gpio_irq_handler;
+               girq->num_parents = 1;
+               girq->parents = devm_kcalloc(dev, 1,
+                                            sizeof(*girq->parents),
+                                            GFP_KERNEL);
+               if (!girq->parents)
+                       return -ENOMEM;
+               girq->parents[0] = irq;
+               girq->default_type = IRQ_TYPE_NONE;
+               girq->handler = handle_simple_irq;
+       }
+
        ret = gpiochip_add_data(gc, chip);
        if (ret < 0) {
                dev_err(dev, "unable to add GPIO chip\n");
@@ -814,20 +833,6 @@ static int iproc_gpio_probe(struct platform_device *pdev)
                }
        }
 
-       /* optional GPIO interrupt support */
-       irq = platform_get_irq(pdev, 0);
-       if (irq) {
-               ret = gpiochip_irqchip_add(gc, &iproc_gpio_irq_chip, 0,
-                                          handle_simple_irq, IRQ_TYPE_NONE);
-               if (ret) {
-                       dev_err(dev, "no GPIO irqchip\n");
-                       goto err_rm_gpiochip;
-               }
-
-               gpiochip_set_chained_irqchip(gc, &iproc_gpio_irq_chip, irq,
-                                            iproc_gpio_irq_handler);
-       }
-
        return 0;
 
 err_rm_gpiochip: