diff options
27 files changed, 59 insertions, 184 deletions
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c index 0d9ff72e2852..853ecef81780 100644 --- a/arch/powerpc/kernel/pci_32.c +++ b/arch/powerpc/kernel/pci_32.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/bootmem.h> | 13 | #include <linux/bootmem.h> |
14 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
15 | #include <linux/list.h> | ||
15 | 16 | ||
16 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
@@ -1338,6 +1339,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) | |||
1338 | struct pci_controller *hose = (struct pci_controller *) bus->sysdata; | 1339 | struct pci_controller *hose = (struct pci_controller *) bus->sysdata; |
1339 | unsigned long io_offset; | 1340 | unsigned long io_offset; |
1340 | struct resource *res; | 1341 | struct resource *res; |
1342 | struct pci_dev *dev; | ||
1341 | int i; | 1343 | int i; |
1342 | 1344 | ||
1343 | io_offset = (unsigned long)hose->io_base_virt - isa_io_base; | 1345 | io_offset = (unsigned long)hose->io_base_virt - isa_io_base; |
@@ -1390,8 +1392,16 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) | |||
1390 | } | 1392 | } |
1391 | } | 1393 | } |
1392 | 1394 | ||
1395 | /* Platform specific bus fixups */ | ||
1393 | if (ppc_md.pcibios_fixup_bus) | 1396 | if (ppc_md.pcibios_fixup_bus) |
1394 | ppc_md.pcibios_fixup_bus(bus); | 1397 | ppc_md.pcibios_fixup_bus(bus); |
1398 | |||
1399 | /* Read default IRQs and fixup if necessary */ | ||
1400 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
1401 | pci_read_irq_line(dev); | ||
1402 | if (ppc_md.pci_irq_fixup) | ||
1403 | ppc_md.pci_irq_fixup(dev); | ||
1404 | } | ||
1395 | } | 1405 | } |
1396 | 1406 | ||
1397 | char __init *pcibios_setup(char *str) | 1407 | char __init *pcibios_setup(char *str) |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 80ae9ea15cdc..9a6bb80a8cd4 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -1215,8 +1215,12 @@ static void __devinit do_bus_setup(struct pci_bus *bus) | |||
1215 | list_for_each_entry(dev, &bus->devices, bus_list) | 1215 | list_for_each_entry(dev, &bus->devices, bus_list) |
1216 | ppc_md.iommu_dev_setup(dev); | 1216 | ppc_md.iommu_dev_setup(dev); |
1217 | 1217 | ||
1218 | if (ppc_md.irq_bus_setup) | 1218 | /* Read default IRQs and fixup if necessary */ |
1219 | ppc_md.irq_bus_setup(bus); | 1219 | list_for_each_entry(dev, &bus->devices, bus_list) { |
1220 | pci_read_irq_line(dev); | ||
1221 | if (ppc_md.pci_irq_fixup) | ||
1222 | ppc_md.pci_irq_fixup(dev); | ||
1223 | } | ||
1220 | } | 1224 | } |
1221 | 1225 | ||
1222 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | 1226 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
diff --git a/arch/powerpc/platforms/82xx/mpc82xx_ads.c b/arch/powerpc/platforms/82xx/mpc82xx_ads.c index bb9acbb98176..ea880f1f0dcd 100644 --- a/arch/powerpc/platforms/82xx/mpc82xx_ads.c +++ b/arch/powerpc/platforms/82xx/mpc82xx_ads.c | |||
@@ -515,16 +515,6 @@ static int m82xx_pci_exclude_device(u_char bus, u_char devfn) | |||
515 | return PCIBIOS_SUCCESSFUL; | 515 | return PCIBIOS_SUCCESSFUL; |
516 | } | 516 | } |
517 | 517 | ||
518 | static void | ||
519 | __init mpc82xx_pcibios_fixup(void) | ||
520 | { | ||
521 | struct pci_dev *dev = NULL; | ||
522 | |||
523 | for_each_pci_dev(dev) { | ||
524 | pci_read_irq_line(dev); | ||
525 | } | ||
526 | } | ||
527 | |||
528 | void __init add_bridge(struct device_node *np) | 518 | void __init add_bridge(struct device_node *np) |
529 | { | 519 | { |
530 | int len; | 520 | int len; |
@@ -597,9 +587,6 @@ static void __init mpc82xx_ads_setup_arch(void) | |||
597 | add_bridge(np); | 587 | add_bridge(np); |
598 | 588 | ||
599 | of_node_put(np); | 589 | of_node_put(np); |
600 | ppc_md.pci_map_irq = NULL; | ||
601 | ppc_md.pcibios_fixup = mpc82xx_pcibios_fixup; | ||
602 | ppc_md.pcibios_fixup_bus = NULL; | ||
603 | #endif | 590 | #endif |
604 | 591 | ||
605 | #ifdef CONFIG_ROOT_NFS | 592 | #ifdef CONFIG_ROOT_NFS |
diff --git a/arch/powerpc/platforms/83xx/mpc834x_itx.c b/arch/powerpc/platforms/83xx/mpc834x_itx.c index e2bcaaf6b329..314c42ac6048 100644 --- a/arch/powerpc/platforms/83xx/mpc834x_itx.c +++ b/arch/powerpc/platforms/83xx/mpc834x_itx.c | |||
@@ -118,7 +118,4 @@ define_machine(mpc834x_itx) { | |||
118 | .time_init = mpc83xx_time_init, | 118 | .time_init = mpc83xx_time_init, |
119 | .calibrate_decr = generic_calibrate_decr, | 119 | .calibrate_decr = generic_calibrate_decr, |
120 | .progress = udbg_progress, | 120 | .progress = udbg_progress, |
121 | #ifdef CONFIG_PCI | ||
122 | .pcibios_fixup = mpc83xx_pcibios_fixup, | ||
123 | #endif | ||
124 | }; | 121 | }; |
diff --git a/arch/powerpc/platforms/83xx/mpc834x_sys.c b/arch/powerpc/platforms/83xx/mpc834x_sys.c index 677196187a4e..80b735a414d9 100644 --- a/arch/powerpc/platforms/83xx/mpc834x_sys.c +++ b/arch/powerpc/platforms/83xx/mpc834x_sys.c | |||
@@ -137,7 +137,4 @@ define_machine(mpc834x_sys) { | |||
137 | .time_init = mpc83xx_time_init, | 137 | .time_init = mpc83xx_time_init, |
138 | .calibrate_decr = generic_calibrate_decr, | 138 | .calibrate_decr = generic_calibrate_decr, |
139 | .progress = udbg_progress, | 139 | .progress = udbg_progress, |
140 | #ifdef CONFIG_PCI | ||
141 | .pcibios_fixup = mpc83xx_pcibios_fixup, | ||
142 | #endif | ||
143 | }; | 140 | }; |
diff --git a/arch/powerpc/platforms/83xx/mpc83xx.h b/arch/powerpc/platforms/83xx/mpc83xx.h index 2c82bca9bfbb..01cae106912b 100644 --- a/arch/powerpc/platforms/83xx/mpc83xx.h +++ b/arch/powerpc/platforms/83xx/mpc83xx.h | |||
@@ -11,7 +11,6 @@ | |||
11 | 11 | ||
12 | extern int add_bridge(struct device_node *dev); | 12 | extern int add_bridge(struct device_node *dev); |
13 | extern int mpc83xx_exclude_device(u_char bus, u_char devfn); | 13 | extern int mpc83xx_exclude_device(u_char bus, u_char devfn); |
14 | extern void mpc83xx_pcibios_fixup(void); | ||
15 | extern void mpc83xx_restart(char *cmd); | 14 | extern void mpc83xx_restart(char *cmd); |
16 | extern long mpc83xx_time_init(void); | 15 | extern long mpc83xx_time_init(void); |
17 | 16 | ||
diff --git a/arch/powerpc/platforms/83xx/pci.c b/arch/powerpc/platforms/83xx/pci.c index 4557ac5255c1..9c3650555144 100644 --- a/arch/powerpc/platforms/83xx/pci.c +++ b/arch/powerpc/platforms/83xx/pci.c | |||
@@ -45,15 +45,6 @@ int mpc83xx_exclude_device(u_char bus, u_char devfn) | |||
45 | return PCIBIOS_SUCCESSFUL; | 45 | return PCIBIOS_SUCCESSFUL; |
46 | } | 46 | } |
47 | 47 | ||
48 | void __init mpc83xx_pcibios_fixup(void) | ||
49 | { | ||
50 | struct pci_dev *dev = NULL; | ||
51 | |||
52 | /* map all the PCI irqs */ | ||
53 | for_each_pci_dev(dev) | ||
54 | pci_read_irq_line(dev); | ||
55 | } | ||
56 | |||
57 | int __init add_bridge(struct device_node *dev) | 48 | int __init add_bridge(struct device_node *dev) |
58 | { | 49 | { |
59 | int len; | 50 | int len; |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ads.c b/arch/powerpc/platforms/85xx/mpc85xx_ads.c index d3e669d69c73..bda2e55e6c4c 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c | |||
@@ -53,15 +53,6 @@ mpc85xx_exclude_device(u_char bus, u_char devfn) | |||
53 | else | 53 | else |
54 | return PCIBIOS_SUCCESSFUL; | 54 | return PCIBIOS_SUCCESSFUL; |
55 | } | 55 | } |
56 | |||
57 | void __init | ||
58 | mpc85xx_pcibios_fixup(void) | ||
59 | { | ||
60 | struct pci_dev *dev = NULL; | ||
61 | |||
62 | for_each_pci_dev(dev) | ||
63 | pci_read_irq_line(dev); | ||
64 | } | ||
65 | #endif /* CONFIG_PCI */ | 56 | #endif /* CONFIG_PCI */ |
66 | 57 | ||
67 | #ifdef CONFIG_CPM2 | 58 | #ifdef CONFIG_CPM2 |
@@ -253,8 +244,6 @@ static void __init mpc85xx_ads_setup_arch(void) | |||
253 | #ifdef CONFIG_PCI | 244 | #ifdef CONFIG_PCI |
254 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) | 245 | for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) |
255 | add_bridge(np); | 246 | add_bridge(np); |
256 | |||
257 | ppc_md.pcibios_fixup = mpc85xx_pcibios_fixup; | ||
258 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; | 247 | ppc_md.pci_exclude_device = mpc85xx_exclude_device; |
259 | #endif | 248 | #endif |
260 | 249 | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c index 1a1c226ad4d9..f4dd5f2f8a28 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | |||
@@ -398,15 +398,6 @@ mpc86xx_hpcn_show_cpuinfo(struct seq_file *m) | |||
398 | } | 398 | } |
399 | 399 | ||
400 | 400 | ||
401 | void __init mpc86xx_hpcn_pcibios_fixup(void) | ||
402 | { | ||
403 | struct pci_dev *dev = NULL; | ||
404 | |||
405 | for_each_pci_dev(dev) | ||
406 | pci_read_irq_line(dev); | ||
407 | } | ||
408 | |||
409 | |||
410 | /* | 401 | /* |
411 | * Called very early, device-tree isn't unflattened | 402 | * Called very early, device-tree isn't unflattened |
412 | */ | 403 | */ |
@@ -461,7 +452,6 @@ define_machine(mpc86xx_hpcn) { | |||
461 | .setup_arch = mpc86xx_hpcn_setup_arch, | 452 | .setup_arch = mpc86xx_hpcn_setup_arch, |
462 | .init_IRQ = mpc86xx_hpcn_init_irq, | 453 | .init_IRQ = mpc86xx_hpcn_init_irq, |
463 | .show_cpuinfo = mpc86xx_hpcn_show_cpuinfo, | 454 | .show_cpuinfo = mpc86xx_hpcn_show_cpuinfo, |
464 | .pcibios_fixup = mpc86xx_hpcn_pcibios_fixup, | ||
465 | .get_irq = mpic_get_irq, | 455 | .get_irq = mpic_get_irq, |
466 | .restart = mpc86xx_restart, | 456 | .restart = mpc86xx_restart, |
467 | .time_init = mpc86xx_time_init, | 457 | .time_init = mpc86xx_time_init, |
diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c index 22c228a49c33..1944bb413f04 100644 --- a/arch/powerpc/platforms/cell/setup.c +++ b/arch/powerpc/platforms/cell/setup.c | |||
@@ -80,14 +80,6 @@ static void cell_progress(char *s, unsigned short hex) | |||
80 | printk("*** %04x : %s\n", hex, s ? s : ""); | 80 | printk("*** %04x : %s\n", hex, s ? s : ""); |
81 | } | 81 | } |
82 | 82 | ||
83 | static void __init cell_pcibios_fixup(void) | ||
84 | { | ||
85 | struct pci_dev *dev = NULL; | ||
86 | |||
87 | for_each_pci_dev(dev) | ||
88 | pci_read_irq_line(dev); | ||
89 | } | ||
90 | |||
91 | static void __init cell_init_irq(void) | 83 | static void __init cell_init_irq(void) |
92 | { | 84 | { |
93 | iic_init_IRQ(); | 85 | iic_init_IRQ(); |
@@ -180,7 +172,6 @@ define_machine(cell) { | |||
180 | .check_legacy_ioport = cell_check_legacy_ioport, | 172 | .check_legacy_ioport = cell_check_legacy_ioport, |
181 | .progress = cell_progress, | 173 | .progress = cell_progress, |
182 | .init_IRQ = cell_init_irq, | 174 | .init_IRQ = cell_init_irq, |
183 | .pcibios_fixup = cell_pcibios_fixup, | ||
184 | #ifdef CONFIG_KEXEC | 175 | #ifdef CONFIG_KEXEC |
185 | .machine_kexec = default_machine_kexec, | 176 | .machine_kexec = default_machine_kexec, |
186 | .machine_kexec_prepare = default_machine_kexec_prepare, | 177 | .machine_kexec_prepare = default_machine_kexec_prepare, |
diff --git a/arch/powerpc/platforms/chrp/chrp.h b/arch/powerpc/platforms/chrp/chrp.h index 996c28744e96..63f0aee4c158 100644 --- a/arch/powerpc/platforms/chrp/chrp.h +++ b/arch/powerpc/platforms/chrp/chrp.h | |||
@@ -9,4 +9,3 @@ extern long chrp_time_init(void); | |||
9 | 9 | ||
10 | extern void chrp_find_bridges(void); | 10 | extern void chrp_find_bridges(void); |
11 | extern void chrp_event_scan(unsigned long); | 11 | extern void chrp_event_scan(unsigned long); |
12 | extern void chrp_pcibios_fixup(void); | ||
diff --git a/arch/powerpc/platforms/chrp/pci.c b/arch/powerpc/platforms/chrp/pci.c index 0f4340506c75..ddb4a116ea89 100644 --- a/arch/powerpc/platforms/chrp/pci.c +++ b/arch/powerpc/platforms/chrp/pci.c | |||
@@ -156,15 +156,6 @@ hydra_init(void) | |||
156 | return 1; | 156 | return 1; |
157 | } | 157 | } |
158 | 158 | ||
159 | void __init | ||
160 | chrp_pcibios_fixup(void) | ||
161 | { | ||
162 | struct pci_dev *dev = NULL; | ||
163 | |||
164 | for_each_pci_dev(dev) | ||
165 | pci_read_irq_line(dev); | ||
166 | } | ||
167 | |||
168 | #define PRG_CL_RESET_VALID 0x00010000 | 159 | #define PRG_CL_RESET_VALID 0x00010000 |
169 | 160 | ||
170 | static void __init | 161 | static void __init |
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index 49b8dabcbc99..e6807d6d75bf 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
@@ -600,7 +600,6 @@ define_machine(chrp) { | |||
600 | .init = chrp_init2, | 600 | .init = chrp_init2, |
601 | .show_cpuinfo = chrp_show_cpuinfo, | 601 | .show_cpuinfo = chrp_show_cpuinfo, |
602 | .init_IRQ = chrp_init_IRQ, | 602 | .init_IRQ = chrp_init_IRQ, |
603 | .pcibios_fixup = chrp_pcibios_fixup, | ||
604 | .restart = rtas_restart, | 603 | .restart = rtas_restart, |
605 | .power_off = rtas_power_off, | 604 | .power_off = rtas_power_off, |
606 | .halt = rtas_halt, | 605 | .halt = rtas_halt, |
diff --git a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c index bdb475c65cba..c6113c39009e 100644 --- a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c +++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c | |||
@@ -89,7 +89,7 @@ u8 find_slot_by_devfn(unsigned int *interrupt_map, unsigned int devfn) | |||
89 | /* | 89 | /* |
90 | * Scans the interrupt map for pci device | 90 | * Scans the interrupt map for pci device |
91 | */ | 91 | */ |
92 | void mpc7448_hpc2_fixup_irq(struct pci_dev *dev) | 92 | void __devinit mpc7448_hpc2_fixup_irq(struct pci_dev *dev) |
93 | { | 93 | { |
94 | struct pci_controller *hose; | 94 | struct pci_controller *hose; |
95 | struct device_node *node; | 95 | struct device_node *node; |
@@ -117,19 +117,13 @@ void mpc7448_hpc2_fixup_irq(struct pci_dev *dev) | |||
117 | pin = 1; | 117 | pin = 1; |
118 | pin--; | 118 | pin--; |
119 | dev->irq = interrupt[slot*4*7 + pin*7 + 5]; | 119 | dev->irq = interrupt[slot*4*7 + pin*7 + 5]; |
120 | |||
121 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
122 | |||
120 | DBG("TSI_PCI: dev->irq = 0x%x\n", dev->irq); | 123 | DBG("TSI_PCI: dev->irq = 0x%x\n", dev->irq); |
121 | } | 124 | } |
122 | /* temporary pci irq map fixup*/ | 125 | /* temporary pci irq map fixup*/ |
123 | 126 | ||
124 | void __init mpc7448_hpc2_pcibios_fixup(void) | ||
125 | { | ||
126 | struct pci_dev *dev = NULL; | ||
127 | for_each_pci_dev(dev) { | ||
128 | mpc7448_hpc2_fixup_irq(dev); | ||
129 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | static void __init mpc7448_hpc2_setup_arch(void) | 127 | static void __init mpc7448_hpc2_setup_arch(void) |
134 | { | 128 | { |
135 | struct device_node *cpu; | 129 | struct device_node *cpu; |
@@ -300,7 +294,7 @@ define_machine(mpc7448_hpc2){ | |||
300 | .init_IRQ = mpc7448_hpc2_init_IRQ, | 294 | .init_IRQ = mpc7448_hpc2_init_IRQ, |
301 | .show_cpuinfo = mpc7448_hpc2_show_cpuinfo, | 295 | .show_cpuinfo = mpc7448_hpc2_show_cpuinfo, |
302 | .get_irq = mpic_get_irq, | 296 | .get_irq = mpic_get_irq, |
303 | .pcibios_fixup = mpc7448_hpc2_pcibios_fixup, | 297 | .pci_irq_fixup = mpc7448_hpc2_fixup_irq, |
304 | .restart = mpc7448_hpc2_restart, | 298 | .restart = mpc7448_hpc2_restart, |
305 | .calibrate_decr = generic_calibrate_decr, | 299 | .calibrate_decr = generic_calibrate_decr, |
306 | .machine_check_exception= mpc7448_machine_check_exception, | 300 | .machine_check_exception= mpc7448_machine_check_exception, |
diff --git a/arch/powerpc/platforms/maple/maple.h b/arch/powerpc/platforms/maple/maple.h index 0657c579b840..c6911ddc479f 100644 --- a/arch/powerpc/platforms/maple/maple.h +++ b/arch/powerpc/platforms/maple/maple.h | |||
@@ -8,5 +8,5 @@ extern void maple_get_rtc_time(struct rtc_time *tm); | |||
8 | extern unsigned long maple_get_boot_time(void); | 8 | extern unsigned long maple_get_boot_time(void); |
9 | extern void maple_calibrate_decr(void); | 9 | extern void maple_calibrate_decr(void); |
10 | extern void maple_pci_init(void); | 10 | extern void maple_pci_init(void); |
11 | extern void maple_pcibios_fixup(void); | 11 | extern void maple_pci_irq_fixup(struct pci_dev *dev); |
12 | extern int maple_pci_get_legacy_ide_irq(struct pci_dev *dev, int channel); | 12 | extern int maple_pci_get_legacy_ide_irq(struct pci_dev *dev, int channel); |
diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index 63b4d1bff359..3a32deda765d 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c | |||
@@ -502,38 +502,29 @@ static int __init add_bridge(struct device_node *dev) | |||
502 | } | 502 | } |
503 | 503 | ||
504 | 504 | ||
505 | void __init maple_pcibios_fixup(void) | 505 | void __devinit maple_pci_irq_fixup(struct pci_dev *dev) |
506 | { | 506 | { |
507 | struct pci_dev *dev = NULL; | 507 | DBG(" -> maple_pci_irq_fixup\n"); |
508 | 508 | ||
509 | DBG(" -> maple_pcibios_fixup\n"); | 509 | /* Fixup IRQ for PCIe host */ |
510 | 510 | if (u4_pcie != NULL && dev->bus->number == 0 && | |
511 | for_each_pci_dev(dev) { | 511 | pci_bus_to_host(dev->bus) == u4_pcie) { |
512 | /* Fixup IRQ for PCIe host */ | 512 | printk(KERN_DEBUG "Fixup U4 PCIe IRQ\n"); |
513 | if (u4_pcie != NULL && dev->bus->number == 0 && | 513 | dev->irq = irq_create_mapping(NULL, 1); |
514 | pci_bus_to_host(dev->bus) == u4_pcie) { | 514 | if (dev->irq != NO_IRQ) |
515 | printk(KERN_DEBUG "Fixup U4 PCIe IRQ\n"); | 515 | set_irq_type(dev->irq, IRQ_TYPE_LEVEL_LOW); |
516 | dev->irq = irq_create_mapping(NULL, 1); | 516 | } |
517 | if (dev->irq != NO_IRQ) | ||
518 | set_irq_type(dev->irq, IRQ_TYPE_LEVEL_LOW); | ||
519 | continue; | ||
520 | } | ||
521 | |||
522 | /* Hide AMD8111 IDE interrupt when in legacy mode so | ||
523 | * the driver calls pci_get_legacy_ide_irq() | ||
524 | */ | ||
525 | if (dev->vendor == PCI_VENDOR_ID_AMD && | ||
526 | dev->device == PCI_DEVICE_ID_AMD_8111_IDE && | ||
527 | (dev->class & 5) != 5) { | ||
528 | dev->irq = NO_IRQ; | ||
529 | continue; | ||
530 | } | ||
531 | 517 | ||
532 | /* For all others, map the interrupt from the device-tree */ | 518 | /* Hide AMD8111 IDE interrupt when in legacy mode so |
533 | pci_read_irq_line(dev); | 519 | * the driver calls pci_get_legacy_ide_irq() |
520 | */ | ||
521 | if (dev->vendor == PCI_VENDOR_ID_AMD && | ||
522 | dev->device == PCI_DEVICE_ID_AMD_8111_IDE && | ||
523 | (dev->class & 5) != 5) { | ||
524 | dev->irq = NO_IRQ; | ||
534 | } | 525 | } |
535 | 526 | ||
536 | DBG(" <- maple_pcibios_fixup\n"); | 527 | DBG(" <- maple_pci_irq_fixup\n"); |
537 | } | 528 | } |
538 | 529 | ||
539 | static void __init maple_fixup_phb_resources(void) | 530 | static void __init maple_fixup_phb_resources(void) |
diff --git a/arch/powerpc/platforms/maple/setup.c b/arch/powerpc/platforms/maple/setup.c index fe6b9bff61b9..094989d50bab 100644 --- a/arch/powerpc/platforms/maple/setup.c +++ b/arch/powerpc/platforms/maple/setup.c | |||
@@ -312,7 +312,7 @@ define_machine(maple_md) { | |||
312 | .setup_arch = maple_setup_arch, | 312 | .setup_arch = maple_setup_arch, |
313 | .init_early = maple_init_early, | 313 | .init_early = maple_init_early, |
314 | .init_IRQ = maple_init_IRQ, | 314 | .init_IRQ = maple_init_IRQ, |
315 | .pcibios_fixup = maple_pcibios_fixup, | 315 | .pci_irq_fixup = maple_pci_irq_fixup, |
316 | .pci_get_legacy_ide_irq = maple_pci_get_legacy_ide_irq, | 316 | .pci_get_legacy_ide_irq = maple_pci_get_legacy_ide_irq, |
317 | .restart = maple_restart, | 317 | .restart = maple_restart, |
318 | .power_off = maple_power_off, | 318 | .power_off = maple_power_off, |
diff --git a/arch/powerpc/platforms/pasemi/pasemi.h b/arch/powerpc/platforms/pasemi/pasemi.h index fd71d72736b2..51c2a2397ecf 100644 --- a/arch/powerpc/platforms/pasemi/pasemi.h +++ b/arch/powerpc/platforms/pasemi/pasemi.h | |||
@@ -3,6 +3,5 @@ | |||
3 | 3 | ||
4 | extern unsigned long pas_get_boot_time(void); | 4 | extern unsigned long pas_get_boot_time(void); |
5 | extern void pas_pci_init(void); | 5 | extern void pas_pci_init(void); |
6 | extern void pas_pcibios_fixup(void); | ||
7 | 6 | ||
8 | #endif /* _PASEMI_PASEMI_H */ | 7 | #endif /* _PASEMI_PASEMI_H */ |
diff --git a/arch/powerpc/platforms/pasemi/pci.c b/arch/powerpc/platforms/pasemi/pci.c index 39020c1fa13d..faa618e04047 100644 --- a/arch/powerpc/platforms/pasemi/pci.c +++ b/arch/powerpc/platforms/pasemi/pci.c | |||
@@ -148,14 +148,6 @@ static int __init add_bridge(struct device_node *dev) | |||
148 | } | 148 | } |
149 | 149 | ||
150 | 150 | ||
151 | void __init pas_pcibios_fixup(void) | ||
152 | { | ||
153 | struct pci_dev *dev = NULL; | ||
154 | |||
155 | for_each_pci_dev(dev) | ||
156 | pci_read_irq_line(dev); | ||
157 | } | ||
158 | |||
159 | static void __init pas_fixup_phb_resources(void) | 151 | static void __init pas_fixup_phb_resources(void) |
160 | { | 152 | { |
161 | struct pci_controller *hose, *tmp; | 153 | struct pci_controller *hose, *tmp; |
diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c index 106896c3b60a..eb2457567f8a 100644 --- a/arch/powerpc/platforms/pasemi/setup.c +++ b/arch/powerpc/platforms/pasemi/setup.c | |||
@@ -176,7 +176,6 @@ define_machine(pas) { | |||
176 | .init_early = pas_init_early, | 176 | .init_early = pas_init_early, |
177 | .init_IRQ = pas_init_IRQ, | 177 | .init_IRQ = pas_init_IRQ, |
178 | .get_irq = mpic_get_irq, | 178 | .get_irq = mpic_get_irq, |
179 | .pcibios_fixup = pas_pcibios_fixup, | ||
180 | .restart = pas_restart, | 179 | .restart = pas_restart, |
181 | .power_off = pas_power_off, | 180 | .power_off = pas_power_off, |
182 | .halt = pas_halt, | 181 | .halt = pas_halt, |
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 257dc9068468..f42475b27c15 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -984,30 +984,23 @@ static int __init add_bridge(struct device_node *dev) | |||
984 | return 0; | 984 | return 0; |
985 | } | 985 | } |
986 | 986 | ||
987 | void __init pmac_pcibios_fixup(void) | 987 | void __devinit pmac_pci_irq_fixup(struct pci_dev *dev) |
988 | { | 988 | { |
989 | struct pci_dev* dev = NULL; | ||
990 | |||
991 | for_each_pci_dev(dev) { | ||
992 | /* Read interrupt from the device-tree */ | ||
993 | pci_read_irq_line(dev); | ||
994 | |||
995 | #ifdef CONFIG_PPC32 | 989 | #ifdef CONFIG_PPC32 |
996 | /* Fixup interrupt for the modem/ethernet combo controller. | 990 | /* Fixup interrupt for the modem/ethernet combo controller. |
997 | * on machines with a second ohare chip. | 991 | * on machines with a second ohare chip. |
998 | * The number in the device tree (27) is bogus (correct for | 992 | * The number in the device tree (27) is bogus (correct for |
999 | * the ethernet-only board but not the combo ethernet/modem | 993 | * the ethernet-only board but not the combo ethernet/modem |
1000 | * board). The real interrupt is 28 on the second controller | 994 | * board). The real interrupt is 28 on the second controller |
1001 | * -> 28+32 = 60. | 995 | * -> 28+32 = 60. |
1002 | */ | 996 | */ |
1003 | if (has_second_ohare && | 997 | if (has_second_ohare && |
1004 | dev->vendor == PCI_VENDOR_ID_DEC && | 998 | dev->vendor == PCI_VENDOR_ID_DEC && |
1005 | dev->device == PCI_DEVICE_ID_DEC_TULIP_PLUS) { | 999 | dev->device == PCI_DEVICE_ID_DEC_TULIP_PLUS) { |
1006 | dev->irq = irq_create_mapping(NULL, 60); | 1000 | dev->irq = irq_create_mapping(NULL, 60); |
1007 | set_irq_type(dev->irq, IRQ_TYPE_LEVEL_LOW); | 1001 | set_irq_type(dev->irq, IRQ_TYPE_LEVEL_LOW); |
1008 | } | ||
1009 | #endif /* CONFIG_PPC32 */ | ||
1010 | } | 1002 | } |
1003 | #endif /* CONFIG_PPC32 */ | ||
1011 | } | 1004 | } |
1012 | 1005 | ||
1013 | #ifdef CONFIG_PPC64 | 1006 | #ifdef CONFIG_PPC64 |
diff --git a/arch/powerpc/platforms/powermac/pmac.h b/arch/powerpc/platforms/powermac/pmac.h index 94e7b24b840b..6e090a7dea83 100644 --- a/arch/powerpc/platforms/powermac/pmac.h +++ b/arch/powerpc/platforms/powermac/pmac.h | |||
@@ -20,7 +20,7 @@ extern void pmac_get_rtc_time(struct rtc_time *); | |||
20 | extern int pmac_set_rtc_time(struct rtc_time *); | 20 | extern int pmac_set_rtc_time(struct rtc_time *); |
21 | extern void pmac_read_rtc_time(void); | 21 | extern void pmac_read_rtc_time(void); |
22 | extern void pmac_calibrate_decr(void); | 22 | extern void pmac_calibrate_decr(void); |
23 | extern void pmac_pcibios_fixup(void); | 23 | extern void pmac_pci_irq_fixup(struct pci_dev *); |
24 | extern void pmac_pci_init(void); | 24 | extern void pmac_pci_init(void); |
25 | extern unsigned long pmac_ide_get_base(int index); | 25 | extern unsigned long pmac_ide_get_base(int index); |
26 | extern void pmac_ide_init_hwif_ports(hw_regs_t *hw, | 26 | extern void pmac_ide_init_hwif_ports(hw_regs_t *hw, |
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c index cb1c342061e2..805791d76fdf 100644 --- a/arch/powerpc/platforms/powermac/setup.c +++ b/arch/powerpc/platforms/powermac/setup.c | |||
@@ -727,7 +727,7 @@ define_machine(powermac) { | |||
727 | .show_cpuinfo = pmac_show_cpuinfo, | 727 | .show_cpuinfo = pmac_show_cpuinfo, |
728 | .init_IRQ = pmac_pic_init, | 728 | .init_IRQ = pmac_pic_init, |
729 | .get_irq = NULL, /* changed later */ | 729 | .get_irq = NULL, /* changed later */ |
730 | .pcibios_fixup = pmac_pcibios_fixup, | 730 | .pci_irq_fixup = pmac_pci_irq_fixup, |
731 | .restart = pmac_restart, | 731 | .restart = pmac_restart, |
732 | .power_off = pmac_power_off, | 732 | .power_off = pmac_power_off, |
733 | .halt = pmac_halt, | 733 | .halt = pmac_halt, |
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index 410a6bcc4ca0..715db5c89908 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c | |||
@@ -29,8 +29,6 @@ | |||
29 | #include <asm/prom.h> | 29 | #include <asm/prom.h> |
30 | #include <asm/ppc-pci.h> | 30 | #include <asm/ppc-pci.h> |
31 | 31 | ||
32 | static int __devinitdata s7a_workaround = -1; | ||
33 | |||
34 | #if 0 | 32 | #if 0 |
35 | void pcibios_name_device(struct pci_dev *dev) | 33 | void pcibios_name_device(struct pci_dev *dev) |
36 | { | 34 | { |
@@ -57,39 +55,6 @@ void pcibios_name_device(struct pci_dev *dev) | |||
57 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_name_device); | 55 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_name_device); |
58 | #endif | 56 | #endif |
59 | 57 | ||
60 | static void __devinit check_s7a(void) | ||
61 | { | ||
62 | struct device_node *root; | ||
63 | const char *model; | ||
64 | |||
65 | s7a_workaround = 0; | ||
66 | root = of_find_node_by_path("/"); | ||
67 | if (root) { | ||
68 | model = get_property(root, "model", NULL); | ||
69 | if (model && !strcmp(model, "IBM,7013-S7A")) | ||
70 | s7a_workaround = 1; | ||
71 | of_node_put(root); | ||
72 | } | ||
73 | } | ||
74 | |||
75 | void __devinit pSeries_irq_bus_setup(struct pci_bus *bus) | ||
76 | { | ||
77 | struct pci_dev *dev; | ||
78 | |||
79 | if (s7a_workaround < 0) | ||
80 | check_s7a(); | ||
81 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
82 | pci_read_irq_line(dev); | ||
83 | if (s7a_workaround) { | ||
84 | if (dev->irq > 16) { | ||
85 | dev->irq -= 3; | ||
86 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, | ||
87 | dev->irq); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | |||
93 | static void __init pSeries_request_regions(void) | 58 | static void __init pSeries_request_regions(void) |
94 | { | 59 | { |
95 | if (!isa_io_base) | 60 | if (!isa_io_base) |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 89a8119f988d..a8f3812aa38e 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -553,7 +553,6 @@ define_machine(pseries) { | |||
553 | .log_error = pSeries_log_error, | 553 | .log_error = pSeries_log_error, |
554 | .pcibios_fixup = pSeries_final_fixup, | 554 | .pcibios_fixup = pSeries_final_fixup, |
555 | .pci_probe_mode = pSeries_pci_probe_mode, | 555 | .pci_probe_mode = pSeries_pci_probe_mode, |
556 | .irq_bus_setup = pSeries_irq_bus_setup, | ||
557 | .restart = rtas_restart, | 556 | .restart = rtas_restart, |
558 | .power_off = rtas_power_off, | 557 | .power_off = rtas_power_off, |
559 | .halt = rtas_halt, | 558 | .halt = rtas_halt, |
diff --git a/include/asm-powerpc/machdep.h b/include/asm-powerpc/machdep.h index dac90dc341cb..3810f131901c 100644 --- a/include/asm-powerpc/machdep.h +++ b/include/asm-powerpc/machdep.h | |||
@@ -86,7 +86,6 @@ struct machdep_calls { | |||
86 | void (*tce_flush)(struct iommu_table *tbl); | 86 | void (*tce_flush)(struct iommu_table *tbl); |
87 | void (*iommu_dev_setup)(struct pci_dev *dev); | 87 | void (*iommu_dev_setup)(struct pci_dev *dev); |
88 | void (*iommu_bus_setup)(struct pci_bus *bus); | 88 | void (*iommu_bus_setup)(struct pci_bus *bus); |
89 | void (*irq_bus_setup)(struct pci_bus *bus); | ||
90 | #endif /* CONFIG_PPC64 */ | 89 | #endif /* CONFIG_PPC64 */ |
91 | 90 | ||
92 | int (*probe)(void); | 91 | int (*probe)(void); |
@@ -106,6 +105,7 @@ struct machdep_calls { | |||
106 | /* Called after scanning the bus, before allocating resources */ | 105 | /* Called after scanning the bus, before allocating resources */ |
107 | void (*pcibios_fixup)(void); | 106 | void (*pcibios_fixup)(void); |
108 | int (*pci_probe_mode)(struct pci_bus *); | 107 | int (*pci_probe_mode)(struct pci_bus *); |
108 | void (*pci_irq_fixup)(struct pci_dev *dev); | ||
109 | 109 | ||
110 | void (*restart)(char *cmd); | 110 | void (*restart)(char *cmd); |
111 | void (*power_off)(void); | 111 | void (*power_off)(void); |
diff --git a/include/asm-powerpc/ppc-pci.h b/include/asm-powerpc/ppc-pci.h index 1115756c79f9..8894d1d4226b 100644 --- a/include/asm-powerpc/ppc-pci.h +++ b/include/asm-powerpc/ppc-pci.h | |||
@@ -47,7 +47,6 @@ unsigned long get_phb_buid (struct device_node *); | |||
47 | 47 | ||
48 | /* From pSeries_pci.h */ | 48 | /* From pSeries_pci.h */ |
49 | extern void pSeries_final_fixup(void); | 49 | extern void pSeries_final_fixup(void); |
50 | extern void pSeries_irq_bus_setup(struct pci_bus *bus); | ||
51 | 50 | ||
52 | extern unsigned long pci_probe_only; | 51 | extern unsigned long pci_probe_only; |
53 | 52 | ||