On Tue, Dec 7, 2010 at 9:50 PM, Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> wrote: > commit 0d8e2d0dad98a693bad88aea6876ac8b94ad95c6 (OMAP2+: PM/serial: > hold console semaphore while OMAP UARTs are disabled) added use of the > console semaphore to protect UARTs from being accessed after disabled > during idle, but this causes problems in suspend. > > During suspend, the console semaphore is already held by the time we reach > the OMAP suspend path, so the try_acquire_console_sem() will always fail and > suspend will be aborted. > > To fix, introduce a check so the console semaphore is only attempted > during idle, and not during suspend. > > Cc: Paul Walmsley <paul@xxxxxxxxx> > Signed-off-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> Tested OK on Beagleboard with suspend and idle with RET and OFF modes Tested-by: Jean Pihet <j-pihet@xxxxxx> Thanks, Jean > --- > Applies to Tony's omap-fixes branch. > > arch/arm/mach-omap2/pm34xx.c | 24 ++++++++++++++++++------ > 1 files changed, 18 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c > index 0ec8a04..122ef3c 100644 > --- a/arch/arm/mach-omap2/pm34xx.c > +++ b/arch/arm/mach-omap2/pm34xx.c > @@ -50,6 +50,19 @@ > #include "sdrc.h" > #include "control.h" > > +#ifdef CONFIG_SUSPEND > +static suspend_state_t suspend_state = PM_SUSPEND_ON; > +static inline bool is_suspending(void) > +{ > + return (suspend_state != PM_SUSPEND_ON); > +} > +#else > +static inline bool is_suspending(void) > +{ > + return false; > +} > +#endif > + > /* Scratchpad offsets */ > #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4 > #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 > @@ -387,10 +400,11 @@ void omap_sram_idle(void) > } > > /* Block console output in case it is on one of the OMAP UARTs */ > - if (per_next_state < PWRDM_POWER_ON || > - core_next_state < PWRDM_POWER_ON) > - if (try_acquire_console_sem()) > - goto console_still_active; > + if (!is_suspending()) > + if (per_next_state < PWRDM_POWER_ON || > + core_next_state < PWRDM_POWER_ON) > + if (try_acquire_console_sem()) > + goto console_still_active; > > /* PER */ > if (per_next_state < PWRDM_POWER_ON) { > @@ -514,8 +528,6 @@ out: > } > > #ifdef CONFIG_SUSPEND > -static suspend_state_t suspend_state; > - > static int omap3_pm_prepare(void) > { > disable_hlt(); > -- > 1.7.2.1 > > -- > 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