Module Name: src
Committed By: pgoyette
Date: Mon Apr 20 12:55:02 UTC 2009
Modified Files:
src/sys/arch/arm/xscale: pxa2x0_i2c.c pxa2x0_i2c.h
Log Message:
One more i2c quick_{read,write} update.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/xscale/pxa2x0_i2c.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/xscale/pxa2x0_i2c.h
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/xscale/pxa2x0_i2c.c
diff -u src/sys/arch/arm/xscale/pxa2x0_i2c.c:1.3 src/sys/arch/arm/xscale/pxa2x0_i2c.c:1.4
--- src/sys/arch/arm/xscale/pxa2x0_i2c.c:1.3 Wed Oct 17 19:53:44 2007
+++ src/sys/arch/arm/xscale/pxa2x0_i2c.c Mon Apr 20 12:55:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pxa2x0_i2c.c,v 1.3 2007/10/17 19:53:44 garbled Exp $ */
+/* $NetBSD: pxa2x0_i2c.c,v 1.4 2009/04/20 12:55:02 pgoyette Exp $ */
/* $OpenBSD: pxa2x0_i2c.c,v 1.2 2005/05/26 03:52:07 pascoe Exp $ */
/*
@@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pxa2x0_i2c.c,v 1.3 2007/10/17 19:53:44 garbled Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pxa2x0_i2c.c,v 1.4 2009/04/20 12:55:02 pgoyette Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -235,6 +235,61 @@
return EIO;
}
+/*
+ * XXX The quick_{read,write} opertions are untested!
+ */
+int
+pxa2x0_i2c_quick(struct pxa2x0_i2c_softc *sc, u_char slave, u_char rw)
+{
+ bus_space_tag_t iot = sc->sc_iot;
+ bus_space_handle_t ioh = sc->sc_ioh;
+ int timeout;
+ int tries = I2C_RETRY_COUNT;
+ uint32_t rv;
+
+retry:
+ bus_space_write_4(iot, ioh, I2C_ICR, ICR_UR);
+ bus_space_write_4(iot, ioh, I2C_ISAR, 0x00);
+ bus_space_write_4(iot, ioh, I2C_ISR, ISR_ITE);
+ delay(1);
+ bus_space_write_4(iot, ioh, I2C_ICR, ICR_IUE | ICR_SCLE);
+
+ /* Write slave device address. */
+ bus_space_write_4(iot, ioh, I2C_IDBR, (slave<<1) | (rw & 1));
+ rv = bus_space_read_4(iot, ioh, I2C_ICR);
+ bus_space_write_4(iot, ioh, I2C_ICR, rv | ICR_START);
+ rv = bus_space_read_4(iot, ioh, I2C_ICR);
+ bus_space_write_4(iot, ioh, I2C_ICR, rv | ICR_STOP);
+ rv = bus_space_read_4(iot, ioh, I2C_ICR);
+
+ timeout = 10000;
+ while ((bus_space_read_4(iot, ioh, I2C_ISR) & ISR_ITE) == 0) {
+ if (timeout-- == 0)
+ goto err;
+ delay(1);
+ }
+ if ((bus_space_read_4(iot, ioh, I2C_ISR) & ISR_ACKNAK) != 0)
+ goto err;
+
+ bus_space_write_4(iot, ioh, I2C_ISR, ISR_ITE);
+
+ rv = bus_space_read_4(iot, ioh, I2C_ICR);
+ bus_space_write_4(iot, ioh, I2C_ICR, rv & ~ICR_STOP);
+
+ return 0;
+
+err:
+ if (tries-- >= 0)
+ goto retry;
+
+ bus_space_write_4(iot, ioh, I2C_ICR, ICR_UR);
+ bus_space_write_4(iot, ioh, I2C_ISAR, 0x00);
+ bus_space_write_4(iot, ioh, I2C_ISR, ISR_ITE);
+ bus_space_write_4(iot, ioh, I2C_ICR, ICR_IUE | ICR_SCLE);
+
+ return EIO;
+}
+
int
pxa2x0_i2c_write_2(struct pxa2x0_i2c_softc *sc, u_char slave, u_short value)
{
Index: src/sys/arch/arm/xscale/pxa2x0_i2c.h
diff -u src/sys/arch/arm/xscale/pxa2x0_i2c.h:1.1 src/sys/arch/arm/xscale/pxa2x0_i2c.h:1.2
--- src/sys/arch/arm/xscale/pxa2x0_i2c.h:1.1 Sun Dec 17 16:03:33 2006
+++ src/sys/arch/arm/xscale/pxa2x0_i2c.h Mon Apr 20 12:55:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pxa2x0_i2c.h,v 1.1 2006/12/17 16:03:33 peter Exp $ */
+/* $NetBSD: pxa2x0_i2c.h,v 1.2 2009/04/20 12:55:02 pgoyette Exp $ */
/* $OpenBSD: pxa2x0_i2c.h,v 1.2 2005/05/26 03:52:07 pascoe Exp $ */
/*
@@ -37,5 +37,6 @@
int pxa2x0_i2c_read(struct pxa2x0_i2c_softc *sc, u_char, u_char *);
int pxa2x0_i2c_write(struct pxa2x0_i2c_softc *, u_char, u_char);
int pxa2x0_i2c_write_2(struct pxa2x0_i2c_softc *, u_char, u_short);
+int pxa2x0_i2c_quick(struct pxa2x0_i2c_softc *sc, u_char slave, u_char rw);
#endif