From 29f5016d7b9cf9ed050af33d40772306e7207bf3 Mon Sep 17 00:00:00 2001 From: Wai-Hong Tam Date: Wed, 11 Dec 2019 19:08:42 -0800 Subject: sdm845, sc7180: Prioritize the power_request for checking power on and off When checking the event for power on or power off, should check the power_request first such that this request can be cleared; otherwise, the request still presents and may result a loop. BRANCH=None BUG=b:145901185 TEST=Toggle the WARM_RESET_L signal and no loop happens. Change-Id: Ifb79107d40b9a4c8e71a459ccd3063a0cacede17 Signed-off-by: Wai-Hong Tam Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1963378 Reviewed-by: Stephen Boyd --- power/sc7180.c | 34 ++++++++++++++++++---------------- power/sdm845.c | 34 ++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/power/sc7180.c b/power/sc7180.c index 01f588fe61..3da8d5c4bb 100644 --- a/power/sc7180.c +++ b/power/sc7180.c @@ -567,6 +567,17 @@ static uint8_t check_for_power_on_event(void) ap_off_flag = system_get_reset_flags() & EC_RESET_FLAG_AP_OFF; system_clear_reset_flags(EC_RESET_FLAG_AP_OFF); + + if (power_request == POWER_REQ_ON) { + power_request = POWER_REQ_NONE; + return POWER_ON_BY_POWER_REQ_ON; + } + + if (power_request == POWER_REQ_RESET) { + power_request = POWER_REQ_NONE; + return POWER_ON_BY_POWER_REQ_RESET; + } + /* check if system is already ON */ if (power_get_signals() & IN_POWER_GOOD) { if (ap_off_flag) { @@ -602,16 +613,6 @@ static uint8_t check_for_power_on_event(void) if (power_button_is_pressed()) return POWER_ON_BY_POWER_BUTTON_PRESSED; - if (power_request == POWER_REQ_ON) { - power_request = POWER_REQ_NONE; - return POWER_ON_BY_POWER_REQ_ON; - } - - if (power_request == POWER_REQ_RESET) { - power_request = POWER_REQ_NONE; - return POWER_ON_BY_POWER_REQ_RESET; - } - return POWER_OFF_CANCEL; } @@ -628,12 +629,7 @@ static uint8_t check_for_power_off_event(void) timestamp_t now; int pressed = 0; - /* - * Check for power button press. - */ - if (power_button_is_pressed()) { - pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED; - } else if (power_request == POWER_REQ_OFF) { + if (power_request == POWER_REQ_OFF) { power_request = POWER_REQ_NONE; return POWER_OFF_BY_POWER_REQ_OFF; } else if (power_request == POWER_REQ_RESET) { @@ -644,6 +640,12 @@ static uint8_t check_for_power_off_event(void) return POWER_OFF_BY_POWER_REQ_RESET; } + /* + * Check for power button press. + */ + if (power_button_is_pressed()) + pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED; + now = get_time(); if (pressed) { if (!power_button_was_pressed) { diff --git a/power/sdm845.c b/power/sdm845.c index ac5b814ad3..a799ec5883 100644 --- a/power/sdm845.c +++ b/power/sdm845.c @@ -555,6 +555,17 @@ static uint8_t check_for_power_on_event(void) ap_off_flag = system_get_reset_flags() & EC_RESET_FLAG_AP_OFF; system_clear_reset_flags(EC_RESET_FLAG_AP_OFF); + + if (power_request == POWER_REQ_ON) { + power_request = POWER_REQ_NONE; + return POWER_ON_BY_POWER_REQ_ON; + } + + if (power_request == POWER_REQ_RESET) { + power_request = POWER_REQ_NONE; + return POWER_ON_BY_POWER_REQ_RESET; + } + /* check if system is already ON */ if (power_get_signals() & IN_POWER_GOOD) { if (ap_off_flag) { @@ -590,16 +601,6 @@ static uint8_t check_for_power_on_event(void) if (power_button_is_pressed()) return POWER_ON_BY_POWER_BUTTON_PRESSED; - if (power_request == POWER_REQ_ON) { - power_request = POWER_REQ_NONE; - return POWER_ON_BY_POWER_REQ_ON; - } - - if (power_request == POWER_REQ_RESET) { - power_request = POWER_REQ_NONE; - return POWER_ON_BY_POWER_REQ_RESET; - } - return POWER_OFF_CANCEL; } @@ -616,12 +617,7 @@ static uint8_t check_for_power_off_event(void) timestamp_t now; int pressed = 0; - /* - * Check for power button press. - */ - if (power_button_is_pressed()) { - pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED; - } else if (power_request == POWER_REQ_OFF) { + if (power_request == POWER_REQ_OFF) { power_request = POWER_REQ_NONE; return POWER_OFF_BY_POWER_REQ_OFF; } else if (power_request == POWER_REQ_RESET) { @@ -632,6 +628,12 @@ static uint8_t check_for_power_off_event(void) return POWER_OFF_BY_POWER_REQ_RESET; } + /* + * Check for power button press. + */ + if (power_button_is_pressed()) + pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED; + now = get_time(); if (pressed) { if (!power_button_was_pressed) { -- cgit v1.2.1