[PATCH] pinctrl: Check pinconfig nodes pre-reloc status recursively

Massimo Pegorer massimo.pegorer+oss at gmail.com
Sat Aug 5 16:06:47 CEST 2023


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)?

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