Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 30441
b: refs/heads/master
c: fb7cd9d
h: refs/heads/master
i:
  30439: a8b7ebf
v: v3
  • Loading branch information
David S. Miller committed Jun 26, 2006
1 parent 5ac93f6 commit 8e500c7
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dda9beb41414035de230e78cb53416f3e551295a
refs/heads/master: fb7cd9d9acfb52dc1b9fbd5079445e4732667bbc
53 changes: 53 additions & 0 deletions trunk/arch/sparc/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@

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);

int of_device_is_compatible(struct device_node *device, const char *compat)
{
const char* cp;
Expand Down Expand Up @@ -185,6 +190,54 @@ int of_getintprop_default(struct device_node *np, const char *name, int def)
}
EXPORT_SYMBOL(of_getintprop_default);

int of_set_property(struct device_node *dp, const char *name, void *val, int len)
{
struct property **prevp;
void *new_val;
int err;

new_val = kmalloc(len, GFP_KERNEL);
if (!new_val)
return -ENOMEM;

memcpy(new_val, val, len);

err = -ENODEV;

write_lock(&devtree_lock);
prevp = &dp->properties;
while (*prevp) {
struct property *prop = *prevp;

if (!strcmp(prop->name, name)) {
void *old_val = prop->value;
int ret;

ret = prom_setprop(dp->node, name, val, len);
err = -EINVAL;
if (ret >= 0) {
prop->value = new_val;
prop->length = len;

if (OF_IS_DYNAMIC(prop))
kfree(old_val);

OF_MARK_DYNAMIC(prop);

err = 0;
}
break;
}
prevp = &(*prevp)->next;
}
write_unlock(&devtree_lock);

/* XXX Upate procfs if necessary... */

return err;
}
EXPORT_SYMBOL(of_set_property);

static unsigned int prom_early_allocated;

static void * __init prom_early_alloc(unsigned long size)
Expand Down
53 changes: 53 additions & 0 deletions trunk/arch/sparc64/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@

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);

int of_device_is_compatible(struct device_node *device, const char *compat)
{
const char* cp;
Expand Down Expand Up @@ -185,6 +190,54 @@ int of_getintprop_default(struct device_node *np, const char *name, int def)
}
EXPORT_SYMBOL(of_getintprop_default);

int of_set_property(struct device_node *dp, const char *name, void *val, int len)
{
struct property **prevp;
void *new_val;
int err;

new_val = kmalloc(len, GFP_KERNEL);
if (!new_val)
return -ENOMEM;

memcpy(new_val, val, len);

err = -ENODEV;

write_lock(&devtree_lock);
prevp = &dp->properties;
while (*prevp) {
struct property *prop = *prevp;

if (!strcmp(prop->name, name)) {
void *old_val = prop->value;
int ret;

ret = prom_setprop(dp->node, name, val, len);
err = -EINVAL;
if (ret >= 0) {
prop->value = new_val;
prop->length = len;

if (OF_IS_DYNAMIC(prop))
kfree(old_val);

OF_MARK_DYNAMIC(prop);

err = 0;
}
break;
}
prevp = &(*prevp)->next;
}
write_unlock(&devtree_lock);

/* XXX Upate procfs if necessary... */

return err;
}
EXPORT_SYMBOL(of_set_property);

static unsigned int prom_early_allocated;

static void * __init prom_early_alloc(unsigned long size)
Expand Down
8 changes: 8 additions & 0 deletions trunk/include/asm-sparc/prom.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ struct property {
int length;
void *value;
struct property *next;
unsigned long _flags;
};

struct device_node {
Expand All @@ -60,6 +61,12 @@ struct device_node {
void *data;
};

/* flag descriptions */
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */

#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)

static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
{
dn->pde = de;
Expand Down Expand Up @@ -88,6 +95,7 @@ extern struct property *of_find_property(struct device_node *np,
extern int of_device_is_compatible(struct device_node *device, const char *);
extern void *of_get_property(struct device_node *node, const char *name,
int *lenp);
extern int of_set_property(struct device_node *node, const char *name, void *val, int len);
extern int of_getintprop_default(struct device_node *np,
const char *name,
int def);
Expand Down
8 changes: 8 additions & 0 deletions trunk/include/asm-sparc64/prom.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ struct property {
int length;
void *value;
struct property *next;
unsigned long _flags;
};

struct device_node {
Expand All @@ -60,6 +61,12 @@ struct device_node {
void *data;
};

/* flag descriptions */
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */

#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)

static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
{
dn->pde = de;
Expand Down Expand Up @@ -88,6 +95,7 @@ extern struct property *of_find_property(struct device_node *np,
extern int of_device_is_compatible(struct device_node *device, const char *);
extern void *of_get_property(struct device_node *node, const char *name,
int *lenp);
extern int of_set_property(struct device_node *node, const char *name, void *val, int len);
extern int of_getintprop_default(struct device_node *np,
const char *name,
int def);
Expand Down

0 comments on commit 8e500c7

Please sign in to comment.