Skip to content

Commit

Permalink
Consolidate of_find_property
Browse files Browse the repository at this point in the history
The only change here is that a readlock is taken while the property list
is being traversed on Sparc where it was not taken previously.

Also, Sparc uses strcasecmp to compare property names while PowerPC
uses strcmp.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Acked-by: Paul Mackerras <paulus@samba.org>
Acked-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Rothwell committed Jul 20, 2007
1 parent 0081cbc commit 581b605
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 65 deletions.
24 changes: 1 addition & 23 deletions arch/powerpc/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,7 @@ struct boot_param_header *initial_boot_params;

static struct device_node *allnodes = NULL;

/* use when traversing tree through the allnext, child, sibling,
* or parent members of struct device_node.
*/
static DEFINE_RWLOCK(devtree_lock);
extern rwlock_t devtree_lock; /* temporary while merging */

/* export that to outside world */
struct device_node *of_chosen;
Expand Down Expand Up @@ -1489,25 +1486,6 @@ static int __init prom_reconfig_setup(void)
__initcall(prom_reconfig_setup);
#endif

struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
{
struct property *pp;

read_lock(&devtree_lock);
for (pp = np->properties; pp != 0; pp = pp->next)
if (strcmp(pp->name, name) == 0) {
if (lenp != 0)
*lenp = pp->length;
break;
}
read_unlock(&devtree_lock);

return pp;
}
EXPORT_SYMBOL(of_find_property);

/*
* Add a property to a node
*/
Expand Down
22 changes: 1 addition & 21 deletions arch/sparc/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,7 @@

static struct device_node *allnodes;

/* use when traversing tree through the allnext, child, sibling,
* or parent members of struct device_node.
*/
static DEFINE_RWLOCK(devtree_lock);
extern rwlock_t devtree_lock; /* temporary while merging */

struct device_node *of_get_parent(const struct device_node *node)
{
Expand Down Expand Up @@ -130,23 +127,6 @@ struct device_node *of_find_compatible_node(struct device_node *from,
}
EXPORT_SYMBOL(of_find_compatible_node);

struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
{
struct property *pp;

for (pp = np->properties; pp != 0; pp = pp->next) {
if (strcasecmp(pp->name, name) == 0) {
if (lenp != 0)
*lenp = pp->length;
break;
}
}
return pp;
}
EXPORT_SYMBOL(of_find_property);

int of_getintprop_default(struct device_node *np, const char *name, int def)
{
struct property *prop;
Expand Down
22 changes: 1 addition & 21 deletions arch/sparc64/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@

static struct device_node *allnodes;

/* use when traversing tree through the allnext, child, sibling,
* or parent members of struct device_node.
*/
static DEFINE_RWLOCK(devtree_lock);
extern rwlock_t devtree_lock; /* temporary while merging */

struct device_node *of_get_parent(const struct device_node *node)
{
Expand Down Expand Up @@ -135,23 +132,6 @@ struct device_node *of_find_compatible_node(struct device_node *from,
}
EXPORT_SYMBOL(of_find_compatible_node);

struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
{
struct property *pp;

for (pp = np->properties; pp != 0; pp = pp->next) {
if (strcasecmp(pp->name, name) == 0) {
if (lenp != 0)
*lenp = pp->length;
break;
}
}
return pp;
}
EXPORT_SYMBOL(of_find_property);

int of_getintprop_default(struct device_node *np, const char *name, int def)
{
struct property *prop;
Expand Down
26 changes: 26 additions & 0 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
*/
#include <linux/module.h>
#include <linux/of.h>
#include <linux/spinlock.h>

/* use when traversing tree through the allnext, child, sibling,
* or parent members of struct device_node.
*/
DEFINE_RWLOCK(devtree_lock);

int of_n_addr_cells(struct device_node *np)
{
Expand Down Expand Up @@ -51,6 +57,26 @@ int of_n_size_cells(struct device_node *np)
}
EXPORT_SYMBOL(of_n_size_cells);

struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
{
struct property *pp;

read_lock(&devtree_lock);
for (pp = np->properties; pp != 0; pp = pp->next) {
if (of_prop_cmp(pp->name, name) == 0) {
if (lenp != 0)
*lenp = pp->length;
break;
}
}
read_unlock(&devtree_lock);

return pp;
}
EXPORT_SYMBOL(of_find_property);

/*
* Find a property with a given name for a given node
* and return the value.
Expand Down
1 change: 1 addition & 0 deletions include/asm-powerpc/prom.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1

#define of_compat_cmp(s1, s2, l) strncasecmp((s1), (s2), (l))
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))

/* Definitions used by the flattened device tree */
#define OF_DT_HEADER 0xd00dfeed /* marker */
Expand Down
1 change: 1 addition & 0 deletions include/asm-sparc/prom.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1

#define of_compat_cmp(s1, s2, l) strncmp((s1), (s2), (l))
#define of_prop_cmp(s1, s2) strcasecmp((s1), (s2))

typedef u32 phandle;
typedef u32 ihandle;
Expand Down
1 change: 1 addition & 0 deletions include/asm-sparc64/prom.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1

#define of_compat_cmp(s1, s2, l) strncmp((s1), (s2), (l))
#define of_prop_cmp(s1, s2) strcasecmp((s1), (s2))

typedef u32 phandle;
typedef u32 ihandle;
Expand Down

0 comments on commit 581b605

Please sign in to comment.