diff options
author | Kevin Hilman <khilman@deeprootsystems.com> | 2010-04-26 17:59:09 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-05-12 12:38:59 -0400 |
commit | d6290a3ead555c0b092d48288b4dc0566580e17f (patch) | |
tree | aa0f99e67f6c3fa5432db1cf47cf62566adae585 | |
parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) |
OMAP3: PRCM interrupt: only check and clear enabled PRCM IRQs
While handling PRCM IRQs, mask out interrupts that are not enabled in
PRM_IRQENABLE_MPU. If these are not masked out, non-enabled
interrupts are caught, a WARN() is printed due to no 'handler' and the
events are cleared. In addition to being noisy, this can also
interfere with independent polling of this register by SR/VP code.
This was noticed using SmartReflex transitions which cause the VPx_*
interrupts to be handled since they are set in PRM_IRQSTATUS_MPU even
but not enabled in PRM_IRQENABLE_MPU.
Acked-by: Mike Turquette <mturquette@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index ea0000bc5358..a15aa92d384e 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -267,13 +267,16 @@ static int _prcm_int_handle_wakeup(void) | |||
267 | */ | 267 | */ |
268 | static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | 268 | static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) |
269 | { | 269 | { |
270 | u32 irqstatus_mpu; | 270 | u32 irqenable_mpu, irqstatus_mpu; |
271 | int c = 0; | 271 | int c = 0; |
272 | 272 | ||
273 | do { | 273 | irqenable_mpu = prm_read_mod_reg(OCP_MOD, |
274 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, | 274 | OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
275 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 275 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, |
276 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
277 | irqstatus_mpu &= irqenable_mpu; | ||
276 | 278 | ||
279 | do { | ||
277 | if (irqstatus_mpu & (OMAP3430_WKUP_ST | OMAP3430_IO_ST)) { | 280 | if (irqstatus_mpu & (OMAP3430_WKUP_ST | OMAP3430_IO_ST)) { |
278 | c = _prcm_int_handle_wakeup(); | 281 | c = _prcm_int_handle_wakeup(); |
279 | 282 | ||
@@ -292,7 +295,11 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | |||
292 | prm_write_mod_reg(irqstatus_mpu, OCP_MOD, | 295 | prm_write_mod_reg(irqstatus_mpu, OCP_MOD, |
293 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 296 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
294 | 297 | ||
295 | } while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET)); | 298 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, |
299 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
300 | irqstatus_mpu &= irqenable_mpu; | ||
301 | |||
302 | } while (irqstatus_mpu); | ||
296 | 303 | ||
297 | return IRQ_HANDLED; | 304 | return IRQ_HANDLED; |
298 | } | 305 | } |