Skip to content

Commit

Permalink
of: Fix phandle endian issues
Browse files Browse the repository at this point in the history
The flat tree code wasn't fixing the endianness on phandle values when
unflattening the tree, and the code in drivers/of wasn't always doing a
be32_to_cpu before trying to dereference the phandle values.  This patch
fixes them.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Grant Likely committed Jul 24, 2010
1 parent 883c2cf commit 9a6b2e5
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 11 deletions.
12 changes: 6 additions & 6 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -605,14 +605,14 @@ EXPORT_SYMBOL(of_find_node_by_phandle);
struct device_node *
of_parse_phandle(struct device_node *np, const char *phandle_name, int index)
{
const phandle *phandle;
const __be32 *phandle;
int size;

phandle = of_get_property(np, phandle_name, &size);
if ((!phandle) || (size < sizeof(*phandle) * (index + 1)))
return NULL;

return of_find_node_by_phandle(phandle[index]);
return of_find_node_by_phandle(be32_to_cpup(phandle + index));
}
EXPORT_SYMBOL(of_parse_phandle);

Expand Down Expand Up @@ -668,16 +668,16 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,

while (list < list_end) {
const __be32 *cells;
const phandle *phandle;
phandle phandle;

phandle = list++;
phandle = be32_to_cpup(list++);
args = list;

/* one cell hole in the list = <>; */
if (!*phandle)
if (!phandle)
goto next;

node = of_find_node_by_phandle(*phandle);
node = of_find_node_by_phandle(phandle);
if (!node) {
pr_debug("%s: could not find phandle\n",
np->full_name);
Expand Down
4 changes: 2 additions & 2 deletions drivers/of/fdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,13 +320,13 @@ unsigned long __init unflatten_dt_node(unsigned long mem,
if ((strcmp(pname, "phandle") == 0) ||
(strcmp(pname, "linux,phandle") == 0)) {
if (np->phandle == 0)
np->phandle = *((u32 *)*p);
np->phandle = be32_to_cpup((__be32*)*p);
}
/* And we process the "ibm,phandle" property
* used in pSeries dynamic device tree
* stuff */
if (strcmp(pname, "ibm,phandle") == 0)
np->phandle = *((u32 *)*p);
np->phandle = be32_to_cpup((__be32 *)*p);
pp->name = pname;
pp->length = sz;
pp->value = (void *)*p;
Expand Down
6 changes: 3 additions & 3 deletions drivers/of/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
static struct device_node *of_irq_find_parent(struct device_node *child)
{
struct device_node *p;
const phandle *parp;
const __be32 *parp;

if (!of_node_get(child))
return NULL;
Expand All @@ -67,7 +67,7 @@ static struct device_node *of_irq_find_parent(struct device_node *child)
if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
p = of_node_get(of_irq_dflt_pic);
else
p = of_find_node_by_phandle(*parp);
p = of_find_node_by_phandle(be32_to_cpup(parp));
}
of_node_put(child);
child = p;
Expand Down Expand Up @@ -206,7 +206,7 @@ int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize,
if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
newpar = of_node_get(of_irq_dflt_pic);
else
newpar = of_find_node_by_phandle((phandle)*imap);
newpar = of_find_node_by_phandle(be32_to_cpup(imap));
imap++;
--imaplen;

Expand Down

0 comments on commit 9a6b2e5

Please sign in to comment.