diff options
Diffstat (limited to 'power/intel_x86.c')
-rw-r--r-- | power/intel_x86.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/power/intel_x86.c b/power/intel_x86.c index 8c8ee908eb..e020874de6 100644 --- a/power/intel_x86.c +++ b/power/intel_x86.c @@ -29,6 +29,7 @@ enum sys_sleep_state { SYS_SLEEP_S3, SYS_SLEEP_S4, + SYS_SLEEP_S5, #ifdef CONFIG_POWER_S0IX SYS_SLEEP_S0IX, #endif @@ -37,6 +38,7 @@ enum sys_sleep_state { static const int sleep_sig[] = { [SYS_SLEEP_S3] = SLP_S3_SIGNAL_L, [SYS_SLEEP_S4] = SLP_S4_SIGNAL_L, + [SYS_SLEEP_S5] = SLP_S5_SIGNAL_L, #ifdef CONFIG_POWER_S0IX [SYS_SLEEP_S0IX] = GPIO_PCH_SLP_S0_L, #endif @@ -121,7 +123,7 @@ static enum power_state power_wait_s5_rtc_reset(void) } s5_exit_tries = 0; - return POWER_S5S3; /* Power up to next state */ + return POWER_S5S4; /* Power up to next state */ } #endif @@ -279,22 +281,34 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) return power_wait_s5_rtc_reset(); #endif - if (chipset_get_sleep_signal(SYS_SLEEP_S4) == 1) - return POWER_S5S3; /* Power up to next state */ + if (chipset_get_sleep_signal(SYS_SLEEP_S5) == 1) + return POWER_S5S4; /* Power up to next state */ + break; + + case POWER_S4: + if (chipset_get_sleep_signal(SYS_SLEEP_S5) == 0) { + /* Power down to next state */ + return POWER_S4S5; + } else if (chipset_get_sleep_signal(SYS_SLEEP_S4) == 1) { + /* Power up to the next level */ + return POWER_S4S3; + } + break; case POWER_S3: if (!power_has_signals(IN_PGOOD_ALL_CORE)) { - /* Required rail went away */ + /* Required rail went away, go straight to S5 */ chipset_force_shutdown(CHIPSET_SHUTDOWN_POWERFAIL); return POWER_S3S5; } else if (chipset_get_sleep_signal(SYS_SLEEP_S3) == 1) { /* Power up to next state */ return POWER_S3S0; } else if (chipset_get_sleep_signal(SYS_SLEEP_S4) == 0) { - /* Power down to next state */ - return POWER_S3S5; + /* Power down to the next state */ + return POWER_S3S4; } + break; case POWER_S0: @@ -359,7 +373,15 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) power_s5_up = 1; return POWER_S5; + case POWER_S5S4: + return POWER_S4; /* Power up to next state */ + + case POWER_S3S4: + return POWER_S4; /* Power down to the next state */ + case POWER_S5S3: + /* fallthrough */ + case POWER_S4S3: if (!power_has_signals(IN_PGOOD_ALL_CORE)) { /* Required rail went away */ chipset_force_shutdown(CHIPSET_SHUTDOWN_POWERFAIL); @@ -380,7 +402,7 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) case POWER_S3S0: if (!power_has_signals(IN_PGOOD_ALL_CORE)) { - /* Required rail went away */ + /* Required rail went away, go straight back to S5 */ chipset_force_shutdown(CHIPSET_SHUTDOWN_POWERFAIL); return POWER_S3S5; } @@ -390,6 +412,10 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) lpc_s3_resume_clear_masks(); +#ifdef CONFIG_CHIPSET_RESUME_INIT_HOOK + /* Call hooks prior to chipset resume */ + hook_notify(HOOK_CHIPSET_RESUME_INIT); +#endif /* Call hooks now that rails are up */ hook_notify(HOOK_CHIPSET_RESUME); @@ -412,8 +438,13 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) return POWER_S0; case POWER_S0S3: + /* Call hooks before we remove power rails */ hook_notify(HOOK_CHIPSET_SUSPEND); +#ifdef CONFIG_CHIPSET_RESUME_INIT_HOOK + /* Call hooks after chipset suspend */ + hook_notify(HOOK_CHIPSET_SUSPEND_COMPLETE); +#endif /* Suspend wireless */ wireless_set_state(WIRELESS_SUSPEND); @@ -445,6 +476,11 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) * to go into deep sleep in S0ix. */ enable_sleep(SLEEP_MASK_AP_RUN); + +#ifdef CONFIG_CHIPSET_RESUME_INIT_HOOK + hook_notify(HOOK_CHIPSET_SUSPEND_COMPLETE); +#endif + return POWER_S0ix; case POWER_S0ixS0: @@ -454,11 +490,17 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) */ disable_sleep(SLEEP_MASK_AP_RUN); +#ifdef CONFIG_CHIPSET_RESUME_INIT_HOOK + hook_notify(HOOK_CHIPSET_RESUME_INIT); +#endif + sleep_resume_transition(); return POWER_S0; #endif case POWER_S3S5: + /* fallthrough */ + case POWER_S4S5: /* Call hooks before we remove power rails */ hook_notify(HOOK_CHIPSET_SHUTDOWN); |