From e54af6574a73c09deffa9355eb600ef09a6e5159 Mon Sep 17 00:00:00 2001 From: Shawn Nematbakhsh Date: Tue, 30 Aug 2016 12:52:42 -0700 Subject: [PATCH] power: rk3399: Minimize resume latency on short suspend BUG=chrome-os-partner:56605 BRANCH=None TEST=Manual on kevin, modify code to force CHECK_ABORTED_SUSPEND() condition to be true for each respective case, verify AP resumes successfully. Signed-off-by: Shawn Nematbakhsh Change-Id: Ib3ec3c287c14ea2b9b410171a173c38c9385a90f Reviewed-on: https://chromium-review.googlesource.com/378078 Commit-Ready: Shawn N Tested-by: Douglas Anderson Reviewed-by: Aseda Aboagye Reviewed-by: Douglas Anderson --- power/rk3399.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/power/rk3399.c b/power/rk3399.c index bb0cd81f3e..1b7978d22b 100644 --- a/power/rk3399.c +++ b/power/rk3399.c @@ -97,6 +97,19 @@ DECLARE_DEFERRED(force_shutdown); */ #define PGOOD_AP_DEBOUNCE_TIMEOUT (100 * MSEC) +/* + * The AP informs the EC of its S0 / S3 state through IN_SUSPEND_DEASSERTED / + * AP_EC_S3_S0_L. Latency between deassertion and power rails coming up must + * be minimized, so check for deassertion at various stages of our suspend + * power sequencing, and immediately transition out of suspend if necessary. + */ +#define CHECK_ABORTED_SUSPEND() \ + if (!forcing_shutdown && \ + power_get_signals() & IN_SUSPEND_DEASSERTED) { \ + CPRINTS("suspend aborted"); \ + return POWER_S3S0; \ + } + enum power_state power_handle_state(enum power_state state) { static int sys_reset_asserted; @@ -259,20 +272,32 @@ enum power_state power_handle_state(enum power_state state) case POWER_S0S3: /* Call hooks before we remove power rails */ hook_notify(HOOK_CHIPSET_SUSPEND); + CHECK_ABORTED_SUSPEND(); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP1800_SENSOR_EN_L, 1); gpio_set_level(GPIO_PP1800_SIXAXIS_EN_L, 1); gpio_set_level(GPIO_PP3300_S0_EN_L, 1); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP1800_S0_EN_L, 1); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_AP_CORE_EN, 0); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP1800_AP_AVDD_EN_L, 1); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP900_DDRPLL_EN, 0); msleep(10); + CHECK_ABORTED_SUSPEND(); /* * Enable idle task deep sleep. Allow the low power idle task