pinctrl: ocelot: Pass irqchip when adding gpiochip
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 2 Oct 2019 11:44:54 +0000 (13:44 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 16 Oct 2019 13:03:40 +0000 (15:03 +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: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20191002114454.9684-1-linus.walleij@linaro.org
drivers/pinctrl/pinctrl-ocelot.c

index fb76fb2..eb3dd0d 100644 (file)
@@ -736,6 +736,7 @@ static int ocelot_gpiochip_register(struct platform_device *pdev,
                                    struct ocelot_pinctrl *info)
 {
        struct gpio_chip *gc;
+       struct gpio_irq_chip *girq;
        int ret, irq;
 
        info->gpio_chip = ocelot_gpiolib_chip;
@@ -747,22 +748,26 @@ static int ocelot_gpiochip_register(struct platform_device *pdev,
        gc->of_node = info->dev->of_node;
        gc->label = "ocelot-gpio";
 
-       ret = devm_gpiochip_add_data(&pdev->dev, gc, info);
-       if (ret)
-               return ret;
-
        irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
        if (irq <= 0)
                return irq;
 
-       ret = gpiochip_irqchip_add(gc, &ocelot_irqchip, 0, handle_edge_irq,
-                                  IRQ_TYPE_NONE);
+       girq = &gc->irq;
+       girq->chip = &ocelot_irqchip;
+       girq->parent_handler = ocelot_irq_handler;
+       girq->num_parents = 1;
+       girq->parents = devm_kcalloc(&pdev->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_edge_irq;
+
+       ret = devm_gpiochip_add_data(&pdev->dev, gc, info);
        if (ret)
                return ret;
 
-       gpiochip_set_chained_irqchip(gc, &ocelot_irqchip, irq,
-                                    ocelot_irq_handler);
-
        return 0;
 }