mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-08 14:13:53 +00:00
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
@ -606,119 +606,6 @@ void of_detach_node(struct device_node *np)
|
|||||||
write_unlock_irqrestore(&devtree_lock, flags);
|
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)
|
#if defined(CONFIG_DEBUG_FS) && defined(DEBUG)
|
||||||
static struct debugfs_blob_wrapper flat_dt_blob;
|
static struct debugfs_blob_wrapper flat_dt_blob;
|
||||||
|
|
||||||
|
@ -1130,120 +1130,6 @@ static int __init prom_reconfig_setup(void)
|
|||||||
__initcall(prom_reconfig_setup);
|
__initcall(prom_reconfig_setup);
|
||||||
#endif
|
#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
|
/* 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
|
* local thread number (index in ibm,interrupt-server#s) if relevant and
|
||||||
* asked for (non NULL)
|
* asked for (non NULL)
|
||||||
|
@ -658,3 +658,119 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_parse_phandles_with_args);
|
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 New Issue
Block a user