Hi Simon, On 09:36-20231217, Simon Glass wrote: > The existing bootph binding is defined such that properties in a > subnode are also implied in the supernode also, as in this example: > > buttons { > /* bootph,pre-ram is implied by btn1 */ > compatible = "gpio-keys"; > > btn1 { > bootph,pre-ram; > gpios = <&gpio_a 3 0>; > label = "button1"; > linux,code = <BTN_1>; > }; > > Provide an option to implement this in fdtgrep. > > Signed-off-by: Simon Glass <s...@chromium.org>
Coming back to this patch as am facing some issues with the bootph-all propagation to the parent nodes [0]. We have a dmsc/sms node in our devices and it is a parent node of k3_pds, k3_clks, k3_reset. During U-boot proper we are initializing the serial console and during that time we have to make some calls to our Device manager for clocks and power domains. With the DT modelling, the clocks and power domains come under the device manager node ( dmsc/sms ) but interestingly that driver is not getting probed while putting bootph-all in the child nodes. Do you know anything about this? I thought putting it in child node will propagate it to the parent nodes as well so it'll be probed as well. We are having to put bootph-all explicitely in the dmsc/sms node for it to work. [0]: https://lore.kernel.org/linux-arm-kernel/20240705-b4-upstream-bootph-all-v2-0-9007681ed...@ti.com/T/#t Regards, Manorit > --- > > tools/fdtgrep.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/tools/fdtgrep.c b/tools/fdtgrep.c > index ca639a2d9f4f..f1ff1946bd4a 100644 > --- a/tools/fdtgrep.c > +++ b/tools/fdtgrep.c > @@ -63,6 +63,7 @@ struct display_info { > int types_inc; /* Mask of types that we include (FDT_IS...) */ > int types_exc; /* Mask of types that we exclude (FDT_IS...) */ > int invert; /* Invert polarity of match */ > + int props_up; /* Imply properties up to supernodes */ > struct value_node *value_head; /* List of values to match */ > const char *output_fname; /* Output filename */ > FILE *fout; /* File to write dts/dtb output */ > @@ -606,6 +607,16 @@ static int check_props(struct display_info *disp, const > void *fdt, int node, > strlen(str)); > } > > + /* if requested, check all subnodes for this property too */ > + if (inc != 1 && disp->props_up) { > + int subnode; > + > + for (subnode = fdt_first_subnode(fdt, node); > + subnode > 0 && inc != 1; > + subnode = fdt_next_subnode(fdt, subnode)) > + inc = check_props(disp, fdt, subnode, inc); > + } > + > return inc; > } > > @@ -955,7 +966,7 @@ static const char usage_synopsis[] = > case '?': usage("unknown option"); > > static const char usage_short_opts[] = > - "haAc:b:C:defg:G:HIlLmn:N:o:O:p:P:rRsStTv" > + "haAc:b:C:defg:G:HIlLmn:N:o:O:p:P:rRsStTuv" > USAGE_COMMON_SHORT_OPTS; > static const struct option usage_long_opts[] = { > {"show-address", no_argument, NULL, 'a'}, > @@ -985,6 +996,7 @@ static const struct option usage_long_opts[] = { > {"skip-supernodes", no_argument, NULL, 'S'}, > {"show-stringtab", no_argument, NULL, 't'}, > {"show-aliases", no_argument, NULL, 'T'}, > + {"props-up-to-supernode", no_argument, NULL, 'u'}, > {"invert-match", no_argument, NULL, 'v'}, > USAGE_COMMON_LONG_OPTS, > }; > @@ -1016,6 +1028,7 @@ static const char * const usage_opts_help[] = { > "Don't include supernodes of matching nodes", > "Include string table in binary output", > "Include matching aliases in output", > + "Add -p properties to supernodes too", > "Invert the sense of matching (select non-matching lines)", > USAGE_COMMON_OPTS_HELP > }; > @@ -1202,6 +1215,9 @@ static void scan_args(struct display_info *disp, int > argc, char *argv[]) > case 'T': > disp->add_aliases = 1; > break; > + case 'u': > + disp->props_up = 1; > + break; > case 'v': > disp->invert = 1; > break; > -- > 2.43.0.472.g3155946c3a-goog >