diff options
author | Phil Reid <preid@electromag.com.au> | 2019-06-10 17:50:11 +0800 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2019-06-10 16:24:22 +0200 |
commit | 9d373acadaf676e3733ba57c7294ec60e9a358a9 (patch) | |
tree | e0f3875210e0f7883de166b5b736b569a0118f7d | |
parent | 1ebd06871b57a632b6624fbd4b680dc7dd8a1283 (diff) |
gpio: altera: Allocate irq_chip dynamically
Keeping the irq_chip definition static shares it with multiple instances
of the altera gpiochip in the system. This is bad and now we get this
warning from gpiolib core:
"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 altera_gpio_chips. So a unique irq_chip is used for each gpiochip
instance.
Signed-off-by: Phil Reid <preid@electromag.com.au>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | drivers/gpio/gpio-altera.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/drivers/gpio/gpio-altera.c b/drivers/gpio/gpio-altera.c index e088b908c2c1..a266d8796ee5 100644 --- a/drivers/gpio/gpio-altera.c +++ b/drivers/gpio/gpio-altera.c @@ -30,6 +30,7 @@ struct altera_gpio_chip { raw_spinlock_t gpio_lock; int interrupt_trigger; int mapped_irq; + struct irq_chip irq_chip; }; static void altera_gpio_irq_unmask(struct irq_data *d) @@ -101,15 +102,6 @@ static unsigned int altera_gpio_irq_startup(struct irq_data *d) return 0; } -static struct irq_chip altera_irq_chip = { - .name = "altera-gpio", - .irq_mask = altera_gpio_irq_mask, - .irq_unmask = altera_gpio_irq_unmask, - .irq_set_type = altera_gpio_irq_set_type, - .irq_startup = altera_gpio_irq_startup, - .irq_shutdown = altera_gpio_irq_mask, -}; - static int altera_gpio_get(struct gpio_chip *gc, unsigned offset) { struct of_mm_gpio_chip *mm_gc; @@ -294,8 +286,15 @@ static int altera_gpio_probe(struct platform_device *pdev) } altera_gc->interrupt_trigger = reg; - ret = gpiochip_irqchip_add(&altera_gc->mmchip.gc, &altera_irq_chip, 0, - handle_bad_irq, IRQ_TYPE_NONE); + altera_gc->irq_chip.name = "altera-gpio"; + altera_gc->irq_chip.irq_mask = altera_gpio_irq_mask; + altera_gc->irq_chip.irq_unmask = altera_gpio_irq_unmask; + altera_gc->irq_chip.irq_set_type = altera_gpio_irq_set_type; + altera_gc->irq_chip.irq_startup = altera_gpio_irq_startup; + altera_gc->irq_chip.irq_shutdown = altera_gpio_irq_mask; + + ret = gpiochip_irqchip_add(&altera_gc->mmchip.gc, &altera_gc->irq_chip, + 0, handle_bad_irq, IRQ_TYPE_NONE); if (ret) { dev_err(&pdev->dev, "could not add irqchip\n"); @@ -303,7 +302,7 @@ static int altera_gpio_probe(struct platform_device *pdev) } gpiochip_set_chained_irqchip(&altera_gc->mmchip.gc, - &altera_irq_chip, + &altera_gc->irq_chip, altera_gc->mapped_irq, altera_gc->interrupt_trigger == IRQ_TYPE_LEVEL_HIGH ? altera_gpio_irq_leveL_high_handler : |