summaryrefslogtreecommitdiff
path: root/arch/arm/common
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2012-04-19 14:42:22 -0700
committerColin Cross <ccross@android.com>2012-04-19 14:42:22 -0700
commitab2965eefef95a2eecfd54c12b0eb243162862e9 (patch)
treec947fdc158e144c2d060486b65d10ee67d254039 /arch/arm/common
parenta0ec4361e4539e30cf1c5de7ddfd2dadcd8e1595 (diff)
parente816b57a337ea3b755de72bec38c10c864f23015 (diff)
Merge commit 'v3.4-rc3' into android-3.4
Conflicts: drivers/staging/android/lowmemorykiller.c Change-Id: Ia3ffcfc702e28c4fce0e91b363f4afd5f1c40306
Diffstat (limited to 'arch/arm/common')
-rw-r--r--arch/arm/common/vic.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c
index 7a66311f306..7e288f96ced 100644
--- a/arch/arm/common/vic.c
+++ b/arch/arm/common/vic.c
@@ -427,19 +427,18 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent)
/*
* Handle each interrupt in a single VIC. Returns non-zero if we've
- * handled at least one interrupt. This does a single read of the
- * status register and handles all interrupts in order from LSB first.
+ * handled at least one interrupt. This reads the status register
+ * before handling each interrupt, which is necessary given that
+ * handle_IRQ may briefly re-enable interrupts for soft IRQ handling.
*/
static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs)
{
u32 stat, irq;
int handled = 0;
- stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
- while (stat) {
+ while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) {
irq = ffs(stat) - 1;
handle_IRQ(irq_find_mapping(vic->domain, irq), regs);
- stat &= ~(1 << irq);
handled = 1;
}