summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaveh Jalali <caveh@chromium.org>2021-07-27 17:12:05 -0700
committerCommit Bot <commit-bot@chromium.org>2021-08-17 10:18:20 +0000
commitf3c614b1b89c985f917ea1f4cb2d131d3fe7a6f4 (patch)
treec5dfce6bcb670551da236c0892346271cba161a5
parenta46efa226904918b2144f3d92721b78e10adee3d (diff)
downloadchrome-ec-f3c614b1b89c985f917ea1f4cb2d131d3fe7a6f4.tar.gz
nx20p348x: Check device status reg for sink mode
This fixes an issue where we sometimes time out waiting for the HVSNK_STS bit to get set after enabling sink mode using the EN_SINK GPIO. Checking for HV_SNK mode in the device status register is more robust as it appears to reflect the state of the EN_SINK pin as expected. I'm still not sure why the HVSNK_STS bit isn't set as expected sometimes. I suspect that it only gets set when there is actual voltage presented by the connected device. BRANCH=none BUG=b:194833460 TEST=with additional debug code, verified that we detect HV_SNK mode even when HV sink switch is off.N Change-Id: Ifa5b9ebaedfc03755306ecb4e3e6e1fa654418d0 Signed-off-by: Caveh Jalali <caveh@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3058079 Reviewed-by: Denis Brockus <dbrockus@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r--driver/ppc/nx20p348x.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/driver/ppc/nx20p348x.c b/driver/ppc/nx20p348x.c
index 497fdb21d5..a5136bbf23 100644
--- a/driver/ppc/nx20p348x.c
+++ b/driver/ppc/nx20p348x.c
@@ -234,13 +234,18 @@ __maybe_unused static int nx20p3483_vbus_sink_enable(int port, int enable)
return rv;
for (int i = 0; i < NX20P348X_SWITCH_STATUS_DEBOUNCE_MSEC; ++i) {
- int sw;
+ int ds;
+ bool is_sink;
- rv = read_reg(port, NX20P348X_SWITCH_STATUS_REG, &sw);
+ rv = read_reg(port, NX20P348X_DEVICE_STATUS_REG, &ds);
if (rv != EC_SUCCESS)
return rv;
- if (!!(sw & NX20P348X_SWITCH_STATUS_HVSNK) == enable)
+
+ is_sink = (ds & NX20P3483_DEVICE_MODE_MASK) ==
+ NX20P3483_MODE_HV_SNK;
+ if (enable == is_sink)
return EC_SUCCESS;
+
msleep(1);
}