diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/prom.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 8a9359ae471..3bfe7837e82 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -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; |