pinctrl: baytrail: Allocate IRQ chip dynamic
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 24 Oct 2019 14:33:42 +0000 (17:33 +0300)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 9 Dec 2019 10:59:43 +0000 (12:59 +0200)
Keeping the IRQ chip definition static shares it with multiple instances
of the GPIO chip in the system. This is bad and now we get this warning
from GPIO library:

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

Hence, move the IRQ chip definition from being driver static into the struct
intel_pinctrl. So a unique IRQ chip is used for each GPIO chip instance.

Fixes: 9f573b98ca50 ("pinctrl: baytrail: Update irq chip operations")
Depends-on: ca8a958e2acb ("pinctrl: baytrail: Pass irqchip when adding gpiochip")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/pinctrl/intel/pinctrl-baytrail.c

index 55141d5de29e60254165ae1b269c31d9bfd36331..72ffd19448e50ca3654d8ff431147a433406fc18 100644 (file)
@@ -107,6 +107,7 @@ struct byt_gpio_pin_context {
 
 struct byt_gpio {
        struct gpio_chip chip;
+       struct irq_chip irqchip;
        struct platform_device *pdev;
        struct pinctrl_dev *pctl_dev;
        struct pinctrl_desc pctl_desc;
@@ -1395,15 +1396,6 @@ static int byt_irq_type(struct irq_data *d, unsigned int type)
        return 0;
 }
 
-static struct irq_chip byt_irqchip = {
-       .name           = "BYT-GPIO",
-       .irq_ack        = byt_irq_ack,
-       .irq_mask       = byt_irq_mask,
-       .irq_unmask     = byt_irq_unmask,
-       .irq_set_type   = byt_irq_type,
-       .flags          = IRQCHIP_SKIP_SET_WAKE,
-};
-
 static void byt_gpio_irq_handler(struct irq_desc *desc)
 {
        struct irq_data *data = irq_desc_get_irq_data(desc);
@@ -1551,8 +1543,15 @@ static int byt_gpio_probe(struct byt_gpio *vg)
        if (irq_rc && irq_rc->start) {
                struct gpio_irq_chip *girq;
 
+               vg->irqchip.name = "BYT-GPIO",
+               vg->irqchip.irq_ack = byt_irq_ack,
+               vg->irqchip.irq_mask = byt_irq_mask,
+               vg->irqchip.irq_unmask = byt_irq_unmask,
+               vg->irqchip.irq_set_type = byt_irq_type,
+               vg->irqchip.flags = IRQCHIP_SKIP_SET_WAKE,
+
                girq = &gc->irq;
-               girq->chip = &byt_irqchip;
+               girq->chip = &vg->irqchip;
                girq->init_hw = byt_gpio_irq_init_hw;
                girq->parent_handler = byt_gpio_irq_handler;
                girq->num_parents = 1;