of: merge prom_{add,remove,modify}_property
Merge common code between PowerPC and MicroBlaze Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Reviewed-by: Wolfram Sang <w.sang@pengutronix.de> Tested-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
parent
41f880091c
commit
02af11b03f
3 changed files with 116 additions and 227 deletions
|
@ -606,119 +606,6 @@ void of_detach_node(struct device_node *np)
|
|||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove a property from a node. Note that we don't actually
|
||||
* remove it, since we have given out who-knows-how-many pointers
|
||||
* to the data using get-property. Instead we just move the property
|
||||
* to the "dead properties" list, so it won't be found any more.
|
||||
*/
|
||||
int prom_remove_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
struct property **next;
|
||||
unsigned long flags;
|
||||
int found = 0;
|
||||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
next = &np->properties;
|
||||
while (*next) {
|
||||
if (*next == prop) {
|
||||
/* found the node */
|
||||
*next = prop->next;
|
||||
prop->next = np->deadprops;
|
||||
np->deadprops = prop;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
next = &(*next)->next;
|
||||
}
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
if (!found)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_PROC_DEVICETREE
|
||||
/* try to remove the proc node as well */
|
||||
if (np->pde)
|
||||
proc_device_tree_remove_prop(np->pde, prop);
|
||||
#endif /* CONFIG_PROC_DEVICETREE */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update a property in a node. Note that we don't actually
|
||||
* remove it, since we have given out who-knows-how-many pointers
|
||||
* to the data using get-property. Instead we just move the property
|
||||
* to the "dead properties" list, and add the new property to the
|
||||
* property list
|
||||
*/
|
||||
int prom_update_property(struct device_node *np,
|
||||
struct property *newprop,
|
||||
struct property *oldprop)
|
||||
{
|
||||
struct property **next;
|
||||
unsigned long flags;
|
||||
int found = 0;
|
||||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
next = &np->properties;
|
||||
while (*next) {
|
||||
if (*next == oldprop) {
|
||||
/* found the node */
|
||||
newprop->next = oldprop->next;
|
||||
*next = newprop;
|
||||
oldprop->next = np->deadprops;
|
||||
np->deadprops = oldprop;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
next = &(*next)->next;
|
||||
}
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
if (!found)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_PROC_DEVICETREE
|
||||
/* try to add to proc as well if it was initialized */
|
||||
if (np->pde)
|
||||
proc_device_tree_update_prop(np->pde, newprop, oldprop);
|
||||
#endif /* CONFIG_PROC_DEVICETREE */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS) && defined(DEBUG)
|
||||
static struct debugfs_blob_wrapper flat_dt_blob;
|
||||
|
||||
|
|
|
@ -1130,120 +1130,6 @@ static int __init prom_reconfig_setup(void)
|
|||
__initcall(prom_reconfig_setup);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove a property from a node. Note that we don't actually
|
||||
* remove it, since we have given out who-knows-how-many pointers
|
||||
* to the data using get-property. Instead we just move the property
|
||||
* to the "dead properties" list, so it won't be found any more.
|
||||
*/
|
||||
int prom_remove_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
struct property **next;
|
||||
unsigned long flags;
|
||||
int found = 0;
|
||||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
next = &np->properties;
|
||||
while (*next) {
|
||||
if (*next == prop) {
|
||||
/* found the node */
|
||||
*next = prop->next;
|
||||
prop->next = np->deadprops;
|
||||
np->deadprops = prop;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
next = &(*next)->next;
|
||||
}
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
if (!found)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_PROC_DEVICETREE
|
||||
/* try to remove the proc node as well */
|
||||
if (np->pde)
|
||||
proc_device_tree_remove_prop(np->pde, prop);
|
||||
#endif /* CONFIG_PROC_DEVICETREE */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update a property in a node. Note that we don't actually
|
||||
* remove it, since we have given out who-knows-how-many pointers
|
||||
* to the data using get-property. Instead we just move the property
|
||||
* to the "dead properties" list, and add the new property to the
|
||||
* property list
|
||||
*/
|
||||
int prom_update_property(struct device_node *np,
|
||||
struct property *newprop,
|
||||
struct property *oldprop)
|
||||
{
|
||||
struct property **next;
|
||||
unsigned long flags;
|
||||
int found = 0;
|
||||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
next = &np->properties;
|
||||
while (*next) {
|
||||
if (*next == oldprop) {
|
||||
/* found the node */
|
||||
newprop->next = oldprop->next;
|
||||
*next = newprop;
|
||||
oldprop->next = np->deadprops;
|
||||
np->deadprops = oldprop;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
next = &(*next)->next;
|
||||
}
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
if (!found)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_PROC_DEVICETREE
|
||||
/* try to add to proc as well if it was initialized */
|
||||
if (np->pde)
|
||||
proc_device_tree_update_prop(np->pde, newprop, oldprop);
|
||||
#endif /* CONFIG_PROC_DEVICETREE */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Find the device node for a given logical cpu number, also returns the cpu
|
||||
* local thread number (index in ibm,interrupt-server#s) if relevant and
|
||||
* asked for (non NULL)
|
||||
|
|
|
@ -658,3 +658,119 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
|
|||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(of_parse_phandles_with_args);
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* prom_remove_property - Remove a property from a node.
|
||||
*
|
||||
* Note that we don't actually remove it, since we have given out
|
||||
* who-knows-how-many pointers to the data using get-property.
|
||||
* Instead we just move the property to the "dead properties"
|
||||
* list, so it won't be found any more.
|
||||
*/
|
||||
int prom_remove_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
struct property **next;
|
||||
unsigned long flags;
|
||||
int found = 0;
|
||||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
next = &np->properties;
|
||||
while (*next) {
|
||||
if (*next == prop) {
|
||||
/* found the node */
|
||||
*next = prop->next;
|
||||
prop->next = np->deadprops;
|
||||
np->deadprops = prop;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
next = &(*next)->next;
|
||||
}
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
if (!found)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_PROC_DEVICETREE
|
||||
/* try to remove the proc node as well */
|
||||
if (np->pde)
|
||||
proc_device_tree_remove_prop(np->pde, prop);
|
||||
#endif /* CONFIG_PROC_DEVICETREE */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* prom_update_property - Update a property in a node.
|
||||
*
|
||||
* Note that we don't actually remove it, since we have given out
|
||||
* who-knows-how-many pointers to the data using get-property.
|
||||
* Instead we just move the property to the "dead properties" list,
|
||||
* and add the new property to the property list
|
||||
*/
|
||||
int prom_update_property(struct device_node *np,
|
||||
struct property *newprop,
|
||||
struct property *oldprop)
|
||||
{
|
||||
struct property **next;
|
||||
unsigned long flags;
|
||||
int found = 0;
|
||||
|
||||
write_lock_irqsave(&devtree_lock, flags);
|
||||
next = &np->properties;
|
||||
while (*next) {
|
||||
if (*next == oldprop) {
|
||||
/* found the node */
|
||||
newprop->next = oldprop->next;
|
||||
*next = newprop;
|
||||
oldprop->next = np->deadprops;
|
||||
np->deadprops = oldprop;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
next = &(*next)->next;
|
||||
}
|
||||
write_unlock_irqrestore(&devtree_lock, flags);
|
||||
|
||||
if (!found)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_PROC_DEVICETREE
|
||||
/* try to add to proc as well if it was initialized */
|
||||
if (np->pde)
|
||||
proc_device_tree_update_prop(np->pde, newprop, oldprop);
|
||||
#endif /* CONFIG_PROC_DEVICETREE */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue