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); }