]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpio: vf610: Do not share irq_chip
authorAndrey Smirnov <andrew.smirnov@gmail.com>
Mon, 11 Mar 2019 06:27:31 +0000 (23:27 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 15 Jun 2019 09:54:59 +0000 (11:54 +0200)
[ Upstream commit 338aa10750ba24d04beeaf5dc5efc032e5cf343f ]

Fix the warning produced by gpiochip_set_irq_hooks() by allocating a
dedicated IRQ chip per GPIO chip/port.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Heiner Kallweit <hkallweit1@gmail.com>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: linux-gpio@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-imx@nxp.com
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpio/gpio-vf610.c

index 1309b444720e3bd234f20fdbe6fc1d26828e3c58..3210fba16a9b0d453029fccd12b9a2a3161a292b 100644 (file)
@@ -37,6 +37,7 @@ struct fsl_gpio_soc_data {
 
 struct vf610_gpio_port {
        struct gpio_chip gc;
+       struct irq_chip ic;
        void __iomem *base;
        void __iomem *gpio_base;
        const struct fsl_gpio_soc_data *sdata;
@@ -66,8 +67,6 @@ struct vf610_gpio_port {
 #define PORT_INT_EITHER_EDGE   0xb
 #define PORT_INT_LOGIC_ONE     0xc
 
-static struct irq_chip vf610_gpio_irq_chip;
-
 static const struct fsl_gpio_soc_data imx_data = {
        .have_paddr = true,
 };
@@ -243,15 +242,6 @@ static int vf610_gpio_irq_set_wake(struct irq_data *d, u32 enable)
        return 0;
 }
 
-static struct irq_chip vf610_gpio_irq_chip = {
-       .name           = "gpio-vf610",
-       .irq_ack        = vf610_gpio_irq_ack,
-       .irq_mask       = vf610_gpio_irq_mask,
-       .irq_unmask     = vf610_gpio_irq_unmask,
-       .irq_set_type   = vf610_gpio_irq_set_type,
-       .irq_set_wake   = vf610_gpio_irq_set_wake,
-};
-
 static int vf610_gpio_probe(struct platform_device *pdev)
 {
        const struct of_device_id *of_id = of_match_device(vf610_gpio_dt_ids,
@@ -261,6 +251,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
        struct vf610_gpio_port *port;
        struct resource *iores;
        struct gpio_chip *gc;
+       struct irq_chip *ic;
        int i;
        int ret;
 
@@ -297,6 +288,14 @@ static int vf610_gpio_probe(struct platform_device *pdev)
        gc->direction_output = vf610_gpio_direction_output;
        gc->set = vf610_gpio_set;
 
+       ic = &port->ic;
+       ic->name = "gpio-vf610";
+       ic->irq_ack = vf610_gpio_irq_ack;
+       ic->irq_mask = vf610_gpio_irq_mask;
+       ic->irq_unmask = vf610_gpio_irq_unmask;
+       ic->irq_set_type = vf610_gpio_irq_set_type;
+       ic->irq_set_wake = vf610_gpio_irq_set_wake;
+
        ret = gpiochip_add_data(gc, port);
        if (ret < 0)
                return ret;
@@ -308,14 +307,13 @@ 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, &vf610_gpio_irq_chip, 0,
-                                  handle_edge_irq, IRQ_TYPE_NONE);
+       ret = gpiochip_irqchip_add(gc, ic, 0, handle_edge_irq, IRQ_TYPE_NONE);
        if (ret) {
                dev_err(dev, "failed to add irqchip\n");
                gpiochip_remove(gc);
                return ret;
        }
-       gpiochip_set_chained_irqchip(gc, &vf610_gpio_irq_chip, port->irq,
+       gpiochip_set_chained_irqchip(gc, ic, port->irq,
                                     vf610_gpio_irq_handler);
 
        return 0;