Skip to content

Commit

Permalink
OMAP2+: disable idle early in the suspend sequence
Browse files Browse the repository at this point in the history
Some bad interaction between the idle and the suspend paths has been
identified: the idle code is called during the suspend enter and exit
sequences. This could cause corruption or lock-up of resources.

The solution is to move the calls to disable_hlt at the very beginning
of the suspend sequence (ex. in omap3_pm_begin instead of
omap3_pm_prepare), and the call to enable_hlt at the very end of
the suspend sequence (ex. in omap3_pm_end instead of omap3_pm_finish).

Tested with RET and OFF on Beagle and OMAP3EVM.

Signed-off-by: Jean Pihet <j-pihet@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
  • Loading branch information
Jean Pihet authored and Kevin Hilman committed Dec 21, 2010
1 parent 90a8a73 commit c166381
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 41 deletions.
16 changes: 2 additions & 14 deletions arch/arm/mach-omap2/pm24xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,14 +301,8 @@ static void omap2_pm_idle(void)

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 */
disable_hlt();
suspend_state = state;
return 0;
}

Expand Down Expand Up @@ -349,21 +343,15 @@ static int omap2_pm_enter(suspend_state_t state)
return ret;
}

static void omap2_pm_finish(void)
{
enable_hlt();
}

static void omap2_pm_end(void)
{
suspend_state = PM_SUSPEND_ON;
enable_hlt();
}

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,
};
Expand Down
15 changes: 2 additions & 13 deletions arch/arm/mach-omap2/pm34xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -529,12 +529,6 @@ static void omap3_pm_idle(void)
}

#ifdef CONFIG_SUSPEND
static int omap3_pm_prepare(void)
{
disable_hlt();
return 0;
}

static int omap3_pm_suspend(void)
{
struct power_state *pwrst;
Expand Down Expand Up @@ -597,14 +591,10 @@ static int omap3_pm_enter(suspend_state_t unused)
return ret;
}

static void omap3_pm_finish(void)
{
enable_hlt();
}

/* Hooks to enable / disable UART interrupts during suspend */
static int omap3_pm_begin(suspend_state_t state)
{
disable_hlt();
suspend_state = state;
omap_uart_enable_irqs(0);
return 0;
Expand All @@ -614,15 +604,14 @@ static void omap3_pm_end(void)
{
suspend_state = PM_SUSPEND_ON;
omap_uart_enable_irqs(1);
enable_hlt();
return;
}

static struct platform_suspend_ops omap_pm_ops = {
.begin = omap3_pm_begin,
.end = omap3_pm_end,
.prepare = omap3_pm_prepare,
.enter = omap3_pm_enter,
.finish = omap3_pm_finish,
.valid = suspend_valid_only_mem,
};
#endif /* CONFIG_SUSPEND */
Expand Down
16 changes: 2 additions & 14 deletions arch/arm/mach-omap2/pm44xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@ struct power_state {
static LIST_HEAD(pwrst_list);

#ifdef CONFIG_SUSPEND
static int omap4_pm_prepare(void)
{
disable_hlt();
return 0;
}

static int omap4_pm_suspend(void)
{
do_wfi();
Expand All @@ -59,28 +53,22 @@ static int omap4_pm_enter(suspend_state_t suspend_state)
return ret;
}

static void omap4_pm_finish(void)
{
enable_hlt();
return;
}

static int omap4_pm_begin(suspend_state_t state)
{
disable_hlt();
return 0;
}

static void omap4_pm_end(void)
{
enable_hlt();
return;
}

static struct platform_suspend_ops omap_pm_ops = {
.begin = omap4_pm_begin,
.end = omap4_pm_end,
.prepare = omap4_pm_prepare,
.enter = omap4_pm_enter,
.finish = omap4_pm_finish,
.valid = suspend_valid_only_mem,
};
#endif /* CONFIG_SUSPEND */
Expand Down

0 comments on commit c166381

Please sign in to comment.