Commit d144f61a authored by Ye Li's avatar Ye Li Committed by Heiko Schocher

lpi2c: Fix bus stop problem in xfer

In xfer function, both bus_i2c_read and bus_i2c_write will
send a STOP command.  This causes a problem when reading register
data from i2c device.

Generally two operations comprise the register data reading:
   1. Write the register address to i2c device.
      START | chip_addr | W | ACK | register_addr | ACK |

   2. Read the Data from i2c device.
      START | chip_addr | R | ACK | DATA          | NACK | STOP

The STOP command should happen at the end of the transfer, otherwise
we will always get data from register address 0
Signed-off-by: default avatarYe Li <ye.li@nxp.com>
Acked-by: Peng Fan's avatarPeng Fan <peng.fan@nxp.com>
Reviewed-by: Heiko Schocher's avatarHeiko Schocher <hs@denx.de>
parent a32effd2
......@@ -225,9 +225,6 @@ static int bus_i2c_read(struct imx_lpi2c_reg *regs, u32 chip, u8 *buf, int len)
if (result)
return result;
result = bus_i2c_receive(regs, buf, len);
if (result)
return result;
result = bus_i2c_stop(regs);
if (result)
return result;
......@@ -242,9 +239,6 @@ static int bus_i2c_write(struct imx_lpi2c_reg *regs, u32 chip, u8 *buf, int len)
if (result)
return result;
result = bus_i2c_send(regs, buf, len);
if (result)
return result;
result = bus_i2c_stop(regs);
if (result)
return result;
......@@ -380,7 +374,7 @@ static int imx_lpi2c_probe_chip(struct udevice *bus, u32 chip,
static int imx_lpi2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
{
struct imx_lpi2c_reg *regs;
int ret = 0;
int ret = 0, ret_stop;
regs = (struct imx_lpi2c_reg *)devfdt_get_addr(bus);
for (; nmsgs > 0; nmsgs--, msg++) {
......@@ -398,6 +392,12 @@ static int imx_lpi2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
if (ret)
debug("i2c_write: error sending\n");
ret_stop = bus_i2c_stop(regs);
if (ret_stop)
debug("i2c_xfer: stop bus error\n");
ret |= ret_stop;
return ret;
}
......
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