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: Ye Li <ye.li@nxp.com>
Acked-by: Peng Fan <peng.fan@nxp.com>
Reviewed-by: Heiko Schocher <hs@denx.de>
diff --git a/drivers/i2c/imx_lpi2c.c b/drivers/i2c/imx_lpi2c.c
index d2e11b4..585787a 100644
--- a/drivers/i2c/imx_lpi2c.c
+++ b/drivers/i2c/imx_lpi2c.c
@@ -227,9 +227,6 @@
result = bus_i2c_receive(regs, buf, len);
if (result)
return result;
- result = bus_i2c_stop(regs);
- if (result)
- return result;
return result;
}
@@ -244,9 +241,6 @@
result = bus_i2c_send(regs, buf, len);
if (result)
return result;
- result = bus_i2c_stop(regs);
- if (result)
- return result;
return result;
}
@@ -380,7 +374,7 @@
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 @@
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;
}