Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: devicetree: Fix dt_to_map_one_config handling of hogs

When dt_to_map_one_config() is called with a pinctrl_dev passed
in, it should only be using this if the node being looked up
is a hog. The code was always using the passed pinctrl_dev
without checking whether the dt node referred to it.

A pin controller can have pinctrl-n dependencies on other pin
controllers in these cases:

- the pin controller hardware is external, for example I2C, so
needs other pin controller(s) to be setup to communicate with
the hardware device.

- it is a child of a composite MFD so its of_node is shared with
the parent MFD and other children of that MFD. Any part of that
MFD could have dependencies on other pin controllers.

Because of this, dt_to_map_one_config() can't assume that if it
has a pinctrl_dev passed in then the node it looks up must be
a hog. It could be a reference to some other pin controller.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Richard Fitzgerald and committed by
Linus Walleij
b89405b6 536836d3

+4 -2
+4 -2
drivers/pinctrl/devicetree.c
··· 122 122 /* OK let's just assume this will appear later then */ 123 123 return -EPROBE_DEFER; 124 124 } 125 - if (!pctldev) 126 - pctldev = get_pinctrl_dev_from_of_node(np_pctldev); 125 + /* If we're creating a hog we can use the passed pctldev */ 126 + if (pctldev && (np_pctldev == p->dev->of_node)) 127 + break; 128 + pctldev = get_pinctrl_dev_from_of_node(np_pctldev); 127 129 if (pctldev) 128 130 break; 129 131 /* Do not defer probing of hogs (circular loop) */