Commit 9f2e7ffc authored by Joakim Tjernlund's avatar Joakim Tjernlund Committed by james toy

The driver always ends a read with a STOP condition which breaks

subsequent I2C reads/writes in the same transaction as these expect to do
a repeated START(ReSTART).

This will also help I2C multimaster as the bus will not be released after
the first read, but when the whole transaction ends.
Signed-off-by: default avatarJoakim Tjernlund <Joakim.Tjernlund@transmode.se>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 8b0a2547
...@@ -365,9 +365,6 @@ static int mpc_write(struct mpc_i2c *i2c, int target, ...@@ -365,9 +365,6 @@ static int mpc_write(struct mpc_i2c *i2c, int target,
unsigned timeout = i2c->adap.timeout; unsigned timeout = i2c->adap.timeout;
u32 flags = restart ? CCR_RSTA : 0; u32 flags = restart ? CCR_RSTA : 0;
/* Start with MEN */
if (!restart)
writeccr(i2c, CCR_MEN);
/* Start as master */ /* Start as master */
writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags);
/* Write target byte */ /* Write target byte */
...@@ -396,9 +393,6 @@ static int mpc_read(struct mpc_i2c *i2c, int target, ...@@ -396,9 +393,6 @@ static int mpc_read(struct mpc_i2c *i2c, int target,
int i, result; int i, result;
u32 flags = restart ? CCR_RSTA : 0; u32 flags = restart ? CCR_RSTA : 0;
/* Start with MEN */
if (!restart)
writeccr(i2c, CCR_MEN);
/* Switch to read - restart */ /* Switch to read - restart */
writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags);
/* Write target address byte - this time with the read flag set */ /* Write target address byte - this time with the read flag set */
...@@ -425,9 +419,9 @@ static int mpc_read(struct mpc_i2c *i2c, int target, ...@@ -425,9 +419,9 @@ static int mpc_read(struct mpc_i2c *i2c, int target,
/* Generate txack on next to last byte */ /* Generate txack on next to last byte */
if (i == length - 2) if (i == length - 2)
writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK);
/* Generate stop on last byte */ /* Do not generate stop on last byte */
if (i == length - 1) if (i == length - 1)
writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_TXAK); writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX);
data[i] = readb(i2c->base + MPC_I2C_DR); data[i] = readb(i2c->base + MPC_I2C_DR);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment