diff options
Diffstat (limited to 'power/common.c')
-rw-r--r-- | power/common.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/power/common.c b/power/common.c index c75865ea53..380b3410fe 100644 --- a/power/common.c +++ b/power/common.c @@ -38,12 +38,19 @@ static const char * const state_names[] = { "S5", "S3", "S0", +#ifdef CONFIG_POWER_S0IX + "S0ix", +#endif "G3->S5", "S5->S3", "S3->S0", "S0->S3", "S3->S5", "S5->G3", +#ifdef CONFIG_POWER_S0IX + "S0ix->S0", + "S0->S0ix", +#endif }; static uint32_t in_signals; /* Current input signal states (IN_PGOOD_*) */ @@ -64,6 +71,15 @@ static uint32_t hibernate_delay = CONFIG_HIBERNATE_DELAY_SEC; static int pause_in_s5; #endif +static int power_signal_get_level(enum gpio_signal signal) +{ +#ifdef CONFIG_POWER_S0IX + return chipset_get_ps_debounced_level(signal); +#else + return gpio_get_level(signal); +#endif +} + /** * Update input signals mask */ @@ -74,7 +90,7 @@ static void power_update_signals(void) int i; for (i = 0; i < POWER_SIGNAL_COUNT; i++, s++) { - if (gpio_get_level(s->gpio) == s->level) + if (power_signal_get_level(s->gpio) == s->level) inew |= 1 << i; } @@ -229,7 +245,13 @@ static enum power_state power_common_state(enum power_state state) power_wait_signals(0); task_wait_event(-1); break; - +#ifdef CONFIG_POWER_S0IX + case POWER_S0ix: + /* Wait for a message */ + power_wait_signals(0); + task_wait_event(-1); + break; +#endif default: /* No common functionality for transition states */ break; @@ -279,6 +301,15 @@ int chipset_in_state(int state_mask) case POWER_S0: need_mask = CHIPSET_STATE_ON; break; +#ifdef CONFIG_POWER_S0IX + case POWER_S0ixS0: + case POWER_S0S0ix: + need_mask = CHIPSET_STATE_ON | CHIPSET_STATE_STANDBY; + break; + case POWER_S0ix: + need_mask = CHIPSET_STATE_STANDBY; + break; +#endif } /* Return non-zero if all needed bits are present */ |