diff options
author | Scott <scollyer@chromium.org> | 2016-09-21 14:34:01 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-09-25 17:47:29 -0700 |
commit | 672ea89dba35644d5a6b056c5e6a6ffa37dfca11 (patch) | |
tree | ca19b6275f770aa1a996c3ace7cc8cebdb6f3d81 /board/cr50/board.c | |
parent | 66ad05dfd7751f0351fce39e923da5523c08f261 (diff) | |
download | chrome-ec-stabilize-8838.B.tar.gz |
Cr50: I2CS TPM: Prevent sleep when I2CS is activestabilize-8838.B
Similar to the TPM SPI interface, added code to disable sleep an I2CS
interrupt is received. Enabling sleep follwoing a 1 second delay when
the TPM fifo register has been read by the host. The I2CS TPM layer
doesn't know when a command has finished, but the one second delay is
more than enough delay since sleep will be disabled again when the
next I2CS interrupt is received.
BRANCH=none
BUG=chrome-os-partner:40397
TEST=manual
Tested without these changes first. Shortened sleep delay to 30
seconds, and disconnected suzyq. Waited 30 seconds then issued the
command on the AP console:
tpmc read 0x1007 0xa
[ 59.796813] tpm tpm0: tpm_transmit: tpm_send: error -16
ERROR: write failure to TPM device: Device or resource busy
In addition, using logic analyzer verifed that there was activity on
SDA/SCL but no response from Cr50. With this CL in place, ran the
test and got the following:
tpmc read 0x1007 0xa
2 0 1 0 1 0 0 0 0 4f
With the logic analyzer I was able to confirm that there was no
activity from the host on the I2CS bus until the command was issued.
Change-Id: If07573ae8f72b983bca57979d53c22660b91b95e
Signed-off-by: Scott <scollyer@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/387910
Commit-Ready: Scott Collyer <scollyer@chromium.org>
Tested-by: Scott Collyer <scollyer@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
Diffstat (limited to 'board/cr50/board.c')
-rw-r--r-- | board/cr50/board.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c index 1bb6ce46ec..e370973778 100644 --- a/board/cr50/board.c +++ b/board/cr50/board.c @@ -765,6 +765,14 @@ void i2cs_set_pinmux(void) */ GWRITE_FIELD(PINMUX, DIOA1_CTL, PU, 1); GWRITE_FIELD(PINMUX, DIOA9_CTL, PU, 1); - /* TODO(scollyer): Do we need to add wake on SCL activity here? */ + /* Allow I2CS_SCL to wake from sleep */ + GWRITE_FIELD(PINMUX, EXITEDGE0, DIOA9, 1); /* edge sensitive */ + GWRITE_FIELD(PINMUX, EXITINV0, DIOA9, 1); /* wake on low */ + GWRITE_FIELD(PINMUX, EXITEN0, DIOA9, 1); /* enable powerdown exit */ + + /* Allow I2CS_SDA to wake from sleep */ + GWRITE_FIELD(PINMUX, EXITEDGE0, DIOA1, 1); /* edge sensitive */ + GWRITE_FIELD(PINMUX, EXITINV0, DIOA1, 1); /* wake on low */ + GWRITE_FIELD(PINMUX, EXITEN0, DIOA1, 1); /* enable powerdown exit */ } |