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

Commit 732063b9 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Grant Likely
Browse files

gpio/langwell: Simplify demux loop



Use __ffs() to find the pending interrupt source instead of looping 32
times.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Feng Tang <feng.tang@intel.com>
Cc: Alek Du <alek.du@intel.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 674db906
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -191,18 +191,19 @@ static void lnw_irq_handler(unsigned irq, struct irq_desc *desc)
	struct lnw_gpio *lnw = irq_data_get_irq_handler_data(data);
	struct irq_chip *chip = irq_data_get_irq_chip(data);
	u32 base, gpio, gedr_v;
	unsigned long pending;
	void __iomem *gedr;

	/* check GPIO controller to check which pin triggered the interrupt */
	for (base = 0; base < lnw->chip.ngpio; base += 32) {
		gedr = gpio_reg(&lnw->chip, base, GEDR);
		gedr_v = readl(gedr);
		gedr_v = pending = readl(gedr);
		if (!gedr_v)
			continue;
		for (gpio = base; gpio < base + 32; gpio++)
			if (gedr_v & BIT(gpio % 32)) {
				pr_debug("pin %d triggered\n", gpio);
				generic_handle_irq(lnw->irq_base + gpio);
		while (pending) {
			gpio = __ffs(pending) - 1;
			pending &= ~BIT(gpio);
			generic_handle_irq(lnw->irq_base + base + gpio);
		}
		/* clear the edge detect status bit */
		writel(gedr_v, gedr);