Message ID | 20240217120842.2381465-1-jonas@kwiboo.se |
---|---|
State | Accepted |
Commit | 1d01440b3f14f6648cd672da619489f635cb209c |
Delegated to: | Tom Rini |
Headers | show |
Series | [v2] pinctrl: Check pinconfig nodes pre-reloc status recursively | expand |
Hi Jonas, On 2/17/24 13:08, Jonas Karlman wrote: > 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 devices, e.g on RK3568: > > ns16550_serial serial@fe660000: pinctrl_select_state_full: uclass_get_device_by_phandle_id: err=-19 > > and on RK3328: > > ns16550_serial serial@ff130000: 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@kwiboo.se> > --- > v2: > - No change > > A recent change to fdtgrep was believed to solve this however, fdtgrep > is only applied to control fdt for xPL so this issue still exist at > U-Boot proper pre-reloc stage. > > Link to v1: https://patchwork.ozlabs.org/patch/1817296/ > --- > 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)) { You could move the ofnode child declaration here for limiting the scope. I also got confused by "parent" name, as it isn't actually the parent we're looking at right now, but the node itself, so it was a bit misleading. I would have kept "node" and the "child" one is explicit enough. In any case, Reviewed-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> Thanks, Quentin
On Sat, Feb 17, 2024 at 12:08:40PM +0000, Jonas Karlman wrote: > 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 devices, e.g on RK3568: > > ns16550_serial serial@fe660000: pinctrl_select_state_full: uclass_get_device_by_phandle_id: err=-19 > > and on RK3328: > > ns16550_serial serial@ff130000: 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@kwiboo.se> Applied to u-boot/next, thanks!
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
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 devices, e.g on RK3568: ns16550_serial serial@fe660000: pinctrl_select_state_full: uclass_get_device_by_phandle_id: err=-19 and on RK3328: ns16550_serial serial@ff130000: 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@kwiboo.se> --- v2: - No change A recent change to fdtgrep was believed to solve this however, fdtgrep is only applied to control fdt for xPL so this issue still exist at U-Boot proper pre-reloc stage. Link to v1: https://patchwork.ozlabs.org/patch/1817296/ --- drivers/pinctrl/pinctrl-uclass.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)