PERFORCE change 111929 for review

Warner Losh imp at FreeBSD.org
Mon Dec 18 23:45:01 PST 2006


http://perforce.freebsd.org/chv.cgi?CH=111929

Change 111929 by imp at imp_lighthouse on 2006/12/19 07:44:45

	MF FreeBSD-tsc-6
	
	Convert write to 7-1 addressing.
	Also, it turns out that my bitchin' iic controller was smart and
	would keep retrying until we'd succeed.  This means that the
	delay caused by writes were getting obscured.  Now we read back
	the first byte we've written.  This gets the iic eeproms
	working on the hacked-up bit-bang driver that I wrote for AT91
	in place of at91_twi.  Turns out we'll likely not need it, but
	it was a good excersize none-the-less...

Affected files ...

.. //depot/projects/arm/src/sys/dev/iicbus/icee.c#9 edit

Differences ...

==== //depot/projects/arm/src/sys/dev/iicbus/icee.c#9 (text+ko) ====

@@ -214,11 +214,14 @@
 icee_write(struct cdev *dev, struct uio *uio, int ioflag)
 {
 	struct icee_softc *sc;
-	int error, len, slave;
+	int error, len, slave, waitlimit;
 	uint8_t data[MAX_WR_SZ + 2];
-	struct iic_msg msgs[1] = {
+	struct iic_msg wr[1] = {
 	     { 0, IIC_M_WR, 0, data },
 	};
+	struct iic_msg rd[1] = {
+	     { 0, IIC_M_RD, 1, data },
+	};
 
 	sc = CDEV2SOFTC(dev);
 	if (uio->uio_offset >= sc->size)
@@ -234,24 +237,36 @@
 		    uio->uio_resid);
 		switch (sc->type) {
 		case 8:
-			slave = (uio->uio_offset >> 8) | sc->addr;
-			msgs[0].len = 1 + len;
+			slave = (uio->uio_offset >> 7) | sc->addr;
+			wr[0].len = 1 + len;
 			data[0] = uio->uio_offset & 0xff;
 			break;
 		case 16:
-			slave = sc->addr | (uio->uio_offset >> 16);
-			msgs[0].len = 2 + len;
+			slave = sc->addr | (uio->uio_offset >> 15);
+			wr[0].len = 2 + len;
 			data[0] = (uio->uio_offset >> 8) & 0xff;
 			data[1] = uio->uio_offset & 0xff;
 			break;
 		}
-		msgs[0].slave = slave;
+		wr[0].slave = slave;
 		error = uiomove(data + sc->type / 8, len, uio);
 		if (error)
 			break;
-		error = iicbus_transfer(sc->sc_dev, msgs, 1);
+		error = iicbus_transfer(sc->sc_dev, wr, 1);
 		if (error)
 			break;
+		// Now wait for the write to be done by trying to read
+		// the part.
+		waitlimit = 10000;
+		rd[0].slave = slave;
+		do 
+		{
+		    error = iicbus_transfer(sc->sc_dev, rd, 1);
+		} while (waitlimit-- > 0 && error != 0);
+		if (error) {
+		    printf("waiting for write failed %d\n", error);
+		    break;
+		}
 	}
 	ICEE_UNLOCK(sc);
 	return error;


More information about the p4-projects mailing list