|
@@ -1332,12 +1332,14 @@ EXPORT_SYMBOL(of_node_put);
|
|
|
*/
|
|
|
void of_attach_node(struct device_node *np)
|
|
|
{
|
|
|
- write_lock(&devtree_lock);
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ write_lock_irqsave(&devtree_lock, flags);
|
|
|
np->sibling = np->parent->child;
|
|
|
np->allnext = allnodes;
|
|
|
np->parent->child = np;
|
|
|
allnodes = np;
|
|
|
- write_unlock(&devtree_lock);
|
|
|
+ write_unlock_irqrestore(&devtree_lock, flags);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1348,8 +1350,9 @@ void of_attach_node(struct device_node *np)
|
|
|
void of_detach_node(struct device_node *np)
|
|
|
{
|
|
|
struct device_node *parent;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- write_lock(&devtree_lock);
|
|
|
+ write_lock_irqsave(&devtree_lock, flags);
|
|
|
|
|
|
parent = np->parent;
|
|
|
if (!parent)
|
|
@@ -1380,7 +1383,7 @@ void of_detach_node(struct device_node *np)
|
|
|
of_node_set_flag(np, OF_DETACHED);
|
|
|
|
|
|
out_unlock:
|
|
|
- write_unlock(&devtree_lock);
|
|
|
+ write_unlock_irqrestore(&devtree_lock, flags);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PPC_PSERIES
|
|
@@ -1461,20 +1464,21 @@ __initcall(prom_reconfig_setup);
|
|
|
int prom_add_property(struct device_node* np, struct property* prop)
|
|
|
{
|
|
|
struct property **next;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
prop->next = NULL;
|
|
|
- write_lock(&devtree_lock);
|
|
|
+ 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(&devtree_lock);
|
|
|
+ write_unlock_irqrestore(&devtree_lock, flags);
|
|
|
return -1;
|
|
|
}
|
|
|
next = &(*next)->next;
|
|
|
}
|
|
|
*next = prop;
|
|
|
- write_unlock(&devtree_lock);
|
|
|
+ write_unlock_irqrestore(&devtree_lock, flags);
|
|
|
|
|
|
#ifdef CONFIG_PROC_DEVICETREE
|
|
|
/* try to add to proc as well if it was initialized */
|
|
@@ -1494,9 +1498,10 @@ int prom_add_property(struct device_node* np, struct property* prop)
|
|
|
int prom_remove_property(struct device_node *np, struct property *prop)
|
|
|
{
|
|
|
struct property **next;
|
|
|
+ unsigned long flags;
|
|
|
int found = 0;
|
|
|
|
|
|
- write_lock(&devtree_lock);
|
|
|
+ write_lock_irqsave(&devtree_lock, flags);
|
|
|
next = &np->properties;
|
|
|
while (*next) {
|
|
|
if (*next == prop) {
|
|
@@ -1509,7 +1514,7 @@ int prom_remove_property(struct device_node *np, struct property *prop)
|
|
|
}
|
|
|
next = &(*next)->next;
|
|
|
}
|
|
|
- write_unlock(&devtree_lock);
|
|
|
+ write_unlock_irqrestore(&devtree_lock, flags);
|
|
|
|
|
|
if (!found)
|
|
|
return -ENODEV;
|
|
@@ -1535,9 +1540,10 @@ int prom_update_property(struct device_node *np,
|
|
|
struct property *oldprop)
|
|
|
{
|
|
|
struct property **next;
|
|
|
+ unsigned long flags;
|
|
|
int found = 0;
|
|
|
|
|
|
- write_lock(&devtree_lock);
|
|
|
+ write_lock_irqsave(&devtree_lock, flags);
|
|
|
next = &np->properties;
|
|
|
while (*next) {
|
|
|
if (*next == oldprop) {
|
|
@@ -1551,7 +1557,7 @@ int prom_update_property(struct device_node *np,
|
|
|
}
|
|
|
next = &(*next)->next;
|
|
|
}
|
|
|
- write_unlock(&devtree_lock);
|
|
|
+ write_unlock_irqrestore(&devtree_lock, flags);
|
|
|
|
|
|
if (!found)
|
|
|
return -ENODEV;
|