pinctrl: exynos: Handle only unmasked wakeup interrupts
authorTomasz Figa <t.figa@samsung.com>
Thu, 20 Sep 2012 22:33:55 +0000 (07:33 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Thu, 20 Sep 2012 22:33:55 +0000 (07:33 +0900)
A bit in EINTxx_PEND register is set regardless of interrupt mask, which
causes spurious interrupts. To avoid them, the read value of pending
register must be masked with current interrupt mask manually.

Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
drivers/pinctrl/pinctrl-exynos.c

index 46cd637f4804a731122e5d5f7e2d5120a9bbdd55..56489714cd704a93da706206d4eaec06fad2b7af 100644 (file)
@@ -395,12 +395,15 @@ static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
        struct exynos_weint_data *eintd = irq_get_handler_data(irq);
        struct samsung_pinctrl_drv_data *d = eintd->domain->host_data;
        unsigned long pend;
+       unsigned long mask;
 
        chained_irq_enter(chip, desc);
        pend = readl(d->virt_base + d->ctrl->weint_pend + 0x8);
-       exynos_irq_demux_eint(16, pend, eintd->domain);
+       mask = readl(d->virt_base + d->ctrl->weint_mask + 0x8);
+       exynos_irq_demux_eint(16, pend & ~mask, eintd->domain);
        pend = readl(d->virt_base + d->ctrl->weint_pend + 0xC);
-       exynos_irq_demux_eint(24, pend, eintd->domain);
+       mask = readl(d->virt_base + d->ctrl->weint_mask + 0xC);
+       exynos_irq_demux_eint(24, pend & ~mask, eintd->domain);
        chained_irq_exit(chip, desc);
 }