Commit 02bf8934 authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt

sh: Keep track of allowed sleep modes

Add code to keep track of supported sleep modes. This to
only export cpuidle modes that are backed by board support
code. Also, do not allow suspend-to-ram if sdram board code
is missing.
Signed-off-by: default avatarMagnus Damm <damm@opensource.se>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 323ef8db
...@@ -61,6 +61,9 @@ struct sh_sleep_data { ...@@ -61,6 +61,9 @@ struct sh_sleep_data {
struct sh_sleep_regs data; struct sh_sleep_regs data;
}; };
/* a bitmap of supported sleep modes (SUSP_SH..) */
extern unsigned long sh_mobile_sleep_supported;
#endif #endif
/* flags passed to assembly suspend code */ /* flags passed to assembly suspend code */
......
...@@ -87,25 +87,31 @@ void sh_mobile_setup_cpuidle(void) ...@@ -87,25 +87,31 @@ void sh_mobile_setup_cpuidle(void)
dev->safe_state = state; dev->safe_state = state;
if (sh_mobile_sleep_supported & SUSP_SH_SF) {
state = &dev->states[i++]; state = &dev->states[i++];
snprintf(state->name, CPUIDLE_NAME_LEN, "C1"); snprintf(state->name, CPUIDLE_NAME_LEN, "C1");
strncpy(state->desc, "SuperH Sleep Mode [SF]", CPUIDLE_DESC_LEN); strncpy(state->desc, "SuperH Sleep Mode [SF]",
CPUIDLE_DESC_LEN);
state->exit_latency = 100; state->exit_latency = 100;
state->target_residency = 1 * 2; state->target_residency = 1 * 2;
state->power_usage = 1; state->power_usage = 1;
state->flags = 0; state->flags = 0;
state->flags |= CPUIDLE_FLAG_TIME_VALID; state->flags |= CPUIDLE_FLAG_TIME_VALID;
state->enter = cpuidle_sleep_enter; state->enter = cpuidle_sleep_enter;
}
if (sh_mobile_sleep_supported & SUSP_SH_STANDBY) {
state = &dev->states[i++]; state = &dev->states[i++];
snprintf(state->name, CPUIDLE_NAME_LEN, "C2"); snprintf(state->name, CPUIDLE_NAME_LEN, "C2");
strncpy(state->desc, "SuperH Mobile Standby Mode [SF]", CPUIDLE_DESC_LEN); strncpy(state->desc, "SuperH Mobile Standby Mode [SF]",
CPUIDLE_DESC_LEN);
state->exit_latency = 2300; state->exit_latency = 2300;
state->target_residency = 1 * 2; state->target_residency = 1 * 2;
state->power_usage = 1; state->power_usage = 1;
state->flags = 0; state->flags = 0;
state->flags |= CPUIDLE_FLAG_TIME_VALID; state->flags |= CPUIDLE_FLAG_TIME_VALID;
state->enter = cpuidle_sleep_enter; state->enter = cpuidle_sleep_enter;
}
dev->state_count = i; dev->state_count = i;
......
...@@ -67,6 +67,8 @@ extern char sh_mobile_sleep_enter_end; ...@@ -67,6 +67,8 @@ extern char sh_mobile_sleep_enter_end;
extern char sh_mobile_sleep_resume_start; extern char sh_mobile_sleep_resume_start;
extern char sh_mobile_sleep_resume_end; extern char sh_mobile_sleep_resume_end;
unsigned long sh_mobile_sleep_supported = SUSP_SH_SLEEP;
void sh_mobile_register_self_refresh(unsigned long flags, void sh_mobile_register_self_refresh(unsigned long flags,
void *pre_start, void *pre_end, void *pre_start, void *pre_end,
void *post_start, void *post_end) void *post_start, void *post_end)
...@@ -103,10 +105,15 @@ void sh_mobile_register_self_refresh(unsigned long flags, ...@@ -103,10 +105,15 @@ void sh_mobile_register_self_refresh(unsigned long flags,
vp = onchip_mem + 0x600; /* located at interrupt vector */ vp = onchip_mem + 0x600; /* located at interrupt vector */
n = &sh_mobile_sleep_resume_end - &sh_mobile_sleep_resume_start; n = &sh_mobile_sleep_resume_end - &sh_mobile_sleep_resume_start;
memcpy(vp, &sh_mobile_sleep_resume_start, n); memcpy(vp, &sh_mobile_sleep_resume_start, n);
sh_mobile_sleep_supported |= flags;
} }
static int sh_pm_enter(suspend_state_t state) static int sh_pm_enter(suspend_state_t state)
{ {
if (!(sh_mobile_sleep_supported & SUSP_MODE_STANDBY_SF))
return -ENXIO;
local_irq_disable(); local_irq_disable();
set_bl_bit(); set_bl_bit();
sh_mobile_call_standby(SUSP_MODE_STANDBY_SF); sh_mobile_call_standby(SUSP_MODE_STANDBY_SF);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment