summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Hsu <Henry.Hsu@quantatw.com>2014-02-17 15:36:31 +0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-02-20 05:39:23 +0000
commite1006840ab5de34eaf6016e462e6e4642aa418c7 (patch)
tree27604ec0f0718cde453ce7e292f707df976d7f24
parent716be1dff2e6762e380d7a4eb54c06ac95352710 (diff)
downloadchrome-ec-e1006840ab5de34eaf6016e462e6e4642aa418c7.tar.gz
Glimmer: Implement the breathing led when suspend
The breathing led is gradual on in 1 second, gradual off in 1 second, and off for 3 seconds when system suspend. BUG=chrome-os-partner:24647 BRANCH=glimmer TEST=use command powerd_dbus_suspend, the led breathes normally. Change-Id: I2c5d018ca2765eab4f86ddf7d1617edd4f955b5b Signed-off-by: Henry Hsu <Henry.Hsu@quantatw.com> Reviewed-on: https://chromium-review.googlesource.com/186850 Reviewed-by: Dave Parker <dparker@chromium.org>
-rw-r--r--board/glimmer/board.h1
-rw-r--r--board/glimmer/led.c44
2 files changed, 43 insertions, 2 deletions
diff --git a/board/glimmer/board.h b/board/glimmer/board.h
index dc2dfdda1f..c7897b5e18 100644
--- a/board/glimmer/board.h
+++ b/board/glimmer/board.h
@@ -39,6 +39,7 @@
#define CONFIG_POWER_BUTTON_IGNORE_LID
#define CONFIG_POWER_BUTTON_X86
#define CONFIG_PWM
+#define CONFIG_PWM_DSLEEP
#define CONFIG_SCI_GPIO GPIO_PCH_SCI_L
#define CONFIG_TEMP_SENSOR
#define CONFIG_TEMP_SENSOR_TMP432
diff --git a/board/glimmer/led.c b/board/glimmer/led.c
index e3414bc5ff..e28d9bdf69 100644
--- a/board/glimmer/led.c
+++ b/board/glimmer/led.c
@@ -14,9 +14,14 @@
#include "pwm.h"
#include "util.h"
+#define TICKS_STEP1_BRIGHTER 0
+#define TICKS_STEP2_DIMMER 20
+#define TICKS_STEP3_OFF 40
+
const enum ec_led_id supported_led_ids[] = {EC_LED_ID_POWER_LED};
const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
static int ac_in_blink_times;
+static int ticks;
enum led_color {
LED_OFF = 0,
@@ -68,6 +73,41 @@ static void ac_in_blink(void)
}
DECLARE_HOOK(HOOK_AC_CHANGE, ac_in_blink, HOOK_PRIO_DEFAULT);
+static void suspend_led_update(void)
+{
+ int delay = 50 * MSEC;
+
+ ticks++;
+
+ /* 1s gradual on, 1s gradual off, 3s off */
+ if (ticks <= TICKS_STEP2_DIMMER) {
+ pwm_set_duty(PWM_CH_LED_RED, ticks*5);
+ } else if (ticks <= TICKS_STEP3_OFF) {
+ pwm_set_duty(PWM_CH_LED_RED, (TICKS_STEP3_OFF - ticks)*5);
+ } else {
+ ticks = TICKS_STEP1_BRIGHTER;
+ delay = 3000 * MSEC;
+ }
+
+ hook_call_deferred(suspend_led_update, delay);
+}
+DECLARE_DEFERRED(suspend_led_update);
+
+static void suspend_led_init(void)
+{
+ ticks = TICKS_STEP2_DIMMER;
+
+ hook_call_deferred(suspend_led_update, 0);
+}
+DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, suspend_led_init, HOOK_PRIO_DEFAULT);
+
+static void suspend_led_deinit(void)
+{
+ hook_call_deferred(suspend_led_update, -1);
+}
+DECLARE_HOOK(HOOK_CHIPSET_RESUME, suspend_led_deinit, HOOK_PRIO_DEFAULT);
+DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, suspend_led_deinit, HOOK_PRIO_DEFAULT);
+
/**
* Called by hook task every 250 ms
*/
@@ -87,8 +127,8 @@ static void led_tick(void)
/* If suspended, breathe the led */
if (chipset_in_state(CHIPSET_STATE_SUSPEND)) {
- set_color(LED_OFF);
- /* TODO keep led off now, will to be done in next CL */
+
+ /* Kept no function, use defered function instead. */
return;
}