From 571d71ff7b7b7911b8b756e22ce52dc5d9febb9b Mon Sep 17 00:00:00 2001 From: Devin Lu Date: Fri, 31 Jul 2020 09:45:38 +0800 Subject: drawcia: Add power led support On drawcia, we have a LED indicator with following: System S0: White. System S0ix: Blinking white (1 sec on, 1 sec off) System S5/G3: Off. BUG=none BRANCH=none TEST=make sure led is showing white on system S0. make sure led is blinking white on S0ix. make sure led is OFF on S5/G3. Signed-off-by: Devin Lu Change-Id: I38f8c4c06b5da1f050b9542667a54a26923ca222 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2331436 Reviewed-by: Diana Z --- board/drawcia/led.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/board/drawcia/led.c b/board/drawcia/led.c index 1cd435b4b0..68242180fa 100644 --- a/board/drawcia/led.c +++ b/board/drawcia/led.c @@ -14,7 +14,13 @@ #define BAT_LED_ON 0 #define BAT_LED_OFF 1 -const enum ec_led_id supported_led_ids[] = {EC_LED_ID_BATTERY_LED}; +#define POWER_LED_ON 0 +#define POWER_LED_OFF 1 + +const enum ec_led_id supported_led_ids[] = { + EC_LED_ID_BATTERY_LED, + EC_LED_ID_POWER_LED +}; const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); @@ -46,10 +52,34 @@ static int led_set_color_battery(enum led_color color) return EC_SUCCESS; } +static int led_set_color_power(enum ec_led_colors color) +{ + switch (color) { + case LED_OFF: + gpio_set_level(GPIO_PWR_LED_WHITE_L, POWER_LED_OFF); + break; + case LED_WHITE: + gpio_set_level(GPIO_PWR_LED_WHITE_L, POWER_LED_ON); + break; + default: + return EC_ERROR_UNKNOWN; + } + return EC_SUCCESS; +} + void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { - brightness_range[EC_LED_COLOR_WHITE] = 1; - brightness_range[EC_LED_COLOR_AMBER] = 1; + switch (led_id) { + case EC_LED_ID_BATTERY_LED: + brightness_range[EC_LED_COLOR_WHITE] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + break; + case EC_LED_ID_POWER_LED: + brightness_range[EC_LED_COLOR_WHITE] = 1; + break; + default: + break; + } } static int led_set_color(enum ec_led_id led_id, enum led_color color) @@ -60,6 +90,9 @@ static int led_set_color(enum ec_led_id led_id, enum led_color color) case EC_LED_ID_BATTERY_LED: rv = led_set_color_battery(color); break; + case EC_LED_ID_POWER_LED: + rv = led_set_color_power(color); + break; default: return EC_ERROR_UNKNOWN; } @@ -143,9 +176,27 @@ static void led_set_battery(void) } } +static void led_set_power(void) +{ + static int power_tick; + + power_tick++; + + if (chipset_in_state(CHIPSET_STATE_ON)) + led_set_color_power(LED_WHITE); + else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) + led_set_color_power( + (power_tick & 0x2) ? LED_WHITE : LED_OFF); + else + led_set_color_power(LED_OFF); +} + /* Called by hook task every TICK */ static void led_tick(void) { + if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) + led_set_power(); + if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED)) led_set_battery(); } -- cgit v1.2.1