From a7ba11c82c6b8bf84799382f5fc166b02bd88165 Mon Sep 17 00:00:00 2001 From: Shawn Nematbakhsh Date: Thu, 28 May 2015 17:25:04 -0700 Subject: 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 Reviewed-on: https://chromium-review.googlesource.com/273956 Reviewed-by: Alec Berg --- chip/mec1322/i2c.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'chip') 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++; -- cgit v1.2.1