diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-05-28 17:25:04 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-05-29 02:54:42 +0000 |
commit | a7ba11c82c6b8bf84799382f5fc166b02bd88165 (patch) | |
tree | 353d377cfe57507cc0ca2c36d5a5579cdb0cb53a | |
parent | 14ba846eea9a16876df98802d9c0f192ae006ce0 (diff) | |
download | chrome-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.c | 34 |
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++; |