Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Dec 2006 07:44:56 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 111929 for review
Message-ID:  <200612190744.kBJ7iukl056863@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=111929

Change 111929 by imp@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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200612190744.kBJ7iukl056863>