summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@chromium.org>2017-09-23 01:15:53 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-10-03 17:28:28 -0700
commit04db902fee7dc7ae615fbb22454dc247a534c1f0 (patch)
tree4edb40bb519b0ce9acae506b0d899ed529649ae3
parent81682e06bc94d1b9e702b9794349bd34594896b3 (diff)
downloadchrome-ec-04db902fee7dc7ae615fbb22454dc247a534c1f0.tar.gz
intel_x86: Enable/disable SLP_S0 signal based on S0ix entry/exit
Runtime S0ix results in SLP_S0 signal being toggled continuously resulting in an interrupt storm on the EC. In order to avoid this, enable SLP_S0 power signal only when host indicates intent to enter S0ix and disable when host exits from S0ix. BUG=b:65421825 BRANCH=None TEST=Verified that runtime S0ix no longer results in interrupt storm on EC. Normal S0ix works fine on soraka. Verified state of SLP_S0 using powerindebug. Change-Id: I9ca62b8122afd8acedc2c353106407fdcc284925 Signed-off-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/679982 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/chell/board.c4
-rw-r--r--board/coral/board.c4
-rw-r--r--board/glkrvp/board.c4
-rw-r--r--board/poppy/board.c4
-rw-r--r--board/reef/board.c4
-rw-r--r--board/reef_it8320/board.c4
-rw-r--r--board/zoombini/board.c4
-rw-r--r--power/intel_x86.c7
8 files changed, 28 insertions, 7 deletions
diff --git a/board/chell/board.c b/board/chell/board.c
index e02513548a..ca0ed3d276 100644
--- a/board/chell/board.c
+++ b/board/chell/board.c
@@ -82,7 +82,9 @@ void usb1_evt(enum gpio_signal signal)
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
#ifdef CONFIG_POWER_S0IX
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
#endif
{GPIO_RSMRST_L_PGOOD, POWER_SIGNAL_ACTIVE_HIGH, "RSMRST_N_PWRGD"},
{GPIO_PCH_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
diff --git a/board/coral/board.c b/board/coral/board.c
index ee5db6d899..e8d7ad537d 100644
--- a/board/coral/board.c
+++ b/board/coral/board.c
@@ -127,7 +127,9 @@ void tablet_mode_interrupt(enum gpio_signal signal)
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
#ifdef CONFIG_POWER_S0IX
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
#endif
{GPIO_RSMRST_L_PGOOD, POWER_SIGNAL_ACTIVE_HIGH, "RSMRST_L"},
{GPIO_PCH_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
diff --git a/board/glkrvp/board.c b/board/glkrvp/board.c
index 5517371894..9c5f22eb58 100644
--- a/board/glkrvp/board.c
+++ b/board/glkrvp/board.c
@@ -46,7 +46,9 @@
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
{GPIO_RSMRST_L_PGOOD, POWER_SIGNAL_ACTIVE_HIGH, "RSMRST_L"},
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
{GPIO_PCH_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
{GPIO_PCH_SLP_S4_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S4_DEASSERTED"},
diff --git a/board/poppy/board.c b/board/poppy/board.c
index 53870f76a3..de1cb0ed24 100644
--- a/board/poppy/board.c
+++ b/board/poppy/board.c
@@ -330,7 +330,9 @@ static void base_disable(void)
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
#ifdef CONFIG_POWER_S0IX
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
#endif
#ifdef CONFIG_ESPI_VW_SIGNALS
{VW_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
diff --git a/board/reef/board.c b/board/reef/board.c
index 206e725af8..53918cd416 100644
--- a/board/reef/board.c
+++ b/board/reef/board.c
@@ -126,7 +126,9 @@ void tablet_mode_interrupt(enum gpio_signal signal)
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
#ifdef CONFIG_POWER_S0IX
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
#endif
{GPIO_RSMRST_L_PGOOD, POWER_SIGNAL_ACTIVE_HIGH, "RSMRST_L"},
{GPIO_PCH_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
diff --git a/board/reef_it8320/board.c b/board/reef_it8320/board.c
index ba48b29d0a..a33431dcca 100644
--- a/board/reef_it8320/board.c
+++ b/board/reef_it8320/board.c
@@ -61,7 +61,9 @@
/* power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
#ifdef CONFIG_POWER_S0IX
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
#endif
{GPIO_RSMRST_L_PGOOD, POWER_SIGNAL_ACTIVE_HIGH, "RSMRST_L"},
{GPIO_PCH_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
diff --git a/board/zoombini/board.c b/board/zoombini/board.c
index 8ffcd5f5cb..f2671ff84b 100644
--- a/board/zoombini/board.c
+++ b/board/zoombini/board.c
@@ -75,7 +75,9 @@ BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT);
/* Power signal list. Must match order of enum power_signal. */
const struct power_signal_info power_signal_list[] = {
- {GPIO_PCH_SLP_S0_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S0_DEASSERTED"},
+ {GPIO_PCH_SLP_S0_L,
+ POWER_SIGNAL_ACTIVE_HIGH | POWER_SIGNAL_DISABLE_AT_BOOT,
+ "SLP_S0_DEASSERTED"},
#ifdef CONFIG_ESPI_VW_SIGNALS
{VW_SLP_S3_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S3_DEASSERTED"},
{VW_SLP_S4_L, POWER_SIGNAL_ACTIVE_HIGH, "SLP_S4_DEASSERTED"},
diff --git a/power/intel_x86.c b/power/intel_x86.c
index 6c182344c4..c1f49353fd 100644
--- a/power/intel_x86.c
+++ b/power/intel_x86.c
@@ -464,6 +464,13 @@ power_board_handle_host_sleep_event(enum host_sleep_event state)
void power_chipset_handle_host_sleep_event(enum host_sleep_event state)
{
power_board_handle_host_sleep_event(state);
+
+#ifdef CONFIG_POWER_S0IX
+ if (state == HOST_SLEEP_EVENT_S0IX_SUSPEND)
+ power_signal_enable_interrupt(sleep_sig[SYS_SLEEP_S0IX]);
+ else
+ power_signal_disable_interrupt(sleep_sig[SYS_SLEEP_S0IX]);
+#endif
}
#endif