Linux I2C development
 help / color / mirror / Atom feed
* [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound
@ 2026-05-23 17:44 Hardik Prakash
  2026-05-23 17:44 ` [PATCH v6 1/1] " Hardik Prakash
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Hardik Prakash @ 2026-05-23 17:44 UTC (permalink / raw)
  To: linux-i2c
  Cc: linux-gpio, wsa, andriy.shevchenko, mario.limonciello, brgl,
	basavaraj.natikar, linus.walleij, Hardik Prakash

Patch 1/2 (pinctrl-amd GPIO IRQ fix) is already in Linus Walleij's
tree. This replaces patch 2 with a generic solution suggested by
Mario Limonciello.

The root cause: i2c_designware probes AMDI0010:02 before pinctrl-amd
completes. Dynamic debug tracing confirmed the race:

  0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
  0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
  0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
  2.348157  lost arbitration

Previous attempts to fix this via initcall promotion (subsys_initcall,
fs_initcall, arch_initcall) all failed because the race is not about
when the driver registers but about when probe completes. The GPIO chip
becomes visible to the system via gpiochip_add_data() before
amd_gpio_probe() finishes, and i2c-designware probes AMDI0010:02 in
that window.

This patch adds a generic check that walks ACPI child devices, finds
any GpioInt resources, and defers probe if the referenced GPIO
controllers are not yet fully bound. No DMI matching required.

v6:
 - Replace DMI-specific deferral with generic GpioInt dependency check
   walking ACPI child devices (suggested by Mario Limonciello)

v5:
 - Add blank line before #include <linux/acpi.h> (Bartosz Golaszewski)
 - Use scoped_guard(device, gpio_dev) (Bartosz Golaszewski)

v4:
 - Rebase onto Linus Walleij's tree (patch 1 already there)
 - Use --base so series is correctly 1/1 (Andy Shevchenko)
 - Add subsys_initcall test results (Mario Limonciello)

v3:
 - Fix variable declaration style in dw_i2c_needs_amd_gpio_dep (Andy Shevchenko)
 - Add BugLink tag (Andy Shevchenko)
 - CC AMD engineers (Andy Shevchenko)

v2:
 - Replace custom HID/UID lookup with acpi_dev_get_first_match_dev()
 - Use device_is_bound() under device_lock() with explanatory comments
 - Add Assisted-by tags per coding-assistants.rst

Kernel bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=221494
Related: https://bugzilla.kernel.org/show_bug.cgi?id=221454

Hardik Prakash (1):
  i2c: designware: defer probe if child GpioInt controllers are not
    bound

 drivers/i2c/busses/i2c-designware-platdrv.c | 157 ++++++++++++++++++++
 1 file changed, 157 insertions(+)

base-commit: 3812a9e84265a5cdd90d29fe8d97a023e91fb945

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-23 17:44 [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound Hardik Prakash
@ 2026-05-23 17:44 ` Hardik Prakash
  2026-05-24  1:47   ` kernel test robot
  2026-05-26 10:42   ` Bartosz Golaszewski
  2026-05-23 17:57 ` [PATCH v6 0/1] " Mario Limonciello
  2026-05-26  9:41 ` Bartosz Golaszewski
  2 siblings, 2 replies; 11+ messages in thread
From: Hardik Prakash @ 2026-05-23 17:44 UTC (permalink / raw)
  To: linux-i2c
  Cc: linux-gpio, wsa, andriy.shevchenko, mario.limonciello, brgl,
	basavaraj.natikar, linus.walleij, Hardik Prakash

I2C controllers may have child devices with GpioInt resources that
depend on GPIO controllers to be fully initialized. If the I2C
controller probes and enumerates children before the referenced GPIO
controller has completed probe, GPIO interrupts may not be properly
configured, leading to device failures.

On Lenovo Yoga 7 14AGP11, the WACF2200 touchscreen (child of
AMDI0010:02) has a GpioInt resource pointing to GPIO 157 on the
pinctrl-amd controller (AMDI0030:00). When i2c-designware probes
AMDI0010:02 before pinctrl-amd finishes initializing, I2C transactions
occur before the GPIO IRQ quirk in amd_gpio_probe() has run, causing:

  i2c_designware AMDI0010:02: i2c_dw_handle_tx_abort: lost arbitration

Add a generic dependency check in i2c-designware that walks ACPI child
devices, identifies any GpioInt resources, resolves the referenced GPIO
controllers, and defers probe if those controllers are not yet bound.

This ensures GPIO controllers complete initialization (including IRQ
setup and quirks) before I2C child enumeration begins, fixing the race
without device-specific quirks or DMI matching.

The probe ordering race was confirmed via dynamic debug tracing:

  0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
  0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
  0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
  2.348157  lost arbitration

Suggested-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Hardik Prakash <hardikprakash.official@gmail.com>
Assisted-by: Claude:claude-sonnet-4-6
Assisted-by: GPT-Codex:gpt-5.2-codex
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=221494
---
 drivers/i2c/busses/i2c-designware-platdrv.c | 157 ++++++++++++++++++++
 1 file changed, 157 insertions(+)

diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 3351c4a9ef11..a789c54de433 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -8,6 +8,8 @@
  * Copyright (C) 2007 MontaVista Software Inc.
  * Copyright (C) 2009 Provigent Ltd.
  */
+
+#include <linux/acpi.h>
 #include <linux/clk-provider.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
@@ -130,6 +132,153 @@ static int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev)
 	return 0;
 }
 
