static int of_overlay_apply_single_property(struct of_overlay *ov, struct device_node *target, struct property *prop) { struct property *propn, *tprop; /* NOTE: Multiple changes of single properties not supported */ tprop = of_find_property(target, prop->name, NULL); /* special properties are not meant to be updated (silent NOP) */ if (of_prop_cmp(prop->name, "name") == 0 || of_prop_cmp(prop->name, "phandle") == 0 || of_prop_cmp(prop->name, "linux,phandle") == 0) return 0; propn = __of_prop_dup(prop, GFP_KERNEL); if (propn == NULL) return -ENOMEM; /* not found? add */ if (tprop == NULL) return of_changeset_add_property(&ov->cset, target, propn); /* found? update */ return of_changeset_update_property(&ov->cset, target, propn); }
/** * add_changeset_property() - add @overlay_prop to overlay changeset * @ovcs: overlay changeset * @target_node: where to place @overlay_prop in live tree * @overlay_prop: property to add or update, from overlay tree * @is_symbols_prop: 1 if @overlay_prop is from node "/__symbols__" * * If @overlay_prop does not already exist in @target_node, add changeset entry * to add @overlay_prop in @target_node, else add changeset entry to update * value of @overlay_prop. * * Some special properties are not updated (no error returned). * * Update of property in symbols node is not allowed. * * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if * invalid @overlay. */ static int add_changeset_property(struct overlay_changeset *ovcs, struct device_node *target_node, struct property *overlay_prop, bool is_symbols_prop) { struct property *new_prop = NULL, *prop; int ret = 0; prop = of_find_property(target_node, overlay_prop->name, NULL); if (!of_prop_cmp(overlay_prop->name, "name") || !of_prop_cmp(overlay_prop->name, "phandle") || !of_prop_cmp(overlay_prop->name, "linux,phandle")) return 0; if (is_symbols_prop) { if (prop) return -EINVAL; new_prop = dup_and_fixup_symbol_prop(ovcs, overlay_prop); } else { new_prop = __of_prop_dup(overlay_prop, GFP_KERNEL); } if (!new_prop) return -ENOMEM; if (!prop) ret = of_changeset_add_property(&ovcs->cset, target_node, new_prop); else ret = of_changeset_update_property(&ovcs->cset, target_node, new_prop); if (ret) { kfree(new_prop->name); kfree(new_prop->value); kfree(new_prop); } return ret; }