|
Takashi Iwai |
4d3d0a |
From 28dc10eb77a2db7681b08e3b109764bbe469e347 Mon Sep 17 00:00:00 2001
|
|
Takashi Iwai |
4d3d0a |
From: Nikita Shubin <nikita.shubin@maquefel.me>
|
|
Takashi Iwai |
4d3d0a |
Date: Tue, 9 Feb 2021 16:31:05 +0300
|
|
Takashi Iwai |
4d3d0a |
Subject: [PATCH] gpio: ep93xx: Fix single irqchip with multi gpiochips
|
|
Takashi Iwai |
4d3d0a |
Git-commit: 28dc10eb77a2db7681b08e3b109764bbe469e347
|
|
Takashi Iwai |
4d3d0a |
Patch-mainline: v5.11
|
|
Takashi Iwai |
4d3d0a |
References: git-fixes
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
Fixes the following warnings which results in interrupts disabled on
|
|
Takashi Iwai |
4d3d0a |
port B/F:
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
gpio gpiochip1: (B): detected irqchip that is shared with multiple gpiochips: please fix the driver.
|
|
Takashi Iwai |
4d3d0a |
gpio gpiochip5: (F): detected irqchip that is shared with multiple gpiochips: please fix the driver.
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
- added separate irqchip for each interrupt capable gpiochip
|
|
Takashi Iwai |
4d3d0a |
- provided unique names for each irqchip
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
Fixes: d2b091961510 ("gpio: ep93xx: Pass irqchip when adding gpiochip")
|
|
Takashi Iwai |
4d3d0a |
Cc: <stable@vger.kernel.org>
|
|
Takashi Iwai |
4d3d0a |
Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>
|
|
Takashi Iwai |
4d3d0a |
Tested-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
|
|
Takashi Iwai |
4d3d0a |
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
|
Takashi Iwai |
4d3d0a |
Acked-by: Takashi Iwai <tiwai@suse.de>
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
---
|
|
Takashi Iwai |
4d3d0a |
drivers/gpio/gpio-ep93xx.c | 30 +++++++++++++++++++-----------
|
|
Takashi Iwai |
4d3d0a |
1 file changed, 19 insertions(+), 11 deletions(-)
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
diff --git a/drivers/gpio/gpio-ep93xx.c b/drivers/gpio/gpio-ep93xx.c
|
|
Takashi Iwai |
4d3d0a |
index 64d6c2b4282e..94d9fa0d6aa7 100644
|
|
Takashi Iwai |
4d3d0a |
--- a/drivers/gpio/gpio-ep93xx.c
|
|
Takashi Iwai |
4d3d0a |
+++ b/drivers/gpio/gpio-ep93xx.c
|
|
Takashi Iwai |
4d3d0a |
@@ -38,6 +38,7 @@
|
|
Takashi Iwai |
4d3d0a |
#define EP93XX_GPIO_F_IRQ_BASE 80
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
struct ep93xx_gpio_irq_chip {
|
|
Takashi Iwai |
4d3d0a |
+ struct irq_chip ic;
|
|
Takashi Iwai |
4d3d0a |
u8 irq_offset;
|
|
Takashi Iwai |
4d3d0a |
u8 int_unmasked;
|
|
Takashi Iwai |
4d3d0a |
u8 int_enabled;
|
|
Takashi Iwai |
4d3d0a |
@@ -263,15 +264,6 @@ static int ep93xx_gpio_irq_type(struct irq_data *d, unsigned int type)
|
|
Takashi Iwai |
4d3d0a |
return 0;
|
|
Takashi Iwai |
4d3d0a |
}
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
-static struct irq_chip ep93xx_gpio_irq_chip = {
|
|
Takashi Iwai |
4d3d0a |
- .name = "GPIO",
|
|
Takashi Iwai |
4d3d0a |
- .irq_ack = ep93xx_gpio_irq_ack,
|
|
Takashi Iwai |
4d3d0a |
- .irq_mask_ack = ep93xx_gpio_irq_mask_ack,
|
|
Takashi Iwai |
4d3d0a |
- .irq_mask = ep93xx_gpio_irq_mask,
|
|
Takashi Iwai |
4d3d0a |
- .irq_unmask = ep93xx_gpio_irq_unmask,
|
|
Takashi Iwai |
4d3d0a |
- .irq_set_type = ep93xx_gpio_irq_type,
|
|
Takashi Iwai |
4d3d0a |
-};
|
|
Takashi Iwai |
4d3d0a |
-
|
|
Takashi Iwai |
4d3d0a |
/*************************************************************************
|
|
Takashi Iwai |
4d3d0a |
* gpiolib interface for EP93xx on-chip GPIOs
|
|
Takashi Iwai |
4d3d0a |
*************************************************************************/
|
|
Takashi Iwai |
4d3d0a |
@@ -331,6 +323,15 @@ static int ep93xx_gpio_f_to_irq(struct gpio_chip *gc, unsigned offset)
|
|
Takashi Iwai |
4d3d0a |
return EP93XX_GPIO_F_IRQ_BASE + offset;
|
|
Takashi Iwai |
4d3d0a |
}
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
+static void ep93xx_init_irq_chip(struct device *dev, struct irq_chip *ic)
|
|
Takashi Iwai |
4d3d0a |
+{
|
|
Takashi Iwai |
4d3d0a |
+ ic->irq_ack = ep93xx_gpio_irq_ack;
|
|
Takashi Iwai |
4d3d0a |
+ ic->irq_mask_ack = ep93xx_gpio_irq_mask_ack;
|
|
Takashi Iwai |
4d3d0a |
+ ic->irq_mask = ep93xx_gpio_irq_mask;
|
|
Takashi Iwai |
4d3d0a |
+ ic->irq_unmask = ep93xx_gpio_irq_unmask;
|
|
Takashi Iwai |
4d3d0a |
+ ic->irq_set_type = ep93xx_gpio_irq_type;
|
|
Takashi Iwai |
4d3d0a |
+}
|
|
Takashi Iwai |
4d3d0a |
+
|
|
Takashi Iwai |
4d3d0a |
static int ep93xx_gpio_add_bank(struct ep93xx_gpio_chip *egc,
|
|
Takashi Iwai |
4d3d0a |
struct platform_device *pdev,
|
|
Takashi Iwai |
4d3d0a |
struct ep93xx_gpio *epg,
|
|
Takashi Iwai |
4d3d0a |
@@ -352,6 +353,8 @@ static int ep93xx_gpio_add_bank(struct ep93xx_gpio_chip *egc,
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
girq = &gc->irq;
|
|
Takashi Iwai |
4d3d0a |
if (bank->has_irq || bank->has_hierarchical_irq) {
|
|
Takashi Iwai |
4d3d0a |
+ struct irq_chip *ic;
|
|
Takashi Iwai |
4d3d0a |
+
|
|
Takashi Iwai |
4d3d0a |
gc->set_config = ep93xx_gpio_set_config;
|
|
Takashi Iwai |
4d3d0a |
egc->eic = devm_kcalloc(dev, 1,
|
|
Takashi Iwai |
4d3d0a |
sizeof(*egc->eic),
|
|
Takashi Iwai |
4d3d0a |
@@ -359,7 +362,12 @@ static int ep93xx_gpio_add_bank(struct ep93xx_gpio_chip *egc,
|
|
Takashi Iwai |
4d3d0a |
if (!egc->eic)
|
|
Takashi Iwai |
4d3d0a |
return -ENOMEM;
|
|
Takashi Iwai |
4d3d0a |
egc->eic->irq_offset = bank->irq;
|
|
Takashi Iwai |
4d3d0a |
- girq->chip = &ep93xx_gpio_irq_chip;
|
|
Takashi Iwai |
4d3d0a |
+ ic = &egc->eic->ic;
|
|
Takashi Iwai |
4d3d0a |
+ ic->name = devm_kasprintf(dev, GFP_KERNEL, "gpio-irq-%s", bank->label);
|
|
Takashi Iwai |
4d3d0a |
+ if (!ic->name)
|
|
Takashi Iwai |
4d3d0a |
+ return -ENOMEM;
|
|
Takashi Iwai |
4d3d0a |
+ ep93xx_init_irq_chip(dev, ic);
|
|
Takashi Iwai |
4d3d0a |
+ girq->chip = ic;
|
|
Takashi Iwai |
4d3d0a |
}
|
|
Takashi Iwai |
4d3d0a |
|
|
Takashi Iwai |
4d3d0a |
if (bank->has_irq) {
|
|
Takashi Iwai |
4d3d0a |
@@ -401,7 +409,7 @@ static int ep93xx_gpio_add_bank(struct ep93xx_gpio_chip *egc,
|
|
Takashi Iwai |
4d3d0a |
gpio_irq = EP93XX_GPIO_F_IRQ_BASE + i;
|
|
Takashi Iwai |
4d3d0a |
irq_set_chip_data(gpio_irq, &epg->gc[5]);
|
|
Takashi Iwai |
4d3d0a |
irq_set_chip_and_handler(gpio_irq,
|
|
Takashi Iwai |
4d3d0a |
- &ep93xx_gpio_irq_chip,
|
|
Takashi Iwai |
4d3d0a |
+ girq->chip,
|
|
Takashi Iwai |
4d3d0a |
handle_level_irq);
|
|
Takashi Iwai |
4d3d0a |
irq_clear_status_flags(gpio_irq, IRQ_NOREQUEST);
|
|
Takashi Iwai |
4d3d0a |
}
|
|
Takashi Iwai |
4d3d0a |
--
|
|
Takashi Iwai |
4d3d0a |
2.26.2
|
|
Takashi Iwai |
4d3d0a |
|