summaryrefslogtreecommitdiff
path: root/drivers/of
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-13 18:03:01 +0200
committerThomas Gleixner <tglx@linutronix.de>2009-08-13 18:03:01 +0200
commita87f354dbe174dc43a93844f2d3bc7dd990ffb32 (patch)
tree15cbfd63548f09d4a44a74a60f2e2e4cc9065f6d /drivers/of
parent925df9b36dc9abe0bab32cbd2ac544d773da71ff (diff)
downloadlwn-a87f354dbe174dc43a93844f2d3bc7dd990ffb32.tar.gz
lwn-a87f354dbe174dc43a93844f2d3bc7dd990ffb32.zip
OF: devtree_lock needs to be taken irqsave
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/of')
-rw-r--r--drivers/of/base.c60
1 files changed, 36 insertions, 24 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 3626e37f360b..fc0c20637f64 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -83,10 +83,11 @@ struct property *of_find_property(const struct device_node *np,
int *lenp)
{
struct property *pp;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
pp = __of_find_property(np, name, lenp);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return pp;
}
@@ -146,11 +147,12 @@ static int __of_device_is_compatible(const struct device_node *device,
int of_device_is_compatible(const struct device_node *device,
const char *compat)
{
+ unsigned long flags;
int res;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
res = __of_device_is_compatible(device, compat);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return res;
}
EXPORT_SYMBOL(of_device_is_compatible);
@@ -191,13 +193,14 @@ EXPORT_SYMBOL(of_device_is_available);
struct device_node *of_get_parent(const struct device_node *node)
{
struct device_node *np;
+ unsigned long flags;
if (!node)
return NULL;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
np = of_node_get(node->parent);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_get_parent);
@@ -216,14 +219,15 @@ EXPORT_SYMBOL(of_get_parent);
struct device_node *of_get_next_parent(struct device_node *node)
{
struct device_node *parent;
+ unsigned long flags;
if (!node)
return NULL;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
parent = of_node_get(node->parent);
of_node_put(node);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return parent;
}
@@ -239,14 +243,15 @@ struct device_node *of_get_next_child(const struct device_node *node,
struct device_node *prev)
{
struct device_node *next;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
next = prev ? prev->sibling : node->child;
for (; next; next = next->sibling)
if (of_node_get(next))
break;
of_node_put(prev);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return next;
}
EXPORT_SYMBOL(of_get_next_child);
@@ -261,14 +266,15 @@ EXPORT_SYMBOL(of_get_next_child);
struct device_node *of_find_node_by_path(const char *path)
{
struct device_node *np = allnodes;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
for (; np; np = np->allnext) {
if (np->full_name && (of_node_cmp(np->full_name, path) == 0)
&& of_node_get(np))
break;
}
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_node_by_path);
@@ -288,15 +294,16 @@ struct device_node *of_find_node_by_name(struct device_node *from,
const char *name)
{
struct device_node *np;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext)
if (np->name && (of_node_cmp(np->name, name) == 0)
&& of_node_get(np))
break;
of_node_put(from);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_node_by_name);
@@ -317,15 +324,16 @@ struct device_node *of_find_node_by_type(struct device_node *from,
const char *type)
{
struct device_node *np;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext)
if (np->type && (of_node_cmp(np->type, type) == 0)
&& of_node_get(np))
break;
of_node_put(from);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_node_by_type);
@@ -348,8 +356,9 @@ struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compatible)
{
struct device_node *np;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext) {
if (type
@@ -360,7 +369,7 @@ struct device_node *of_find_compatible_node(struct device_node *from,
break;
}
of_node_put(from);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_compatible_node);
@@ -382,8 +391,9 @@ struct device_node *of_find_node_with_property(struct device_node *from,
{
struct device_node *np;
struct property *pp;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext) {
for (pp = np->properties; pp != 0; pp = pp->next) {
@@ -395,7 +405,7 @@ struct device_node *of_find_node_with_property(struct device_node *from,
}
out:
of_node_put(from);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_node_with_property);
@@ -433,10 +443,11 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
const struct device_node *node)
{
const struct of_device_id *match;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
match = __of_match_node(matches, node);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return match;
}
EXPORT_SYMBOL(of_match_node);
@@ -457,15 +468,16 @@ struct device_node *of_find_matching_node(struct device_node *from,
const struct of_device_id *matches)
{
struct device_node *np;
+ unsigned long flags;
- atomic_spin_lock(&devtree_lock);
+ atomic_spin_lock_irqsave(&devtree_lock, flags);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext) {
if (__of_match_node(matches, np) && of_node_get(np))
break;
}
of_node_put(from);
- atomic_spin_unlock(&devtree_lock);
+ atomic_spin_unlock_irqrestore(&devtree_lock, flags);
return np;
}
EXPORT_SYMBOL(of_find_matching_node);