Skip to content

Commit

Permalink
ARM: SAMSUNG: Gracefully exit on suspend failure
Browse files Browse the repository at this point in the history
As per the Exynos5250 User Manual:
When there are pending interrupt events, WFI/WFE instruction are
ignored. To cancel the power-down sequence follow these steps:
1) Disable system power-down using CENTRAL_SEQ_CONFIGURATION register
2) Clear WAKEUP_STAT register
3) Enable interrupt service routine for CPU

Code for early wakeup for exynos already exists. Remove the panic
on suspend failure, clear the wakeup state register and return 1
from cpu_suspend to indicate a failed suspend (to a user daemon).

Older Samsung SoCs have similar panics and I have removed them all.
Haven't touched the S3C2410 sleep code.

Signed-off-by: Abhilash Kesavan <a.kesavan@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
  • Loading branch information
Abhilash Kesavan authored and Kukjin Kim committed Jan 31, 2013
1 parent 8baaa26 commit d3fcacf
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 10 deletions.
6 changes: 4 additions & 2 deletions arch/arm/mach-exynos/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ static int exynos_cpu_suspend(unsigned long arg)
/* issue the standby signal into the pm unit. */
cpu_do_idle();

/* we should never get past here */
panic("sleep resumed to originator?");
pr_info("Failed to suspend the system\n");
return 1; /* Aborting suspend */
}

static void exynos_pm_prepare(void)
Expand Down Expand Up @@ -282,6 +282,8 @@ static void exynos_pm_resume(void)
if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
tmp |= S5P_CENTRAL_LOWPWR_CFG;
__raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
/* clear the wakeup state register */
__raw_writel(0x0, S5P_WAKEUP_STAT);
/* No need to perform below restore code */
goto early_wakeup;
}
Expand Down
3 changes: 2 additions & 1 deletion arch/arm/mach-s3c24xx/pm-s3c2412.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ static int s3c2412_cpu_suspend(unsigned long arg)

s3c2412_sleep_enter();

panic("sleep resumed to originator?");
pr_info("Failed to suspend the system\n");
return 1; /* Aborting suspend */
}

static void s3c2412_pm_prepare(void)
Expand Down
3 changes: 2 additions & 1 deletion arch/arm/mach-s3c24xx/pm-s3c2416.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ static int s3c2416_cpu_suspend(unsigned long arg)

s3c2412_sleep_enter();

panic("sleep resumed to originator?");
pr_info("Failed to suspend the system\n");
return 1; /* Aborting suspend */
}

static void s3c2416_pm_prepare(void)
Expand Down
3 changes: 2 additions & 1 deletion arch/arm/mach-s3c64xx/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,8 @@ static int s3c64xx_cpu_suspend(unsigned long arg)

/* we should never get past here */

panic("sleep resumed to originator?");
pr_info("Failed to suspend the system\n");
return 1; /* Aborting suspend */
}

/* mapping of interrupts to parts of the wakeup mask */
Expand Down
4 changes: 2 additions & 2 deletions arch/arm/mach-s5p64x0/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ static int s5p64x0_cpu_suspend(unsigned long arg)
"mcr p15, 0, %0, c7, c10, 4\n\t"
"mcr p15, 0, %0, c7, c0, 4" : : "r" (tmp));

/* we should never get past here */
panic("sleep resumed to originator?");
pr_info("Failed to suspend the system\n");
return 1; /* Aborting suspend */
}

/* mapping of interrupts to parts of the wakeup mask */
Expand Down
4 changes: 2 additions & 2 deletions arch/arm/mach-s5pv210/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ static int s5pv210_cpu_suspend(unsigned long arg)
"mcr p15, 0, %0, c7, c10, 4\n\t"
"wfi" : : "r" (tmp));

/* we should never get past here */
panic("sleep resumed to originator?");
pr_info("Failed to suspend the system\n");
return 1; /* Aborting suspend */
}

static void s5pv210_pm_prepare(void)
Expand Down
5 changes: 4 additions & 1 deletion arch/arm/plat-samsung/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ int (*pm_cpu_sleep)(unsigned long);

static int s3c_pm_enter(suspend_state_t state)
{
int ret;
/* ensure the debug is initialised (if enabled) */

s3c_pm_debug_init();
Expand Down Expand Up @@ -300,7 +301,9 @@ static int s3c_pm_enter(suspend_state_t state)
* we resume as it saves its own register state and restores it
* during the resume. */

cpu_suspend(0, pm_cpu_sleep);
ret = cpu_suspend(0, pm_cpu_sleep);
if (ret)
return ret;

/* restore the system state */

Expand Down

0 comments on commit d3fcacf

Please sign in to comment.