Skip to content

Commit

Permalink
sparc: Create common area for OF device layer code.
Browse files Browse the repository at this point in the history
This is where common code implementations will go as we unify
32-bit and 64-bit OF device tree code.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Dec 6, 2008
1 parent ab04323 commit dfa7606
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 188 deletions.
1 change: 1 addition & 0 deletions arch/sparc/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ obj-y += ptrace_$(BITS).o
obj-y += unaligned_$(BITS).o
obj-y += una_asm_$(BITS).o
obj-$(CONFIG_SPARC32) += muldiv.o
obj-y += prom_common.o
obj-y += prom_$(BITS).o
obj-y += of_device_$(BITS).o

Expand Down
94 changes: 0 additions & 94 deletions arch/sparc/kernel/prom_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,100 +27,6 @@

#include "prom.h"

struct device_node *of_find_node_by_phandle(phandle handle)
{
struct device_node *np;

for (np = allnodes; np != 0; np = np->allnext)
if (np->node == handle)
break;

return np;
}
EXPORT_SYMBOL(of_find_node_by_phandle);

int of_getintprop_default(struct device_node *np, const char *name, int def)
{
struct property *prop;
int len;

prop = of_find_property(np, name, &len);
if (!prop || len != 4)
return def;

return *(int *) prop->value;
}
EXPORT_SYMBOL(of_getintprop_default);

DEFINE_MUTEX(of_set_property_mutex);
EXPORT_SYMBOL(of_set_property_mutex);

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 (!strcasecmp(prop->name, name)) {
void *old_val = prop->value;
int ret;

mutex_lock(&of_set_property_mutex);
ret = prom_setprop(dp->node, (char *) name, val, len);
mutex_unlock(&of_set_property_mutex);

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

int of_find_in_proplist(const char *list, const char *match, int len)
{
while (len > 0) {
int l;

if (!strcmp(list, match))
return 1;
l = strlen(list) + 1;
list += l;
len -= l;
}
return 0;
}
EXPORT_SYMBOL(of_find_in_proplist);

static unsigned int prom_early_allocated;

static void * __init prom_early_alloc(unsigned long size)
Expand Down
94 changes: 0 additions & 94 deletions arch/sparc/kernel/prom_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,100 +32,6 @@

#include "prom.h"

struct device_node *of_find_node_by_phandle(phandle handle)
{
struct device_node *np;

for (np = allnodes; np; np = np->allnext)
if (np->node == handle)
break;

return np;
}
EXPORT_SYMBOL(of_find_node_by_phandle);

int of_getintprop_default(struct device_node *np, const char *name, int def)
{
struct property *prop;
int len;

prop = of_find_property(np, name, &len);
if (!prop || len != 4)
return def;

return *(int *) prop->value;
}
EXPORT_SYMBOL(of_getintprop_default);

DEFINE_MUTEX(of_set_property_mutex);
EXPORT_SYMBOL(of_set_property_mutex);

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 (!strcasecmp(prop->name, name)) {
void *old_val = prop->value;
int ret;

mutex_lock(&of_set_property_mutex);
ret = prom_setprop(dp->node, name, val, len);
mutex_unlock(&of_set_property_mutex);

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

int of_find_in_proplist(const char *list, const char *match, int len)
{
while (len > 0) {
int l;

if (!strcmp(list, match))
return 1;
l = strlen(list) + 1;
list += l;
len -= l;
}
return 0;
}
EXPORT_SYMBOL(of_find_in_proplist);

static unsigned int prom_early_allocated __initdata;

static void * __init prom_early_alloc(unsigned long size)
Expand Down
121 changes: 121 additions & 0 deletions arch/sparc/kernel/prom_common.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/* prom_common.c: OF device tree support common code.
*
* Paul Mackerras August 1996.
* Copyright (C) 1996-2005 Paul Mackerras.
*
* Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
* {engebret|bergner}@us.ibm.com
*
* Adapted for sparc by David S. Miller davem@davemloft.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <asm/prom.h>
#include <asm/oplib.h>

#include "prom.h"

struct device_node *of_find_node_by_phandle(phandle handle)
{
struct device_node *np;

for (np = allnodes; np; np = np->allnext)
if (np->node == handle)
break;

return np;
}
EXPORT_SYMBOL(of_find_node_by_phandle);

int of_getintprop_default(struct device_node *np, const char *name, int def)
{
struct property *prop;
int len;

prop = of_find_property(np, name, &len);
if (!prop || len != 4)
return def;

return *(int *) prop->value;
}
EXPORT_SYMBOL(of_getintprop_default);

DEFINE_MUTEX(of_set_property_mutex);
EXPORT_SYMBOL(of_set_property_mutex);

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 (!strcasecmp(prop->name, name)) {
void *old_val = prop->value;
int ret;

mutex_lock(&of_set_property_mutex);
ret = prom_setprop(dp->node, name, val, len);
mutex_unlock(&of_set_property_mutex);

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

int of_find_in_proplist(const char *list, const char *match, int len)
{
while (len > 0) {
int l;

if (!strcmp(list, match))
return 1;
l = strlen(list) + 1;
list += l;
len -= l;
}
return 0;
}
EXPORT_SYMBOL(of_find_in_proplist);

0 comments on commit dfa7606

Please sign in to comment.