diff options
author | Ye Li <ye.li@nxp.com> | 2018-07-08 11:46:42 +0800 |
---|---|---|
committer | Heiko Schocher <hs@denx.de> | 2018-07-12 11:09:23 +0200 |
commit | d144f61ad3faa2104676791af58c2371729bef94 (patch) | |
tree | 63ed8747b1cad9a8c94365bb3691d1114e675668 /drivers/i2c/imx_lpi2c.c | |
parent | a32effd2838a62a5d1dcc01f613508f1d90b5667 (diff) |
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>
Diffstat (limited to 'drivers/i2c/imx_lpi2c.c')
-rw-r--r-- | drivers/i2c/imx_lpi2c.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/i2c/imx_lpi2c.c b/drivers/i2c/imx_lpi2c.c index d2e11b411b..585787a35c 100644 --- a/drivers/i2c/imx_lpi2c.c +++ b/drivers/i2c/imx_lpi2c.c @@ -227,9 +227,6 @@ static int bus_i2c_read(struct imx_lpi2c_reg *regs, u32 chip, u8 *buf, int len) 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 @@ static int bus_i2c_write(struct imx_lpi2c_reg *regs, u32 chip, u8 *buf, int len) 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_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; } |