aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel
diff options
context:
space:
mode:
authorAndres Salomon <dilinger@queued.net>2010-10-10 23:49:45 -0400
committerGrant Likely <grant.likely@secretlab.ca>2010-10-12 23:57:53 -0400
commitf90c34bd658d240cb5ebc5fe0a17796e590c6ec8 (patch)
tree02e8243910e156d3af4a14bd9be63dd829d07576 /arch/sparc/kernel
parent3cfc535c5df8122af1258ae05aaf2770c033425d (diff)
of/promtree: no longer call prom_ functions directly; use an ops structure
Rather than assuming an architecture defines prom_getchild and friends, define an ops struct with hooks for the various prom functions that pdt.c needs. This ops struct is filled in by the arch-(and sometimes firmware-)specific code, and passed to of_pdt_build_devicetree. Update sparc code to define the ops struct as well. Signed-off-by: Andres Salomon <dilinger@queued.net> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'arch/sparc/kernel')
-rw-r--r--arch/sparc/kernel/prom_common.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c
index fe84d56b7c5..ed25834328f 100644
--- a/arch/sparc/kernel/prom_common.c
+++ b/arch/sparc/kernel/prom_common.c
@@ -118,11 +118,45 @@ int of_find_in_proplist(const char *list, const char *match, int len)
118} 118}
119EXPORT_SYMBOL(of_find_in_proplist); 119EXPORT_SYMBOL(of_find_in_proplist);
120 120
121/*
122 * SPARC32 and SPARC64's prom_nextprop() do things differently
123 * here, despite sharing the same interface. SPARC32 doesn't fill in 'buf',
124 * returning NULL on an error. SPARC64 fills in 'buf', but sets it to an
125 * empty string upon error.
126 */
127static int __init handle_nextprop_quirks(char *buf, const char *name)
128{
129 if (!name || strlen(name) == 0)
130 return -1;
131
132#ifdef CONFIG_SPARC32
133 strcpy(buf, name);
134#endif
135 return 0;
136}
137
138static int __init prom_common_nextprop(phandle node, char *prev, char *buf)
139{
140 const char *name;
141
142 buf[0] = '\0';
143 name = prom_nextprop(node, prev, buf);
144 return handle_nextprop_quirks(buf, name);
145}
146
121unsigned int prom_early_allocated __initdata; 147unsigned int prom_early_allocated __initdata;
122 148
149static struct of_pdt_ops prom_sparc_ops __initdata = {
150 .nextprop = prom_common_nextprop,
151 .getproplen = prom_getproplen,
152 .getproperty = prom_getproperty,
153 .getchild = prom_getchild,
154 .getsibling = prom_getsibling,
155};
156
123void __init prom_build_devicetree(void) 157void __init prom_build_devicetree(void)
124{ 158{
125 of_pdt_build_devicetree(prom_root_node); 159 of_pdt_build_devicetree(prom_root_node, &prom_sparc_ops);
126 of_console_init(); 160 of_console_init();
127 161
128 pr_info("PROM: Built device tree with %u bytes of memory.\n", 162 pr_info("PROM: Built device tree with %u bytes of memory.\n",