From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 604E5CD8CB2 for ; Wed, 10 Jun 2026 15:34:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=5P+K2RjY++5TAh+Ftyu/REm6223YzAaRP7VOsWI2Hg4=; b=3b2K03yJ1P7mU6 vWnEJNbUa9kG3LYYhSWOGGua9vk2ZtTXGlDFQT2rM5yUgRaROL9UTtNr0x2w1D8Ln3+RL8hZ524kN CBwKfDNUea7Or4OPCjgtevDQ/yXJ37tgw1GzGA9K8ISmQcd97wdTPlb/dn8WYko4wz6GU7Oz8EwUL 0oz34KpFqstOsVnu9sSvJ7AT/8jyRK0pTgoxbaRUIO+o9GRIXnj14peZ+D0VYDaGw8GWLvugvV++e xXBRY8MasRdSzwfB83b0zSUKHi/JxVBGYmelA5hxpPsSLHorKATtSgd9WWLualDw10eeC+XW9b0Rk n0UuRhgemG7HKSVF3GFw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wXKwk-000000081uW-2XqU; Wed, 10 Jun 2026 15:34:26 +0000 Received: from mx.adeep.su ([185.250.0.168]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wXKwh-000000081u8-3sqa; Wed, 10 Jun 2026 15:34:26 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 003B6176A2A; Wed, 10 Jun 2026 18:34:03 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baodeep.com; s=dkim; t=1781105658; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding; bh=wWnMIfRoPEPairQ9ngOUWFlbPHVSKvx5vY/dr6ad4k4=; b=V6EMpbO2Bb3ARZsvqwyY97TkfCoZYL2xO4Iz0o5bbtiiWbHYw+4vzh4fHA2v9Zj8JxnkaE csPVm7SSVcH1F1blcmNBUPk1cbWnbYDxEI8vXymB0LmwlQqE3Sq+bEyRJ67yUaYuPdBGUR nGLQa9sx1/+II/MlFDB0zLxoXkBIqUp1N8g/PzqOX4saB+OHoMztZ6lPgpF0vDnzT4ghmb NBqObMmumjBlCRpBz54Rvib3JeK0UA4AyUKd7mSWLX8TcEhQLsxW+pKXJESHIXOzEBHAaA cqtXXMLEwMl66oBXWzu65atkZPN/bv9SYPcE0ALQZK51hXLxVzDtUgzP7v8TSg== From: Viacheslav Bocharov To: Linus Walleij , Bartosz Golaszewski Cc: Neil Armstrong , Kevin Hilman , Jerome Brunet , Martin Blumenstingl , Marek Szyprowski , Robin Murphy , Diederik de Haas , linux-gpio@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 0/2] gpio: fix sleeping-in-atomic in shared-proxy; restore meson non-sleeping Date: Wed, 10 Jun 2026 18:32:09 +0300 Message-ID: <20260610153329.937833-1-v@baodeep.com> X-Mailer: git-send-email 2.54.0 MIME-Version: 1.0 X-Last-TLS-Session-Version: TLSv1.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260610_083424_473455_6BFA6022 X-CRM114-Status: GOOD ( 10.07 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org gpio-shared-proxy chooses its descriptor lock (mutex vs spinlock) from the underlying chip's can_sleep, but under that lock it calls config and direction ops that reach sleeping pinctrl paths. On a controller with non-sleeping MMIO value ops the lock is a spinlock, so a sleeping call runs from atomic context: BUG: sleeping function called from invalid context ... pinctrl_gpio_set_config <- gpiochip_generic_config <- gpio_shared_proxy_set_config (voting spinlock held) <- ... <- mmc_pwrseq_simple_probe This was reported on Khadas VIM3 and worked around for Amlogic by commit 28f240683871 ("pinctrl: meson: mark the GPIO controller as sleeping"), which marked the whole meson controller sleeping. That workaround broke atomic value-path consumers: w1-gpio (1-Wire bitbang) no longer detects devices, because its IRQ-disabled read slot calls the non-cansleep gpiod_*_value() and now hits WARN_ON(can_sleep) per bit. Patch 1 fixes the proxy locking generically (always a sleeping mutex). Patch 2 then restores meson can_sleep=false, fixing 1-Wire. Patch 1 has a trade-off: a proxied GPIO becomes sleeping, so consumers gating on gpiod_cansleep() change behaviour. No current device needs atomic (non-cansleep) value access on a shared GPIO -- every report (Khadas VIM3, ODROID-M1, my test on JetHub D1+) is a shared reset line (eMMC/SDIO pwrseq or PCIe reset) driven through the cansleep accessors, which is what the proxy exists to vote on. An alternative that keeps atomic value access (split locking) is possible but adds a second lock and new race windows. I went with the simpler, verified approach and would appreciate guidance on whether the atomic value path must be preserved. The two are a unit: patch 2 must not be applied without patch 1, otherwise the original VIM3 splat returns on boards that share a meson GPIO -- please keep the order. I have not Cc'd stable; I will request stable backports separately once both patches have landed. Viacheslav Bocharov (2): gpio: shared-proxy: always serialize with a sleeping mutex pinctrl: meson: restore non-sleeping GPIO access drivers/gpio/gpio-shared-proxy.c | 43 ++++++--------------------- drivers/gpio/gpiolib-shared.c | 9 ++---- drivers/gpio/gpiolib-shared.h | 31 ++++++++----------- drivers/pinctrl/meson/pinctrl-meson.c | 2 +- 4 files changed, 24 insertions(+), 61 deletions(-) -- 2.54.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic