* [PATCH v2] OMAP2+: disable idle early in the suspend sequence
@ 2010-12-08 9:09 jean.pihet
2010-12-08 23:01 ` Kevin Hilman
0 siblings, 1 reply; 3+ messages in thread
From: jean.pihet @ 2010-12-08 9:09 UTC (permalink / raw)
To: linux-omap; +Cc: Jean Pihet, Kevin Hilman
From: Jean Pihet <j-pihet@ti.com>
Some bad interaction between the idle and the suspend paths has been
noticed: 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>
---
v1: support for OMAP3 only.
Tested on board.
v2: Added support for OMAP2 and OMAP4.
Compile tested only for OMAP2 and OMAP4.
Tested on board for OMAP3.
arch/arm/mach-omap2/pm24xx.c | 16 ++++++++++++++--
arch/arm/mach-omap2/pm34xx.c | 4 ++--
arch/arm/mach-omap2/pm44xx.c | 4 ++--
3 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c
index c85923e..3820179 100644
--- a/arch/arm/mach-omap2/pm24xx.c
+++ b/arch/arm/mach-omap2/pm24xx.c
@@ -286,8 +286,6 @@ out:
static int omap2_pm_prepare(void)
{
- /* We cannot sleep in idle until we have resumed */
- disable_hlt();
return 0;
}
@@ -330,10 +328,24 @@ static int omap2_pm_enter(suspend_state_t state)
static void omap2_pm_finish(void)
{
+}
+
+static int omap2_pm_begin(suspend_state_t state)
+{
+ /* We cannot sleep in idle until we have resumed */
+ disable_hlt();
+ return 0;
+}
+
+static void omap2_pm_end(void)
+{
enable_hlt();
+ return;
}
static struct platform_suspend_ops omap_pm_ops = {
+ .begin = omap2_pm_begin,
+ .end = omap2_pm_end,
.prepare = omap2_pm_prepare,
.enter = omap2_pm_enter,
.finish = omap2_pm_finish,
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 0ec8a04..ec80d38 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -518,7 +518,6 @@ static suspend_state_t suspend_state;
static int omap3_pm_prepare(void)
{
- disable_hlt();
return 0;
}
@@ -586,12 +585,12 @@ static int omap3_pm_enter(suspend_state_t unused)
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;
@@ -601,6 +600,7 @@ static void omap3_pm_end(void)
{
suspend_state = PM_SUSPEND_ON;
omap_uart_enable_irqs(1);
+ enable_hlt();
return;
}
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c
index 54544b4..f4c4fab 100644
--- a/arch/arm/mach-omap2/pm44xx.c
+++ b/arch/arm/mach-omap2/pm44xx.c
@@ -33,7 +33,6 @@ static LIST_HEAD(pwrst_list);
#ifdef CONFIG_SUSPEND
static int omap4_pm_prepare(void)
{
- disable_hlt();
return 0;
}
@@ -61,17 +60,18 @@ static int omap4_pm_enter(suspend_state_t suspend_state)
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;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH v2] OMAP2+: disable idle early in the suspend sequence
2010-12-08 9:09 [PATCH v2] OMAP2+: disable idle early in the suspend sequence jean.pihet
@ 2010-12-08 23:01 ` Kevin Hilman
2010-12-09 17:41 ` Jean Pihet
0 siblings, 1 reply; 3+ messages in thread
From: Kevin Hilman @ 2010-12-08 23:01 UTC (permalink / raw)
To: jean.pihet; +Cc: linux-omap, Jean Pihet
jean.pihet@newoldbits.com writes:
> From: Jean Pihet <j-pihet@ti.com>
>
> Some bad interaction between the idle and the suspend paths has been
> noticed: 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).
In an earlier version, I thought we agreed to just remove the empty
prepare/finish calls. Can you do that?
Also, can you base this on top of my recently posted patch:
[PATCH v3] OMAP2+: PM/serial: fix console semaphore acquire during suspend
since it touches some of the same code for pm24xx.c
Thanks,
Kevin
> Tested with RET and OFF on Beagle and OMAP3EVM.
>
> Signed-off-by: Jean Pihet <j-pihet@ti.com>
> Cc: Kevin Hilman <khilman@deeprootsystems.com>
> ---
> v1: support for OMAP3 only.
> Tested on board.
>
> v2: Added support for OMAP2 and OMAP4.
> Compile tested only for OMAP2 and OMAP4.
> Tested on board for OMAP3.
>
> arch/arm/mach-omap2/pm24xx.c | 16 ++++++++++++++--
> arch/arm/mach-omap2/pm34xx.c | 4 ++--
> arch/arm/mach-omap2/pm44xx.c | 4 ++--
> 3 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c
> index c85923e..3820179 100644
> --- a/arch/arm/mach-omap2/pm24xx.c
> +++ b/arch/arm/mach-omap2/pm24xx.c
> @@ -286,8 +286,6 @@ out:
>
> static int omap2_pm_prepare(void)
> {
> - /* We cannot sleep in idle until we have resumed */
> - disable_hlt();
> return 0;
> }
>
> @@ -330,10 +328,24 @@ static int omap2_pm_enter(suspend_state_t state)
>
> static void omap2_pm_finish(void)
> {
> +}
>
> +
> +static int omap2_pm_begin(suspend_state_t state)
> +{
> + /* We cannot sleep in idle until we have resumed */
> + disable_hlt();
> + return 0;
> +}
> +
> +static void omap2_pm_end(void)
> +{
> enable_hlt();
> + return;
> }
>
> static struct platform_suspend_ops omap_pm_ops = {
> + .begin = omap2_pm_begin,
> + .end = omap2_pm_end,
> .prepare = omap2_pm_prepare,
> .enter = omap2_pm_enter,
> .finish = omap2_pm_finish,
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index 0ec8a04..ec80d38 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -518,7 +518,6 @@ static suspend_state_t suspend_state;
>
> static int omap3_pm_prepare(void)
> {
> - disable_hlt();
> return 0;
> }
>
> @@ -586,12 +585,12 @@ static int omap3_pm_enter(suspend_state_t unused)
>
> 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;
> @@ -601,6 +600,7 @@ static void omap3_pm_end(void)
> {
> suspend_state = PM_SUSPEND_ON;
> omap_uart_enable_irqs(1);
> + enable_hlt();
> return;
> }
>
> diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c
> index 54544b4..f4c4fab 100644
> --- a/arch/arm/mach-omap2/pm44xx.c
> +++ b/arch/arm/mach-omap2/pm44xx.c
> @@ -33,7 +33,6 @@ static LIST_HEAD(pwrst_list);
> #ifdef CONFIG_SUSPEND
> static int omap4_pm_prepare(void)
> {
> - disable_hlt();
> return 0;
> }
>
> @@ -61,17 +60,18 @@ static int omap4_pm_enter(suspend_state_t suspend_state)
>
> 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;
> }
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH v2] OMAP2+: disable idle early in the suspend sequence
2010-12-08 23:01 ` Kevin Hilman
@ 2010-12-09 17:41 ` Jean Pihet
0 siblings, 0 replies; 3+ messages in thread
From: Jean Pihet @ 2010-12-09 17:41 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Jean Pihet
Kevin,
On Thu, Dec 9, 2010 at 12:01 AM, Kevin Hilman
<khilman@deeprootsystems.com> wrote:
> jean.pihet@newoldbits.com writes:
>
>> From: Jean Pihet <j-pihet@ti.com>
>>
>> Some bad interaction between the idle and the suspend paths has been
>> noticed: 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).
>
> In an earlier version, I thought we agreed to just remove the empty
> prepare/finish calls. Can you do that?
>
> Also, can you base this on top of my recently posted patch:
>
> [PATCH v3] OMAP2+: PM/serial: fix console semaphore acquire during suspend
>
> since it touches some of the same code for pm24xx.c
Ok sent as '[PATCH v3] OMAP2+: disable idle early in the suspend sequence'
Thanks,
Jean
>
> Thanks,
>
> Kevin
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-12-09 17:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-08 9:09 [PATCH v2] OMAP2+: disable idle early in the suspend sequence jean.pihet
2010-12-08 23:01 ` Kevin Hilman
2010-12-09 17:41 ` Jean Pihet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox