Skip to content

Commit

Permalink
of/flattree: merge of_get_flat_dt_prop
Browse files Browse the repository at this point in the history
Merge common code between PowerPC and Microblaze

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Reviewed-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by: Michal Simek <monstr@monstr.eu>
  • Loading branch information
Grant Likely committed Nov 24, 2009
1 parent 31a6a87 commit ca900cf
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 84 deletions.
42 changes: 0 additions & 42 deletions arch/microblaze/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,48 +50,6 @@ typedef u32 cell_t;
/* export that to outside world */
struct device_node *of_chosen;

/**
* This function can be used within scan_flattened_dt callback to get
* access to properties
*/
void *__init of_get_flat_dt_prop(unsigned long node, const char *name,
unsigned long *size)
{
unsigned long p = node;

do {
u32 tag = *((u32 *)p);
u32 sz, noff;
const char *nstr;

p += 4;
if (tag == OF_DT_NOP)
continue;
if (tag != OF_DT_PROP)
return NULL;

sz = *((u32 *)p);
noff = *((u32 *)(p + 4));
p += 8;
if (initial_boot_params->version < 0x10)
p = _ALIGN(p, sz >= 8 ? 8 : 4);

nstr = find_flat_dt_string(noff);
if (nstr == NULL) {
printk(KERN_WARNING "Can't find property index"
" name !\n");
return NULL;
}
if (strcmp(name, nstr) == 0) {
if (size)
*size = sz;
return (void *)p;
}
p += sz;
p = _ALIGN(p, 4);
} while (1);
}

int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)
{
const char *cp;
Expand Down
42 changes: 0 additions & 42 deletions arch/powerpc/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,48 +80,6 @@ extern rwlock_t devtree_lock; /* temporary while merging */
/* export that to outside world */
struct device_node *of_chosen;

/**
* This function can be used within scan_flattened_dt callback to get
* access to properties
*/
void* __init of_get_flat_dt_prop(unsigned long node, const char *name,
unsigned long *size)
{
unsigned long p = node;

do {
u32 tag = *((u32 *)p);
u32 sz, noff;
const char *nstr;

p += 4;
if (tag == OF_DT_NOP)
continue;
if (tag != OF_DT_PROP)
return NULL;

sz = *((u32 *)p);
noff = *((u32 *)(p + 4));
p += 8;
if (initial_boot_params->version < 0x10)
p = _ALIGN(p, sz >= 8 ? 8 : 4);

nstr = find_flat_dt_string(noff);
if (nstr == NULL) {
printk(KERN_WARNING "Can't find property index"
" name !\n");
return NULL;
}
if (strcmp(name, nstr) == 0) {
if (size)
*size = sz;
return (void *)p;
}
p += sz;
p = _ALIGN(p, 4);
} while(1);
}

int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)
{
const char* cp;
Expand Down
43 changes: 43 additions & 0 deletions drivers/of/fdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,46 @@ unsigned long __init of_get_flat_dt_root(void)
return _ALIGN(p + strlen((char *)p) + 1, 4);
}

/**
* of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr
*
* This function can be used within scan_flattened_dt callback to get
* access to properties
*/
void *__init of_get_flat_dt_prop(unsigned long node, const char *name,
unsigned long *size)
{
unsigned long p = node;

do {
u32 tag = *((u32 *)p);
u32 sz, noff;
const char *nstr;

p += 4;
if (tag == OF_DT_NOP)
continue;
if (tag != OF_DT_PROP)
return NULL;

sz = *((u32 *)p);
noff = *((u32 *)(p + 4));
p += 8;
if (initial_boot_params->version < 0x10)
p = _ALIGN(p, sz >= 8 ? 8 : 4);

nstr = find_flat_dt_string(noff);
if (nstr == NULL) {
pr_warning("Can't find property index name !\n");
return NULL;
}
if (strcmp(name, nstr) == 0) {
if (size)
*size = sz;
return (void *)p;
}
p += sz;
p = _ALIGN(p, 4);
} while (1);
}

0 comments on commit ca900cf

Please sign in to comment.