diff options
| author | Andres Salomon <dilinger@queued.net> | 2010-10-10 23:49:45 -0400 |
|---|---|---|
| committer | Grant Likely <grant.likely@secretlab.ca> | 2010-10-12 23:57:53 -0400 |
| commit | f90c34bd658d240cb5ebc5fe0a17796e590c6ec8 (patch) | |
| tree | 02e8243910e156d3af4a14bd9be63dd829d07576 /arch/sparc | |
| parent | 3cfc535c5df8122af1258ae05aaf2770c033425d (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')
| -rw-r--r-- | arch/sparc/kernel/prom_common.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index fe84d56b7c5a..ed25834328f4 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 | } |
| 119 | EXPORT_SYMBOL(of_find_in_proplist); | 119 | EXPORT_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 | */ | ||
| 127 | static 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 | |||
| 138 | static 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 | |||
| 121 | unsigned int prom_early_allocated __initdata; | 147 | unsigned int prom_early_allocated __initdata; |
| 122 | 148 | ||
| 149 | static 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 | |||
| 123 | void __init prom_build_devicetree(void) | 157 | void __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", |
