diff options
author | Tommy Chung <tommy.chung@quanta.corp-partner.google.com> | 2020-11-23 19:21:25 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-12-09 01:48:07 +0000 |
commit | 18609f320d924883f9011a6557765f6585bf554c (patch) | |
tree | fa4eac7013659ab7aa4d5cddb8abc125ddab0dbf | |
parent | db240bf9ab317cfc71ed1e8e6613b81b4e1afa4f (diff) | |
download | chrome-ec-18609f320d924883f9011a6557765f6585bf554c.tar.gz |
lantis: Update LED configuration
In lantis, we have a power LED and two battery LEDs. Also, we have two
USB-C ports, and which battery LED takes action related to different
charging states will depend on which USB-C port has been plugged in for
power charge. We blink power LED to indicate system suspend, and we also
override battery LEDs for clamshell SKU, which doesn't have power LED.
BUG=b:171546871
BRANCH=dedede
TEST=Make sure that all LEDs act correctly.
Signed-off-by: Tommy Chung <tommy.chung@quanta.corp-partner.google.com>
Change-Id: I32e931efad9477f64e83e75057b3ae04db997e63
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2556726
Reviewed-by: Devin Lu <Devin.Lu@quantatw.com>
Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r-- | board/lantis/gpio.inc | 10 | ||||
-rw-r--r-- | board/lantis/led.c | 90 |
2 files changed, 68 insertions, 32 deletions
diff --git a/board/lantis/gpio.inc b/board/lantis/gpio.inc index 429b952eef..10a182f766 100644 --- a/board/lantis/gpio.inc +++ b/board/lantis/gpio.inc @@ -91,10 +91,6 @@ GPIO(HDMI_SEL_L, PIN(C, 6), GPIO_OUT_HIGH) /* MKBP event synchronization */ GPIO(EC_AP_MKBP_INT_L, PIN(L, 5), GPIO_ODR_HIGH) -/* Misc pins which will run to the I/O board */ -GPIO(EC_SUB_IO_1_2, PIN(F, 0), GPIO_INPUT) -GPIO(EC_SUB_IO_2_1, PIN(F, 1), GPIO_INPUT) - /* Misc */ GPIO(EN_BL_OD, PIN(K, 4), GPIO_ODR_LOW) GPIO(EC_ENTERING_RW, PIN(G, 0), GPIO_OUT_LOW) @@ -118,8 +114,10 @@ GPIO(GPIOJ6_NC, PIN(J, 6), GPIO_INPUT | GPIO_PULL_DOWN) GPIO(GPIOM6_NC, PIN(M, 6), GPIO_INPUT | GPIO_PULL_DOWN) /* LED */ -GPIO(BAT_LED_AMBER_L, PIN(A, 1), GPIO_OUT_HIGH) -GPIO(BAT_LED_WHITE_L, PIN(A, 2), GPIO_OUT_HIGH) +GPIO(BAT_LED_AMBER_C0, PIN(A, 1), GPIO_OUT_HIGH) +GPIO(BAT_LED_WHITE_C0, PIN(A, 2), GPIO_OUT_HIGH) +GPIO(BAT_LED_AMBER_C1, PIN(F, 1), GPIO_OUT_HIGH) +GPIO(BAT_LED_WHITE_C1, PIN(F, 0), GPIO_OUT_HIGH) GPIO(PWR_LED_WHITE_L, PIN(A, 3), GPIO_OUT_HIGH) /* Alternate functions GPIO definitions */ diff --git a/board/lantis/led.c b/board/lantis/led.c index 68242180fa..c4868de740 100644 --- a/board/lantis/led.c +++ b/board/lantis/led.c @@ -3,9 +3,10 @@ * found in the LICENSE file. */ -/* Drawcia specific LED settings. */ +/* Lantis specific LED settings. */ #include "cbi_fw_config.h" +#include "charge_manager.h" #include "charge_state.h" #include "extpower.h" #include "hooks.h" @@ -18,7 +19,8 @@ #define POWER_LED_OFF 1 const enum ec_led_id supported_led_ids[] = { - EC_LED_ID_BATTERY_LED, + EC_LED_ID_LEFT_LED, + EC_LED_ID_RIGHT_LED, EC_LED_ID_POWER_LED }; @@ -31,20 +33,32 @@ enum led_color { LED_COLOR_COUNT /* Number of colors, not a color itself */ }; -static int led_set_color_battery(enum led_color color) +enum led_port { + LEFT_PORT = 0, + RIGHT_PORT +}; + +static int led_set_color_battery(int port, enum led_color color) { + enum gpio_signal amber_led, white_led; + + amber_led = (port == RIGHT_PORT ? GPIO_BAT_LED_AMBER_C1 : + GPIO_BAT_LED_AMBER_C0); + white_led = (port == RIGHT_PORT ? GPIO_BAT_LED_WHITE_C1 : + GPIO_BAT_LED_WHITE_C0); + switch (color) { case LED_OFF: - gpio_set_level(GPIO_BAT_LED_WHITE_L, BAT_LED_OFF); - gpio_set_level(GPIO_BAT_LED_AMBER_L, BAT_LED_OFF); + gpio_set_level(white_led, BAT_LED_OFF); + gpio_set_level(amber_led, BAT_LED_OFF); break; case LED_WHITE: - gpio_set_level(GPIO_BAT_LED_WHITE_L, BAT_LED_ON); - gpio_set_level(GPIO_BAT_LED_AMBER_L, BAT_LED_OFF); + gpio_set_level(white_led, BAT_LED_ON); + gpio_set_level(amber_led, BAT_LED_OFF); break; case LED_AMBER: - gpio_set_level(GPIO_BAT_LED_WHITE_L, BAT_LED_OFF); - gpio_set_level(GPIO_BAT_LED_AMBER_L, BAT_LED_ON); + gpio_set_level(white_led, BAT_LED_OFF); + gpio_set_level(amber_led, BAT_LED_ON); break; default: return EC_ERROR_UNKNOWN; @@ -70,7 +84,11 @@ static int led_set_color_power(enum ec_led_colors color) void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { switch (led_id) { - case EC_LED_ID_BATTERY_LED: + case EC_LED_ID_LEFT_LED: + brightness_range[EC_LED_COLOR_WHITE] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + break; + case EC_LED_ID_RIGHT_LED: brightness_range[EC_LED_COLOR_WHITE] = 1; brightness_range[EC_LED_COLOR_AMBER] = 1; break; @@ -87,8 +105,11 @@ static int led_set_color(enum ec_led_id led_id, enum led_color color) int rv; switch (led_id) { - case EC_LED_ID_BATTERY_LED: - rv = led_set_color_battery(color); + case EC_LED_ID_RIGHT_LED: + rv = led_set_color_battery(RIGHT_PORT, color); + break; + case EC_LED_ID_LEFT_LED: + rv = led_set_color_battery(LEFT_PORT, color); break; case EC_LED_ID_POWER_LED: rv = led_set_color_power(color); @@ -111,6 +132,22 @@ int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) return EC_SUCCESS; } +/* + * Set active charge port color to the parameter, turn off all others. + * If no port is active (-1), turn off all LEDs. + */ +static void set_active_port_color(enum led_color color) +{ + int port = charge_manager_get_active_charge_port(); + + if (led_auto_control_is_enabled(EC_LED_ID_RIGHT_LED)) + led_set_color_battery(RIGHT_PORT, + (port == RIGHT_PORT) ? color : LED_OFF); + if (led_auto_control_is_enabled(EC_LED_ID_LEFT_LED)) + led_set_color_battery(LEFT_PORT, + (port == LEFT_PORT) ? color : LED_OFF); +} + static void led_set_battery(void) { static int battery_ticks; @@ -120,14 +157,16 @@ static void led_set_battery(void) battery_ticks++; /* - * Override battery LED for Drawlet/Drawman, Drawlet/Drawman - * don't have power LED, blinking battery white LED to indicate - * system suspend without charging. + * Override battery LED for clamshell SKU, which doesn't have power + * LED, blinking battery white LED to indicate system suspend without + * charging. */ if (get_cbi_fw_config_tablet_mode() == TABLET_MODE_ABSENT) { if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND) && charge_get_state() != PWR_STATE_CHARGE) { - led_set_color_battery(power_ticks++ & 0x2 ? + led_set_color_battery(RIGHT_PORT, power_ticks++ & 0x2 ? + LED_WHITE : LED_OFF); + led_set_color_battery(LEFT_PORT, power_ticks++ & 0x2 ? LED_WHITE : LED_OFF); return; } @@ -137,11 +176,11 @@ static void led_set_battery(void) switch (charge_get_state()) { case PWR_STATE_CHARGE: - led_set_color_battery(LED_AMBER); + set_active_port_color(LED_AMBER); break; case PWR_STATE_DISCHARGE_FULL: if (extpower_is_present()) { - led_set_color_battery(LED_WHITE); + set_active_port_color(LED_WHITE); break; } /* Intentional fall-through */ @@ -151,24 +190,24 @@ static void led_set_battery(void) * when battery capacity is less than 10% */ if (charge_get_percent() < 10) - led_set_color_battery( + led_set_color_battery(RIGHT_PORT, (battery_ticks & 0x2) ? LED_WHITE : LED_OFF); else - led_set_color_battery(LED_OFF); + set_active_port_color(LED_OFF); break; case PWR_STATE_ERROR: - led_set_color_battery( + set_active_port_color( (battery_ticks % 0x2) ? LED_WHITE : LED_OFF); break; case PWR_STATE_CHARGE_NEAR_FULL: - led_set_color_battery(LED_WHITE); + set_active_port_color(LED_WHITE); break; case PWR_STATE_IDLE: /* External power connected in IDLE */ if (chflags & CHARGE_FLAG_FORCE_IDLE) - led_set_color_battery( + set_active_port_color( (battery_ticks & 0x2) ? LED_AMBER : LED_OFF); else - led_set_color_battery(LED_WHITE); + set_active_port_color(LED_WHITE); break; default: /* Other states don't alter LED behavior */ @@ -197,7 +236,6 @@ 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(); + led_set_battery(); } DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT); |