]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
gpio: pl061: Move irq_chip definition inside struct pl061
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Wed, 24 Oct 2018 17:29:15 +0000 (22:59 +0530)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 14 Aug 2019 09:18:49 +0000 (11:18 +0200)
BugLink: https://bugs.launchpad.net/bugs/1837477
[ Upstream commit ed8dce4c6f726b7f3c6bf40859b92a9e32f189c1 ]

Keeping the irq_chip definition static will make it shared with multiple
giochips in the system. This practice is considered to be bad and now we
will get the below warning from gpiolib core:

"detected irqchip that is shared with multiple gpiochips: please fix the
driver."

Hence, move the irq_chip definition from static to `struct pl061` for
using a unique irq_chip for each gpiochip.

Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/gpio/gpio-pl061.c

index b70974cb9ef178b5ca56b961ec0dc3e80d9eb5b5..d0adff74c5e279e03058eaaf8f2d9f2a0ec4a62d 100644 (file)
@@ -54,6 +54,7 @@ struct pl061 {
 
        void __iomem            *base;
        struct gpio_chip        gc;
+       struct irq_chip         irq_chip;
        int                     parent_irq;
 
 #ifdef CONFIG_PM
@@ -281,15 +282,6 @@ static int pl061_irq_set_wake(struct irq_data *d, unsigned int state)
        return irq_set_irq_wake(pl061->parent_irq, state);
 }
 
-static struct irq_chip pl061_irqchip = {
-       .name           = "pl061",
-       .irq_ack        = pl061_irq_ack,
-       .irq_mask       = pl061_irq_mask,
-       .irq_unmask     = pl061_irq_unmask,
-       .irq_set_type   = pl061_irq_type,
-       .irq_set_wake   = pl061_irq_set_wake,
-};
-
 static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
 {
        struct device *dev = &adev->dev;
@@ -328,6 +320,13 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
        /*
         * irq_chip support
         */
+       pl061->irq_chip.name = dev_name(dev);
+       pl061->irq_chip.irq_ack = pl061_irq_ack;
+       pl061->irq_chip.irq_mask = pl061_irq_mask;
+       pl061->irq_chip.irq_unmask = pl061_irq_unmask;
+       pl061->irq_chip.irq_set_type = pl061_irq_type;
+       pl061->irq_chip.irq_set_wake = pl061_irq_set_wake;
+
        writeb(0, pl061->base + GPIOIE); /* disable irqs */
        irq = adev->irq[0];
        if (irq < 0) {
@@ -336,14 +335,14 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
        }
        pl061->parent_irq = irq;
 
-       ret = gpiochip_irqchip_add(&pl061->gc, &pl061_irqchip,
+       ret = gpiochip_irqchip_add(&pl061->gc, &pl061->irq_chip,
                                   0, handle_bad_irq,
                                   IRQ_TYPE_NONE);
        if (ret) {
                dev_info(&adev->dev, "could not add irqchip\n");
                return ret;
        }
-       gpiochip_set_chained_irqchip(&pl061->gc, &pl061_irqchip,
+       gpiochip_set_chained_irqchip(&pl061->gc, &pl061->irq_chip,
                                     irq, pl061_irq_handler);
 
        amba_set_drvdata(adev, pl061);