forked from Minki/linux
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 commit3ae02c14d9
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:3ae02c14d9
("pinctrl: intel: set default handler to be handle_bad_irq()") Reported-by: Robert R. Howell <rhowell@uwyo.edu> Suggested-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
04ff5a095d
commit
49c0309626
@ -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)
|
||||
{
|
||||
struct gpio_chip *gc = &vg->chip;
|
||||
struct device *dev = &vg->pdev->dev;
|
||||
void __iomem *reg;
|
||||
u32 base, value;
|
||||
int i;
|
||||
@ -1644,10 +1646,12 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
|
||||
}
|
||||
|
||||
value = readl(reg);
|
||||
if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i) &&
|
||||
!(value & BYT_DIRECT_IRQ_EN)) {
|
||||
if (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);
|
||||
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)
|
||||
gc->can_sleep = false;
|
||||
gc->parent = &vg->pdev->dev;
|
||||
gc->ngpio = vg->soc_data->npins;
|
||||
gc->irq_need_valid_mask = true;
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio,
|
||||
|
Loading…
Reference in New Issue
Block a user