mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
ARM: SAMSUNG: Gracefully exit on suspend failure
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>
This commit is contained in:
parent
8baaa265c5
commit
d3fcacf52d
7 changed files with 18 additions and 10 deletions
|
@ -91,8 +91,8 @@ static int exynos_cpu_suspend(unsigned long arg)
|
||||||
/* issue the standby signal into the pm unit. */
|
/* issue the standby signal into the pm unit. */
|
||||||
cpu_do_idle();
|
cpu_do_idle();
|
||||||
|
|
||||||
/* we should never get past here */
|
pr_info("Failed to suspend the system\n");
|
||||||
panic("sleep resumed to originator?");
|
return 1; /* Aborting suspend */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exynos_pm_prepare(void)
|
static void exynos_pm_prepare(void)
|
||||||
|
@ -282,6 +282,8 @@ static void exynos_pm_resume(void)
|
||||||
if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
|
if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
|
||||||
tmp |= S5P_CENTRAL_LOWPWR_CFG;
|
tmp |= S5P_CENTRAL_LOWPWR_CFG;
|
||||||
__raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
|
__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 */
|
/* No need to perform below restore code */
|
||||||
goto early_wakeup;
|
goto early_wakeup;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,8 @@ static int s3c2412_cpu_suspend(unsigned long arg)
|
||||||
|
|
||||||
s3c2412_sleep_enter();
|
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)
|
static void s3c2412_pm_prepare(void)
|
||||||
|
|
|
@ -34,7 +34,8 @@ static int s3c2416_cpu_suspend(unsigned long arg)
|
||||||
|
|
||||||
s3c2412_sleep_enter();
|
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)
|
static void s3c2416_pm_prepare(void)
|
||||||
|
|
|
@ -296,7 +296,8 @@ static int s3c64xx_cpu_suspend(unsigned long arg)
|
||||||
|
|
||||||
/* we should never get past here */
|
/* 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 */
|
/* mapping of interrupts to parts of the wakeup mask */
|
||||||
|
|
|
@ -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, c10, 4\n\t"
|
||||||
"mcr p15, 0, %0, c7, c0, 4" : : "r" (tmp));
|
"mcr p15, 0, %0, c7, c0, 4" : : "r" (tmp));
|
||||||
|
|
||||||
/* we should never get past here */
|
pr_info("Failed to suspend the system\n");
|
||||||
panic("sleep resumed to originator?");
|
return 1; /* Aborting suspend */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mapping of interrupts to parts of the wakeup mask */
|
/* mapping of interrupts to parts of the wakeup mask */
|
||||||
|
|
|
@ -104,8 +104,8 @@ static int s5pv210_cpu_suspend(unsigned long arg)
|
||||||
"mcr p15, 0, %0, c7, c10, 4\n\t"
|
"mcr p15, 0, %0, c7, c10, 4\n\t"
|
||||||
"wfi" : : "r" (tmp));
|
"wfi" : : "r" (tmp));
|
||||||
|
|
||||||
/* we should never get past here */
|
pr_info("Failed to suspend the system\n");
|
||||||
panic("sleep resumed to originator?");
|
return 1; /* Aborting suspend */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s5pv210_pm_prepare(void)
|
static void s5pv210_pm_prepare(void)
|
||||||
|
|
|
@ -243,6 +243,7 @@ int (*pm_cpu_sleep)(unsigned long);
|
||||||
|
|
||||||
static int s3c_pm_enter(suspend_state_t state)
|
static int s3c_pm_enter(suspend_state_t state)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
/* ensure the debug is initialised (if enabled) */
|
/* ensure the debug is initialised (if enabled) */
|
||||||
|
|
||||||
s3c_pm_debug_init();
|
s3c_pm_debug_init();
|
||||||
|
@ -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
|
* we resume as it saves its own register state and restores it
|
||||||
* during the resume. */
|
* during the resume. */
|
||||||
|
|
||||||
cpu_suspend(0, pm_cpu_sleep);
|
ret = cpu_suspend(0, pm_cpu_sleep);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
/* restore the system state */
|
/* restore the system state */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue