Module Name:    src
Committed By:   jdc
Date:           Mon Jan  4 10:00:33 UTC 2016

Modified Files:
        src/sys/dev/ic: pcf8584.c

Log Message:
Redo r1.12 - process cmd and value buffers in pcfiic_xmit().
Avoids allocating a temporary buffer for writes using both buffers.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/ic/pcf8584.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/dev/ic/pcf8584.c
diff -u src/sys/dev/ic/pcf8584.c:1.13 src/sys/dev/ic/pcf8584.c:1.14
--- src/sys/dev/ic/pcf8584.c:1.13	Sun Jan  3 17:32:17 2016
+++ src/sys/dev/ic/pcf8584.c	Mon Jan  4 10:00:33 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcf8584.c,v 1.13 2016/01/03 17:32:17 jdc Exp $	*/
+/*	$NetBSD: pcf8584.c,v 1.14 2016/01/04 10:00:33 jdc Exp $	*/
 /*	$OpenBSD: pcf8584.c,v 1.9 2007/10/20 18:46:21 kettenis Exp $ */
 
 /*
@@ -31,7 +31,7 @@
 #include <dev/ic/pcf8584var.h>
 #include <dev/ic/pcf8584reg.h>
 
-/* Internal egisters */
+/* Internal registers */
 #define PCF8584_S0		0x00
 #define PCF8584_S1		0x01
 #define PCF8584_S2		0x02
@@ -44,7 +44,7 @@ int		pcfiic_i2c_exec(void *, i2c_op_t, i
 		    size_t, void *, size_t, int);
 
 int		pcfiic_xmit(struct pcfiic_softc *, u_int8_t, const u_int8_t *,
-		    size_t);
+		    size_t, const u_int8_t *, size_t);
 int		pcfiic_recv(struct pcfiic_softc *, u_int8_t, u_int8_t *,
 		    size_t);
 
@@ -157,21 +157,9 @@ pcfiic_i2c_exec(void *arg, i2c_op_t op, 
 	 * If we are reading, write address, cmdbuf, then read address, buf.
 	 */
 	if (I2C_OP_WRITE_P(op)) {
-		if (len > 0) {
-			uint8_t *tmp;
-
-			tmp = malloc(cmdlen + len, M_DEVBUF,
-			   flags & I2C_F_POLL ? M_NOWAIT : M_WAITOK);
-			if (tmp == NULL)
-				return (1);
-			memcpy(tmp, cmdbuf, cmdlen);
-			memcpy(tmp + cmdlen, buf, len);
-			ret = pcfiic_xmit(sc, addr & 0x7f, tmp, cmdlen + len);
-			free(tmp, M_DEVBUF);
-		} else
-			ret = pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen);
+		ret = pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen, buf, len);
 	} else {
-		if (pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen) != 0)
+		if (pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen, NULL, 0) != 0)
 			return (1);
 		ret = pcfiic_recv(sc, addr & 0x7f, buf, len);
 	}
@@ -179,8 +167,8 @@ pcfiic_i2c_exec(void *arg, i2c_op_t op, 
 }
 
 int
-pcfiic_xmit(struct pcfiic_softc *sc, u_int8_t addr, const u_int8_t *buf,
-    size_t len)
+pcfiic_xmit(struct pcfiic_softc *sc, u_int8_t addr, const u_int8_t *cmdbuf,
+    size_t cmdlen, const u_int8_t *buf, size_t len)
 {
 	int			i, err = 0;
 	volatile u_int8_t	r;
@@ -191,7 +179,7 @@ pcfiic_xmit(struct pcfiic_softc *sc, u_i
 	pcfiic_write(sc, PCF8584_S0, addr << 1);
 	pcfiic_write(sc, PCF8584_S1, PCF8584_CMD_START);
 
-	for (i = 0; i <= len; i++) {
+	for (i = 0; i <= cmdlen + len; i++) {
 		if (pcfiic_wait_pin(sc, &r) != 0) {
 			pcfiic_write(sc, PCF8584_S1, PCF8584_CMD_STOP);
 			return (1);
@@ -202,8 +190,10 @@ pcfiic_xmit(struct pcfiic_softc *sc, u_i
 			break;
 		}
 
-		if (i < len)
-			pcfiic_write(sc, PCF8584_S0, buf[i]);
+		if (i < cmdlen)
+			pcfiic_write(sc, PCF8584_S0, cmdbuf[i]);
+		else if (i < cmdlen + len)
+			pcfiic_write(sc, PCF8584_S0, buf[i - cmdlen]);
 	}
 	pcfiic_write(sc, PCF8584_S1, PCF8584_CMD_STOP);
 	return (err);

Reply via email to