From 44feb4b4e75b3373ce3c8e023b6c434ad7053d7d Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Thu, 23 Jan 2014 15:41:10 -0800 Subject: Fix leaving SUSP_VR_EN enabled if S5 rails fail to come up We noticed this on a baytrail board, but the same problem exists in haswell as well. And while looking there, found that we skipped the S5G3 state if the 5V rail failed to come up. Fortunately, these are all rare corner cases; rails will always come up on a good system. So this only affects systems during bringup and factory, not devices in the field. BUG=chrome-os-partner:24915 BRANCH=rambi (and technically haswell, but may not be worth merging) TEST=Try booting a system with a bad power rail; see that SUSP_VR_EN=0 after the system fails to boot. Change-Id: Ifd10841d298a0f2510a8b182250b717ea5643c99 Signed-off-by: Randall Spangler Reviewed-on: https://chromium-review.googlesource.com/183733 Reviewed-by: Aaron Durbin --- board/samus/power_sequence.c | 6 ++++++ power/baytrail.c | 1 + power/haswell.c | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/board/samus/power_sequence.c b/board/samus/power_sequence.c index 74efef873e..1c24ead274 100644 --- a/board/samus/power_sequence.c +++ b/board/samus/power_sequence.c @@ -210,6 +210,7 @@ enum power_state power_handle_state(enum power_state state) while ((power_get_signals() & IN_PGOOD_PP5000) != 0) { if (task_wait_event(SECOND) == TASK_EVENT_TIMER) { CPRINTF("[%T timeout waiting for PP5000\n"); + gpio_set_level(GPIO_PP5000_EN, 0); chipset_force_shutdown(); return POWER_G3; } @@ -227,6 +228,9 @@ enum power_state power_handle_state(enum power_state state) /* Wait for 1.05V to come up and CPU to notice */ if (power_wait_signals(IN_PGOOD_PP1050 | IN_PCH_SLP_SUS_DEASSERTED)) { + gpio_set_level(GPIO_PP1050_EN, 0); + gpio_set_level(GPIO_PP3300_DSW_GATED_EN, 0); + gpio_set_level(GPIO_PP5000_EN, 0); chipset_force_shutdown(); return POWER_G3; } @@ -243,6 +247,8 @@ enum power_state power_handle_state(enum power_state state) gpio_set_level(GPIO_PP1800_EN, 1); gpio_set_level(GPIO_PP1200_EN, 1); if (power_wait_signals(IN_PGOOD_S3)) { + gpio_set_level(GPIO_PP1800_EN, 0); + gpio_set_level(GPIO_PP1200_EN, 0); chipset_force_shutdown(); return POWER_S5; } diff --git a/power/baytrail.c b/power/baytrail.c index 04f0795a95..3ef9b2b37b 100644 --- a/power/baytrail.c +++ b/power/baytrail.c @@ -190,6 +190,7 @@ enum power_state power_handle_state(enum power_state state) gpio_set_level(GPIO_SUSP_VR_EN, 1); if (power_wait_signals(IN_PGOOD_S5)) { + gpio_set_level(GPIO_SUSP_VR_EN, 0); chipset_force_shutdown(); return POWER_G3; } diff --git a/power/haswell.c b/power/haswell.c index df727d2983..b51ac36ad8 100644 --- a/power/haswell.c +++ b/power/haswell.c @@ -213,6 +213,7 @@ enum power_state power_handle_state(enum power_state state) gpio_set_level(GPIO_SUSP_VR_EN, 1); if (power_wait_signals(IN_PGOOD_PP1050)) { + gpio_set_level(GPIO_SUSP_VR_EN, 0); chipset_force_shutdown(); return POWER_G3; } @@ -229,7 +230,7 @@ enum power_state power_handle_state(enum power_state state) gpio_set_level(GPIO_PP5000_EN, 1); if (power_wait_signals(IN_PGOOD_PP5000)) { chipset_force_shutdown(); - return POWER_G3; + return POWER_S5G3; } /* Wait for the always-on rails to be good */ -- cgit v1.2.1