diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2011-01-03 20:41:33 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-01-04 14:16:37 -0500 |
commit | 9663eb21fcfeb1ed9afd73d14bbc4198796cfc7b (patch) | |
tree | d220c96ed6c4db5c1f8fda3bcf775b59f8c5b3cb /arch/sparc/kernel/prom_32.c | |
parent | 2791c1a4390085789e37347fc49f7d189fedae88 (diff) |
SPARC/LEON: avoid AMBAPP name duplicates in openprom fs when REG is missing
When the REG property is not available the NODE-ID is used as an unique
identifier in order to avoid filesystem name duplicates in /proc/openprom
filesystem
Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/prom_32.c')
-rw-r--r-- | arch/sparc/kernel/prom_32.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/arch/sparc/kernel/prom_32.c b/arch/sparc/kernel/prom_32.c index 0a37e8cfd160..05fb25330583 100644 --- a/arch/sparc/kernel/prom_32.c +++ b/arch/sparc/kernel/prom_32.c | |||
@@ -136,18 +136,29 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf) | |||
136 | /* "name:vendor:device@irq,addrlo" */ | 136 | /* "name:vendor:device@irq,addrlo" */ |
137 | static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf) | 137 | static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf) |
138 | { | 138 | { |
139 | struct amba_prom_registers *regs; unsigned int *intr; | 139 | struct amba_prom_registers *regs; |
140 | unsigned int *device, *vendor; | 140 | unsigned int *intr, *device, *vendor, reg0; |
141 | struct property *prop; | 141 | struct property *prop; |
142 | int interrupt = 0; | ||
142 | 143 | ||
144 | /* In order to get a unique ID in the device tree (multiple AMBA devices | ||
145 | * may have the same name) the node number is printed | ||
146 | */ | ||
143 | prop = of_find_property(dp, "reg", NULL); | 147 | prop = of_find_property(dp, "reg", NULL); |
144 | if (!prop) | 148 | if (!prop) { |
145 | return; | 149 | reg0 = (unsigned int)dp->phandle; |
146 | regs = prop->value; | 150 | } else { |
151 | regs = prop->value; | ||
152 | reg0 = regs->phys_addr; | ||
153 | } | ||
154 | |||
155 | /* Not all cores have Interrupt */ | ||
147 | prop = of_find_property(dp, "interrupts", NULL); | 156 | prop = of_find_property(dp, "interrupts", NULL); |
148 | if (!prop) | 157 | if (!prop) |
149 | return; | 158 | intr = &interrupt; /* IRQ0 does not exist */ |
150 | intr = prop->value; | 159 | else |
160 | intr = prop->value; | ||
161 | |||
151 | prop = of_find_property(dp, "vendor", NULL); | 162 | prop = of_find_property(dp, "vendor", NULL); |
152 | if (!prop) | 163 | if (!prop) |
153 | return; | 164 | return; |
@@ -159,7 +170,7 @@ static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf) | |||
159 | 170 | ||
160 | sprintf(tmp_buf, "%s:%d:%d@%x,%x", | 171 | sprintf(tmp_buf, "%s:%d:%d@%x,%x", |
161 | dp->name, *vendor, *device, | 172 | dp->name, *vendor, *device, |
162 | *intr, regs->phys_addr); | 173 | *intr, reg0); |
163 | } | 174 | } |
164 | 175 | ||
165 | static void __init __build_path_component(struct device_node *dp, char *tmp_buf) | 176 | static void __init __build_path_component(struct device_node *dp, char *tmp_buf) |