diff options
Diffstat (limited to 'scripts/dtc/livetree.c')
| -rw-r--r-- | scripts/dtc/livetree.c | 25 | 
1 files changed, 18 insertions, 7 deletions
| diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c index 49f723002f85..d51d05830b18 100644 --- a/scripts/dtc/livetree.c +++ b/scripts/dtc/livetree.c @@ -174,7 +174,7 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)  				old_prop->val = new_prop->val;  				old_prop->deleted = 0; -				free(old_prop->srcpos); +				srcpos_free(old_prop->srcpos);  				old_prop->srcpos = new_prop->srcpos;  				free(new_prop);  				new_prop = NULL; @@ -504,7 +504,7 @@ struct node *get_subnode(struct node *node, const char *nodename)  	struct node *child;  	for_each_child(node, child) -		if (streq(child->name, nodename)) +		if (streq(child->name, nodename) && !child->deleted)  			return child;  	return NULL; @@ -1014,9 +1014,7 @@ static void add_local_fixup_entry(struct dt_info *dti,  	/* walk the path components creating nodes if they don't exist */  	for (wn = lfn, i = 1; i < depth; i++, wn = nwn) {  		/* if no node exists, create it */ -		nwn = get_subnode(wn, compp[i]); -		if (!nwn) -			nwn = build_and_name_child_node(wn, compp[i]); +		nwn = build_root_node(wn, compp[i]);  	}  	free(compp); @@ -1058,16 +1056,29 @@ void generate_label_tree(struct dt_info *dti, const char *name, bool allocph)  void generate_fixups_tree(struct dt_info *dti, const char *name)  { +	struct node *n = get_subnode(dti->dt, name); + +	/* Start with an empty __fixups__ node to not get duplicates */ +	if (n) +		n->deleted = true; +  	if (!any_fixup_tree(dti, dti->dt))  		return; -	generate_fixups_tree_internal(dti, build_root_node(dti->dt, name), +	generate_fixups_tree_internal(dti, +				      build_and_name_child_node(dti->dt, name),  				      dti->dt);  }  void generate_local_fixups_tree(struct dt_info *dti, const char *name)  { +	struct node *n = get_subnode(dti->dt, name); + +	/* Start with an empty __local_fixups__ node to not get duplicates */ +	if (n) +		n->deleted = true;  	if (!any_local_fixup_tree(dti, dti->dt))  		return; -	generate_local_fixups_tree_internal(dti, build_root_node(dti->dt, name), +	generate_local_fixups_tree_internal(dti, +					    build_and_name_child_node(dti->dt, name),  					    dti->dt);  } | 
