Skip to contentSkip to conversation

pinctrl: devicetree: Keep deferring even on timeout

PATCH In review Thierry Reding 2 participants 3 messages Aug 25, 2020 – Sep 12, 2020

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 pinctrl: devicetree: Keep deferring even on timeout

From: Thierry Reding <[email protected]>

driver_deferred_probe_check_state() may return -ETIMEDOUT instead of -EPROBE_DEFER after all built-in drivers have been probed. This can cause issues for built-in drivers that depend on resources provided by loadable modules.

One such case happens on Tegra where I2C controllers are used during early boot to set up the system PMIC, so the I2C driver needs to be a built-in driver. At the same time, some instances of the I2C controller depend on the DPAUX hardware for pinmuxing. Since the DPAUX is handled by the display driver, which is usually not built-in, the pin control states will not become available until after the root filesystem has been mounted and the display driver loaded from it.

Fixes bec6c0ecb243 ("pinctrl: Remove use of driver_deferred_probe_check_state_continue()")
---
 drivers/pinctrl/devicetree.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/pinctrl/devicetree.c +2 -3
index 5eff8c296552..3fb238714718 100644
@@ -130,9 +130,8 @@ static int dt_to_map_one_config(struct pinctrl *p,
 		if (!np_pctldev || of_node_is_root(np_pctldev)) {
 			of_node_put(np_pctldev);
 			ret = driver_deferred_probe_check_state(p->dev);
-			/* keep deferring if modules are enabled unless we've timed out */
-			if (IS_ENABLED(CONFIG_MODULES) && !allow_default &&
-			    (ret == -ENODEV))
+			/* keep deferring if modules are enabled */
+			if (IS_ENABLED(CONFIG_MODULES) && !allow_default && ret < 0)
 				ret = -EPROBE_DEFER;
 			return ret;
 		}
Signature · 1 line
2.28.0
#1 lore raw
Quoted 15 lines · Thierry Reding

From: Thierry Reding <[email protected]>

driver_deferred_probe_check_state() may return -ETIMEDOUT instead of -EPROBE_DEFER after all built-in drivers have been probed. This can cause issues for built-in drivers that depend on resources provided by loadable modules.

One such case happens on Tegra where I2C controllers are used during early boot to set up the system PMIC, so the I2C driver needs to be a built-in driver. At the same time, some instances of the I2C controller depend on the DPAUX hardware for pinmuxing. Since the DPAUX is handled by the display driver, which is usually not built-in, the pin control states will not become available until after the root filesystem has been mounted and the display driver loaded from it.

Quoted 3 lines
Fixes bec6c0ecb243 ("pinctrl: Remove use of driver_deferred_probe_check_state_continue()")

Just like with the identical patch from John I got a while back, I'd like some nod from the device core maintainers (Greg or Raphael) that this is how we want to do things.

Yours,
Linus Walleij

#2 lore raw
In reply to Thierry Reding
Quoted 15 lines · Thierry Reding

From: Thierry Reding <[email protected]>

driver_deferred_probe_check_state() may return -ETIMEDOUT instead of -EPROBE_DEFER after all built-in drivers have been probed. This can cause issues for built-in drivers that depend on resources provided by loadable modules.

One such case happens on Tegra where I2C controllers are used during early boot to set up the system PMIC, so the I2C driver needs to be a built-in driver. At the same time, some instances of the I2C controller depend on the DPAUX hardware for pinmuxing. Since the DPAUX is handled by the display driver, which is usually not built-in, the pin control states will not become available until after the root filesystem has been mounted and the display driver loaded from it.

Quoted 3 lines
Fixes bec6c0ecb243 ("pinctrl: Remove use of driver_deferred_probe_check_state_continue()")

I applied this patch (rather than Johns') since John agreed this is a better solution.

I got Greg's ACK on Johns patch but not this one, but anyways it shows he's convenient with the concept so here we go.

Yours,
Linus Walleij