Module Name:    src
Committed By:   jmcneill
Date:           Thu Jan  1 22:15:40 UTC 2015

Modified Files:
        src/sys/arch/arm/rockchip: rockchip_i2c.c

Log Message:
Include addr and reg in data sent with rkiic_write, now writes work too.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_i2c.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/rockchip/rockchip_i2c.c
diff -u src/sys/arch/arm/rockchip/rockchip_i2c.c:1.4 src/sys/arch/arm/rockchip/rockchip_i2c.c:1.5
--- src/sys/arch/arm/rockchip/rockchip_i2c.c:1.4	Thu Jan  1 15:18:45 2015
+++ src/sys/arch/arm/rockchip/rockchip_i2c.c	Thu Jan  1 22:15:40 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_i2c.c,v 1.4 2015/01/01 15:18:45 jmcneill Exp $ */
+/* $NetBSD: rockchip_i2c.c,v 1.5 2015/01/01 22:15:40 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -30,7 +30,7 @@
 #include "opt_rkiic.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_i2c.c,v 1.4 2015/01/01 15:18:45 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_i2c.c,v 1.5 2015/01/01 22:15:40 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -207,6 +207,14 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_
 	if (cmdlen != 0 && cmdlen != 1)
 		return EINVAL;
 
+	if (I2C_OP_READ_P(op)) {
+		if (len > 32)
+			return EINVAL;
+	} else {
+		if (len > 30)
+			return EINVAL;
+	}
+
 	error = rkiic_set_rate(sc, RKIIC_CLOCK_RATE);
 	if (error)
 		return error;
@@ -256,7 +264,15 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_
 	if (I2C_OP_READ_P(op)) {
 		error = rkiic_read(sc, addr, buf, len, flags);
 	} else {
-		error = rkiic_write(sc, addr, buf, len, flags);
+		uint8_t tmp_buf[32];
+		tmp_buf[0] = addr << 1;
+		if (cmdlen == 1) {
+			tmp_buf[1] = sraddr;
+			memcpy(&tmp_buf[2], buf, len);
+		} else {
+			memcpy(&tmp_buf[1], buf, len);
+		}
+		error = rkiic_write(sc, addr, tmp_buf, len + cmdlen + 1, flags);
 	}
 
 	if (I2C_OP_STOP_P(op)) {
@@ -369,7 +385,7 @@ rkiic_write(struct rkiic_softc *sc, i2c_
 	for (off = 0, resid = buflen; off < 8 && resid > 0; off++) {
 		uint32_t data = 0;
 		for (byte = 0; byte < 4 && resid > 0; byte++, resid--) {
-			data |= buf[off * 4 + byte] << (byte * 8);
+			data |= (uint32_t)buf[off * 4 + byte] << (byte * 8);
 		}
 		I2C_WRITE(sc, I2C_TXDATA_REG(off), data);
 	}

Reply via email to