diff options
Diffstat (limited to 'arch/arm/mach-omap2/pm24xx.c')
| -rw-r--r-- | arch/arm/mach-omap2/pm24xx.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index aa9764eeb94..f3f3bfa230d 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -30,6 +30,7 @@  #include <linux/irq.h>  #include <linux/time.h>  #include <linux/gpio.h> +#include <linux/console.h>  #include <asm/mach/time.h>  #include <asm/mach/irq.h> @@ -52,6 +53,19 @@  #include <plat/powerdomain.h>  #include <plat/clockdomain.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 +  static void (*omap2_sram_idle)(void);  static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,  				  void __iomem *sdrc_power); @@ -118,6 +132,11 @@ static void omap2_enter_full_retention(void)  	if (omap_irq_pending())  		goto no_sleep; +	/* Block console output in case it is on one of the OMAP UARTs */ +	if (!is_suspending()) +		if (try_acquire_console_sem()) +			goto no_sleep; +  	omap_uart_prepare_idle(0);  	omap_uart_prepare_idle(1);  	omap_uart_prepare_idle(2); @@ -131,6 +150,9 @@ static void omap2_enter_full_retention(void)  	omap_uart_resume_idle(1);  	omap_uart_resume_idle(0); +	if (!is_suspending()) +		release_console_sem(); +  no_sleep:  	if (omap2_pm_debug) {  		unsigned long long tmp; @@ -277,6 +299,12 @@ out:  	local_irq_enable();  } +static int omap2_pm_begin(suspend_state_t state) +{ +	suspend_state = state; +	return 0; +} +  static int omap2_pm_prepare(void)  {  	/* We cannot sleep in idle until we have resumed */ @@ -326,10 +354,17 @@ static void omap2_pm_finish(void)  	enable_hlt();  } +static void omap2_pm_end(void) +{ +	suspend_state = PM_SUSPEND_ON; +} +  static const struct platform_suspend_ops omap_pm_ops = { +	.begin		= omap2_pm_begin,  	.prepare	= omap2_pm_prepare,  	.enter		= omap2_pm_enter,  	.finish		= omap2_pm_finish, +	.end		= omap2_pm_end,  	.valid		= suspend_valid_only_mem,  };  |