OSDN Git Service

gpio: vf610: Pass irqchip when adding gpiochip
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 9 Aug 2019 14:19:16 +0000 (16:19 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 23 Aug 2019 07:41:18 +0000 (09:41 +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: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Dong Aisheng <aisheng.dong@nxp.com>
Cc: Stefan Agner <stefan@agner.ch>
Cc: Thierry Reding <treding@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20190809141916.20999-1-linus.walleij@linaro.org
drivers/gpio/gpio-vf610.c

index 7ba668d..58776f2 100644 (file)
@@ -243,6 +243,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
        struct device_node *np = dev->of_node;
        struct vf610_gpio_port *port;
        struct gpio_chip *gc;
+       struct gpio_irq_chip *girq;
        struct irq_chip *ic;
        int i;
        int ret;
@@ -318,10 +319,6 @@ static int vf610_gpio_probe(struct platform_device *pdev)
        ic->irq_set_type = vf610_gpio_irq_set_type;
        ic->irq_set_wake = vf610_gpio_irq_set_wake;
 
-       ret = devm_gpiochip_add_data(dev, gc, port);
-       if (ret < 0)
-               return ret;
-
        /* Mask all GPIO interrupts */
        for (i = 0; i < gc->ngpio; i++)
                vf610_gpio_writel(0, port->base + PORT_PCR(i));
@@ -329,15 +326,20 @@ static int vf610_gpio_probe(struct platform_device *pdev)
        /* Clear the interrupt status register for all GPIO's */
        vf610_gpio_writel(~0, port->base + PORT_ISFR);
 
-       ret = gpiochip_irqchip_add(gc, ic, 0, handle_edge_irq, IRQ_TYPE_NONE);
-       if (ret) {
-               dev_err(dev, "failed to add irqchip\n");
-               return ret;
-       }
-       gpiochip_set_chained_irqchip(gc, ic, port->irq,
-                                    vf610_gpio_irq_handler);
+       girq = &gc->irq;
+       girq->chip = ic;
+       girq->parent_handler = vf610_gpio_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] = port->irq;
+       girq->default_type = IRQ_TYPE_NONE;
+       girq->handler = handle_edge_irq;
 
-       return 0;
+       return devm_gpiochip_add_data(dev, gc, port);
 }
 
 static struct platform_driver vf610_gpio_driver = {