summaryrefslogtreecommitdiff
path: root/power/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'power/common.c')
-rw-r--r--power/common.c35
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 */