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 <[email protected]>
@@ -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);
}