summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2015-05-28 17:25:04 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-05-29 02:54:42 +0000
commita7ba11c82c6b8bf84799382f5fc166b02bd88165 (patch)
tree353d377cfe57507cc0ca2c36d5a5579cdb0cb53a
parent14ba846eea9a16876df98802d9c0f192ae006ce0 (diff)
downloadchrome-ec-a7ba11c82c6b8bf84799382f5fc166b02bd88165.tar.gz
mec1322: i2c: Fix open transaction i2x_xfer
- Don't re-send our slave address if we're not generating a start condition. - Handle repeated start vs new transaction properly in the Rx case. BUG=chrome-os-partner:40677 BRANCH=none TEST=Manual on glados. Verify 'battery' dumps correct info, and i2cscan succeeds. Also verify that tcpc communication with PD transmits the expected data. Change-Id: I30315d2d82857d6031fda6d4e6a787a52ec01382 Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/273956 Reviewed-by: Alec Berg <alecaberg@chromium.org>
-rw-r--r--chip/mec1322/i2c.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/chip/mec1322/i2c.c b/chip/mec1322/i2c.c
index e80d6cb5f8..b826a3f661 100644
--- a/chip/mec1322/i2c.c
+++ b/chip/mec1322/i2c.c
@@ -255,15 +255,14 @@ int chip_i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size,
}
if (out_size) {
- MEC1322_I2C_DATA(controller) = (uint8_t)slave_addr;
+ if (send_start) {
+ MEC1322_I2C_DATA(controller) = (uint8_t)slave_addr;
- /*
- * Clock out the slave address. Send START bit if start flag is
- * set.
- */
- MEC1322_I2C_CTRL(controller) = CTRL_PIN | CTRL_ESO | CTRL_ENI |
- CTRL_ACK |
- (send_start ? CTRL_STA : 0);
+ /* Clock out the slave address, sending START bit */
+ MEC1322_I2C_CTRL(controller) = CTRL_PIN | CTRL_ESO |
+ CTRL_ENI | CTRL_ACK |
+ CTRL_STA;
+ }
for (i = 0; i < out_size; ++i) {
if (wait_byte_done(controller))
@@ -286,12 +285,25 @@ int chip_i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size,
if (in_size) {
/* Resend start bit when changing direction */
if (out_size || send_start) {
- MEC1322_I2C_CTRL(controller) = CTRL_ESO | CTRL_STA |
- CTRL_ACK | CTRL_ENI |
- CTRL_PIN;
+ /* Repeated start case */
+ if (out_size)
+ MEC1322_I2C_CTRL(controller) = CTRL_ESO |
+ CTRL_STA |
+ CTRL_ACK |
+ CTRL_ENI |
+ CTRL_PIN;
MEC1322_I2C_DATA(controller) = (uint8_t)slave_addr
| 0x01;
+
+ /* New transaction case, clock out slave address. */
+ if (!out_size)
+ MEC1322_I2C_CTRL(controller) = CTRL_ESO |
+ CTRL_STA |
+ CTRL_ACK |
+ CTRL_ENI |
+ CTRL_PIN;
+
/* Skip over the dummy byte */
skip = 1;
in_size++;