Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de59049b authored by Tomasz Figa's avatar Tomasz Figa Committed by Kukjin Kim
Browse files

pinctrl: exynos: Handle only unmasked wakeup interrupts



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: default avatarTomasz Figa <t.figa@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent 3da23f27
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -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 exynos_weint_data *eintd = irq_get_handler_data(irq);
	struct samsung_pinctrl_drv_data *d = eintd->domain->host_data;
	struct samsung_pinctrl_drv_data *d = eintd->domain->host_data;
	unsigned long pend;
	unsigned long pend;
	unsigned long mask;


	chained_irq_enter(chip, desc);
	chained_irq_enter(chip, desc);
	pend = readl(d->virt_base + d->ctrl->weint_pend + 0x8);
	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);
	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);
	chained_irq_exit(chip, desc);
}
}