From c2b7fbf19ca943d9a182fe92273749a6f24c2a2f Mon Sep 17 00:00:00 2001 From: Devin Lu Date: Tue, 15 Dec 2020 13:54:26 +0800 Subject: kukui/usb_pd: Store vbus enable status before sysjump Since vbus enable status is not store in EC ram while sysjump. This patch adds tag to store vbus enable status before sysjump. BUG=b:174376610 BRANCH=firmware-kukui-12573.B TEST=With PDtrace. Make sure vbus discharing works correctly on sysjump. Signed-off-by: Devin Lu Change-Id: Ibb96d74a8017f8838c59fefe18c5252a98a637e4 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2592531 Reviewed-by: Ting Shen --- baseboard/kukui/usb_pd_policy.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'baseboard') diff --git a/baseboard/kukui/usb_pd_policy.c b/baseboard/kukui/usb_pd_policy.c index 2344c41427..311b0f2663 100644 --- a/baseboard/kukui/usb_pd_policy.c +++ b/baseboard/kukui/usb_pd_policy.c @@ -8,6 +8,7 @@ #include "charger.h" #include "console.h" #include "gpio.h" +#include "hooks.h" #include "system.h" #include "timer.h" #include "usb_mux.h" @@ -29,6 +30,31 @@ static int board_get_polarity(int port) static uint8_t vbus_en; +#define VBUS_EN_SYSJUMP_TAG 0x5645 /* VE */ +#define VBUS_EN_HOOK_VERSION 1 + +static void vbus_en_preserve_state(void) +{ + system_add_jump_tag(VBUS_EN_SYSJUMP_TAG, VBUS_EN_HOOK_VERSION, + sizeof(vbus_en), &vbus_en); +} +DECLARE_HOOK(HOOK_SYSJUMP, vbus_en_preserve_state, HOOK_PRIO_DEFAULT); + +static void vbus_en_restore_state(void) +{ + const uint8_t *prev_vbus_en; + int size, version; + + prev_vbus_en = (const uint8_t *)system_get_jump_tag( + VBUS_EN_SYSJUMP_TAG, &version, &size); + + if (prev_vbus_en && version == VBUS_EN_HOOK_VERSION && + size == sizeof(*prev_vbus_en)) { + memcpy(&vbus_en, prev_vbus_en, sizeof(vbus_en)); + } +} +DECLARE_HOOK(HOOK_INIT, vbus_en_restore_state, HOOK_PRIO_DEFAULT); + int board_vbus_source_enabled(int port) { return vbus_en; -- cgit v1.2.1