From 2cc62069dabec52c145c0e71afe0afbe5709d3f1 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Wed, 10 Jun 2026 09:23:08 -0600 Subject: [PATCH] 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. --- dtmerge/dtoverlay.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dtmerge/dtoverlay.c b/dtmerge/dtoverlay.c index 73e5637..14a2ce1 100644 --- a/dtmerge/dtoverlay.c +++ b/dtmerge/dtoverlay.c @@ -564,6 +564,7 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off, int overlay_off, int depth) { int prop_off, subnode_off; + int preserve_phandles; int err = 0; if (dtoverlay_debug_enabled) @@ -578,6 +579,10 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off, overlay_path); } + // Check for a property flag to indicate preserving top-level phandles + preserve_phandles = depth > 0 || + fdt_getprop(overlay_dtb->fdt, overlay_off, "dtoverlay,preserve-phandle", NULL); + // Merge each property of the node for (prop_off = fdt_first_property_offset(overlay_dtb->fdt, overlay_off); (prop_off >= 0) && (err == 0); @@ -592,10 +597,11 @@ int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off, prop_val = fdt_getprop_by_offset(overlay_dtb->fdt, prop_off, &prop_name, &prop_len); - /* Skip these system properties (only phandles in the first level) */ + // Skip system properties and top-level phandles unless preserved if ((strcmp(prop_name, "name") == 0) || - ((depth == 0) && ((strcmp(prop_name, "phandle") == 0) || - (strcmp(prop_name, "linux,phandle") == 0)))) + (strcmp(prop_name, "dtoverlay,preserve-phandle") == 0) || + (!preserve_phandles && ((strcmp(prop_name, "phandle") == 0) || + (strcmp(prop_name, "linux,phandle") == 0)))) continue; dtoverlay_debug(" +prop(%s)", prop_name);