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>
This commit is contained in:
Родитель
536836d32c
Коммит
b89405b610
|
@ -122,8 +122,10 @@ static int dt_to_map_one_config(struct pinctrl *p,
|
||||||
/* OK let's just assume this will appear later then */
|
/* OK let's just assume this will appear later then */
|
||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
}
|
}
|
||||||
if (!pctldev)
|
/* If we're creating a hog we can use the passed pctldev */
|
||||||
pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
|
if (pctldev && (np_pctldev == p->dev->of_node))
|
||||||
|
break;
|
||||||
|
pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
|
||||||
if (pctldev)
|
if (pctldev)
|
||||||
break;
|
break;
|
||||||
/* Do not defer probing of hogs (circular loop) */
|
/* Do not defer probing of hogs (circular loop) */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче