summaryrefslogtreecommitdiff
path: root/baseboard/kukui/usb_pd_policy.c
diff options
context:
space:
mode:
authorDevin Lu <devin.lu@quantatw.com>2020-12-15 13:54:26 +0800
committerCommit Bot <commit-bot@chromium.org>2020-12-17 06:16:50 +0000
commitc2b7fbf19ca943d9a182fe92273749a6f24c2a2f (patch)
tree65286e41fb4b5c3ed69c5f59e75f9d30aab946cd /baseboard/kukui/usb_pd_policy.c
parent6a6891121c0cda0d5c6b68e30f9ee40d60563f89 (diff)
downloadchrome-ec-c2b7fbf19ca943d9a182fe92273749a6f24c2a2f.tar.gz
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 <Devin.Lu@quantatw.com> Change-Id: Ibb96d74a8017f8838c59fefe18c5252a98a637e4 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2592531 Reviewed-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'baseboard/kukui/usb_pd_policy.c')
-rw-r--r--baseboard/kukui/usb_pd_policy.c26
1 files changed, 26 insertions, 0 deletions
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;