summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2020-10-20 16:21:31 -0600
committerCommit Bot <commit-bot@chromium.org>2020-10-28 22:49:13 +0000
commit48d48298a9849ce98611b08753823ffb9e818a9f (patch)
tree830b1c65bced871d94b42af81f6e7cae6c3e9b72
parent13ad8e39b780ac0612744dffc63d56adea00a680 (diff)
downloadchrome-ec-48d48298a9849ce98611b08753823ffb9e818a9f.tar.gz
SM5803: Only run inits once per EC boot
Ensure the SM5803 inits are run only once per EC boot. This will prevent the EC from re-running the init sequence if it is sysjumping (ex. due to an EC flash). BRANCH=None BUG=b:168169691 TEST=on drawlat, unplug battery and verify running a sysjump with the AP on doesn't brown out during init (instead, it browns out later when a hard reset is sent). Verify EC resets do result in inits being run again. Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: I700aabd51b45e2aff459f787c13978c6212026f5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2493110 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r--driver/charger/sm5803.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/driver/charger/sm5803.c b/driver/charger/sm5803.c
index 66d7f1144d..1b1de492d8 100644
--- a/driver/charger/sm5803.c
+++ b/driver/charger/sm5803.c
@@ -13,6 +13,7 @@
#include "hooks.h"
#include "i2c.h"
#include "sm5803.h"
+#include "system.h"
#include "throttle_ap.h"
#include "timer.h"
#include "usb_charge.h"
@@ -349,6 +350,35 @@ enum ec_error_list sm5803_vbus_sink_enable(int chgnum, int enable)
}
+/*
+ * Track and store whether we've initialized the charger chips already on this
+ * boot. This should prevent us from re-running inits after sysjumps.
+ */
+static bool chip_inited[CHARGER_NUM];
+#define SM5803_SYSJUMP_TAG 0x534D /* SM */
+#define SM5803_HOOK_VERSION 1
+
+static void init_status_preserve(void)
+{
+ system_add_jump_tag(SM5803_SYSJUMP_TAG, SM5803_HOOK_VERSION,
+ sizeof(chip_inited), &chip_inited);
+}
+DECLARE_HOOK(HOOK_SYSJUMP, init_status_preserve, HOOK_PRIO_DEFAULT);
+
+static void init_status_retrieve(void)
+{
+ const uint8_t *tag_contents;
+ int version, size;
+
+ tag_contents = system_get_jump_tag(SM5803_SYSJUMP_TAG,
+ &version, &size);
+ if (tag_contents && (version == SM5803_HOOK_VERSION) &&
+ (size == sizeof(chip_inited)))
+ /* Valid init status found, restore before charger chip init */
+ memcpy(&chip_inited, tag_contents, size);
+}
+DECLARE_HOOK(HOOK_INIT, init_status_retrieve, HOOK_PRIO_FIRST);
+
static void sm5803_init(int chgnum)
{
enum ec_error_list rv;
@@ -379,6 +409,15 @@ static void sm5803_init(int chgnum)
return;
}
+ /*
+ * A previous boot already ran inits, safe to return now that we've
+ * checked i2c communication to the chip and cached Vbus presence
+ */
+ if (chip_inited[chgnum]) {
+ CPRINTS("%s %d: Already initialized", CHARGER_NAME, chgnum);
+ return;
+ }
+
rv |= charger_device_id(&reg);
if (reg == 0x02) {
/* --- Special register init ---
@@ -664,6 +703,8 @@ static void sm5803_init(int chgnum)
if (rv)
CPRINTS("%s %d: Failed initialization", CHARGER_NAME, chgnum);
+ else
+ chip_inited[chgnum] = true;
}
static enum ec_error_list sm5803_post_init(int chgnum)