of: add package-to-path support to pdt
PATCH 4/5 of: add package-to-path support to pdt
package-to-path is a PROM function which tells us the real (full) name of the node. This provides a hook for that in the prom ops struct, and makes use of it in the pdt code when attempting to determine a node's name. If the hook is available, try using it (falling back to looking at the "name" property if it fails).
Signed-off-by Andres Salomon <[email protected]>
--- drivers/of/pdt.c | 43 ++++++++++++++++++++++++++++++++++++++++++- include/linux/of_pdt.h | 3 +++ 2 files changed, 45 insertions(+), 1 deletions(-)
drivers/of/pdt.c +42 -1
@@ -132,6 +132,47 @@ static char * __init of_pdt_get_one_property(phandle node, const char *name)return buf; } +static char *__init of_pdt_try_pkg2path (phandle node) +{ +char *res, *buf =NULL ; +int len; + +if (!of_pdt_prom_ops->pkg2path) +return NULL ; + +if (of_pdt_prom_ops->pkg2path (node, buf,0 , &len)) +return NULL ; + buf =prom_early_alloc (len +1 ); +if (of_pdt_prom_ops->pkg2path (node, buf, len, &len)) { +pr_err ("%s: package-to-path failed\n" , __func__); +return NULL ; + } + + res =strrchr (buf,'/' ); +if (!res) { +pr_err ("%s: couldn't find / in %s\n" , __func__, buf); +return NULL ; + } +return res+1 ; +} + +/* +* When fetching the node's name, first try using package-to-path; if +* that fails (either because the arch hasn't supplied a PROM callback, +* or some other random failure), fall back to just looking at the node's +* 'name' property. +*/ +static char *__init of_pdt_build_name (phandle node) +{ +char *buf; + + buf =of_pdt_try_pkg2path (node); +if (!buf) + buf =of_pdt_get_one_property (node,"name" ); + +return buf; +} +static struct device_node *__init of_pdt_create_node (phandle node,struct device_node *parent) {
@@ -146,7 +187,7 @@ static struct device_node * __init of_pdt_create_node(phandle node,kref_init (&dp->kref); - dp->name =of_pdt_get_one_property (node,"name" ); + dp->name =of_pdt_build_name (node); dp->type =of_pdt_get_one_property (node,"device_type" ); dp->phandle = node;
include/linux/of_pdt.h +3 -0
@@ -29,6 +29,9 @@ struct of_pdt_ops {/* phandles are 0 if no child or sibling exists */ phandle (*getchild)(phandle parent);phandle (*getsibling)(phandle node); + +/* return 0 on success; fill in 'len' with number of bytes in path */ +int (*pkg2path)(phandle node,char *buf,const int buflen,int *len); };extern void *prom_early_alloc (unsigned long size);
Signature · 1 line
1.5.6.5
Grant Likely
AppliedQuoted 8 lines · Andres Salomon
package-to-path is a PROM function which tells us the real (full) name of the node. This provides a hook for that in the prom ops struct, and makes use of it in the pdt code when attempting to determine a node's name. If the hook is available, try using it (falling back to looking at the "name" property if it fails).
Signed-off-by Andres Salomon <[email protected]>
Applied, thanks.
g.