From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6655731BCAE; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=Xv9uo+10hcpvptOZECQvg86GcwmqRzILit1zNOQpyTGzXXH73uNb+OY82WH1yXidzqy70HvkZDlYQiQAC42v4sEIsyw2oJyKDtdIxAgTtkIeUPCZC1ltmtvDLG9Np4JFiO8LxuCOSAE1gMItRDLlCTrP0AstHTovNF3HkktPgCU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=Syz9agCjo0v7ek7ZUl8IDRv5CIYKzs5t99pAAWh8o7Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cbSeOr3cAgbAf2DWNvmnHfxjunAZ+9RVZApX1gA2y1ipkHMorHHMkWC14sJDLZY1PaWUlChUDE1G3GcVKjCJ/yWodMX95PnYBq8OvQhErITjdtiUrs9ItGoj/SaZDN0XsNsfimmT/ePVUv4+SFuoTc76Hut40z6qCWXgwGL4XaI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lLqs0GVM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lLqs0GVM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 249D2C4AF09; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=Syz9agCjo0v7ek7ZUl8IDRv5CIYKzs5t99pAAWh8o7Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lLqs0GVMLLCptnQypnTSmCyxArTXWwcl2P94VKpfYL2luahviZpwXjwxm4SVPjFmP n+Nzp8IubS4ZtvPJ7HiXVznR64zW27v/lbtDGAe43dLAF0OxFzzwtaXotCN2yNI1X0 wb5Htxsr9VE06+Gzgz/I1ENnXrx31QAmtPH3MIuLrVcL6XJqGLLGzzFpmNuUTMU36U zJqVczTW9NBI/C3abuBtiiPNodbRCsyGqMtmUSUQAp7BdU5Jj0mQJYNc/JmbZqX0kT 1QNro4tFaYdUKdNZIGTZ0uQdUYfHgxiC4BBLO/sH7bYJxdQOzxHKqQIlTJPSSPBUKt bjTa6dMQz6UVg== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7J-00000001ah0-42SO; Fri, 08 May 2026 11:03:29 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org, Benjamin Tissoires Subject: [PATCH v2 1/9] i2c: core: fix irq domain leak on adapter registration failure Date: Fri, 8 May 2026 11:03:03 +0200 Message-ID: <20260508090311.379333-2-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make sure to tear down the host notify irq domain on adapter registration failure to avoid leaking it. This issue was flagged by Sashiko when reviewing another adapter registration fix. Fixes: 4d5538f5882a ("i2c: use an IRQ to report Host Notify events, not ale= rt") Cc: stable@vger.kernel.org # 4.10 Cc: Benjamin Tissoires Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 9c46147e3506..abe8341c1d6e 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1574,7 +1574,7 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) if (res) { pr_err("adapter '%s': can't register device (%d)\n", adap->name, res); put_device(&adap->dev); - goto out_list; + goto err_remove_irq_domain; } =20 adap->debugfs =3D debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_ro= ot); @@ -1609,6 +1609,8 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) init_completion(&adap->dev_released); device_unregister(&adap->dev); wait_for_completion(&adap->dev_released); +err_remove_irq_domain: + i2c_host_notify_irq_teardown(adap); out_list: mutex_lock(&core_lock); idr_remove(&i2c_adapter_idr, adap->nr); --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 664D03168EE; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=CxCl18B3Kv3dR9XV3dwULOPpnq2BILAMx9NqPNC91uaBpoNQtdqvVypqtM96ze4JzGV9/U3ZFv0mDgft9G3BI4DbM0auSBI3rnC2fXpqty35+kEyYfVGh+bxEUvKlnEAiyHVlqI4ImgFrnBYP1bj18bv7s9RFtfMgkj3Qh8OWWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=iWOJMFzk81mc01UCHmR2eS+IPYYYlYe4517FrK8gdpc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CpQY+4DsjiZCzy3wo4qckkXRQmMYf4qlP/706W8FFep4I/6xVdshujGa5FySMfbI+aM/qn3g1hkQbirDTYZMG7Hmc7EkjAvqghOeOTcTmc5S+iT4YWrJQmgtDAR3CPcuesUcsNxdjo9vgmVi7o9eRvPoSYCSizl6523y60I2XwE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PbCEH/SV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PbCEH/SV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 21C2DC2BCC7; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=iWOJMFzk81mc01UCHmR2eS+IPYYYlYe4517FrK8gdpc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PbCEH/SVJOl3yT2Vmiek8Wf8cjsfZ/SgELzFV5uBjRDyNcLTPMocA95c7C4rwEHRl l9rftj8wG2jtU2/U0XhtRqZMDb99TCZEhQdLHe8OxHp/S6fSzroJ0uOLQRFjqjpZAx 3cFbCgP6H2PKeVYo1qf8thtrjI44+j9tSC75sQ3gvJ+2dpSQb+/hhqwGWUWRc9Ovrz fj32iFRpXZPdERdMladQdxyxFsk2P6JAOewZ5PbK8g6CaiPf78HHcQCr7RjTNl8gyM Av+zfPILSH1otArlRk+woU58QIHe7dm/9rh1ts2eMFuGAvy3dKnijowlF6SdOJIUzu WGk6DHPCKTG8w== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7J-00000001ah2-45ME; Fri, 08 May 2026 11:03:29 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org, Phil Reid Subject: [PATCH v2 2/9] i2c: core: fix hang on adapter registration failure Date: Fri, 8 May 2026 11:03:04 +0200 Message-ID: <20260508090311.379333-3-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Clients may be registered from bus notifier callbacks when the adapter is registered. On a subsequent error during registration, the adapter references taken by such clients prevent the wait for the references to be released from ever completing. Fix this by refactoring client deregistration and deregistering also on late adapter registration failures. Fixes: f8756c67b3de ("i2c: core: call of_i2c_setup_smbus_alert in i2c_regis= ter_adapter") Cc: stable@vger.kernel.org # 4.15 Cc: Phil Reid Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 49 ++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index abe8341c1d6e..e42851a10098 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -63,6 +63,7 @@ static DEFINE_MUTEX(core_lock); static DEFINE_IDR(i2c_adapter_idr); =20 +static void i2c_deregister_clients(struct i2c_adapter *adap); static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driv= er); =20 static DEFINE_STATIC_KEY_FALSE(i2c_trace_msg_key); @@ -1605,6 +1606,7 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) return 0; =20 out_reg: + i2c_deregister_clients(adap); debugfs_remove_recursive(adap->debugfs); init_completion(&adap->dev_released); device_unregister(&adap->dev); @@ -1746,29 +1748,10 @@ static int __process_removed_adapter(struct device_= driver *d, void *data) return 0; } =20 -/** - * i2c_del_adapter - unregister I2C adapter - * @adap: the adapter being unregistered - * Context: can sleep - * - * This unregisters an I2C adapter which was previously registered - * by @i2c_add_adapter or @i2c_add_numbered_adapter. - */ -void i2c_del_adapter(struct i2c_adapter *adap) +static void i2c_deregister_clients(struct i2c_adapter *adap) { - struct i2c_adapter *found; struct i2c_client *client, *next; =20 - /* First make sure that this adapter was ever added */ - mutex_lock(&core_lock); - found =3D idr_find(&i2c_adapter_idr, adap->nr); - mutex_unlock(&core_lock); - if (found !=3D adap) { - pr_debug("attempting to delete unregistered adapter [%s]\n", adap->name); - return; - } - - i2c_acpi_remove_space_handler(adap); /* Tell drivers about this removal */ mutex_lock(&core_lock); bus_for_each_drv(&i2c_bus_type, NULL, adap, @@ -1794,6 +1777,32 @@ void i2c_del_adapter(struct i2c_adapter *adap) * them up properly, so we give them a chance to do that first. */ device_for_each_child(&adap->dev, NULL, __unregister_client); device_for_each_child(&adap->dev, NULL, __unregister_dummy); +} + +/** + * i2c_del_adapter - unregister I2C adapter + * @adap: the adapter being unregistered + * Context: can sleep + * + * This unregisters an I2C adapter which was previously registered + * by @i2c_add_adapter or @i2c_add_numbered_adapter. + */ +void i2c_del_adapter(struct i2c_adapter *adap) +{ + struct i2c_adapter *found; + + /* First make sure that this adapter was ever added */ + mutex_lock(&core_lock); + found =3D idr_find(&i2c_adapter_idr, adap->nr); + mutex_unlock(&core_lock); + if (found !=3D adap) { + pr_debug("attempting to delete unregistered adapter [%s]\n", adap->name); + return; + } + + i2c_acpi_remove_space_handler(adap); + + i2c_deregister_clients(adap); =20 /* device name is gone after device_unregister */ dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F559382F26; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=SMlzjyD9Dm/onkCaLy9G+7UOqFQESHo2grLjbssV/eRcXhmnP1nkNAoIXagE6i++s9ZQxoRGhyuAvwo3mIdfU4cl53nrXiljRYj2Qs/gNarLyWVOYYHkK/zy8OWzP1kwm1VuBJfdIVnDIXdypT6mN+2dtegfCM43GvdYcsCSUYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=N46uGMjt3fV1Z3PaiSqd3/q7oyJsZAsXz0u+Q9Byvuk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Np+kTErop+8Yga6DZ38NCMzNKHe5Bh3Ri5ViJDTY4ilmvEgoytJkSkcJ7IQsKCA9Jj9K0KQGRRBg/feiSfsNwW1TqgZuwWuVbna7XdeNYEU5BivQR3hNMzWAeUXdFTwKE85qu7wczECzIFqgL/WqV++dSiIHlijujhvUJL+lmHg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NvGBQGJz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NvGBQGJz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2BB02C2BCF4; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=N46uGMjt3fV1Z3PaiSqd3/q7oyJsZAsXz0u+Q9Byvuk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NvGBQGJz0hGMPHiCu9Trw0Fvy5atrFdFSZyWy4UUcp1vBxTMv6I6C8QZa1FwTRmTY ISXYcL/blEL8VGoL0w6yzr2gcYkZAikdF+ErO448HZVzUeLEFHXGL20272S4LOuGiz 8jOD7HoElIEDhJsbxgjMHoXjqqBaB2xarAW+edfgOPgxOfup5puKapr6yTkSY0df4F X7B0as3ANodLYZW9cBGzfFVIxvtKT4EhjWcM3Tqp0RRsgKWREALtG0jTWdwhXWc3EZ YZVt16tgrXNl18xh7W8HvV6HDNp+BsWszE85nWPB7uTrP00ZEyeVWVfijC5kFBdzGq TBiuUGMtxrh+g== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7J-00000001ah4-48g6; Fri, 08 May 2026 11:03:29 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org, Codrin Ciubotariu Subject: [PATCH v2 3/9] i2c: core: fix adapter probe deferral loop Date: Fri, 8 May 2026 11:03:05 +0200 Message-ID: <20260508090311.379333-4-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drivers must not probe defer after having registered devices as that will trigger a probe loop if the devices bind to a driver (cf. commit fbc35b45f9f6 ("Add documentation on meaning of -EPROBE_DEFER")). Move the recovery initialisation, where the GPIO lookup may fail, before registering the adapter to prevent this. Fixes: 75820314de26 ("i2c: core: add generic I2C GPIO recovery") Cc: stable@vger.kernel.org # 5.9 Cc: Codrin Ciubotariu Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index e42851a10098..1caaa3b3ee10 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1562,6 +1562,10 @@ static int i2c_register_adapter(struct i2c_adapter *= adap) adap->dev.type =3D &i2c_adapter_type; device_initialize(&adap->dev); =20 + res =3D i2c_init_recovery(adap); + if (res =3D=3D -EPROBE_DEFER) + goto err_put_adap; + /* * This adapter can be used as a parent immediately after device_add(), * setup runtime-pm (especially ignore-children) before hand. @@ -1574,8 +1578,7 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) res =3D device_add(&adap->dev); if (res) { pr_err("adapter '%s': can't register device (%d)\n", adap->name, res); - put_device(&adap->dev); - goto err_remove_irq_domain; + goto err_put_adap; } =20 adap->debugfs =3D debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_ro= ot); @@ -1584,10 +1587,6 @@ static int i2c_register_adapter(struct i2c_adapter *= adap) if (res) goto out_reg; =20 - res =3D i2c_init_recovery(adap); - if (res =3D=3D -EPROBE_DEFER) - goto out_reg; - dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); =20 /* create pre-declared device nodes */ @@ -1608,10 +1607,12 @@ static int i2c_register_adapter(struct i2c_adapter = *adap) out_reg: i2c_deregister_clients(adap); debugfs_remove_recursive(adap->debugfs); + device_del(&adap->dev); +err_put_adap: init_completion(&adap->dev_released); - device_unregister(&adap->dev); + put_device(&adap->dev); wait_for_completion(&adap->dev_released); -err_remove_irq_domain: + i2c_host_notify_irq_teardown(adap); out_list: mutex_lock(&core_lock); --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 664262D8391; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=k0fsr2xVM74gjU3LgA0+/GshZVU2IywKXaZCFYToV1xFQHcDTmGB9oaWT3PckMZ5dy6ewdUJHD4W6YKaSCBJaYEKQmBel7RvDfKBIzVKFugUF7pUtfao+QqTr/0de7EcTYO1Oosb+4b/7KOkaOSCaThjrQMXB8raa4X7D0UEdPg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=siKm5KHJA/JlSh2Msa+A6N5LZ92TKWBw13MPlkjC1dk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gzwyKj9UoFzmuw+E9wPWXxf5QvdoXs54lUJFLyp5EqcTX3zA8jfY+PhXH+DkB15Da+scYhwvsQWkNuraDsFhqh0GlAsfzLfehbzC7cvQ4Pt26cfgA/JWXXoCPEjcJxL3DuQs+vOUXuACf6Ug9Kcen3+xw6FMBsImgQi5iV7WUqI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=a6i+fa10; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="a6i+fa10" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1FA6BC2BCB8; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=siKm5KHJA/JlSh2Msa+A6N5LZ92TKWBw13MPlkjC1dk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a6i+fa10mMooorcTB338XrM/ArerOZRqt9iWDE2c2iCrmXubtUFXEVQjoov5ORiGA KGMmpVWH5ekQDRvNLNP9qDdpSTSMQWEGsL4JakMFtypzo0zQctCag/79ZGeGPZBMEk w2MiHJCbDzzIM7sNhM6mOf+nVH+xJ5IIMFgxuJSUmipYTXcPKS4rr/RXL2JKKr4OMb FNm6Wn6Rvcjl10TmZ4r5VdL/QvgO75c7qgtzBH9PwXL5fOOv2cmLBitVBMlsmmYUo9 sxxiw4Y0Xi3t3rIcjfVFZ7sW7v/6sXDVbmsL8rz55+xOuYbEBwPCaSaQtqm7fFxidu Fh2XD4FyE2UZw== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7J-00000001ah6-4Axp; Fri, 08 May 2026 11:03:29 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org Subject: [PATCH v2 4/9] i2c: core: fix adapter debugfs creation Date: Fri, 8 May 2026 11:03:06 +0200 Message-ID: <20260508090311.379333-5-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Clients can be registered from bus notifier callbacks so the debugfs directory needs to be created before registering the adapter as clients use that directory as their debugfs parent. Move debugfs creation before adapter registration to avoid having clients create their debugfs directories in the debugfs root (which is also more likely to fail due to name collisions). Fixes: 73febd775bdb ("i2c: create debugfs entry per adapter") Cc: stable@vger.kernel.org # 6.8 Cc: Wolfram Sang Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 1caaa3b3ee10..8bf85aa2f0c2 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1575,14 +1575,14 @@ static int i2c_register_adapter(struct i2c_adapter = *adap) pm_suspend_ignore_children(&adap->dev, true); pm_runtime_enable(&adap->dev); =20 + adap->debugfs =3D debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_ro= ot); + res =3D device_add(&adap->dev); if (res) { pr_err("adapter '%s': can't register device (%d)\n", adap->name, res); - goto err_put_adap; + goto err_remove_debugfs; } =20 - adap->debugfs =3D debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_ro= ot); - res =3D i2c_setup_smbus_alert(adap); if (res) goto out_reg; @@ -1606,8 +1606,9 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) =20 out_reg: i2c_deregister_clients(adap); - debugfs_remove_recursive(adap->debugfs); device_del(&adap->dev); +err_remove_debugfs: + debugfs_remove_recursive(adap->debugfs); err_put_adap: init_completion(&adap->dev_released); put_device(&adap->dev); --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EDCC382388; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=D2xMCghU5GrIY1mTmq2fTSsfWeIKNkNVSzM5yfzhIWEW3aEbEdTu3oUIu7kSf19zf5nc7xXrrkrK4pKkvXWRE050dIp7/BSxWhynRn0Cr6o8I7SExuO2NjbOKeubHF7bdw9Ev9QhxvirSjXpJYG2SMHotDGFaJMMfuGz4U4B+xQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=Qq6J0RU0HW755i12+ls3OBnnmBATDz0rz09PJ4LsHqo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OD+8n8DAf557H1xh4EPvCeoP3MQoE7I92GGkG7aofJH6xJ9ooF44dx11CNsHqAS0FRwcPzXKn2sIRXUSKA+oBpUuHsjEGKoKMEZC1/U7ShK7ndKk4KRq3hZcp2Y0bUauNPtGfqMr1BVRJLjVykG5OYXuudR+kw8l+ryjUSA0OtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z3hpb7qd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Z3hpb7qd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 31178C2BCF7; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=Qq6J0RU0HW755i12+ls3OBnnmBATDz0rz09PJ4LsHqo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z3hpb7qd5oDM6VvDdP2wskyg1UbweGBGLJlBkO4TXlNh18r20kgGfne1hGQRvYY7O B/PvkgqFQSLXQ82DcJlxojiAXN6rTEF3AgllVrUPziKPg8ouFM8Dgtn37grdUSF/9e PT75T5G0cRu3stSpdpBWwTyLJWOy7G9qb/cimUEL1A+TMIHEEer8lBdFJcRTtIY8QY ehI7HNkgj2TxYZH0NA6XLyoDpSgZ82AwApaz+5otrD/lL8QMhSZGs+IMG9Tj+wk7Ng 2OJtsK7rPSEsJ8VfCeumfojaobLFHNifbKMer7r215vQ45yK7ylWKuWsvjKucIx8tP YWcFLqKmhUL3A== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7K-00000001ah8-019k; Fri, 08 May 2026 11:03:30 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , Codrin Ciubotariu Subject: [PATCH v2 5/9] i2c: core: disable runtime PM on adapter registration failure Date: Fri, 8 May 2026 11:03:07 +0200 Message-ID: <20260508090311.379333-6-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Runtime PM is disabled by driver core when deregistering a device (and on registration failure) but add an explicit disable to balance the enable call when adapter registration fails for symmetry. Fixes: 23a698fe65ec ("i2c: core: treat EPROBE_DEFER when acquiring SCL/SDA = GPIOs") Cc: Codrin Ciubotariu Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 8bf85aa2f0c2..20d48cb84a6c 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1609,6 +1609,7 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) device_del(&adap->dev); err_remove_debugfs: debugfs_remove_recursive(adap->debugfs); + pm_runtime_disable(&adap->dev); err_put_adap: init_completion(&adap->dev_released); put_device(&adap->dev); --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DCEA3815E1; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=l/hs9sphFngc372JEkOBr2L1wPONldH1iMa0WazDY3g4v0Fam6KP19CxkVEXnmY7Y1XIO8oA8UzD3VTThr2R6r15m1MLiJXq6k1eKVE1a38EnfDQCg6wnd7JWsp+BhB7I0ZxcBHbGvBl8r8Nwc/y12wa5AcxpD5SDmy0VnWeINk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=sI4KlbwGOk77SXPZS0f98Lx3I2yyUnIH5LrfDk6EqOY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=icVWt3jkaETy1Nc1D/tghuI44NBR+zKHkS4yiWYAhAzENCYdux0SAmEIIHC5lNOpCluhneA95EIsibPj38ClYqdwRpS9tqO/alHopUEJpqCWHFBoJ5B3At43BiSHZD5/xYHHnHQu8Imegu/0xH3XWGHtMbt6IB3GssxDZVyPo+Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=T22GXDCA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="T22GXDCA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 33685C2BCFB; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=sI4KlbwGOk77SXPZS0f98Lx3I2yyUnIH5LrfDk6EqOY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T22GXDCAQ8knidISGcDa49K8IN2g99tT6fYnUlS4NOZs3/CN8bbPlrZnO5vILs2PP 7G+gdkNYMafyCsnIGDPTOF/ZWxBb56H+G0MvAOT9ZMLREMrcdg865AyYgoMnkFn2F+ V3iml5+d0kzNcqs5RyLcaHjLl31p6w0edRUdfLz5305AvvyL7bofQUAcgZSaPsgXMU mPJ1o7y9xrJ35WqmDlsXDjdmp3CPBFHksVImXktihuv4X2T8nPmhekeWu57s3QGXaQ M46XuQlDwX0f+PxX7viasLzkV56eHEp8NKiBPn178QTYDPPMEDGPdCrfjzezrFXmt0 v4EOvOvPluEWQ== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7K-00000001ahA-03my; Fri, 08 May 2026 11:03:30 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org Subject: [PATCH v2 6/9] i2c: core: fix adapter registration race Date: Fri, 8 May 2026 11:03:08 +0200 Message-ID: <20260508090311.379333-7-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adapters can be looked up based on their id using i2c_get_adapter() which takes a reference to the embedded struct device. Make sure that the adapter (including its struct device) has been initialised before adding it to the IDR to avoid accessing uninitialised data which could, for example, lead to NULL-pointer dereferences or use-after-free. Note that the i2c-dev chardev, which is registered from a bus notifier, currently uses i2c_get_adapter() so the adapter needs to be added to the IDR before registration. Fixes: 6e13e6418418 ("i2c: Add i2c_add_numbered_adapter()") Cc: stable@vger.kernel.org # 2.6.22 Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 20d48cb84a6c..4863d660faf6 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1577,6 +1577,10 @@ static int i2c_register_adapter(struct i2c_adapter *= adap) =20 adap->debugfs =3D debugfs_create_dir(dev_name(&adap->dev), i2c_debugfs_ro= ot); =20 + mutex_lock(&core_lock); + idr_replace(&i2c_adapter_idr, adap, adap->nr); + mutex_unlock(&core_lock); + res =3D device_add(&adap->dev); if (res) { pr_err("adapter '%s': can't register device (%d)\n", adap->name, res); @@ -1635,7 +1639,7 @@ static int __i2c_add_numbered_adapter(struct i2c_adap= ter *adap) int id; =20 mutex_lock(&core_lock); - id =3D idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERN= EL); + id =3D idr_alloc(&i2c_adapter_idr, NULL, adap->nr, adap->nr + 1, GFP_KERN= EL); mutex_unlock(&core_lock); if (WARN(id < 0, "couldn't get idr")) return id =3D=3D -ENOSPC ? -EBUSY : id; @@ -1669,7 +1673,7 @@ int i2c_add_adapter(struct i2c_adapter *adapter) } =20 mutex_lock(&core_lock); - id =3D idr_alloc(&i2c_adapter_idr, adapter, + id =3D idr_alloc(&i2c_adapter_idr, NULL, __i2c_first_dynamic_bus_num, 0, GFP_KERNEL); mutex_unlock(&core_lock); if (WARN(id < 0, "couldn't get idr")) --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8ECD7381AE3; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=pn5zOuPG7RbfhtBTiX4sOo1oIWHdHu09DdHb+O2LovL9m//86Q6XwU0BpDTmB+MZKWvuSra8QKyrO3tyjAtuvJDB09V9nbInFjpEX5wdKNV53D6NIk1KlpoENbO9NlkkfGyhzdza6QeLVo1IJr8hfHHUteMjt1YKwWlVS1nvbgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=D8vN4bT/q3VsYLc/zBF2Wx5uVsdZitkHCv0LNJ5DYfY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ARraSOXRFq7SGgttYLKVvEGNKuNECsZuCdoawReadIdSLA3YttBibXPsBQ5oZY573GwRiECaqFlkQGSoHEWH/fG96a40TmNRNdoq4wJwXnapJCJcXlTCzD1AxHf0Tt+ou639KB+V3JpMAVYCdZcxTWtylOmWZ8sJPXsv3ISQg6E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=trPmGS2r; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="trPmGS2r" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35CAFC2BCFD; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=D8vN4bT/q3VsYLc/zBF2Wx5uVsdZitkHCv0LNJ5DYfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=trPmGS2r2Ee/P3CQjBagCunNXhUKQi0KfP2r4r4YYfV0pbPBwsAaAUwrQbTSTFKB5 Ls7rkmu6al4cSrfpoOVKgMflCz0i5JzKgciQ66Etf8OUT+nKok+IsoadroLPaspFAP hcvdeuFTzcrJupCFjxF4rzoNIAkNt4TMEPQ/D8dShySc11XB0pfwmhswFpIc6X/Sfs QaKWem5DSJgobm3Kwr6IyBIc1u7j530bAGroARzT+OLbKFgAeolZlm8kXdpQhmVTEI oyWau4PkidWD14IN/E4Ksog4XNGi6Oxrn9bAQjvRRQxm5GskvWPKMEH0D/ZO1XIYck 1/1BkTlkBE1wA== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7K-00000001ahC-066a; Fri, 08 May 2026 11:03:30 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , stable@vger.kernel.org, Jean Delvare Subject: [PATCH v2 7/9] i2c: core: fix adapter deregistration race Date: Fri, 8 May 2026 11:03:09 +0200 Message-ID: <20260508090311.379333-8-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adapters can be looked up by their id using i2c_get_adapter() which takes a reference to the embedded struct device. Remove the adapter from the IDR before tearing it down during deregistration to make sure its resources are not accessed after having been freed (e.g.the device name). Fixes: 35fc37f81881 ("i2c: Limit core locking to the necessary sections") Cc: stable@vger.kernel.org # 2.6.31 Cc: Jean Delvare Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 4863d660faf6..f72f15a1b067 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1801,6 +1801,8 @@ void i2c_del_adapter(struct i2c_adapter *adap) /* First make sure that this adapter was ever added */ mutex_lock(&core_lock); found =3D idr_find(&i2c_adapter_idr, adap->nr); + if (found =3D=3D adap) + idr_replace(&i2c_adapter_idr, NULL, adap->nr); mutex_unlock(&core_lock); if (found !=3D adap) { pr_debug("attempting to delete unregistered adapter [%s]\n", adap->name); --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DAD5320CD1; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=gUwSG/vUt+By9vBJ2uM/F1bHd2rZvinB4ZflhnXhaOMD9pVWHDrRqaMJPawJqmpypFhIduffL4Mux/8R2Rl0OI4GOkPMrXxRrn0hVWOSBWHeohMMdTpwIuDM+sMckcy94IpWLZ17TTtVzDv47y4BzAx//Gjy82lWPz9B6FLDWRs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=kpcGn8XwWVqIg5gDPPh2/2boUjm7BaR9MU68se3eHf8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oNygvGdnUfitVO4LfIwy8yBmlF7hx2yqmztBsTQcGBlEnyLr4zR+6EJLaHcRieITnjRRkjDcm05J6XQ7rwJdaboAaHEHYNeCueLuOV22wU5Q5p3kK/iGhR0YHg2FuwKisT7/kqgaoXfac0m0a47/HG/69251pPsqYNWGuU20Bec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IshByKyY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IshByKyY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2948BC2BCF6; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=kpcGn8XwWVqIg5gDPPh2/2boUjm7BaR9MU68se3eHf8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IshByKyYkOasqzmdh2HKBpPzkLGcYokzvoWgYpOVoNk8I5bEdmkPOFCc9n/Oey47c d3doV84N3Ulx4hGbOJ4AhaAvPYAVC8Wr8/YEnm6SHv+axnXq9uu4nMUgd8MJ+MoSI3 cgTaPzu7jErCQ20LCP6W1BaQiMzXgjpJ4tfSeTQ++HAFRcHiq5Y/tk7pYol2nZM0CM ZpLEg4nyP2CD92fH0zlLU4Zn/8SdoZqd22nRc1CYUIvk5moat1/r9jPvtdBEJfoSJu AEft38ihE6PqOgeON+YdXCfyObfMjsDDGV5Bvb1MGZjkerHTrhr2dnSNz9NP3kTybi dvWQ38bgm0bLw== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7K-00000001ahE-08I6; Fri, 08 May 2026 11:03:30 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold Subject: [PATCH v2 8/9] i2c: core: clean up bus id allocation Date: Fri, 8 May 2026 11:03:10 +0200 Message-ID: <20260508090311.379333-9-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Clean up bus id allocation by using a common helper and deferring it until it is needed during adapter registration. Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 85 +++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index f72f15a1b067..5350ee54132b 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1517,23 +1517,48 @@ int i2c_handle_smbus_host_notify(struct i2c_adapter= *adap, unsigned short addr) } EXPORT_SYMBOL_GPL(i2c_handle_smbus_host_notify); =20 +static int i2c_allocate_adapter_id(struct i2c_adapter *adap) +{ + int id, start, end; + + if (adap->nr =3D=3D -1) { + start =3D __i2c_first_dynamic_bus_num; + end =3D 0; + } else { + start =3D adap->nr; + end =3D adap->nr + 1; + } + + mutex_lock(&core_lock); + id =3D idr_alloc(&i2c_adapter_idr, NULL, start, end, GFP_KERNEL); + mutex_unlock(&core_lock); + if (id < 0) { + if (adap->nr !=3D -1 && id =3D=3D -ENOSPC) + id =3D -EBUSY; + pr_err("adapter '%s': failed to allocate id: %d\n", adap->name, id); + return id; + } + + adap->nr =3D id; + + return 0; +} + static int i2c_register_adapter(struct i2c_adapter *adap) { - int res =3D -EINVAL; + int res; =20 /* Can't register until after driver model init */ - if (WARN_ON(!is_registered)) { - res =3D -EAGAIN; - goto out_list; - } + if (WARN_ON(!is_registered)) + return -EAGAIN; =20 /* Sanity checks */ if (WARN(!adap->name[0], "i2c adapter has no name")) - goto out_list; + return -EINVAL; =20 if (!adap->algo) { pr_err("adapter '%s': no algo supplied!\n", adap->name); - goto out_list; + return -EINVAL; } =20 if (!adap->lock_ops) @@ -1554,9 +1579,13 @@ static int i2c_register_adapter(struct i2c_adapter *= adap) if (res) { pr_err("adapter '%s': can't create Host Notify IRQs (%d)\n", adap->name, res); - goto out_list; + return res; } =20 + res =3D i2c_allocate_adapter_id(adap); + if (res) + goto err_remove_irq_domain; + dev_set_name(&adap->dev, "i2c-%d", adap->nr); adap->dev.bus =3D &i2c_bus_type; adap->dev.type =3D &i2c_adapter_type; @@ -1619,32 +1648,13 @@ static int i2c_register_adapter(struct i2c_adapter = *adap) put_device(&adap->dev); wait_for_completion(&adap->dev_released); =20 - i2c_host_notify_irq_teardown(adap); -out_list: mutex_lock(&core_lock); idr_remove(&i2c_adapter_idr, adap->nr); mutex_unlock(&core_lock); - return res; -} - -/** - * __i2c_add_numbered_adapter - i2c_add_numbered_adapter where nr is never= -1 - * @adap: the adapter to register (with adap->nr initialized) - * Context: can sleep - * - * See i2c_add_numbered_adapter() for details. - */ -static int __i2c_add_numbered_adapter(struct i2c_adapter *adap) -{ - int id; - - mutex_lock(&core_lock); - id =3D idr_alloc(&i2c_adapter_idr, NULL, adap->nr, adap->nr + 1, GFP_KERN= EL); - mutex_unlock(&core_lock); - if (WARN(id < 0, "couldn't get idr")) - return id =3D=3D -ENOSPC ? -EBUSY : id; +err_remove_irq_domain: + i2c_host_notify_irq_teardown(adap); =20 - return i2c_register_adapter(adap); + return res; } =20 /** @@ -1667,17 +1677,8 @@ int i2c_add_adapter(struct i2c_adapter *adapter) int id; =20 id =3D of_alias_get_id(dev->of_node, "i2c"); - if (id >=3D 0) { - adapter->nr =3D id; - return __i2c_add_numbered_adapter(adapter); - } - - mutex_lock(&core_lock); - id =3D idr_alloc(&i2c_adapter_idr, NULL, - __i2c_first_dynamic_bus_num, 0, GFP_KERNEL); - mutex_unlock(&core_lock); - if (WARN(id < 0, "couldn't get idr")) - return id; + if (id < 0) + id =3D -1; =20 adapter->nr =3D id; =20 @@ -1713,7 +1714,7 @@ int i2c_add_numbered_adapter(struct i2c_adapter *adap) if (adap->nr =3D=3D -1) /* -1 means dynamically assign bus id */ return i2c_add_adapter(adap); =20 - return __i2c_add_numbered_adapter(adap); + return i2c_register_adapter(adap); } EXPORT_SYMBOL_GPL(i2c_add_numbered_adapter); =20 --=20 2.53.0 From nobody Sat Jun 13 09:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8FE3137F75E; Fri, 8 May 2026 09:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; cv=none; b=tUe+mZ7GcBDkZatK5LJIms0ssNvF0lj10nt7Rux6XEU6Z1xlebggn5xHqIS9GhEr+8dt6Q98nL98ttJqPl6mEyGtyIi9j3tx7N/JYD4It9AMmHFwzBIXjt9h154oEv0y7/X9Qm6DZCErixTWBVo5tt9xneplzncWd/5Lb+tnIoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778231012; c=relaxed/simple; bh=KhgTZ6PbzQKtcR1d2ZrOX8dboBUitE7o+QYct8JBHy0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OeZ/39kur8LhefH6Vg/HuLEKJLt+l9xSO+bKCmQ8bjZ4Ap5VCFJnnD0UXpnIeZegRchC2V0Xvxxvc5DqVlmvYK8v/nCKIXza9N+dpq8UOKBKU2b9m+9VJazrVUL7/7CdgyAJBtwumCN9Qma3z9drXm9Mtz2OTjMyXBSPLOHKoQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TQQyEgu1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TQQyEgu1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2DD2FC2BCFA; Fri, 8 May 2026 09:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778231012; bh=KhgTZ6PbzQKtcR1d2ZrOX8dboBUitE7o+QYct8JBHy0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TQQyEgu1BlBRnDmGLm8kA71QdXiVqWedNLKaN2ICwLfu3JPZgVoRUvMQJ7GcoFFkm foegLZ4StlnDQJnCTSN7TsZaUbltWjLRHrTAc2LBmzZRgMCIvvE6XD+ldDbovDS0lv TUObkYs9OzhwS93mGajJ9RpUp/pVbN3HeU1kAhQY+09ot2hz/HImTJ6oaTBD+xcm4Y 77m8vi5A0FKYwinG7GvnNirqYBLVYlLSliKvT8xAe6iQOnSFU4xpXO3MLsktLJUTiw cfhATrBz8BgbD63a0c6XxABHbd04L7qguQMS1qjFVKGRbDAMGr+nUeL7Jiv03USnRy fY2tU1UEzUxPQ== Received: from johan by xi.lan with local (Exim 4.98.2) (envelope-from ) id 1wLH7K-00000001ahG-0AaA; Fri, 08 May 2026 11:03:30 +0200 From: Johan Hovold To: Wolfram Sang Cc: Andi Shyti , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold Subject: [PATCH v2 9/9] i2c: core: clean up adapter registration error label Date: Fri, 8 May 2026 11:03:11 +0200 Message-ID: <20260508090311.379333-10-johan@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260508090311.379333-1-johan@kernel.org> References: <20260508090311.379333-1-johan@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Clean up the adapter registration error labels by making sure that also the last one is named after what it does. Signed-off-by: Johan Hovold --- drivers/i2c/i2c-core-base.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 5350ee54132b..029ebe44c68e 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1618,7 +1618,7 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) =20 res =3D i2c_setup_smbus_alert(adap); if (res) - goto out_reg; + goto err_deregister_clients; =20 dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); =20 @@ -1637,7 +1637,7 @@ static int i2c_register_adapter(struct i2c_adapter *a= dap) =20 return 0; =20 -out_reg: +err_deregister_clients: i2c_deregister_clients(adap); device_del(&adap->dev); err_remove_debugfs: --=20 2.53.0