svn commit: r268210 - stable/10/sys/dev/glxiic
Daichi GOTO
daichi at FreeBSD.org
Thu Jul 3 10:59:43 UTC 2014
Author: daichi (ports committer)
Date: Thu Jul 3 10:59:42 2014
New Revision: 268210
URL: http://svnweb.freebsd.org/changeset/base/268210
Log:
MFC: r267852
Fixed an IIC timing issue between the glxiic master and a slave of
peripheral devices. When transmitting (rx) from slave to master,
sometimes nAKC delays. As a result, some slaves fails their
transmission.
Submitted by: Masanori OZAWA <ozawa at ongs.co.jp>
Reviewed by: brix
Modified:
stable/10/sys/dev/glxiic/glxiic.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/glxiic/glxiic.c
==============================================================================
--- stable/10/sys/dev/glxiic/glxiic.c Thu Jul 3 10:49:46 2014 (r268209)
+++ stable/10/sys/dev/glxiic/glxiic.c Thu Jul 3 10:59:42 2014 (r268210)
@@ -711,6 +711,7 @@ static int
glxiic_state_master_addr_callback(struct glxiic_softc *sc, uint8_t status)
{
uint8_t slave;
+ uint8_t ctrl1;
GLXIIC_ASSERT_LOCKED(sc);
@@ -746,6 +747,13 @@ glxiic_state_master_addr_callback(struct
bus_write_1(sc->smb_res, GLXIIC_SMB_SDA, slave);
+ if ((sc->msg->flags & IIC_M_RD) != 0 && sc->ndata == 1) {
+ /* Last byte from slave, set NACK. */
+ ctrl1 = bus_read_1(sc->smb_res, GLXIIC_SMB_CTRL1);
+ bus_write_1(sc->smb_res, GLXIIC_SMB_CTRL1,
+ ctrl1 | GLXIIC_SMB_CTRL1_ACK_BIT);
+ }
+
return (IIC_NOERR);
}
@@ -811,13 +819,6 @@ glxiic_state_master_rx_callback(struct g
return (IIC_ENOACK);
}
- if (sc->ndata == 1) {
- /* Last byte from slave, set NACK. */
- ctrl1 = bus_read_1(sc->smb_res, GLXIIC_SMB_CTRL1);
- bus_write_1(sc->smb_res, GLXIIC_SMB_CTRL1,
- ctrl1 | GLXIIC_SMB_CTRL1_ACK_BIT);
- }
-
if ((status & GLXIIC_SMB_STS_STASTR_BIT) != 0) {
/* Bus is stalled, clear and wait for data. */
bus_write_1(sc->smb_res, GLXIIC_SMB_STS,
@@ -837,6 +838,13 @@ glxiic_state_master_rx_callback(struct g
return (glxiic_state_table[sc->state].callback(sc, status));
}
+ if (sc->ndata == 1) {
+ /* Last byte from slave, set NACK. */
+ ctrl1 = bus_read_1(sc->smb_res, GLXIIC_SMB_CTRL1);
+ bus_write_1(sc->smb_res, GLXIIC_SMB_CTRL1,
+ ctrl1 | GLXIIC_SMB_CTRL1_ACK_BIT);
+ }
+
glxiic_start_timeout_locked(sc);
return (IIC_NOERR);
More information about the svn-src-stable
mailing list