]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/pinctrl/devicetree.c
Merge tag 'devicetree-fixes-for-4.20-1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / drivers / pinctrl / devicetree.c
index c4aa411f5935b7b0275c004a3924ffda3613630a..2969ff3162c35b17fdce2b516f927b558543e497 100644 (file)
@@ -111,17 +111,24 @@ static int dt_to_map_one_config(struct pinctrl *p,
        int ret;
        struct pinctrl_map *map;
        unsigned num_maps;
+       bool allow_default = false;
 
        /* Find the pin controller containing np_config */
        np_pctldev = of_node_get(np_config);
        for (;;) {
+               if (!allow_default)
+                       allow_default = of_property_read_bool(np_pctldev,
+                                                             "pinctrl-use-default");
+
                np_pctldev = of_get_next_parent(np_pctldev);
                if (!np_pctldev || of_node_is_root(np_pctldev)) {
-                       dev_info(p->dev, "could not find pctldev for node %pOF, deferring probe\n",
-                               np_config);
                        of_node_put(np_pctldev);
-                       /* OK let's just assume this will appear later then */
-                       return -EPROBE_DEFER;
+                       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)
+                               ret = -EPROBE_DEFER;
+
+                       return ret;
                }
                /* If we're creating a hog we can use the passed pctldev */
                if (hog_pctldev && (np_pctldev == p->dev->of_node)) {