[SPARC]: Add of_set_property() interface.
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
dda9beb414
commit
fb7cd9d9ac
4 changed files with 122 additions and 0 deletions
|
@ -27,6 +27,11 @@
|
||||||
|
|
||||||
static struct device_node *allnodes;
|
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)
|
int of_device_is_compatible(struct device_node *device, const char *compat)
|
||||||
{
|
{
|
||||||
const char* cp;
|
const char* cp;
|
||||||
|
@ -185,6 +190,54 @@ int of_getintprop_default(struct device_node *np, const char *name, int def)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_getintprop_default);
|
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 unsigned int prom_early_allocated;
|
||||||
|
|
||||||
static void * __init prom_early_alloc(unsigned long size)
|
static void * __init prom_early_alloc(unsigned long size)
|
||||||
|
|
|
@ -27,6 +27,11 @@
|
||||||
|
|
||||||
static struct device_node *allnodes;
|
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)
|
int of_device_is_compatible(struct device_node *device, const char *compat)
|
||||||
{
|
{
|
||||||
const char* cp;
|
const char* cp;
|
||||||
|
@ -185,6 +190,54 @@ int of_getintprop_default(struct device_node *np, const char *name, int def)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_getintprop_default);
|
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 unsigned int prom_early_allocated;
|
||||||
|
|
||||||
static void * __init prom_early_alloc(unsigned long size)
|
static void * __init prom_early_alloc(unsigned long size)
|
||||||
|
|
|
@ -35,6 +35,7 @@ struct property {
|
||||||
int length;
|
int length;
|
||||||
void *value;
|
void *value;
|
||||||
struct property *next;
|
struct property *next;
|
||||||
|
unsigned long _flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct device_node {
|
struct device_node {
|
||||||
|
@ -60,6 +61,12 @@ struct device_node {
|
||||||
void *data;
|
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)
|
static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
|
||||||
{
|
{
|
||||||
dn->pde = de;
|
dn->pde = de;
|
||||||
|
@ -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 int of_device_is_compatible(struct device_node *device, const char *);
|
||||||
extern void *of_get_property(struct device_node *node, const char *name,
|
extern void *of_get_property(struct device_node *node, const char *name,
|
||||||
int *lenp);
|
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,
|
extern int of_getintprop_default(struct device_node *np,
|
||||||
const char *name,
|
const char *name,
|
||||||
int def);
|
int def);
|
||||||
|
|
|
@ -35,6 +35,7 @@ struct property {
|
||||||
int length;
|
int length;
|
||||||
void *value;
|
void *value;
|
||||||
struct property *next;
|
struct property *next;
|
||||||
|
unsigned long _flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct device_node {
|
struct device_node {
|
||||||
|
@ -60,6 +61,12 @@ struct device_node {
|
||||||
void *data;
|
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)
|
static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
|
||||||
{
|
{
|
||||||
dn->pde = de;
|
dn->pde = de;
|
||||||
|
@ -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 int of_device_is_compatible(struct device_node *device, const char *);
|
||||||
extern void *of_get_property(struct device_node *node, const char *name,
|
extern void *of_get_property(struct device_node *node, const char *name,
|
||||||
int *lenp);
|
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,
|
extern int of_getintprop_default(struct device_node *np,
|
||||||
const char *name,
|
const char *name,
|
||||||
int def);
|
int def);
|
||||||
|
|
Loading…
Reference in a new issue