From nobody Wed Aug 6 05:55:45 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 4bxffT4FRnz64DmJ; Wed, 06 Aug 2025 05:55:45 +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 4bxffT2l7vz3sHv; Wed, 06 Aug 2025 05:55:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754459745; 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=SLP+RqoECVkzOiMBiap8asqirzjlRlXcABWq7P7TaNE=; b=Q1AuJypPVZEW2POXuo7txKTt/UmYeq8n3F/qSinXwDm3rAbKR9/F6/3ai+x1LTf0cZLYLn hbr//EHGXQztPG5LZTFHDJOPMXAAdykWtyxGU++ZdsBnj8ERrHHnL9BE+hmoYVSKFGyryG VAyGuasllWXPTnBubAtRPDA9JiGRpZf/ZRLMei+c1CiK/0yULjNav6a/xENkqU7d41i5z4 qJphzLQGHsag/+hT/8RzQpVN6V3dfL8Fl6RCGiz21Afu4+Ud/xOy3Xx+xGWbE/Df7PYGS/ RMg6FEKNH+gWJiMwsSWHNnboL2yTCc0qVaAZKm6em7LWHJkJZBaGAtuyPHGkZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754459745; 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=SLP+RqoECVkzOiMBiap8asqirzjlRlXcABWq7P7TaNE=; b=CY8KpsYP3u5WZqsNuUuA4xlvmkaV9YsLcwSHOJ6N4t8UAVfAz0Jt7kdRfH5xS/DlQyFseh TqVcoNem/zbY5i25EBct27tO4g/qq+UCyVr0U/9VVhAtztvVjwGlVw2wY0/1f7Ot9b+qVC BRZW8IbmSFCteGsT2rBCI64eO84xMn/s7QKdHNb9/QT26c/Nhr/WGBbDlKxfAx9S5F810N Amj3L5WCF+4eOCPNMBYQMLmqutzNgPQDs825AjzhKwgykg0QTNYfbGir6A4ulPGpISHXJB EPCJJydJTB8FELQQEdYM8Al34qNfJnpzl4eXkNqnpR1N8COtA/7EJkUpdITToQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754459745; a=rsa-sha256; cv=none; b=nlpps/0OeAnlOi8UGhTH8nrtgqeCcFYg4NQAwU1z40i9mI25yNAltajLte1VtLEnxcL1S7 /LfxkWloe/tDeMIaiJcaqOJYxhEGlnc0LhQXPJHRIL0xakcAWr/t+aAB6SLH05Nk4rserO qWJax22/uWAZJ54A2QBQc3KzB07DwGAhhOz0aLmiQOt/Anyj/gF+WMUvayGjBiER+FYSsd 6JK4I8cYT/+5PZVZtcsoXtGd0J0/bHBI4Ocp/D8X7oS097OiYYV5N5TluNua6funB84ZCz I8kP10CKTo/69/XZJ5kbFSswwE9VcmoJSM8hRPqw3nXJ/SZeAUy46djNmt/4mQ== 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 4bxffT2Kh5z17Jl; Wed, 06 Aug 2025 05:55:45 +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 5765tjS8058276; Wed, 6 Aug 2025 05:55:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5765tjfN058273; Wed, 6 Aug 2025 05:55:45 GMT (envelope-from git) Date: Wed, 6 Aug 2025 05:55:45 GMT Message-Id: <202508060555.5765tjfN058273@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: e71f019b82f4 - stable/13 - 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/13 X-Git-Reftype: branch X-Git-Commit: e71f019b82f4d4e623fa75aca647cf7103d89b54 Auto-Submitted: auto-generated The branch stable/13 has been updated by avg: URL: https://cgit.FreeBSD.org/src/commit/?id=e71f019b82f4d4e623fa75aca647cf7103d89b54 commit e71f019b82f4d4e623fa75aca647cf7103d89b54 Author: Andriy Gapon AuthorDate: 2024-06-27 07:40:22 +0000 Commit: Andriy Gapon CommitDate: 2025-08-06 05:55:24 +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). (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 cfaf3c7f871a..d2f1c2fc4a5b 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);