From nobody Wed Aug 6 05:55:06 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bxfdk347Pz64DTv; Wed, 06 Aug 2025 05:55:06 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bxfdk2JBrz3rXR; Wed, 06 Aug 2025 05:55:06 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754459706; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=EY02oAqUJNCvOM7a7dy1bzVSMo1ednkAmkCe/nDI5Zc=; b=OCFhUoo+9f3sCUPRO34fZBhkMlokQq0rncYOcfd1PeIxc4gpJrVThyq8OT+CYjXHcytouZ yoKW8khS/rnjHYqRh8EOOg5BZ/f7Npr9fa36W9JRYkFZ267BYbtYKMHdtwgo+M/U3Nnp5V lJLpa+uIa4UIZVpUJPZS2jQPK9Y80WCUE2Eve2MACBBZMR9Jz7XXNZI+BVUUCOA10I4juX BIYBxtA6M+SOQHC1RHfS98PUWWxOFwu6FRejlGZmyQVlhNMR9gfzcX3hGmu4r7DqSqX2zZ rr9JVMMEH6vvfnVDOWfVB+Z0SO3AO6NZ0xxnbR44QEGiiLvLoFJRuDGiRb0zjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754459706; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=EY02oAqUJNCvOM7a7dy1bzVSMo1ednkAmkCe/nDI5Zc=; b=b7zcZTmsRCo1FYsgfEx1Z7OMeqdENK9g1D3BuD9lWFDYDJXQf0kawOpGRh7zf31bdxiYow vYCSSf7LY8OqDBPRhud4sqbv4/+Fo987gJZKdH0xIF9CRTRi8CJ3MrptEaFEp2+6aczlBA I+5a+iMGtu+O17mvMvjP4Ak6ElWFo8jndXvq8JwVfg19Rn7ZItX0K3WnqX2CKOQaJnouA+ 9/MclHej9c+p302zx+O6V0qrAf8FsjsjO0bd5z43cV1XfVLJ1keZmq67D0k3BZFoYYpSM4 Iyp9jIMnOeNjzw8TIBezrzzydDBeUMof2D1VseiHMvPrXMyxN2zXAU6gSihWyg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754459706; a=rsa-sha256; cv=none; b=yu0qJkRpUq2m/Mx1YT5iGFijY473GpLnoD0q0vl3uqQM5a7Sy2xGM5tMZIMtpFfSId4aYO oVu/Ar9hd1DMyyi6llR8vBK2afPi+HDPx8K1T6kKZ4OgP0eFs9ZVcgx5jRxuk02DHZtvZX BuY6V/kY2kCYZN9haxB+En92yQrwkFNnplJOf3V8cIBtpGAdMvnKC+BYDXcNerYcy7I/n1 a4ixad1wRQPJXwoXuyF2cfYTCnD0zRLMa+g8H1k35J3r8jXnnd0Z6NCZXI3Zk9vLjxIiuu 64LUZlBrc9uc3ZA8xASR64wCgffaoDiL4OESCa1PXoxwE2ROFehdKJLjTx+zdQ== 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 4bxfdk1sL1z172q; Wed, 06 Aug 2025 05:55:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5765t6al057956; Wed, 6 Aug 2025 05:55:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5765t6mL057953; Wed, 6 Aug 2025 05:55:06 GMT (envelope-from git) Date: Wed, 6 Aug 2025 05:55:06 GMT Message-Id: <202508060555.5765t6mL057953@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Andriy Gapon Subject: git: 640979856fc8 - stable/14 - rk_i2c: emulate repeated start List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: avg X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 640979856fc8d9c2abf1dd78d68f016d265abc5c Auto-Submitted: auto-generated The branch stable/14 has been updated by avg: URL: https://cgit.FreeBSD.org/src/commit/?id=640979856fc8d9c2abf1dd78d68f016d265abc5c commit 640979856fc8d9c2abf1dd78d68f016d265abc5c Author: Andriy Gapon AuthorDate: 2024-06-27 07:40:22 +0000 Commit: Andriy Gapon CommitDate: 2025-08-06 05:54:22 +0000 rk_i2c: emulate repeated start rk_i2c_send_stop is modified so that it sends a stop condition, like it always did, if there is no IIC_M_NOSTOP flag. But if the flag is set then the function completely resets the control register and sets the driver state to transfer completed. Something like this was previously done for a write with IIC_M_NOSTOP. Now it is done for a read with IIC_M_NOSTOP as well. Linux code says that the hardware does not support the repeated start condition and the documentation, indeed, does not mention it. But according to the Linux driver clearing the control register and then sending a start condition acts as if it were a repeated start. While here, add braces around a single-line 'if' branch to balance it with a multi-line 'else' branch. Tested with max44009(4). MFC after: 2 weeks (cherry picked from commit 0deaf4be346f7f343bd2cf771bbf5d172d1c0d2a) --- sys/arm64/rockchip/rk_i2c.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/sys/arm64/rockchip/rk_i2c.c b/sys/arm64/rockchip/rk_i2c.c index 608b9782d787..ea32f52876be 100644 --- a/sys/arm64/rockchip/rk_i2c.c +++ b/sys/arm64/rockchip/rk_i2c.c @@ -282,13 +282,26 @@ rk_i2c_send_stop(struct rk_i2c_softc *sc) { uint32_t reg; - RK_I2C_WRITE(sc, RK_I2C_IEN, RK_I2C_IEN_STOPIEN); + if (!(sc->msg->flags & IIC_M_NOSTOP)) { + RK_I2C_WRITE(sc, RK_I2C_IEN, RK_I2C_IEN_STOPIEN); - sc->state = STATE_STOP; + sc->state = STATE_STOP; - reg = RK_I2C_READ(sc, RK_I2C_CON); - reg |= RK_I2C_CON_STOP; - RK_I2C_WRITE(sc, RK_I2C_CON, reg); + reg = RK_I2C_READ(sc, RK_I2C_CON); + reg |= RK_I2C_CON_STOP; + RK_I2C_WRITE(sc, RK_I2C_CON, reg); + } else { + /* + * Do not actually set stop bit, set up conditions to + * emulate repeated start by clearing all state. + */ + sc->state = STATE_IDLE; + sc->transfer_done = 1; + + reg = RK_I2C_READ(sc, RK_I2C_CON); + reg &= ~RK_I2C_CON_CTRL_MASK; + RK_I2C_WRITE(sc, RK_I2C_CON, reg); + } } static void @@ -351,9 +364,9 @@ rk_i2c_intr_locked(struct rk_i2c_softc *sc) case STATE_READ: rk_i2c_drain_rx(sc); - if (sc->cnt == sc->msg->len) + if (sc->cnt == sc->msg->len) { rk_i2c_send_stop(sc); - else { + } else { sc->mode = RK_I2C_CON_MODE_RX; reg = RK_I2C_READ(sc, RK_I2C_CON) & \ ~RK_I2C_CON_CTRL_MASK; @@ -370,7 +383,6 @@ rk_i2c_intr_locked(struct rk_i2c_softc *sc) RK_I2C_WRITE(sc, RK_I2C_CON, reg); RK_I2C_WRITE(sc, RK_I2C_MRXCNT, transfer_len); } - break; case STATE_WRITE: if (sc->cnt < sc->msg->len) { @@ -379,12 +391,10 @@ rk_i2c_intr_locked(struct rk_i2c_softc *sc) RK_I2C_IEN_NAKRCVIEN); transfer_len = rk_i2c_fill_tx(sc); RK_I2C_WRITE(sc, RK_I2C_MTXCNT, transfer_len); - break; - } else if (!(sc->msg->flags & IIC_M_NOSTOP)) { + } else { rk_i2c_send_stop(sc); - break; } - /* passthru */ + break; case STATE_STOP: /* Disable stop bit */ reg = RK_I2C_READ(sc, RK_I2C_CON);