[U-Boot] [PATCH 3/3] rockchip: i2c: fix >32 byte writes

John Keeping john at metanate.com
Thu Aug 18 21:08:42 CEST 2016


The special handling of the chip address and register address must only
happen before we send the data buffer, otherwise we will end up
inserting both of these every 32 bytes.

Signed-off-by: John Keeping <john at metanate.com>

---
I'm not entirely sure about this; it's the smallest change that fixes
the issue and I can't see another way to fix it without completely
rewriting the function.  I guess we could drop r_len completely since
the only caller always passes zero and that would make it all a bit
simpler, but I don't want to conflict with any plan to use this function
elsewhere.

 drivers/i2c/rk_i2c.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/rk_i2c.c b/drivers/i2c/rk_i2c.c
index a4c0032..7c701cb 100644
--- a/drivers/i2c/rk_i2c.c
+++ b/drivers/i2c/rk_i2c.c
@@ -269,9 +269,9 @@ static int rk_i2c_write(struct rk_i2c *i2c, uchar chip, uint reg, uint r_len,
 				if ((i * 4 + j) == bytes_xferred)
 					break;
 
-				if (i == 0 && j == 0) {
+				if (i == 0 && j == 0 && pbuf == buf) {
 					txdata |= (chip << 1);
-				} else if (i == 0 && j <= r_len) {
+				} else if (i == 0 && j <= r_len && pbuf == buf) {
 					txdata |= (reg &
 						(0xff << ((j - 1) * 8))) << 8;
 				} else {
-- 
2.9.3.728.g30b24b4.dirty



More information about the U-Boot mailing list