dm: core: Don't use pinctrl for the root device
authorSimon Glass <sjg@chromium.org>
Sat, 12 Sep 2015 14:45:19 +0000 (08:45 -0600)
committerSimon Glass <sjg@chromium.org>
Mon, 5 Oct 2015 14:47:49 +0000 (15:47 +0100)
Currently when driver model starts up it finds the root uclass and the
pinctrl uclass. This is because even the root node handles pinctrl
processing.

But this is not useful. The root node is not a real hardware device so
cannot require any particular pinmux settings. Also it means that the
memory leak tests fails, since they end up freeing more memory than
they allocate: the marker it set after the root device and pinctrl
uclass are allocated, and later once the pinctrl uclass is freed the memory
used by driver model is less than when the marker was set.

If a platform needs 'core' pin mulitplex settings it can do this with
a driver that is probed on start-up. It would be an abuse of the root node
to use this for pinctrl.

To avoid this problem, only process pinctrl settings for non-root nodes.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/device.c

index 0bc04d4876d09482dac61ebd4dd8a0963dcb8a5e..833a803696439f92a4812b6a4d5438816ee377fa 100644 (file)
@@ -289,8 +289,12 @@ int device_probe_child(struct udevice *dev, void *parent_priv)
 
        dev->flags |= DM_FLAG_ACTIVATED;
 
-       /* continue regardless of the result of pinctrl */
-       pinctrl_select_state(dev, "default");
+       /*
+        * Process pinctrl for everything except the root device, and
+        * continue regardless of the result of pinctrl.
+        */
+       if (dev->parent)
+               pinctrl_select_state(dev, "default");
 
        ret = uclass_pre_probe_device(dev);
        if (ret)