Commit e599256a authored by Linus Walleij's avatar Linus Walleij
Browse files

gpio: vf610: Pass irqchip when adding gpiochip



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: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20190809141916.20999-1-linus.walleij@linaro.org
parent 49751efb
Loading
Loading
Loading
Loading
+14 −12
Original line number Original line Diff line number Diff line
@@ -243,6 +243,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
	struct device_node *np = dev->of_node;
	struct device_node *np = dev->of_node;
	struct vf610_gpio_port *port;
	struct vf610_gpio_port *port;
	struct gpio_chip *gc;
	struct gpio_chip *gc;
	struct gpio_irq_chip *girq;
	struct irq_chip *ic;
	struct irq_chip *ic;
	int i;
	int i;
	int ret;
	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_type = vf610_gpio_irq_set_type;
	ic->irq_set_wake = vf610_gpio_irq_set_wake;
	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 */
	/* Mask all GPIO interrupts */
	for (i = 0; i < gc->ngpio; i++)
	for (i = 0; i < gc->ngpio; i++)
		vf610_gpio_writel(0, port->base + PORT_PCR(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 */
	/* Clear the interrupt status register for all GPIO's */
	vf610_gpio_writel(~0, port->base + PORT_ISFR);
	vf610_gpio_writel(~0, port->base + PORT_ISFR);


	ret = gpiochip_irqchip_add(gc, ic, 0, handle_edge_irq, IRQ_TYPE_NONE);
	girq = &gc->irq;
	if (ret) {
	girq->chip = ic;
		dev_err(dev, "failed to add irqchip\n");
	girq->parent_handler = vf610_gpio_irq_handler;
		return ret;
	girq->num_parents = 1;
	}
	girq->parents = devm_kcalloc(&pdev->dev, 1,
	gpiochip_set_chained_irqchip(gc, ic, port->irq,
				     sizeof(*girq->parents),
				     vf610_gpio_irq_handler);
				     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 = {
static struct platform_driver vf610_gpio_driver = {