diff options
author | Wai-Hong Tam <waihong@google.com> | 2019-12-11 19:08:42 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-01-23 01:02:38 +0000 |
commit | 29f5016d7b9cf9ed050af33d40772306e7207bf3 (patch) | |
tree | ef8a4eaeecef36caee9d1dfd9865945341b7b060 /power | |
parent | 15ea40d83fb22bf4655ecb2b2c4fb66bce90cb92 (diff) | |
download | chrome-ec-29f5016d7b9cf9ed050af33d40772306e7207bf3.tar.gz |
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 <waihong@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1963378
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Diffstat (limited to 'power')
-rw-r--r-- | power/sc7180.c | 34 | ||||
-rw-r--r-- | 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) { |