Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Jun 2017 18:38:52 +0000 (UTC)
From:      Luiz Otavio O Souza <loos@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r320161 - head/sys/dev/iicbus/twsi
Message-ID:  <201706201838.v5KIcqek075530@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: loos
Date: Tue Jun 20 18:38:51 2017
New Revision: 320161
URL: https://svnweb.freebsd.org/changeset/base/320161

Log:
  Always ignore the START and STOP bits whenever the control register is
  being overwritten, they are set only bits (cleared by hardware).
  
  Disable the Acknowledge of the controller slave address.  The slave mode is
  not supported.
  
  Make sure the interrupt flag bit is being cleared as recommended, add a
  delay() _after_ clear the interrupt bit.
  
  Sponsored by:	Rubicon Communications, LLC (Netgate)

Modified:
  head/sys/dev/iicbus/twsi/twsi.c

Modified: head/sys/dev/iicbus/twsi/twsi.c
==============================================================================
--- head/sys/dev/iicbus/twsi/twsi.c	Tue Jun 20 18:29:01 2017	(r320160)
+++ head/sys/dev/iicbus/twsi/twsi.c	Tue Jun 20 18:38:51 2017	(r320161)
@@ -114,6 +114,7 @@ twsi_control_clear(struct twsi_softc *sc, uint32_t mas
 	uint32_t val;
 
 	val = TWSI_READ(sc, sc->reg_control);
+	val &= ~(TWSI_CONTROL_STOP | TWSI_CONTROL_START);
 	val &= ~mask;
 	TWSI_WRITE(sc, sc->reg_control, val);
 }
@@ -124,6 +125,7 @@ twsi_control_set(struct twsi_softc *sc, uint32_t mask)
 	uint32_t val;
 
 	val = TWSI_READ(sc, sc->reg_control);
+	val &= ~(TWSI_CONTROL_STOP | TWSI_CONTROL_START);
 	val |= mask;
 	TWSI_WRITE(sc, sc->reg_control, val);
 }
@@ -204,8 +206,8 @@ twsi_locked_start(device_t dev, struct twsi_softc *sc,
 	}
 
 	TWSI_WRITE(sc, sc->reg_data, slave);
-	DELAY(1000);
 	twsi_clear_iflg(sc);
+	DELAY(1000);
 
 	if (twsi_poll_ctrl(sc, timeout, TWSI_CONTROL_IFLG)) {
 		debugf("timeout sending slave address\n");
@@ -251,7 +253,7 @@ twsi_reset(device_t dev, u_char speed, u_char addr, u_
 	TWSI_WRITE(sc, sc->reg_soft_reset, 0x0);
 	DELAY(2000);
 	TWSI_WRITE(sc, sc->reg_baud_rate, param);
-	TWSI_WRITE(sc, sc->reg_control, TWSI_CONTROL_TWSIEN | TWSI_CONTROL_ACK);
+	TWSI_WRITE(sc, sc->reg_control, TWSI_CONTROL_TWSIEN);
 	DELAY(1000);
 	mtx_unlock(&sc->mutex);
 
@@ -266,9 +268,10 @@ twsi_stop(device_t dev)
 	sc = device_get_softc(dev);
 
 	mtx_lock(&sc->mutex);
+	twsi_control_clear(sc, TWSI_CONTROL_ACK);
 	twsi_control_set(sc, TWSI_CONTROL_STOP);
-	DELAY(1000);
 	twsi_clear_iflg(sc);
+	DELAY(1000);
 	mtx_unlock(&sc->mutex);
 
 	return (IIC_NOERR);
@@ -341,8 +344,8 @@ twsi_read(device_t dev, char *buf, int len, int *read,
 		else
 			twsi_control_set(sc, TWSI_CONTROL_ACK);
 
-		DELAY (1000);
 		twsi_clear_iflg(sc);
+		DELAY(1000);
 
 		if (twsi_poll_ctrl(sc, delay, TWSI_CONTROL_IFLG)) {
 			debugf("timeout reading data\n");
@@ -382,6 +385,7 @@ twsi_write(device_t dev, const char *buf, int len, int
 		TWSI_WRITE(sc, sc->reg_data, *buf++);
 
 		twsi_clear_iflg(sc);
+		DELAY(1000);
 		if (twsi_poll_ctrl(sc, timeout, TWSI_CONTROL_IFLG)) {
 			debugf("timeout writing data\n");
 			rv = IIC_ETIMEOUT;



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