From: Benjamin Herrenschmidt Tom's recent irq patch broke PowerMac (and possibly others). I think he forgot that PReP, CHRP and PowerMac are all built together in a single kernel image, thus all of those arch_initcall's will end up beeing called, even on the wrong machine... Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc/platforms/chrp_setup.c | 3 +++ 25-akpm/arch/ppc/platforms/prep_setup.c | 3 +++ 25-akpm/arch/ppc/syslib/i8259.c | 6 ++++++ 3 files changed, 12 insertions(+) diff -puN arch/ppc/platforms/chrp_setup.c~ppc32-fix-boot-on-powermac arch/ppc/platforms/chrp_setup.c --- 25/arch/ppc/platforms/chrp_setup.c~ppc32-fix-boot-on-powermac 2004-10-28 20:35:38.100163184 -0700 +++ 25-akpm/arch/ppc/platforms/chrp_setup.c 2004-10-28 20:35:38.106162272 -0700 @@ -374,6 +374,9 @@ static void __init chrp_find_openpic(voi static int __init chrp_request_cascade(void) { + if (_machine != _MACH_chrp) + return 0; + /* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */ openpic_hookup_cascade(NUM_8259_INTERRUPTS, "82c59 cascade", i8259_irq); diff -puN arch/ppc/platforms/prep_setup.c~ppc32-fix-boot-on-powermac arch/ppc/platforms/prep_setup.c --- 25/arch/ppc/platforms/prep_setup.c~ppc32-fix-boot-on-powermac 2004-10-28 20:35:38.101163032 -0700 +++ 25-akpm/arch/ppc/platforms/prep_setup.c 2004-10-28 20:35:38.108161968 -0700 @@ -961,6 +961,9 @@ prep_irq_canonicalize(u_int irq) static int __init prep_request_cascade(void) { + if (_machine != _MACH_prep) + return 0; + if (OpenPIC_Addr != NULL) /* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */ openpic_hookup_cascade(NUM_8259_INTERRUPTS, "82c59 cascade", diff -puN arch/ppc/syslib/i8259.c~ppc32-fix-boot-on-powermac arch/ppc/syslib/i8259.c --- 25/arch/ppc/syslib/i8259.c~ppc32-fix-boot-on-powermac 2004-10-28 20:35:38.103162728 -0700 +++ 25-akpm/arch/ppc/syslib/i8259.c 2004-10-28 20:35:38.107162120 -0700 @@ -13,6 +13,7 @@ unsigned char cached_8259[2] = { 0xff, 0 static spinlock_t i8259_lock = SPIN_LOCK_UNLOCKED; int i8259_pic_irq_offset; +static int i8259_present; /* * Acknowledge the IRQ using either the PCI host bridge's interrupt @@ -154,6 +155,9 @@ static struct resource pic_edgectrl_iore static int __init i8259_hook_cascade(void) { + if (!i8259_present) + return 0; + /* reserve our resources */ request_irq( i8259_pic_irq_offset + 2, no_action, SA_INTERRUPT, "82c59 secondary cascade", NULL ); @@ -201,4 +205,6 @@ i8259_init(long intack_addr) if (intack_addr != 0) pci_intack = ioremap(intack_addr, 1); + + i8259_present = 1; } _