|
@@ -53,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);
|
|
@@ -120,8 +133,9 @@ static void omap2_enter_full_retention(void)
|
|
|
goto no_sleep;
|
|
|
|
|
|
/* Block console output in case it is on one of the OMAP UARTs */
|
|
|
- if (try_acquire_console_sem())
|
|
|
- goto no_sleep;
|
|
|
+ if (!is_suspending())
|
|
|
+ if (try_acquire_console_sem())
|
|
|
+ goto no_sleep;
|
|
|
|
|
|
omap_uart_prepare_idle(0);
|
|
|
omap_uart_prepare_idle(1);
|
|
@@ -136,7 +150,8 @@ static void omap2_enter_full_retention(void)
|
|
|
omap_uart_resume_idle(1);
|
|
|
omap_uart_resume_idle(0);
|
|
|
|
|
|
- release_console_sem();
|
|
|
+ if (!is_suspending())
|
|
|
+ release_console_sem();
|
|
|
|
|
|
no_sleep:
|
|
|
if (omap2_pm_debug) {
|
|
@@ -284,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 */
|
|
@@ -333,10 +354,17 @@ static void omap2_pm_finish(void)
|
|
|
enable_hlt();
|
|
|
}
|
|
|
|
|
|
+static void omap2_pm_end(void)
|
|
|
+{
|
|
|
+ suspend_state = PM_SUSPEND_ON;
|
|
|
+}
|
|
|
+
|
|
|
static 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,
|
|
|
};
|
|
|
|