mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
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>
This commit is contained in:
parent
883c2cfc8b
commit
9a6b2e588c
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user