@@ -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_phandles ;
567568 int err = 0 ;
568569
569570 if (dtoverlay_debug_enabled )
@@ -578,6 +579,10 @@ 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+ preserve_phandles = depth > 0 ||
584+ fdt_getprop (overlay_dtb -> fdt , overlay_off , "dtoverlay,preserve-phandle" , NULL );
585+
581586 // Merge each property of the node
582587 for (prop_off = fdt_first_property_offset (overlay_dtb -> fdt , overlay_off );
583588 (prop_off >= 0 ) && (err == 0 );
@@ -592,10 +597,11 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off,
592597 prop_val = fdt_getprop_by_offset (overlay_dtb -> fdt , prop_off ,
593598 & prop_name , & prop_len );
594599
595- /* Skip these system properties (only phandles in the first level) */
600+ // Skip system properties and top-level phandles unless preserved
596601 if ((strcmp (prop_name , "name" ) == 0 ) ||
597- ((depth == 0 ) && ((strcmp (prop_name , "phandle" ) == 0 ) ||
598- (strcmp (prop_name , "linux,phandle" ) == 0 ))))
602+ (strcmp (prop_name , "dtoverlay,preserve-phandle" ) == 0 ) ||
603+ (!preserve_phandles && ((strcmp (prop_name , "phandle" ) == 0 ) ||
604+ (strcmp (prop_name , "linux,phandle" ) == 0 ))))
599605 continue ;
600606
601607 dtoverlay_debug (" +prop(%s)" , prop_name );
0 commit comments