From 1722849223efae4aaf87d2476a7ad07d2c7bd8c5 Mon Sep 17 00:00:00 2001 From: Nicolas Boichat Date: Fri, 14 Jun 2019 13:44:24 +0800 Subject: power/mt8183: Hold PMIC enable to force S5->G3 transition. Asserting VSYSSNS should only be done as a last measure. If the PMIC is configured properly, it will shut down upon holding POWER+HOME key for 8+ seconds. This is shorter than the S5->G3 timeout, so we should never need to assert VSYSSNS. BRANCH=none BUG=b:134912821 TEST=reboot ap-off, immediately powerb, see that AP turns on and stays on. TEST=apshutdown, PMIC shuts off gracefully TEST=In power/common.c, change S5_INACTIVITY_TIMEOUT to 3 seconds, see that state machines forces PMIC off using VSYSSNS. TEST=Boot DUT: mosys eventlog clear; poweroff power on DUT, run dut-control power_state:off Wait 8 seconds for EC to go to G3, power on DUT again mosys eventlog list shows events with correct time stamps: 0 | 2019-06-14 15:44:31 | Log area cleared | 79 1 | 2019-06-14 15:44:38 | System boot | 0 2 | 2019-06-14 15:44:38 | Chrome OS Developer Mode 3 | 2019-06-14 15:45:13 | System boot | 0 4 | 2019-06-14 15:45:13 | Chrome OS Developer Mode Change-Id: I9b73d06e07296e47e15fe87dd87fffac2af04d12 Signed-off-by: Nicolas Boichat Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1660073 Reviewed-by: Daisuke Nojiri --- power/mt8183.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/power/mt8183.c b/power/mt8183.c index e005cb0288..0be256cb89 100644 --- a/power/mt8183.c +++ b/power/mt8183.c @@ -254,7 +254,23 @@ enum power_state power_handle_state(enum power_state state) return POWER_S5S3; } - /* Stay in S5, common code will drop to G3 after timeout. */ + /* Forcing shutdown */ + + /* Long press has worked, transition to G3. */ + if (!(power_get_signals() & IN_PGOOD_PMIC)) + return POWER_S5G3; + + /* + * Try to force PMIC shutdown with a long press. This takes 8s, + * shorter than the common code S5->G3 timeout (10s). + */ + CPRINTS("Forcing shutdown with long press."); + gpio_set_level(GPIO_PMIC_EN_ODL, 0); + + /* + * Stay in S5, common code will drop to G3 after timeout + * if the long press does not work. + */ return POWER_S5; case POWER_S3: @@ -282,8 +298,15 @@ enum power_state power_handle_state(enum power_state state) return POWER_S5; case POWER_S5S3: + /* + * Release power button in case it was pressed by force shutdown + * sequence. + */ + gpio_set_level(GPIO_PMIC_EN_ODL, 1); + /* If PMIC is off, switch it on by pulsing PMIC enable. */ if (!(power_get_signals() & IN_PGOOD_PMIC)) { + msleep(PMIC_EN_PULSE_MS); gpio_set_level(GPIO_PMIC_EN_ODL, 0); msleep(PMIC_EN_PULSE_MS); gpio_set_level(GPIO_PMIC_EN_ODL, 1); @@ -391,11 +414,16 @@ enum power_state power_handle_state(enum power_state state) return POWER_S5; case POWER_S5G3: + /* Release the power button, in case it was long pressed. */ + if (forcing_shutdown) + gpio_set_level(GPIO_PMIC_EN_ODL, 1); + /* * If PMIC is still not off, assert PMIC_FORCE_RESET_ODL. * This should only happen for forced shutdown where the AP is - * not able to send a command to the PMIC. Also, PMIC will lose - * RTC state, in that case. + * not able to send a command to the PMIC, and where the long + * power+home press did not work (if the PMIC is misconfigured). + * Also, PMIC will lose RTC state, in that case. */ if (power_get_signals() & IN_PGOOD_PMIC) { CPRINTS("Forcing PMIC off"); -- cgit v1.2.1