summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/chipset_gaia.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/common/chipset_gaia.c b/common/chipset_gaia.c
index a6f2337c6f..310e1b50cc 100644
--- a/common/chipset_gaia.c
+++ b/common/chipset_gaia.c
@@ -236,8 +236,10 @@ static int check_for_power_off_event(void)
return 0;
}
-void gaia_suspend_event(enum gpio_signal signal)
+void gaia_suspend_deferred(void)
{
+ int new_ap_suspended;
+
if (!ap_on) /* power on/off : not a real suspend / resume */
return;
@@ -245,7 +247,13 @@ void gaia_suspend_event(enum gpio_signal signal)
* Note: For Snow, suspend state can only be reliably
* determined when the AP is on (crosbug.com/p/13200).
*/
- ap_suspended = !gpio_get_level(GPIO_SUSPEND_L);
+ new_ap_suspended = !gpio_get_level(GPIO_SUSPEND_L);
+
+ /* We never want to call two suspend or two resumes in a row */
+ if (ap_suspended == new_ap_suspended)
+ return;
+
+ ap_suspended = new_ap_suspended;
if (ap_suspended) {
if (lid_is_open())
@@ -258,6 +266,13 @@ void gaia_suspend_event(enum gpio_signal signal)
powerled_set_state(POWERLED_STATE_ON);
hook_notify(HOOK_CHIPSET_RESUME);
}
+
+}
+DECLARE_DEFERRED(gaia_suspend_deferred);
+
+void gaia_suspend_event(enum gpio_signal signal)
+{
+ hook_call_deferred(gaia_suspend_deferred, 0);
}
void gaia_power_event(enum gpio_signal signal)