@@ -564,6 +564,7 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off,
564564 int overlay_off , int depth )
565565{
566566 int prop_off , subnode_off ;
567+ int preserve_phandle = 0 ;
567568 int err = 0 ;
568569
569570 if (dtoverlay_debug_enabled )
@@ -578,6 +579,21 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off,
578579 overlay_path );
579580 }
580581
582+ // Check for a property flag to indicate preserving top-level phandles
583+ for (prop_off = fdt_first_property_offset (overlay_dtb -> fdt , overlay_off );
584+ (prop_off >= 0 ) && (err == 0 );
585+ prop_off = fdt_next_property_offset (overlay_dtb -> fdt , prop_off ))
586+ {
587+
588+ const char * prop_name ;
589+ int prop_len ;
590+
591+ fdt_getprop_by_offset (overlay_dtb -> fdt , prop_off , & prop_name , & prop_len );
592+
593+ if (strcmp (prop_name , "dtoverlay,preserve-phandle" ) == 0 )
594+ preserve_phandle = 1 ;
595+ }
596+
581597 // Merge each property of the node
582598 for (prop_off = fdt_first_property_offset (overlay_dtb -> fdt , overlay_off );
583599 (prop_off >= 0 ) && (err == 0 );
@@ -592,8 +608,13 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off,
592608 prop_val = fdt_getprop_by_offset (overlay_dtb -> fdt , prop_off ,
593609 & prop_name , & prop_len );
594610
595- /* Skip these system properties (only phandles in the first level) */
611+ /* Skip these system properties */
596612 if ((strcmp (prop_name , "name" ) == 0 ) ||
613+ (strcmp (prop_name , "dtoverlay,preserve-phandle" ) == 0 ))
614+ continue ;
615+
616+ /* Skip phandles in the first level, unless specifically requested */
617+ if ((!preserve_phandle ) &&
597618 ((depth == 0 ) && ((strcmp (prop_name , "phandle" ) == 0 ) ||
598619 (strcmp (prop_name , "linux,phandle" ) == 0 ))))
599620 continue ;
0 commit comments