From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The current "generic" implementation of IRQ probing isn't well suited for
ppc in it's current form, and causes issues with yenta_socket (and possibly
others) on pmac laptops.  We didn't have a probe implementation in the
past, we probably don't need one anyway, so for now, the fix is to make
this optional and enable it on x86 and x86_64 but not ppc and ppc64 (the 4
archs to use the generic IRQ code).

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/i386/Kconfig         |    4 ++++
 25-akpm/arch/x86_64/Kconfig       |    4 ++++
 25-akpm/include/linux/interrupt.h |   16 ++++++++++++++++
 25-akpm/kernel/irq/Makefile       |    3 ++-
 4 files changed, 26 insertions(+), 1 deletion(-)

diff -puN arch/i386/Kconfig~ppc-disable-irq-probe-on-ppc arch/i386/Kconfig
--- 25/arch/i386/Kconfig~ppc-disable-irq-probe-on-ppc	2004-10-21 20:52:25.478593808 -0700
+++ 25-akpm/arch/i386/Kconfig	2004-10-21 20:52:25.488592288 -0700
@@ -1207,6 +1207,10 @@ config GENERIC_HARDIRQS
 	bool
 	default y
 
+config GENERIC_IRQ_PROBE
+	bool
+	default y
+
 config X86_SMP
 	bool
 	depends on SMP && !X86_VOYAGER
diff -puN arch/x86_64/Kconfig~ppc-disable-irq-probe-on-ppc arch/x86_64/Kconfig
--- 25/arch/x86_64/Kconfig~ppc-disable-irq-probe-on-ppc	2004-10-21 20:52:25.479593656 -0700
+++ 25-akpm/arch/x86_64/Kconfig	2004-10-21 20:52:25.486592592 -0700
@@ -346,6 +346,10 @@ config GENERIC_HARDIRQS
 	bool
 	default y
 
+config GENERIC_IRQ_PROBE
+	bool
+	default y
+
 menu "Power management options"
 
 source kernel/power/Kconfig
diff -puN include/linux/interrupt.h~ppc-disable-irq-probe-on-ppc include/linux/interrupt.h
--- 25/include/linux/interrupt.h~ppc-disable-irq-probe-on-ppc	2004-10-21 20:52:25.481593352 -0700
+++ 25-akpm/include/linux/interrupt.h	2004-10-21 20:52:25.486592592 -0700
@@ -252,8 +252,24 @@ extern void tasklet_init(struct tasklet_
  * or zero if none occurred, or a negative irq number
  * if more than one irq occurred.
  */
+
+#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
+static inline unsigned long probe_irq_on(void)
+{
+	return 0;
+}
+static inline int probe_irq_off(unsigned long val)
+{
+	return 0;
+}
+static inline unsigned int probe_irq_mask(unsigned long val)
+{
+	return 0;
+}
+#else
 extern unsigned long probe_irq_on(void);	/* returns 0 on failure */
 extern int probe_irq_off(unsigned long);	/* returns 0 or negative on failure */
 extern unsigned int probe_irq_mask(unsigned long);	/* returns mask of ISA interrupts */
+#endif
 
 #endif
diff -puN kernel/irq/Makefile~ppc-disable-irq-probe-on-ppc kernel/irq/Makefile
--- 25/kernel/irq/Makefile~ppc-disable-irq-probe-on-ppc	2004-10-21 20:52:25.482593200 -0700
+++ 25-akpm/kernel/irq/Makefile	2004-10-21 20:52:25.485592744 -0700
@@ -1,4 +1,5 @@
 
-obj-y := autoprobe.o handle.o manage.o spurious.o
+obj-y := handle.o manage.o spurious.o
+obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o
 obj-$(CONFIG_PROC_FS) += proc.o
 
_