]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pinctrl: devicetree: Keep deferring even on timeout
authorThierry Reding <treding@nvidia.com>
Tue, 25 Aug 2020 14:33:48 +0000 (16:33 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Sat, 12 Sep 2020 16:19:53 +0000 (18:19 +0200)
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()")
Suggested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20200825143348.1358679-1-thierry.reding@gmail.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/devicetree.c

index 5eff8c2965528d446fdbf1b4773a395c56c33110..3fb2387147189d5d286751fa4c8c6d5b8a602f9d 100644 (file)
@@ -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;
                }