Commit 49c03096 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Linus Walleij

pinctrl: baytrail: Do not add all GPIOs to IRQ domain

When DIRECT_IRQ_EN is set, the pin is routed directly to the IO-APIC bypassing
the GPIO driver completely. However, the mask register is still used to
determine if the pin is supposed to generate IRQ or not.

So with commit 3ae02c14 the IRQ core masks all IRQs (because of
handle_bad_irq()) the pin connected to the touchscreen gets masked as well and
hence no interrupts.

To make this all work as expected we do not add those GPIOs to the IRQ domain
that can actually propagate interrupts.

Fixes: 3ae02c14 ("pinctrl: intel: set default handler to be handle_bad_irq()")
Reported-by: default avatarRobert R. Howell <rhowell@uwyo.edu>
Suggested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 04ff5a09
...@@ -1623,6 +1623,8 @@ static void byt_gpio_irq_handler(struct irq_desc *desc) ...@@ -1623,6 +1623,8 @@ static void byt_gpio_irq_handler(struct irq_desc *desc)
static void byt_gpio_irq_init_hw(struct byt_gpio *vg) static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
{ {
struct gpio_chip *gc = &vg->chip;
struct device *dev = &vg->pdev->dev;
void __iomem *reg; void __iomem *reg;
u32 base, value; u32 base, value;
int i; int i;
...@@ -1644,10 +1646,12 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg) ...@@ -1644,10 +1646,12 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
} }
value = readl(reg); value = readl(reg);
if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i) && if (value & BYT_DIRECT_IRQ_EN) {
!(value & BYT_DIRECT_IRQ_EN)) { clear_bit(i, gc->irq_valid_mask);
dev_dbg(dev, "excluding GPIO %d from IRQ domain\n", i);
} else if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i)) {
byt_gpio_clear_triggering(vg, i); byt_gpio_clear_triggering(vg, i);
dev_dbg(&vg->pdev->dev, "disabling GPIO %d\n", i); dev_dbg(dev, "disabling GPIO %d\n", i);
} }
} }
...@@ -1686,6 +1690,7 @@ static int byt_gpio_probe(struct byt_gpio *vg) ...@@ -1686,6 +1690,7 @@ static int byt_gpio_probe(struct byt_gpio *vg)
gc->can_sleep = false; gc->can_sleep = false;
gc->parent = &vg->pdev->dev; gc->parent = &vg->pdev->dev;
gc->ngpio = vg->soc_data->npins; gc->ngpio = vg->soc_data->npins;
gc->irq_need_valid_mask = true;
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio, vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment