Tero Kristo <tero.kristo@xxxxxxxxx> writes: > From: Tero Kristo <tero.kristo@xxxxxxxxx> > > OMAP interrupt controller goes to unknown state when there is right > combination of l3,l4 sleep/wake-up transitions, l4 autoidle in > interrupt controller and some interrupt. When this happens, interrupts > are not delivered to ARM anymore and ARM will remain in WFI (wait for > interrupt) until interrupt controller is forced to wake-up > (i.e. lauterbach). > > Signed-off-by: Tero Kristo <tero.kristo@xxxxxxxxx> Thanks, applying to PM branch, queuing for pm-fixes. Kevin > --- > arch/arm/mach-omap2/irq.c | 12 ++++++++++++ > arch/arm/mach-omap2/pm34xx.c | 2 ++ > arch/arm/plat-omap/include/mach/irqs.h | 2 ++ > 3 files changed, 16 insertions(+), 0 deletions(-) > > diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c > index ee8c68a..9241b87 100644 > --- a/arch/arm/mach-omap2/irq.c > +++ b/arch/arm/mach-omap2/irq.c > @@ -272,4 +272,16 @@ void omap3_intc_suspend(void) > /* A pending interrupt would prevent OMAP from entering suspend */ > omap_ack_irq(0); > } > + > +void omap3_intc_prepare_idle(void) > +{ > + /* Disable autoidle as it can stall interrupt controller */ > + intc_bank_write_reg(0, &irq_banks[0], INTC_SYSCONFIG); > +} > + > +void omap3_intc_resume_idle(void) > +{ > + /* Re-enable autoidle */ > + intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); > +} > #endif /* CONFIG_ARCH_OMAP3 */ > diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c > index 492458e..fec9c38 100644 > --- a/arch/arm/mach-omap2/pm34xx.c > +++ b/arch/arm/mach-omap2/pm34xx.c > @@ -431,6 +431,7 @@ void omap_sram_idle(void) > prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN); > omap3_enable_io_chain(); > } > + omap3_intc_prepare_idle(); > > /* > * On EMU/HS devices ROM code restores a SRDC value > @@ -487,6 +488,7 @@ void omap_sram_idle(void) > OMAP3430_GR_MOD, > OMAP3_PRM_VOLTCTRL_OFFSET); > } > + omap3_intc_resume_idle(); > > /* > * Enable smartreflex after WFI. Only needed if we entered > diff --git a/arch/arm/plat-omap/include/mach/irqs.h b/arch/arm/plat-omap/include/mach/irqs.h > index ff1faa8..b736c5d 100644 > --- a/arch/arm/plat-omap/include/mach/irqs.h > +++ b/arch/arm/plat-omap/include/mach/irqs.h > @@ -486,6 +486,8 @@ extern int omap_irq_pending(void); > void omap3_intc_save_context(void); > void omap3_intc_restore_context(void); > void omap3_intc_suspend(void); > +void omap3_intc_prepare_idle(void); > +void omap3_intc_resume_idle(void); > #endif > > #include <mach/hardware.h> > -- > 1.5.4.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html