diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2010-07-23 11:48:25 +0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-07-25 02:51:52 +0400 |
commit | 9a6b2e588c7809e86161236da3d29581bf5f8402 (patch) | |
tree | 0aebb8e868615a2354042a376405cd73d80ef19e /drivers/of | |
parent | 883c2cfc8bcc0fd00c5d9f596fb8870f481b5bda (diff) | |
download | linux-9a6b2e588c7809e86161236da3d29581bf5f8402.tar.xz |
of: Fix phandle endian issues
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>
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/base.c | 12 | ||||
-rw-r--r-- | drivers/of/fdt.c | 4 | ||||
-rw-r--r-- | drivers/of/irq.c | 6 |
3 files changed, 11 insertions, 11 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index e3f7af882e45..aa805250de76 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -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); @@ -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); diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index dc876cbbd9dd..65da5aec7552 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -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; diff --git a/drivers/of/irq.c b/drivers/of/irq.c index 6cfb307204c3..65cfae1bd670 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c @@ -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; @@ -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; @@ -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; |