+#ifdef CONFIG_ACPI
+struct gpio_dep_ctx {
+	struct list_head gpio_controllers;
+	int ret;
+};
+
+struct gpio_controller_ref {
+	struct list_head node;
+	char *path;
+};
+
+static int check_gpioint_resource(struct acpi_resource *ares, void *data)
+{
+	struct gpio_dep_ctx *ctx = data;
+	struct acpi_resource_gpio *agpio;
+	struct gpio_controller_ref *ref, *tmp;
+	bool found = false;
+
+	if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
+		return 1;
+
+	agpio = &ares->data.gpio;
+	if (agpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT)
+		return 1;
+
+	/* Check if we've already tracked this GPIO controller */
+	list_for_each_entry(tmp, &ctx->gpio_controllers, node) {
+		if (!strcmp(tmp->path, agpio->resource_source.string_ptr)) {
+			found = true;
+			break;
+		}
+	}
+
+	if (!found) {
+		ref = kzalloc(sizeof(*ref), GFP_KERNEL);
+		if (!ref) {
+			ctx->ret = -ENOMEM;
+			return 0;
+		}
+
+		ref->path = kstrdup(agpio->resource_source.string_ptr, GFP_KERNEL);
+		if (!ref->path) {
+			kfree(ref);
+			ctx->ret = -ENOMEM;
+			return 0;
+		}
+
+		list_add_tail(&ref->node, &ctx->gpio_controllers);
+	}
+
+	return 1;
+}
+
+static int check_child_gpioint(struct acpi_device *adev, void *data)
+{
+	struct gpio_dep_ctx *ctx = data;
+	struct list_head res_list;
+	int ret;
+
+	INIT_LIST_HEAD(&res_list);
+
+	ret = acpi_dev_get_resources(adev, &res_list, check_gpioint_resource, ctx);
+	acpi_dev_free_resource_list(&res_list);
+
+	if (ctx->ret < 0)
+		return ctx->ret;
+
+	return 0;
+}
+
+static int i2c_dw_check_gpio_dependencies(struct device *dev)
+{
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+	struct gpio_dep_ctx ctx = { .ret = 0 };
+	struct gpio_controller_ref *ref, *tmp;
+	int ret = 0;
+
+	if (!adev)
+		return 0;
+
+	INIT_LIST_HEAD(&ctx.gpio_controllers);
+
+	/* Walk all child devices and collect GpioInt controller references */
+	ret = acpi_dev_for_each_child(adev, check_child_gpioint, &ctx);
+	if (ret < 0 || ctx.ret < 0) {
+		ret = ctx.ret ?: ret;
+		goto cleanup;
+	}
+
+	/* For each GPIO controller, check if its parent device is bound */
+	list_for_each_entry(ref, &ctx.gpio_controllers, node) {
+		acpi_handle handle;
+		acpi_status status;
+		struct acpi_device *gpio_adev;
+		struct device *gpio_dev;
+		bool bound;
+
+		status = acpi_get_handle(NULL, ref->path, &handle);
+		if (ACPI_FAILURE(status))
+			continue;
+
+		gpio_adev = acpi_fetch_acpi_dev(handle);
+		if (!gpio_adev)
+			continue;
+
+		gpio_dev = acpi_get_first_physical_node(gpio_adev);
+		acpi_dev_put(gpio_adev);
+
+		if (!gpio_dev) {
+			ret = -EPROBE_DEFER;
+			goto cleanup;
+		}
+
+		/*
+		 * Check if the GPIO controller's device is bound. If not,
+		 * defer probe to ensure GPIO initialization (including IRQ
+		 * setup and quirks) is complete before we enumerate I2C
+		 * child devices.
+		 */
+		scoped_guard(device, gpio_dev) {
+			bound = device_is_bound(gpio_dev);
+		}
+		if (!bound) {
+			put_device(gpio_dev);
+			ret = -EPROBE_DEFER;
+			goto cleanup;
+		}
+
+		put_device(gpio_dev);
+	}
+
+cleanup:
+	list_for_each_entry_safe(ref, tmp, &ctx.gpio_controllers, node) {
+		list_del(&ref->node);
+		kfree(ref->path);
+		kfree(ref);
+	}
+
+	return ret;
+}
+#else
+static int i2c_dw_check_gpio_dependencies(struct device *dev)
+{
+	return 0;
+}
+#endif /* CONFIG_ACPI */
+
 static int dw_i2c_plat_probe(struct platform_device *pdev)
 {
 	u32 flags = (uintptr_t)device_get_match_data(&pdev->dev);
@@ -138,6 +287,14 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
 	struct dw_i2c_dev *dev;
 	int irq, ret;
 
+	/*
+	 * Check if any child devices have GpioInt resources, and if so,
+	 * defer probe until those GPIO controllers are fully bound.
+	 */
+	ret = i2c_dw_check_gpio_dependencies(device);
+	if (ret)
+		return ret;
+
 	irq = platform_get_irq_optional(pdev, 0);
 	if (irq == -ENXIO)
 		flags |= ACCESS_POLLING;
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-23 17:44 [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound Hardik Prakash
  2026-05-23 17:44 ` [PATCH v6 1/1] " Hardik Prakash
@ 2026-05-23 17:57 ` Mario Limonciello
  2026-05-26  9:41 ` Bartosz Golaszewski
  2 siblings, 0 replies; 11+ messages in thread
From: Mario Limonciello @ 2026-05-23 17:57 UTC (permalink / raw)
  To: Hardik Prakash, linux-i2c
  Cc: linux-gpio, wsa, andriy.shevchenko, mario.limonciello, brgl,
	basavaraj.natikar, linus.walleij



On 5/23/26 12:44 PM, Hardik Prakash wrote:
> Patch 1/2 (pinctrl-amd GPIO IRQ fix) is already in Linus Walleij's
> tree. 

Is patch 1 still needed with this approach?

> This replaces patch 2 with a generic solution suggested by
> Mario Limonciello.
> 
> The root cause: i2c_designware probes AMDI0010:02 before pinctrl-amd
> completes. Dynamic debug tracing confirmed the race:
> 
>    0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
>    0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
>    0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
>    2.348157  lost arbitration
> 
> Previous attempts to fix this via initcall promotion (subsys_initcall,
> fs_initcall, arch_initcall) all failed because the race is not about
> when the driver registers but about when probe completes. The GPIO chip
> becomes visible to the system via gpiochip_add_data() before
> amd_gpio_probe() finishes, and i2c-designware probes AMDI0010:02 in
> that window.
> 
> This patch adds a generic check that walks ACPI child devices, finds
> any GpioInt resources, and defers probe if the referenced GPIO
> controllers are not yet fully bound. No DMI matching required.
> 
> v6:
>   - Replace DMI-specific deferral with generic GpioInt dependency check
>     walking ACPI child devices (suggested by Mario Limonciello)
> 
> v5:
>   - Add blank line before #include <linux/acpi.h> (Bartosz Golaszewski)
>   - Use scoped_guard(device, gpio_dev) (Bartosz Golaszewski)
> 
> v4:
>   - Rebase onto Linus Walleij's tree (patch 1 already there)
>   - Use --base so series is correctly 1/1 (Andy Shevchenko)
>   - Add subsys_initcall test results (Mario Limonciello)
> 
> v3:
>   - Fix variable declaration style in dw_i2c_needs_amd_gpio_dep (Andy Shevchenko)
>   - Add BugLink tag (Andy Shevchenko)
>   - CC AMD engineers (Andy Shevchenko)
> 
> v2:
>   - Replace custom HID/UID lookup with acpi_dev_get_first_match_dev()
>   - Use device_is_bound() under device_lock() with explanatory comments
>   - Add Assisted-by tags per coding-assistants.rst
> 
> Kernel bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=221494
> Related: https://bugzilla.kernel.org/show_bug.cgi?id=221454
> 
> Hardik Prakash (1):
>    i2c: designware: defer probe if child GpioInt controllers are not
>      bound
> 
>   drivers/i2c/busses/i2c-designware-platdrv.c | 157 ++++++++++++++++++++
>   1 file changed, 157 insertions(+)
> 
> base-commit: 3812a9e84265a5cdd90d29fe8d97a023e91fb945
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-23 17:44 ` [PATCH v6 1/1] " Hardik Prakash
@ 2026-05-24  1:47   ` kernel test robot
  2026-05-24  5:40     ` Hardik Prakash
  2026-05-26 10:42   ` Bartosz Golaszewski
  1 sibling, 1 reply; 11+ messages in thread
From: kernel test robot @ 2026-05-24  1:47 UTC (permalink / raw)
  To: Hardik Prakash, linux-i2c
  Cc: llvm, oe-kbuild-all, linux-gpio, wsa, andriy.shevchenko,
	mario.limonciello, brgl, basavaraj.natikar, linus.walleij,
	Hardik Prakash

Hi Hardik,

kernel test robot noticed the following build warnings:

[auto build test WARNING on 3812a9e84265a5cdd90d29fe8d97a023e91fb945]

url:    https://github.com/intel-lab-lkp/linux/commits/Hardik-Prakash/i2c-designware-defer-probe-if-child-GpioInt-controllers-are-not-bound/20260524-014648
base:   3812a9e84265a5cdd90d29fe8d97a023e91fb945
patch link:    https://lore.kernel.org/r/20260523174440.9629-2-hardikprakash.official%40gmail.com
patch subject: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
config: x86_64-randconfig-001-20260524 (https://download.01.org/0day-ci/archive/20260524/202605240959.Kcf1lIg4-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260524/202605240959.Kcf1lIg4-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202605240959.Kcf1lIg4-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/i2c/busses/i2c-designware-platdrv.c:192:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable]
     192 |         int ret;
         |             ^
   1 warning generated.


vim +/ret +192 drivers/i2c/busses/i2c-designware-platdrv.c

   187	
   188	static int check_child_gpioint(struct acpi_device *adev, void *data)
   189	{
   190		struct gpio_dep_ctx *ctx = data;
   191		struct list_head res_list;
 > 192		int ret;
   193	
   194		INIT_LIST_HEAD(&res_list);
   195	
   196		ret = acpi_dev_get_resources(adev, &res_list, check_gpioint_resource, ctx);
   197		acpi_dev_free_resource_list(&res_list);
   198	
   199		if (ctx->ret < 0)
   200			return ctx->ret;
   201	
   202		return 0;
   203	}
   204	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-24  1:47   ` kernel test robot
@ 2026-05-24  5:40     ` Hardik Prakash
  0 siblings, 0 replies; 11+ messages in thread
From: Hardik Prakash @ 2026-05-24  5:40 UTC (permalink / raw)
  To: kernel test robot
  Cc: linux-i2c, llvm, oe-kbuild-all, linux-gpio, wsa,
	andriy.shevchenko, mario.limonciello, brgl, basavaraj.natikar,
	linusw

On Sat, May 23, 2026 at 23:27, Mario Limonciello wrote:
> Is patch 1 still needed with this approach?

No. Tested v6 alone (without patch 1) on a tree based on
63d2059cd665 (the commit immediately before patch 1 in Walleij's
fixes branch). Touchscreen and stylus fully functional, no arbitration
errors.

This confirms your original concern was correct -- the existing
amd_gpio_irq_enable() flow works fine once probe ordering is fixed.
Patch 1's manual IRQ restoration was only necessary because the race
prevented amd_gpio_irq_enable() from ever being called.

v6 is sufficient as a standalone fix. Patch 1 in Linus Walleij's tree
can be reverted if desired.

Also noting that the kernel test robot flagged an unused 'ret' variable
in check_child_gpioint() -- I have a fix ready and will send v7 once
the question of patch 1 is settled.

Thanks,
Hardik

On Sun, 24 May 2026 at 07:18, kernel test robot <lkp@intel.com> wrote:
>
> Hi Hardik,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on 3812a9e84265a5cdd90d29fe8d97a023e91fb945]
>
> url:    https://github.com/intel-lab-lkp/linux/commits/Hardik-Prakash/i2c-designware-defer-probe-if-child-GpioInt-controllers-are-not-bound/20260524-014648
> base:   3812a9e84265a5cdd90d29fe8d97a023e91fb945
> patch link:    https://lore.kernel.org/r/20260523174440.9629-2-hardikprakash.official%40gmail.com
> patch subject: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
> config: x86_64-randconfig-001-20260524 (https://download.01.org/0day-ci/archive/20260524/202605240959.Kcf1lIg4-lkp@intel.com/config)
> compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260524/202605240959.Kcf1lIg4-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202605240959.Kcf1lIg4-lkp@intel.com/
>
> All warnings (new ones prefixed by >>):
>
> >> drivers/i2c/busses/i2c-designware-platdrv.c:192:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable]
>      192 |         int ret;
>          |             ^
>    1 warning generated.
>
>
> vim +/ret +192 drivers/i2c/busses/i2c-designware-platdrv.c
>
>    187
>    188  static int check_child_gpioint(struct acpi_device *adev, void *data)
>    189  {
>    190          struct gpio_dep_ctx *ctx = data;
>    191          struct list_head res_list;
>  > 192          int ret;
>    193
>    194          INIT_LIST_HEAD(&res_list);
>    195
>    196          ret = acpi_dev_get_resources(adev, &res_list, check_gpioint_resource, ctx);
>    197          acpi_dev_free_resource_list(&res_list);
>    198
>    199          if (ctx->ret < 0)
>    200                  return ctx->ret;
>    201
>    202          return 0;
>    203  }
>    204
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-23 17:44 [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound Hardik Prakash
  2026-05-23 17:44 ` [PATCH v6 1/1] " Hardik Prakash
  2026-05-23 17:57 ` [PATCH v6 0/1] " Mario Limonciello
@ 2026-05-26  9:41 ` Bartosz Golaszewski
  2026-05-26 10:05   ` Hardik Prakash
  2 siblings, 1 reply; 11+ messages in thread
From: Bartosz Golaszewski @ 2026-05-26  9:41 UTC (permalink / raw)
  To: Hardik Prakash
  Cc: linux-i2c, linux-gpio, wsa, andriy.shevchenko, mario.limonciello,
	basavaraj.natikar, linus.walleij

On Sat, May 23, 2026 at 7:45 PM Hardik Prakash
<hardikprakash.official@gmail.com> wrote:
>
> Patch 1/2 (pinctrl-amd GPIO IRQ fix) is already in Linus Walleij's
> tree. This replaces patch 2 with a generic solution suggested by
> Mario Limonciello.
>
> The root cause: i2c_designware probes AMDI0010:02 before pinctrl-amd
> completes. Dynamic debug tracing confirmed the race:
>
>   0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
>   0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
>   0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
>   2.348157  lost arbitration
>
> Previous attempts to fix this via initcall promotion (subsys_initcall,
> fs_initcall, arch_initcall) all failed because the race is not about
> when the driver registers but about when probe completes. The GPIO chip
> becomes visible to the system via gpiochip_add_data() before
> amd_gpio_probe() finishes, and i2c-designware probes AMDI0010:02 in
> that window.
>
> This patch adds a generic check that walks ACPI child devices, finds
> any GpioInt resources, and defers probe if the referenced GPIO
> controllers are not yet fully bound. No DMI matching required.
>

What happened to the idea of doing this in subsystem-level GPIO ACPI code?

Bart

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-26  9:41 ` Bartosz Golaszewski
@ 2026-05-26 10:05   ` Hardik Prakash
  0 siblings, 0 replies; 11+ messages in thread
From: Hardik Prakash @ 2026-05-26 10:05 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: linux-i2c, linux-gpio, wsa, andriy.shevchenko, mario.limonciello,
	basavaraj.natikar, linus.walleij, linusw

On Mon, May 26, 2026 at 15:12, Bartosz Golaszewski wrote:
> What happened to the idea of doing this in subsystem-level GPIO ACPI code?

I tested it and reported back on May 20th in this thread -- it didn't
work. The deferral in acpi_get_gpiod() never triggers for AMDI0010:02
because i2c-designware does not call acpi_get_gpiod() during its probe.
The GpioInt resource is on the WACF2200 touchscreen device (TPNL), not
on the I2C controller itself. So the gpiolib-acpi path is never
exercised when AMDI0010:02 probes.

The race is between amd_gpio_probe() completing and dw_i2c_plat_probe()
starting. Nothing in the gpiolib-acpi layer gets called in that window.

Thanks,
Hardik

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-23 17:44 ` [PATCH v6 1/1] " Hardik Prakash
  2026-05-24  1:47   ` kernel test robot
@ 2026-05-26 10:42   ` Bartosz Golaszewski
  2026-05-28 21:24     ` Mario Limonciello
  1 sibling, 1 reply; 11+ messages in thread
From: Bartosz Golaszewski @ 2026-05-26 10:42 UTC (permalink / raw)
  To: Hardik Prakash
  Cc: linux-gpio, wsa, andriy.shevchenko, mario.limonciello, brgl,
	basavaraj.natikar, linus.walleij, linux-i2c

On Sat, 23 May 2026 19:44:40 +0200, Hardik Prakash
<hardikprakash.official@gmail.com> said:
> I2C controllers may have child devices with GpioInt resources that
> depend on GPIO controllers to be fully initialized. If the I2C
> controller probes and enumerates children before the referenced GPIO
> controller has completed probe, GPIO interrupts may not be properly
> configured, leading to device failures.
>
> On Lenovo Yoga 7 14AGP11, the WACF2200 touchscreen (child of
> AMDI0010:02) has a GpioInt resource pointing to GPIO 157 on the
> pinctrl-amd controller (AMDI0030:00). When i2c-designware probes
> AMDI0010:02 before pinctrl-amd finishes initializing, I2C transactions
> occur before the GPIO IRQ quirk in amd_gpio_probe() has run, causing:
>
>   i2c_designware AMDI0010:02: i2c_dw_handle_tx_abort: lost arbitration
>
> Add a generic dependency check in i2c-designware that walks ACPI child
> devices, identifies any GpioInt resources, resolves the referenced GPIO
> controllers, and defers probe if those controllers are not yet bound.
>
> This ensures GPIO controllers complete initialization (including IRQ
> setup and quirks) before I2C child enumeration begins, fixing the race
> without device-specific quirks or DMI matching.
>
> The probe ordering race was confirmed via dynamic debug tracing:
>
>   0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
>   0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
>   0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
>   2.348157  lost arbitration
>
> Suggested-by: Mario Limonciello <mario.limonciello@amd.com>
> Signed-off-by: Hardik Prakash <hardikprakash.official@gmail.com>
> Assisted-by: Claude:claude-sonnet-4-6
> Assisted-by: GPT-Codex:gpt-5.2-codex
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=221494

I don't think we use this tag anymore. Just make it Link:

Acked-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-26 10:42   ` Bartosz Golaszewski
@ 2026-05-28 21:24     ` Mario Limonciello
  2026-05-29  6:56       ` Hardik Prakash
  0 siblings, 1 reply; 11+ messages in thread
From: Mario Limonciello @ 2026-05-28 21:24 UTC (permalink / raw)
  To: Bartosz Golaszewski, Hardik Prakash
  Cc: linux-gpio, wsa, andriy.shevchenko, brgl, basavaraj.natikar,
	linus.walleij, linux-i2c



On 5/26/26 11:42, Bartosz Golaszewski wrote:
> On Sat, 23 May 2026 19:44:40 +0200, Hardik Prakash
> <hardikprakash.official@gmail.com> said:
>> I2C controllers may have child devices with GpioInt resources that
>> depend on GPIO controllers to be fully initialized. If the I2C
>> controller probes and enumerates children before the referenced GPIO
>> controller has completed probe, GPIO interrupts may not be properly
>> configured, leading to device failures.
>>
>> On Lenovo Yoga 7 14AGP11, the WACF2200 touchscreen (child of
>> AMDI0010:02) has a GpioInt resource pointing to GPIO 157 on the
>> pinctrl-amd controller (AMDI0030:00). When i2c-designware probes
>> AMDI0010:02 before pinctrl-amd finishes initializing, I2C transactions
>> occur before the GPIO IRQ quirk in amd_gpio_probe() has run, causing:
>>
>>    i2c_designware AMDI0010:02: i2c_dw_handle_tx_abort: lost arbitration
>>
>> Add a generic dependency check in i2c-designware that walks ACPI child
>> devices, identifies any GpioInt resources, resolves the referenced GPIO
>> controllers, and defers probe if those controllers are not yet bound.
>>
>> This ensures GPIO controllers complete initialization (including IRQ
>> setup and quirks) before I2C child enumeration begins, fixing the race
>> without device-specific quirks or DMI matching.
>>
>> The probe ordering race was confirmed via dynamic debug tracing:
>>
>>    0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
>>    0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
>>    0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
>>    2.348157  lost arbitration
>>
>> Suggested-by: Mario Limonciello <mario.limonciello@amd.com>
>> Signed-off-by: Hardik Prakash <hardikprakash.official@gmail.com>
>> Assisted-by: Claude:claude-sonnet-4-6
>> Assisted-by: GPT-Codex:gpt-5.2-codex
>> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=221494
> 
> I don't think we use this tag anymore. Just make it Link:
> 
> Acked-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>

Please make sure that we drop the now unnecessary patch that was 
committed from the earlier series when queuing this.  If that has 
already made it into a PR to linus (as part of -fixes or so) we should 
get it reverted.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-28 21:24     ` Mario Limonciello
@ 2026-05-29  6:56       ` Hardik Prakash
  2026-05-29  7:23         ` Mario Limonciello
  0 siblings, 1 reply; 11+ messages in thread
From: Hardik Prakash @ 2026-05-29  6:56 UTC (permalink / raw)
  To: Mario Limonciello
  Cc: Bartosz Golaszewski, linux-gpio, wsa, andriy.shevchenko, brgl,
	basavaraj.natikar, linux-i2c, linusw

On Fri, May 29, 2026, at 04:43, Mario Limonciello wrote:
> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
>
> Please make sure that we drop the now unnecessary patch that was
> committed from the earlier series when queuing this. If that has
> already made it into a PR to linus (as part of -fixes or so) we should
> get it reverted.

Linus Walleij confirmed it has already been pulled into Torvalds' tree,
so a revert will be needed. I'll leave that to the maintainers to
coordinate.

I'll send v8 now with your Reviewed-by and Bart's Acked-by collected.

Thanks,
Hardik

On Fri, 29 May 2026 at 04:43, Mario Limonciello <superm1@kernel.org> wrote:
>
>
>
> On 5/26/26 11:42, Bartosz Golaszewski wrote:
> > On Sat, 23 May 2026 19:44:40 +0200, Hardik Prakash
> > <hardikprakash.official@gmail.com> said:
> >> I2C controllers may have child devices with GpioInt resources that
> >> depend on GPIO controllers to be fully initialized. If the I2C
> >> controller probes and enumerates children before the referenced GPIO
> >> controller has completed probe, GPIO interrupts may not be properly
> >> configured, leading to device failures.
> >>
> >> On Lenovo Yoga 7 14AGP11, the WACF2200 touchscreen (child of
> >> AMDI0010:02) has a GpioInt resource pointing to GPIO 157 on the
> >> pinctrl-amd controller (AMDI0030:00). When i2c-designware probes
> >> AMDI0010:02 before pinctrl-amd finishes initializing, I2C transactions
> >> occur before the GPIO IRQ quirk in amd_gpio_probe() has run, causing:
> >>
> >>    i2c_designware AMDI0010:02: i2c_dw_handle_tx_abort: lost arbitration
> >>
> >> Add a generic dependency check in i2c-designware that walks ACPI child
> >> devices, identifies any GpioInt resources, resolves the referenced GPIO
> >> controllers, and defers probe if those controllers are not yet bound.
> >>
> >> This ensures GPIO controllers complete initialization (including IRQ
> >> setup and quirks) before I2C child enumeration begins, fixing the race
> >> without device-specific quirks or DMI matching.
> >>
> >> The probe ordering race was confirmed via dynamic debug tracing:
> >>
> >>    0.285952  amd_gpio_probe: registering gpiochip  <- GPIO chip visible
> >>    0.287121  amd_gpio_probe: requesting parent IRQ <- probe still running
> >>    0.301454  AMDI0010:02 dw_i2c_plat_probe: start  <- races here
> >>    2.348157  lost arbitration
> >>
> >> Suggested-by: Mario Limonciello <mario.limonciello@amd.com>
> >> Signed-off-by: Hardik Prakash <hardikprakash.official@gmail.com>
> >> Assisted-by: Claude:claude-sonnet-4-6
> >> Assisted-by: GPT-Codex:gpt-5.2-codex
> >> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=221494
> >
> > I don't think we use this tag anymore. Just make it Link:
> >
> > Acked-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
>
> Please make sure that we drop the now unnecessary patch that was
> committed from the earlier series when queuing this.  If that has
> already made it into a PR to linus (as part of -fixes or so) we should
> get it reverted.
>
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v6 1/1] i2c: designware: defer probe if child GpioInt controllers are not bound
  2026-05-29  6:56       ` Hardik Prakash
@ 2026-05-29  7:23         ` Mario Limonciello
  0 siblings, 0 replies; 11+ messages in thread
From: Mario Limonciello @ 2026-05-29  7:23 UTC (permalink / raw)
  To: Hardik Prakash
  Cc: Bartosz Golaszewski, linux-gpio, wsa, andriy.shevchenko, brgl,
	basavaraj.natikar, linux-i2c, linusw

On 5/29/26 07:56, Hardik Prakash wrote:
> On Fri, May 29, 2026, at 04:43, Mario Limonciello wrote:
>> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
>>
>> Please make sure that we drop the now unnecessary patch that was
>> committed from the earlier series when queuing this. If that has
>> already made it into a PR to linus (as part of -fixes or so) we should
>> get it reverted.
> 
> Linus Walleij confirmed it has already been pulled into Torvalds' tree,
> so a revert will be needed. I'll leave that to the maintainers to
> coordinate.
> 
> I'll send v8 now with your Reviewed-by and Bart's Acked-by collected.
> 

IMO - Just send your next version with a revert of that first patch 
frontloaded in the series.

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-05-29  7:23 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-23 17:44 [PATCH v6 0/1] i2c: designware: defer probe if child GpioInt controllers are not bound Hardik Prakash
2026-05-23 17:44 ` [PATCH v6 1/1] " Hardik Prakash
2026-05-24  1:47   ` kernel test robot
2026-05-24  5:40     ` Hardik Prakash
2026-05-26 10:42   ` Bartosz Golaszewski
2026-05-28 21:24     ` Mario Limonciello
2026-05-29  6:56       ` Hardik Prakash
2026-05-29  7:23         ` Mario Limonciello
2026-05-23 17:57 ` [PATCH v6 0/1] " Mario Limonciello
2026-05-26  9:41 ` Bartosz Golaszewski
2026-05-26 10:05   ` Hardik Prakash

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox