Module Name:    src
Committed By:   rkujawa
Date:           Thu Apr 25 13:04:27 UTC 2013

Modified Files:
        src/sys/arch/arm/omap: ti_iic.c

Log Message:
Don't discard flags in ti_iic_exec when calling ti_iic_op. I'm not sure if
that's the correct solution. But it unbreaks the drivers when calling iic_exec
with I2C_F_POLL flag.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/omap/ti_iic.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/omap/ti_iic.c
diff -u src/sys/arch/arm/omap/ti_iic.c:1.3 src/sys/arch/arm/omap/ti_iic.c:1.4
--- src/sys/arch/arm/omap/ti_iic.c:1.3	Wed Apr 17 20:29:16 2013
+++ src/sys/arch/arm/omap/ti_iic.c	Thu Apr 25 13:04:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: ti_iic.c,v 1.3 2013/04/17 20:29:16 bouyer Exp $ */
+/* $NetBSD: ti_iic.c,v 1.4 2013/04/25 13:04:27 rkujawa Exp $ */
 
 /*
  * Copyright (c) 2013 Manuel Bouyer.  All rights reserved.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ti_iic.c,v 1.3 2013/04/17 20:29:16 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ti_iic.c,v 1.4 2013/04/25 13:04:27 rkujawa Exp $");
 
 #include "opt_omap.h"
 #include "locators.h"
@@ -301,10 +301,13 @@ ti_iic_intr(void *arg)
 	uint32_t stat;
 
 	mutex_enter(&sc->sc_mtx);
+	DPRINTF(("ti_iic_intr\n"));
 	stat = I2C_READ_REG(sc, OMAP2_I2C_IRQSTATUS);
 	I2C_WRITE_REG(sc, OMAP2_I2C_IRQSTATUS, stat);
+	DPRINTF(("ti_iic_intr pre handle sc->sc_op eq %#x\n", sc->sc_op));
 	ti_iic_handle_intr(sc, stat);
 	if (sc->sc_op == TI_I2CERROR || sc->sc_op == TI_I2CDONE) {
+		DPRINTF(("ti_iic_intr post handle sc->sc_op %#x\n", sc->sc_op));
 		cv_signal(&sc->sc_cv);
 	}
 	mutex_exit(&sc->sc_mtx);
@@ -348,7 +351,7 @@ ti_iic_exec(void *opaque, i2c_op_t op, i
 	if (cmdlen > 0) {
 		err = ti_iic_op(sc, addr, TI_I2CWRITE,
 		    __UNCONST(cmdbuf), cmdlen,
-		    I2C_OP_READ_P(op) ? 0 : I2C_F_STOP);
+		    (I2C_OP_READ_P(op) ? 0 : I2C_F_STOP) | flags);
 		if (err)
 			goto done;
 	}
@@ -386,6 +389,8 @@ ti_iic_reset(struct ti_iic_softc *sc)
 	uint32_t psc, scll, sclh;
 	int i;
 
+	DPRINTF(("ti_iic_reset\n"));
+
 	/* Disable */
 	I2C_WRITE_REG(sc, OMAP2_I2C_CON, 0);
 	/* Soft reset */
