Skip to content

Commit c6e0e3a

Browse files
compholiopelwell
authored andcommitted
dtoverlay: allow top-level phandles to optionally be preserved
Look for the 'dtoverlay,preserve-phandle' flag in the overlay and, if it's present, keep and merge the phandle.
1 parent 8903f29 commit c6e0e3a

1 file changed

Lines changed: 9 additions & 3 deletions

File tree

dtmerge/dtoverlay.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)