i2c-c2k: Fix i2c_c2k_xfer() to support multi-message transfers
i2c_c2k_xfer() only processed the last message in a list of multiple
messages, without even generating a warning about that. Add proper
support for multiple message transfers. Tested with a hacked TPM
driver with 4 messages.
This change also does a general cleanup of i2c_c2k_xfer(). There is no
need to call i2c_start/stop() here, these functions are called from
i2c_read/write().
Change-Id: Ic3ac48c5983f713081a97d3c07190a1a9fab14dd
diff --git a/drivers/i2c/busses/i2c-c2k.c b/drivers/i2c/busses/i2c-c2k.c
index 1253b36..c2ff781 100644
--- a/drivers/i2c/busses/i2c-c2k.c
+++ b/drivers/i2c/busses/i2c-c2k.c
@@ -359,27 +359,20 @@
static int i2c_c2k_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
{
- unsigned int i;
+ int i;
int result;
- /* Start I2C transfer */
- result = i2c_start(adapter->dev);
- if (result)
- goto fail0;
+ for (i = 0; i < num; i++) {
+ if (msgs[i].flags & I2C_M_RD)
+ result = i2c_read(adapter->dev, msgs[i].addr,
+ msgs[i].buf, msgs[i].len);
+ else
+ result = i2c_write(adapter->dev, msgs[i].addr,
+ msgs[i].buf, msgs[i].len);
- /* read/write data */
- i = num-1;
- if (msgs[i].flags & I2C_M_RD)
- result = i2c_read(adapter->dev, msgs[i].addr, msgs[i].buf, msgs[i].len);
- else
- result = i2c_write(adapter->dev, msgs->addr, msgs->buf, msgs->len);
-
- if (result)
- goto fail0;
-
-fail0:
- /* Stop I2C transfer */
- i2c_stop(adapter->dev);
+ if (result)
+ break;
+ }
return (result < 0) ? result : num;
}