@@ -439,6 +444,8 @@ ti_iic_op(struct ti_iic_softc *sc, i2c_a
 	int err, retry;
 
 	KASSERT(op == TI_I2CREAD || op == TI_I2CWRITE);
+	DPRINTF(("ti_iic_op: addr %#x op %#x buf %p buflen %#x flags %#x\n", 
+	    addr, op, buf, (unsigned int) buflen, flags));
 
 	mask = I2C_IRQSTATUS_ARDY | I2C_IRQSTATUS_NACK | I2C_IRQSTATUS_AL;
 	if (op == TI_I2CREAD) {
@@ -487,6 +494,7 @@ ti_iic_op(struct ti_iic_softc *sc, i2c_a
 
 	if ((flags & I2C_F_POLL) == 0) {
 		/* and wait for completion */
+		DPRINTF(("ti_iic_op waiting, op %#x\n", sc->sc_op));
 		while (sc->sc_op == op) {
 			if (cv_timedwait(&sc->sc_cv, &sc->sc_mtx,
 			    mstohz(5000)) == EWOULDBLOCK) {
@@ -494,10 +502,13 @@ ti_iic_op(struct ti_iic_softc *sc, i2c_a
 				op = TI_I2CERROR;
 			}
 		}
+		DPRINTF(("ti_iic_op waiting done, op %#x\n", sc->sc_op));
+
 		/* disable interrupts */
 		I2C_WRITE_REG(sc, OMAP2_I2C_IRQENABLE_CLR, 0xffff);
 	} else {
 		/* poll for completion */
+		DPRINTF(("ti_iic_op polling, op %x\n", sc->sc_op));
 		while (sc->sc_op == op) {
 			stat = ti_iic_stat(sc, mask);
 			DPRINTF(("ti_iic_op stat 0x%x\n", stat));
@@ -509,6 +520,7 @@ ti_iic_op(struct ti_iic_softc *sc, i2c_a
 			}
 			I2C_WRITE_REG(sc, OMAP2_I2C_IRQSTATUS, stat);
 		}
+		DPRINTF(("ti_iic_op polling done, op now %x\n", sc->sc_op));
 	}
 	mutex_exit(&sc->sc_mtx);
 	retry = 10000;
@@ -526,6 +538,8 @@ ti_iic_handle_intr(struct ti_iic_softc *
 {
 	KASSERT(mutex_owned(&sc->sc_mtx));
 	KASSERT(stat != 0);
+	DPRINTF(("ti_iic_handle_intr stat %#x\n", stat));
+
 	if (stat &
 	    (I2C_IRQSTATUS_NACK|I2C_IRQSTATUS_AL)) {
 		sc->sc_op = TI_I2CERROR;
@@ -542,13 +556,13 @@ ti_iic_handle_intr(struct ti_iic_softc *
 	else
 		return;
 }
-
 void
 ti_iic_do_read(struct ti_iic_softc *sc, uint32_t stat)
 {
 	int len;
 
 	KASSERT(mutex_owned(&sc->sc_mtx));
+	DPRINTF(("ti_iic_do_read stat %#x\n", stat));
 	if (stat & I2C_IRQSTATUS_RDR) {
 		len = I2C_READ_REG(sc, OMAP2_I2C_BUFSTAT);
 		len = I2C_BUFSTAT_RXSTAT(len);
@@ -566,6 +580,7 @@ ti_iic_do_read(struct ti_iic_softc *sc, 
 		DPRINTF(("ti_iic_do_read got b[%d]=0x%x\n", sc->sc_bufidx,
 		    sc->sc_buf[sc->sc_bufidx]));
 	}
+	DPRINTF(("ti_iic_do_read done\n"));
 }
 
 void
@@ -573,6 +588,7 @@ ti_iic_do_write(struct ti_iic_softc *sc,
 {
 	int len;
 
+	DPRINTF(("ti_iic_do_write stat %#x\n", stat));
 	KASSERT(mutex_owned(&sc->sc_mtx));
 	if (stat & I2C_IRQSTATUS_XDR) {
 		len = I2C_READ_REG(sc, OMAP2_I2C_BUFSTAT);
@@ -591,6 +607,7 @@ ti_iic_do_write(struct ti_iic_softc *sc,
 		    sc->sc_bufidx, sc->sc_buf[sc->sc_bufidx]));
 		I2C_WRITE_DATA(sc, sc->sc_buf[sc->sc_bufidx]);
 	}
+	DPRINTF(("ti_iic_do_write done\n"));
 }
 
 static int
@@ -598,6 +615,7 @@ ti_iic_wait(struct ti_iic_softc *sc, uin
 {
 	int retry = 10;
 	uint16_t v;
+	DPRINTF(("ti_iic_wait mask %#x val %#x flags %#x\n", mask, val, flags));
 
 	while (((v = I2C_READ_REG(sc, OMAP2_I2C_IRQSTATUS_RAW)) & mask) != val) {
 		--retry;
@@ -613,6 +631,7 @@ ti_iic_wait(struct ti_iic_softc *sc, uin
 			kpause("tiiic", false, mstohz(50), NULL);
 		}
 	}
+	DPRINTF(("ti_iic_wait done retry %#x\n", retry));
 
 	return 0;
 }
@@ -622,18 +641,21 @@ ti_iic_stat(struct ti_iic_softc *sc, uin
 {
 	uint32_t v;
 	int retry = 500;
+	DPRINTF(("ti_iic_wait mask %#x\n", mask));
 	while (--retry > 0) {
 		v = I2C_READ_REG(sc, OMAP2_I2C_IRQSTATUS_RAW) & mask;
 		if (v != 0)
 			break;
 		delay(100);
 	}
+	DPRINTF(("ti_iic_wait done retry %#x\n", retry));
 	return v;
 }
 
 static int
 ti_iic_flush(struct ti_iic_softc *sc)
 {
+	DPRINTF(("ti_iic_flush\n"));
 #if 0
 	int retry = 1000;
 	uint16_t v;

Reply via email to