Skip to content

Commit d2b9df8

Browse files
committed
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 d2b9df8

1 file changed

Lines changed: 22 additions & 1 deletion

File tree

dtmerge/dtoverlay.c

Lines changed: 22 additions & 1 deletion
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_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

Comments
 (0)