|
@@ -36,6 +36,7 @@
|
|
|
#include <plat/prcm.h>
|
|
|
#include <plat/gpmc.h>
|
|
|
#include <plat/dma.h>
|
|
|
+#include <plat/dmtimer.h>
|
|
|
|
|
|
#include <asm/tlbflush.h>
|
|
|
|
|
@@ -60,6 +61,7 @@
|
|
|
|
|
|
u32 enable_off_mode;
|
|
|
u32 sleep_while_idle;
|
|
|
+u32 wakeup_timer_seconds;
|
|
|
|
|
|
struct power_state {
|
|
|
struct powerdomain *pwrdm;
|
|
@@ -535,6 +537,22 @@ out:
|
|
|
#ifdef CONFIG_SUSPEND
|
|
|
static suspend_state_t suspend_state;
|
|
|
|
|
|
+static void omap2_pm_wakeup_on_timer(u32 seconds)
|
|
|
+{
|
|
|
+ u32 tick_rate, cycles;
|
|
|
+
|
|
|
+ if (!seconds)
|
|
|
+ return;
|
|
|
+
|
|
|
+ tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
|
|
|
+ cycles = tick_rate * seconds;
|
|
|
+ omap_dm_timer_stop(gptimer_wakeup);
|
|
|
+ omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
|
|
|
+
|
|
|
+ pr_info("PM: Resume timer in %d secs (%d ticks at %d ticks/sec.)\n",
|
|
|
+ seconds, cycles, tick_rate);
|
|
|
+}
|
|
|
+
|
|
|
static int omap3_pm_prepare(void)
|
|
|
{
|
|
|
disable_hlt();
|
|
@@ -546,6 +564,9 @@ static int omap3_pm_suspend(void)
|
|
|
struct power_state *pwrst;
|
|
|
int state, ret = 0;
|
|
|
|
|
|
+ if (wakeup_timer_seconds)
|
|
|
+ omap2_pm_wakeup_on_timer(wakeup_timer_seconds);
|
|
|
+
|
|
|
/* Read current next_pwrsts */
|
|
|
list_for_each_entry(pwrst, &pwrst_list, node)
|
|
|
pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
|