mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-26 13:44:29 +08:00
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>
This commit is contained in:
parent
a32effd283
commit
d144f61ad3
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user