diff options
author | Caveh Jalali <caveh@chromium.org> | 2021-07-27 17:12:05 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-08-17 10:18:20 +0000 |
commit | f3c614b1b89c985f917ea1f4cb2d131d3fe7a6f4 (patch) | |
tree | c5dfce6bcb670551da236c0892346271cba161a5 /driver/ppc/nx20p348x.c | |
parent | a46efa226904918b2144f3d92721b78e10adee3d (diff) | |
download | chrome-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>
Diffstat (limited to 'driver/ppc/nx20p348x.c')
-rw-r--r-- | driver/ppc/nx20p348x.c | 11 |
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); } |