Skip to content

Commit

Permalink
gpio/omap: optimise interrupt service routine
Browse files Browse the repository at this point in the history
The OMAP GPIO interrupt service routine is checking each bit in the
GPIO interrupt status register to see which bits are set. It is not
efficient to check every bit especially if only a few bits are set.
Therefore, instead of checking every bit use the __ffs() function,
which returns the location of the first set bit, to find all the set
bits.

This optimisation was suggested-by and developed in collaboration
with Felipe Balbi.

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Reviewed-by: Kevin Hilman <khilman@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Jon Hunter authored and Linus Walleij committed Apr 10, 2013
1 parent 60b18b9 commit 3513cde
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions drivers/gpio/gpio-omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
{
void __iomem *isr_reg = NULL;
u32 isr;
unsigned int i;
unsigned int bit;
struct gpio_bank *bank;
int unmasked = 0;
struct irq_chip *chip = irq_desc_get_chip(desc);
Expand Down Expand Up @@ -730,9 +730,9 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
if (!isr)
break;

for (i = 0; isr != 0; isr >>= 1, i++) {
if (!(isr & 1))
continue;
while (isr) {
bit = __ffs(isr);
isr &= ~(1 << bit);

/*
* Some chips can't respond to both rising and falling
Expand All @@ -741,10 +741,10 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
* to respond to the IRQ for the opposite direction.
* This will be indicated in the bank toggle_mask.
*/
if (bank->toggle_mask & (1 << i))
_toggle_gpio_edge_triggering(bank, i);
if (bank->toggle_mask & (1 << bit))
_toggle_gpio_edge_triggering(bank, bit);

generic_handle_irq(irq_find_mapping(bank->domain, i));
generic_handle_irq(irq_find_mapping(bank->domain, bit));
}
}
/* if bank has any level sensitive GPIO pin interrupt
Expand Down

0 comments on commit 3513cde

Please sign in to comment.