[ 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.smir...@gmail.com>
Cc: Linus Walleij <linus.wall...@linaro.org>
Cc: Bartosz Golaszewski <bgolaszew...@baylibre.com>
Cc: Chris Healy <cphe...@gmail.com>
Cc: Andrew Lunn <and...@lunn.ch>
Cc: Heiner Kallweit <hkallwe...@gmail.com>
Cc: Fabio Estevam <feste...@gmail.com>
Cc: linux-g...@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-...@nxp.com
Signed-off-by: Bartosz Golaszewski <bgolaszew...@baylibre.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpio/gpio-vf610.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c
index 1309b444720e..3210fba16a9b 100644
--- a/drivers/gpio/gpio-vf610.c
+++ b/drivers/gpio/gpio-vf610.c
@@ -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;
-- 
2.20.1



Reply via email to