summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Chase <jnchase@google.com>2020-07-31 14:54:23 -0400
committerCommit Bot <commit-bot@chromium.org>2020-08-14 21:41:40 +0000
commitd31bb8257e8baff006bbf174e8fdaf20666abc02 (patch)
tree271c1c0fa11c9aa615676fea6e4f7e29f4541ebc
parenta27cf95f95439f3af0d312d176b9f2d4d8a80da4 (diff)
downloadchrome-ec-d31bb8257e8baff006bbf174e8fdaf20666abc02.tar.gz
endeavour: fix PSE init timing
The PSE controller is unpowered when the AP is not running so it should be initialized whenever the AP resumes. It can take up to 15ms after coming out of reset to respond to I2C accesses so retry as needed. BRANCH=endeavour BUG=b:162311755 TEST=EC reboot with various options. Cr50 reboot. Shutdown/power on. Change-Id: Ic4df0c2ded2c47b30e6ddea945158f664bb77efb Signed-off-by: Jeff Chase <jnchase@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2332859 Reviewed-by: Joe Tessler <jrt@chromium.org> (cherry picked from commit 8c5e48f0c7a1d6cd6bf39ab2e6278c6a42e72a4d) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2355491 Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r--board/endeavour/pse.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/board/endeavour/pse.c b/board/endeavour/pse.c
index c4484d257c..ad481b46da 100644
--- a/board/endeavour/pse.c
+++ b/board/endeavour/pse.c
@@ -43,7 +43,7 @@
#define LTC4291_HPMD_MIN 0x00
#define LTC4291_HPMD_MAX 0xA8
-#define LTC4291_RESET_DELAY_MS 10
+#define LTC4291_RESET_DELAY_US 20000
#define I2C_PSE_READ(reg, data) \
i2c_read8(I2C_PORT_PSE, LTC4291_I2C_ADDR, LTC4291_REG_##reg, (data))
@@ -82,17 +82,17 @@ static int pse_port_hpmd[4] = {
static int pse_init_worker(void)
{
+ timestamp_t deadline;
int err, id, devid, statpin, port;
- err = I2C_PSE_WRITE(RSTPB, LTC4291_FLD_RSTPB_RSTALL);
- if (err != 0)
- return err;
+ /* Ignore errors -- may already be resetting */
+ I2C_PSE_WRITE(RSTPB, LTC4291_FLD_RSTPB_RSTALL);
- msleep(LTC4291_RESET_DELAY_MS);
-
- err = I2C_PSE_READ(ID, &id);
- if (err != 0)
- return err;
+ deadline.val = get_time().val + LTC4291_RESET_DELAY_US;
+ while ((err = I2C_PSE_READ(ID, &id)) != 0) {
+ if (timestamp_expired(deadline, NULL))
+ return err;
+ }
err = I2C_PSE_READ(DEVID, &devid);
if (err != 0)
@@ -144,7 +144,7 @@ static void pse_init(void)
else
CPRINTS("PSE init done");
}
-DECLARE_HOOK(HOOK_INIT, pse_init, HOOK_PRIO_INIT_I2C);
+DECLARE_HOOK(HOOK_CHIPSET_RESUME, pse_init, HOOK_PRIO_DEFAULT);
static int command_pse(int argc, char **argv)
{