[PATCH] pinctrl: Check pinconfig nodes pre-reloc status recursively
Jonas Karlman
jonas at kwiboo.se
Sat Aug 5 16:29:39 CEST 2023
Hi Massimo,
On 2023-08-05 16:06, Massimo Pegorer wrote:
> Hi Jonas,
>
> Il giorno sab 5 ago 2023 alle ore 13:11 Jonas Karlman <jonas at kwiboo.se> ha
> scritto:
>
>> Pinconfig nodes normally bind recursively with PINCTRL_FULL and
>> PINCONF_RECURSIVE enabled. However, during U-Boot proper pre-relocation
>> any node marked with e.g. bootph-all will not bind unless its parent is
>> also marked for pre-reloc.
>>
>> group1 {
>> pinconf1 {
>> bootph-all;
>> };
>> };
>>
>> This cause the following warning message to be shown during U-Boot
>> proper pre-reloc stage on Rockchip RK3568 devices.
>>
>> ns16550_serial serial at fe660000: pinctrl_select_state_full:
>> uclass_get_device_by_phandle_id: err=-19
>>
>> Check pinconfig nodes pre-reloc status recursively to fix this and to
>> make pinconfig_post_bind work same at both U-Boot proper pre-reloc and
>> at TPL/SPL stage.
>>
>> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
>> ---
>> drivers/pinctrl/pinctrl-uclass.c | 18 +++++++++++++++++-
>> 1 file changed, 17 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/pinctrl/pinctrl-uclass.c
>> b/drivers/pinctrl/pinctrl-uclass.c
>> index 73dd7b1038bb..fe2ba5021a78 100644
>> --- a/drivers/pinctrl/pinctrl-uclass.c
>> +++ b/drivers/pinctrl/pinctrl-uclass.c
>> @@ -100,6 +100,22 @@ static int pinctrl_select_state_full(struct udevice
>> *dev, const char *statename)
>> return 0;
>> }
>>
>> +static bool ofnode_pre_reloc_recursive(ofnode parent)
>> +{
>> + ofnode child;
>> +
>> + if (ofnode_pre_reloc(parent))
>> + return true;
>> +
>> + if (CONFIG_IS_ENABLED(PINCONF_RECURSIVE)) {
>> + ofnode_for_each_subnode(child, parent)
>> + if (ofnode_pre_reloc_recursive(child))
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> /**
>> * pinconfig_post_bind() - post binding for PINCONFIG uclass
>> * Recursively bind its children as pinconfig devices.
>> @@ -119,7 +135,7 @@ static int pinconfig_post_bind(struct udevice *dev)
>>
>> dev_for_each_subnode(node, dev) {
>> if (pre_reloc_only &&
>> - !ofnode_pre_reloc(node))
>> + !ofnode_pre_reloc_recursive(node))
>> continue;
>> /*
>> * If this node has "compatible" property, this is not
>> --
>> 2.41.0
>>
>
> I've fixed the same issue for Rockchip RK3308 a couple of days ago with
> patch [1]
> as part of the series [2], adding required nodes with 'bootph-some-ram'
> property
> into *-u-boot.dtsi.
>
> With your solution, is there any risk not to warn about any pin that should
> be configured
> but is not due to any ancestor missing in device tree (in pre-reloc boot
> phase, I mean)?
Yes, with this any pinconf group that may contain a child/leaf node that
have bootph prop will bind so that the child/leaf node also can bind and
be referenced at pre-reloc phase. It is also fully recursive so should
fix the issue with any missed ancestor, when it comes to pinconfig.
For TPL/SPL the ofnode_pre_reloc always return true so this has not been
an issue at that phase. This change should make pinconfig_post_bind
behave same as it does in TPL/SPL where any child/leaf node bind.
Regards,
Jonas
>
> Thanks.
>
> Massimo
>
> [1]
> https://patchwork.ozlabs.org/project/uboot/patch/20230803110813.175956-4-massimo.pegorer+oss@gmail.com/
>
> [2]
> https://patchwork.ozlabs.org/project/uboot/cover/20230803110813.175956-1-massimo.pegorer+oss@gmail.com/
>
More information about the U-Boot
mailing list