From owner-dev-commits-src-main@freebsd.org  Wed May 26 10:00:10 2021
Return-Path: <owner-dev-commits-src-main@freebsd.org>
Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
 by mailman.nyi.freebsd.org (Postfix) with ESMTP id F3E126381E9;
 Wed, 26 May 2021 10:00:09 +0000 (UTC) (envelope-from git@FreeBSD.org)
Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org
 [IPv6:2610:1c1:1:606c::19:3])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256
 client-signature RSA-PSS (4096 bits) client-digest SHA256)
 (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK))
 by mx1.freebsd.org (Postfix) with ESMTPS id 4Fqmf16PYBz4dBM;
 Wed, 26 May 2021 10:00:09 +0000 (UTC) (envelope-from git@FreeBSD.org)
Received: from gitrepo.freebsd.org (gitrepo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:5])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (Client did not present a certificate)
 by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C40BF6A2B;
 Wed, 26 May 2021 10:00:09 +0000 (UTC) (envelope-from git@FreeBSD.org)
Received: from gitrepo.freebsd.org ([127.0.1.44])
 by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 14QA09mj095193;
 Wed, 26 May 2021 10:00:09 GMT (envelope-from git@gitrepo.freebsd.org)
Received: (from git@localhost)
 by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 14QA09uO095190;
 Wed, 26 May 2021 10:00:09 GMT (envelope-from git)
Date: Wed, 26 May 2021 10:00:09 GMT
Message-Id: <202105261000.14QA09uO095190@gitrepo.freebsd.org>
To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org,
 dev-commits-src-main@FreeBSD.org
From: Ruslan Bukin <br@FreeBSD.org>
Subject: git: 38e7025a60b2 - main - o Fix i2c read operation for large
 transfers (more than 32 bytes). o Fix slave address setting.
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Git-Committer: br
X-Git-Repository: src
X-Git-Refname: refs/heads/main
X-Git-Reftype: branch
X-Git-Commit: 38e7025a60b28623b5991622a6efd1b8a329ccb2
Auto-Submitted: auto-generated
X-BeenThere: dev-commits-src-main@freebsd.org
X-Mailman-Version: 2.1.34
Precedence: list
List-Id: Commit messages for the main branch of the src repository
 <dev-commits-src-main.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/dev-commits-src-main>, 
 <mailto:dev-commits-src-main-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/dev-commits-src-main/>
List-Post: <mailto:dev-commits-src-main@freebsd.org>
List-Help: <mailto:dev-commits-src-main-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main>, 
 <mailto:dev-commits-src-main-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 26 May 2021 10:00:10 -0000

The branch main has been updated by br:

URL: https://cgit.FreeBSD.org/src/commit/?id=38e7025a60b28623b5991622a6efd1b8a329ccb2

commit 38e7025a60b28623b5991622a6efd1b8a329ccb2
Author:     Ruslan Bukin <br@FreeBSD.org>
AuthorDate: 2021-05-26 09:55:23 +0000
Commit:     Ruslan Bukin <br@FreeBSD.org>
CommitDate: 2021-05-26 09:55:23 +0000

    o Fix i2c read operation for large transfers (more than 32 bytes).
    o Fix slave address setting.
    
    This allows to read the EDID from an HDMI monitor.
    
    Reviewed by:    manu
    Sponsored by:   UKRI
    Differential Revision: https://reviews.freebsd.org/D27139
---
 sys/arm64/rockchip/rk_i2c.c | 33 ++++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/sys/arm64/rockchip/rk_i2c.c b/sys/arm64/rockchip/rk_i2c.c
index fa824c76003b..c54f523088fe 100644
--- a/sys/arm64/rockchip/rk_i2c.c
+++ b/sys/arm64/rockchip/rk_i2c.c
@@ -291,6 +291,7 @@ static void
 rk_i2c_intr_locked(struct rk_i2c_softc *sc)
 {
 	uint32_t reg;
+	int transfer_len;
 
 	sc->ipd = RK_I2C_READ(sc, RK_I2C_IPD);
 
@@ -324,11 +325,16 @@ rk_i2c_intr_locked(struct rk_i2c_softc *sc)
 			RK_I2C_WRITE(sc, RK_I2C_IEN, RK_I2C_IEN_MBRFIEN |
 			    RK_I2C_IEN_NAKRCVIEN);
 
-			reg = RK_I2C_READ(sc, RK_I2C_CON);
-			reg |= RK_I2C_CON_LASTACK;
-			RK_I2C_WRITE(sc, RK_I2C_CON, reg);
+			if ((sc->msg->len - sc->cnt) > 32)
+				transfer_len = 32;
+			else {
+				transfer_len = sc->msg->len - sc->cnt;
+				reg = RK_I2C_READ(sc, RK_I2C_CON);
+				reg |= RK_I2C_CON_LASTACK;
+				RK_I2C_WRITE(sc, RK_I2C_CON, reg);
+			}
 
-			RK_I2C_WRITE(sc, RK_I2C_MRXCNT, sc->msg->len);
+			RK_I2C_WRITE(sc, RK_I2C_MRXCNT, transfer_len);
 		} else {
 			sc->state = STATE_WRITE;
 			RK_I2C_WRITE(sc, RK_I2C_IEN, RK_I2C_IEN_MBTFIEN |
@@ -344,6 +350,23 @@ rk_i2c_intr_locked(struct rk_i2c_softc *sc)
 
 		if (sc->cnt == sc->msg->len)
 			rk_i2c_send_stop(sc);
+		else {
+			sc->mode = RK_I2C_CON_MODE_RX;
+			reg = RK_I2C_READ(sc, RK_I2C_CON) & \
+			    ~RK_I2C_CON_CTRL_MASK;
+			reg |= sc->mode << RK_I2C_CON_MODE_SHIFT;
+			reg |= RK_I2C_CON_EN;
+
+			if ((sc->msg->len - sc->cnt) > 32)
+				transfer_len = 32;
+			else {
+				transfer_len = sc->msg->len - sc->cnt;
+				reg |= RK_I2C_CON_LASTACK;
+			}
+
+			RK_I2C_WRITE(sc, RK_I2C_CON, reg);
+			RK_I2C_WRITE(sc, RK_I2C_MRXCNT, transfer_len);
+		}
 
 		break;
 	case STATE_WRITE:
@@ -509,7 +532,7 @@ rk_i2c_transfer(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
 					sc->mode = RK_I2C_CON_MODE_RX;
 				} else {
 					sc->mode = RK_I2C_CON_MODE_RRX;
-					reg = msgs[i].slave & LSB;
+					reg = msgs[i].slave & ~LSB;
 					reg |= RK_I2C_MRXADDR_VALID(0);
 					RK_I2C_WRITE(sc, RK_I2C_MRXADDR, reg);
 					RK_I2C_WRITE(sc, RK_I2C_MRXRADDR, 0);