mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 11:03:07 -04:00
pinctrl: airoha: fix IRQ mask/unmask code
When using IRQCHIP_IMMUTABLE, airoha_irq_unmask() must manually call
gpiochip_enable_irq() and airoha_irq_mask() must call
gpiochip_disable_irq(). Without these calls, gpiolib never sets the
GPIOD_FLAG_IRQ_IS_ENABLED bit. Because this bit is missing,
gpiod_direction_output() will not realize the pin is actively used
as an interrupt.
Fixes: 1c8ace2d07 ("pinctrl: airoha: Add support for EN7581 SoC")
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Linus Walleij <linusw@kernel.org>
This commit is contained in:
committed by
Linus Walleij
parent
a02fa031b9
commit
20b9962806
@@ -2595,6 +2595,7 @@ static void airoha_irq_unmask(struct irq_data *data)
|
||||
if (WARN_ON_ONCE(data->hwirq >= ARRAY_SIZE(gpiochip->irq_type)))
|
||||
return;
|
||||
|
||||
gpiochip_enable_irq(gc, irqd_to_hwirq(data));
|
||||
switch (gpiochip->irq_type[data->hwirq]) {
|
||||
case IRQ_TYPE_LEVEL_LOW:
|
||||
val = val << 1;
|
||||
@@ -2629,6 +2630,7 @@ static void airoha_irq_mask(struct irq_data *data)
|
||||
|
||||
regmap_clear_bits(pinctrl->regmap, gpiochip->level[index], mask);
|
||||
regmap_clear_bits(pinctrl->regmap, gpiochip->edge[index], mask);
|
||||
gpiochip_disable_irq(gc, irqd_to_hwirq(data));
|
||||
}
|
||||
|
||||
static int airoha_irq_type(struct irq_data *data, unsigned int type)
|
||||
|
||||
Reference in New Issue
Block a user