From nobody Tue Oct 20 11:47:40 2026 X-Original-To: dev-commits-src-main@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 4j89dS74hCz6wsqH for ; Tue, 20 Oct 2026 11:47:40 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j89dS65G2z4nFy for ; Tue, 20 Oct 2026 11:47:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792496860; 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=3p6v9ISraMFSfpJOPWBaw9Mr/V1bDkBV2IGVliAmFZQ=; b=aI6uu5cFWEpwzCG09FPQMzwMLweWsbf0gL9N+/Ua5h4lswVAns8YFjEvEYmTCIYeCVaK9v SEUw6Mzr68nZf9P2IUeZ8bTgVgUH2MXLw/06yirXlekM+kSam6LCcRtozYJZZLBRO5mWG8 bvM09+9NaWVc1wJCxdM9/XS+V9Oaq+QGki6qQE4MzbUCe5IRex25QXIBO9f/btlllZTXvC m21x7H91pf756GQP5ww3R9NW7jTnBJu3IMk74y3t+G9Ddvlvsou7ZF6yOw5AfmVLfL/TdO QruJTn1kSMTQwJ8tqSawqV6lQAGIfFSmyGEC9Z3E0+gWK6AMzfJ4ZkfazhR8Tg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792496860; b=Gq2Wbazqdntgo8GwUX+jUkIw0xuk82SNviNuIJ3Lo2py9ZSZCbWsj2F5niIgj7BVF5NBuj FH9pH/KTB0Je2fJ08uRYbrfaUjNEJn3Dkfoi4JnqWi083YID0EEje8pZBFVtTrFuVlFVqr ciPlYetsGD+KA9F5H3rVWo2OWieGf7UXGjhaNLiRsPZUHYXiERqpOcoUF68fVCQFm9i4hh 8ANLOYWWpM4PXXl+YS26lxCTX/dF446fZLsADz6+bk+Xm0mcwUD0XDJM0rVXqoiQuec8eN D35/JaZa0nXmUen7Bi8t9HeLTpVqHPnpVi2VhtybKSWb2FjGYj7shmVDlkJL7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792496860; 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=3p6v9ISraMFSfpJOPWBaw9Mr/V1bDkBV2IGVliAmFZQ=; b=dF+MDmJShkJBBLEkf8yZKFf8u70HvqmMZhyxDQsMglYnIwyjROBXyhcpltgJ95VHMiMEbF 5it6Zdyd/2yuUTn0Rz02cXGgLOKwlF4eG87YjA0y5HksUcvThu5vlR+85zse3EaEQR05u9 LMQbUEehJzrtSXO1oAZ9FemRrh+2uH37MGBJU08c/O2BKp5MOq4HT0J6KdS/8yyO6Z8dd1 Lmiqpn3nCuVS86RCepj6JXBYRvNZk/BfH90NyOeQkvv/+bFJ+F/VI0lMOSNTPBN50oW3bb XcsVK1A2MufmpQoW1lg28BtuI39/lZuhwBXpsvelLnt+MoelgvPH9u8FxlaWtA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j89dS5kqXz15gt for ; Tue, 20 Oct 2026 11:47:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 31986 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 20 Oct 2026 11:47:40 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Emmanuel Vadot Subject: git: 6aa2c651df0b - main - rk_spi: Do not change the clock with the driver lock held List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: manu X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6aa2c651df0b0d9e0f8693dbab09d11ecea8e1f8 Auto-Submitted: auto-generated Date: Tue, 20 Oct 2026 11:47:40 +0000 Message-Id: <6ad754dc.31986.3db4c495@gitrepo.freebsd.org> The branch main has been updated by manu: URL: https://cgit.FreeBSD.org/src/commit/?id=6aa2c651df0b0d9e0f8693dbab09d11ecea8e1f8 commit 6aa2c651df0b0d9e0f8693dbab09d11ecea8e1f8 Author: Emmanuel Vadot AuthorDate: 2026-10-20 11:35:59 +0000 Commit: Emmanuel Vadot CommitDate: 2026-10-20 11:47:20 +0000 rk_spi: Do not change the clock with the driver lock held The clock framework can sleep, it takes the clock topology sx lock. Calling clk_set_freq() and clk_get_freq() from rk_spi_hw_setup() with the driver mutex held triggers a witness warning about a sleepable lock acquired after a non-sleepable one, on the first transfer that raises the clock. Set the clock in a new function that is called before taking the lock, and only keep the register setup under the lock. --- sys/dev/spibus/controller/rockchip/rk_spi.c | 33 +++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/sys/dev/spibus/controller/rockchip/rk_spi.c b/sys/dev/spibus/controller/rockchip/rk_spi.c index db650763f6e1..788615cc40b2 100644 --- a/sys/dev/spibus/controller/rockchip/rk_spi.c +++ b/sys/dev/spibus/controller/rockchip/rk_spi.c @@ -158,6 +158,31 @@ rk_spi_set_cs(struct rk_spi_softc *sc, uint32_t cs, bool active) return (0); } +/* + * Raise the SPI clock if needed. The clock framework can sleep, so this must + * be called without the driver lock held. + */ +static void +rk_spi_set_clock(struct rk_spi_softc *sc, uint32_t freq) +{ + uint64_t max_freq; + + RK_SPI_LOCK(sc); + max_freq = sc->max_freq; + RK_SPI_UNLOCK(sc); + + /* minimum divider is 2 */ + if (max_freq >= freq * 2) + return; + + clk_set_freq(sc->clk_spi, 2 * freq, CLK_SET_ROUND_DOWN); + clk_get_freq(sc->clk_spi, &max_freq); + + RK_SPI_LOCK(sc); + sc->max_freq = max_freq; + RK_SPI_UNLOCK(sc); +} + static void rk_spi_hw_setup(struct rk_spi_softc *sc, uint32_t mode, uint32_t freq) { @@ -173,12 +198,6 @@ rk_spi_hw_setup(struct rk_spi_softc *sc, uint32_t mode, uint32_t freq) if (mode & SPIBUS_MODE_CPOL) cr0 |= CTRLR0_SCPOL; - /* minimum divider is 2 */ - if (sc->max_freq < freq*2) { - clk_set_freq(sc->clk_spi, 2 * freq, CLK_SET_ROUND_DOWN); - clk_get_freq(sc->clk_spi, &sc->max_freq); - } - div = ((sc->max_freq + freq - 1) / freq); div = (div + 1) & 0xfffe; RK_SPI_WRITE_4(sc, RK_SPI_BAUDR, div); @@ -422,6 +441,8 @@ rk_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) spibus_get_clock(child, &clock); spibus_get_mode(child, &mode); + rk_spi_set_clock(sc, clock); + RK_SPI_LOCK(sc); rk_spi_hw_setup(sc, mode, clock); rk_spi_enable_chip(sc, 1);