diff options
| author | Michael Ellerman <michael@ellerman.id.au> | 2008-04-01 02:42:26 -0400 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-04-18 01:36:10 -0400 |
| commit | f01567d6d5688f8f613cd23da31aaf02d9538525 (patch) | |
| tree | 70f6c1a55909a49736374900382f2e37697b912e | |
| parent | 30d6ad251b5dcf497a266c4dc7d38fcde7185422 (diff) | |
[POWERPC] Use pseries_setup_i8259_cascade() in pseries_mpic_init_IRQ()
pseries_mpic_init_IRQ() implements the same logic as the xics code did to
find the i8259 cascade irq. Now that we've pulled that logic out into
pseries_setup_i8259_cascade() we can use it in the mpic code.
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
| -rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 43 |
1 files changed, 2 insertions, 41 deletions
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index eb079521fbf1..f66aa9c3b135 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
| @@ -175,12 +175,9 @@ static void __init pseries_setup_i8259_cascade(void) | |||
| 175 | 175 | ||
| 176 | static void __init pseries_mpic_init_IRQ(void) | 176 | static void __init pseries_mpic_init_IRQ(void) |
| 177 | { | 177 | { |
| 178 | struct device_node *np, *old, *cascade = NULL; | 178 | struct device_node *np; |
| 179 | const unsigned int *addrp; | ||
| 180 | unsigned long intack = 0; | ||
| 181 | const unsigned int *opprop; | 179 | const unsigned int *opprop; |
| 182 | unsigned long openpic_addr = 0; | 180 | unsigned long openpic_addr = 0; |
| 183 | unsigned int cascade_irq; | ||
| 184 | int naddr, n, i, opplen; | 181 | int naddr, n, i, opplen; |
| 185 | struct mpic *mpic; | 182 | struct mpic *mpic; |
| 186 | 183 | ||
| @@ -213,43 +210,7 @@ static void __init pseries_mpic_init_IRQ(void) | |||
| 213 | mpic_init(mpic); | 210 | mpic_init(mpic); |
| 214 | 211 | ||
| 215 | /* Look for cascade */ | 212 | /* Look for cascade */ |
| 216 | for_each_node_by_type(np, "interrupt-controller") | 213 | pseries_setup_i8259_cascade(); |
| 217 | if (of_device_is_compatible(np, "chrp,iic")) { | ||
| 218 | cascade = np; | ||
| 219 | break; | ||
| 220 | } | ||
| 221 | if (cascade == NULL) | ||
| 222 | return; | ||
| 223 | |||
| 224 | cascade_irq = irq_of_parse_and_map(cascade, 0); | ||
| 225 | if (cascade_irq == NO_IRQ) { | ||
| 226 | printk(KERN_ERR "mpic: failed to map cascade interrupt"); | ||
| 227 | return; | ||
| 228 | } | ||
| 229 | |||
| 230 | /* Check ACK type */ | ||
| 231 | for (old = of_node_get(cascade); old != NULL ; old = np) { | ||
| 232 | np = of_get_parent(old); | ||
| 233 | of_node_put(old); | ||
| 234 | if (np == NULL) | ||
| 235 | break; | ||
| 236 | if (strcmp(np->name, "pci") != 0) | ||
| 237 | continue; | ||
| 238 | addrp = of_get_property(np, "8259-interrupt-acknowledge", | ||
| 239 | NULL); | ||
| 240 | if (addrp == NULL) | ||
| 241 | continue; | ||
| 242 | naddr = of_n_addr_cells(np); | ||
| 243 | intack = addrp[naddr-1]; | ||
| 244 | if (naddr > 1) | ||
| 245 | intack |= ((unsigned long)addrp[naddr-2]) << 32; | ||
| 246 | } | ||
| 247 | if (intack) | ||
| 248 | printk(KERN_DEBUG "mpic: PCI 8259 intack at 0x%016lx\n", | ||
| 249 | intack); | ||
| 250 | i8259_init(cascade, intack); | ||
| 251 | of_node_put(cascade); | ||
| 252 | set_irq_chained_handler(cascade_irq, pseries_8259_cascade); | ||
| 253 | } | 214 | } |
| 254 | 215 | ||
| 255 | static void __init pseries_xics_init_IRQ(void) | 216 | static void __init pseries_xics_init_IRQ(void) |
