From 6136b1fb09d44410dc8a591abf51d16e5eca3966 Mon Sep 17 00:00:00 2001 From: Alexandru M Stan Date: Thu, 29 Jan 2015 16:11:26 -0800 Subject: Power Button: Wait for power button to be stable when waiting for release The debounce timer might be too slow to actually update the state of debounced_power_pressed by the time we do power_button_is_pressed in the S3->S5 state transition. Solution is to move the power_button_wait_for_release function here and make sure there are no deferreds active. BUG=chrome-os-partner:35948 TEST=During dev mode screen, press power button, note the device stays off TEST=Print debounced_power_pressed in power_button_is_pressed(void), note it's not 0 when power button is actually pressed BRANCH=veyron Change-Id: I8258e9e5524bd65d6ea9c77ea5649304d2195bf0 Signed-off-by: Alexandru M Stan Reviewed-on: https://chromium-review.googlesource.com/244590 Reviewed-by: Randall Spangler --- power/rockchip.c | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) (limited to 'power') diff --git a/power/rockchip.c b/power/rockchip.c index 272f768615..cbb06fc2af 100644 --- a/power/rockchip.c +++ b/power/rockchip.c @@ -357,37 +357,6 @@ static void power_on(void) set_pmic_warm_reset(0); } -/** - * Wait for the power button to be released - * - * @param timeout_us Timeout in microseconds, or -1 to wait forever - * @return EC_SUCCESS if ok, or - * EC_ERROR_TIMEOUT if power button failed to release - */ -static int wait_for_power_button_release(unsigned int timeout_us) -{ - timestamp_t deadline; - timestamp_t now = get_time(); - - deadline.val = now.val + timeout_us; - - while (power_button_is_pressed()) { - now = get_time(); - if (timeout_us < 0) { - task_wait_event(-1); - } else if (timestamp_expired(deadline, &now) || - (task_wait_event(deadline.val - now.val) == - TASK_EVENT_TIMER)) { - CPRINTS("power button not released in time"); - return EC_ERROR_TIMEOUT; - } - } - - CPRINTS("power button released"); - power_button_was_pressed = 0; - return EC_SUCCESS; -} - /** * Power off the AP */ @@ -475,9 +444,10 @@ enum power_state power_handle_state(enum power_state state) if (power_wait_signals(IN_POWER_GOOD) == EC_SUCCESS) { CPRINTS("POWER_GOOD seen"); - if (wait_for_power_button_release( + if (power_button_wait_for_release( DELAY_SHUTDOWN_ON_POWER_HOLD) == EC_SUCCESS) { + power_button_was_pressed = 0; set_pmic_pwron(0); /* setup misc gpio for S3/S0 functionality */ @@ -538,7 +508,8 @@ enum power_state power_handle_state(enum power_state state) return POWER_S3; case POWER_S3S5: - wait_for_power_button_release(-1); + power_button_wait_for_release(-1); + power_button_was_pressed = 0; return POWER_S5; case POWER_S5G3: -- cgit v1.2.1