diff options
author | Felipe Balbi <balbi@ti.com> | 2012-02-22 16:53:59 +0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-03-22 16:05:11 +0400 |
commit | 5a903090e7aa561901b7f052eb744b480d6126d4 (patch) | |
tree | 9bd5b024d34e30329f3b30bbb7bbbdaf80e640d7 /drivers/mfd/twl4030-irq.c | |
parent | f01b1f90bf46ddaf2a68215a9489364c974e5689 (diff) | |
download | linux-5a903090e7aa561901b7f052eb744b480d6126d4.tar.xz |
mfd: Micro-optimization on twl4030 IRQ handler
__ffs() will be far faster than the for loop used.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/twl4030-irq.c')
-rw-r--r-- | drivers/mfd/twl4030-irq.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/mfd/twl4030-irq.c b/drivers/mfd/twl4030-irq.c index d6f3a5e9f7bd..3b748b71c0f3 100644 --- a/drivers/mfd/twl4030-irq.c +++ b/drivers/mfd/twl4030-irq.c @@ -293,7 +293,6 @@ static unsigned twl4030_irq_base; */ static irqreturn_t handle_twl4030_pih(int irq, void *devid) { - int module_irq; irqreturn_t ret; u8 pih_isr; @@ -304,12 +303,13 @@ static irqreturn_t handle_twl4030_pih(int irq, void *devid) return IRQ_NONE; } - /* these handlers deal with the relevant SIH irq status */ - for (module_irq = twl4030_irq_base; - pih_isr; - pih_isr >>= 1, module_irq++) { - if (pih_isr & 0x1) - handle_nested_irq(module_irq); + while (pih_isr) { + unsigned long pending = __ffs(pih_isr); + unsigned int irq; + + pih_isr &= ~BIT(pending); + irq = pending + twl4030_irq_base; + handle_nested_irq(irq); } return IRQ_HANDLED; |