/** * of_add_property - Add a property to a node */ int of_add_property(struct device_node *np, struct property *prop) { struct property **next; unsigned long flags; int rc; rc = of_property_notify(OF_RECONFIG_ADD_PROPERTY, np, prop); if (rc) return rc; prop->next = NULL; raw_spin_lock_irqsave(&devtree_lock, flags); next = &np->properties; while (*next) { if (strcmp(prop->name, (*next)->name) == 0) { /* duplicate ! don't insert it */ raw_spin_unlock_irqrestore(&devtree_lock, flags); return -1; } next = &(*next)->next; } *next = prop; raw_spin_unlock_irqrestore(&devtree_lock, flags); #ifdef CONFIG_PROC_DEVICETREE /* try to add to proc as well if it was initialized */ if (np->pde) proc_device_tree_add_prop(np->pde, prop); #endif /* CONFIG_PROC_DEVICETREE */ return 0; }
/** * prom_add_property - Add a property to a node */ int prom_add_property(struct device_node *np, struct property *prop) { struct property **next; unsigned long flags; prop->next = NULL; write_lock_irqsave(&devtree_lock, flags); next = &np->properties; while (*next) { if (strcmp(prop->name, (*next)->name) == 0) { /* duplicate ! don't insert it */ write_unlock_irqrestore(&devtree_lock, flags); return -1; } next = &(*next)->next; } *next = prop; write_unlock_irqrestore(&devtree_lock, flags); #ifdef CONFIG_PROC_DEVICETREE /* try to add to proc as well if it was initialized */ if (np->pde) proc_device_tree_add_prop(np->pde, prop); #endif /* CONFIG_PROC_DEVICETREE */ return 0; }
void proc_device_tree_update_prop(struct proc_dir_entry *pde, struct property *newprop, struct property *oldprop) { struct proc_dir_entry *ent; if (!oldprop) { proc_device_tree_add_prop(pde, newprop); return; } for (ent = pde->subdir; ent != NULL; ent = ent->next) if (ent->data == oldprop) break; if (ent == NULL) { pr_warn("device-tree: property \"%s\" does not exist\n", oldprop->name); } else { ent->data = newprop; ent->size = newprop->length; } }