diff -urN a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
--- a/Documentation/kernel-parameters.txt	2010-04-10 12:24:29.000000000 +0900
+++ b/Documentation/kernel-parameters.txt	2010-04-10 12:24:29.000000000 +0900
@@ -1821,6 +1821,11 @@
 
 	panic=		[KNL] Kernel behaviour on panic
 			Format: <timeout>
+	panic_output=	[KNL] Enable/disable the output devices of choice
+			panic_output=0: disable the signalling completely
+			panic_output=1: only blink the leds (the default)
+			panic_output=2: only beep
+			panic_output=3: do both
 
 	parkbd.port=	[HW] Parallel port number the keyboard adapter is
 			connected to, default is 0.
diff -urN a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c
--- a/drivers/input/misc/pcspkr.c	2010-02-25 03:52:17.000000000 +0900
+++ b/drivers/input/misc/pcspkr.c	2010-04-10 12:24:29.000000000 +0900
@@ -70,6 +70,34 @@
 	return 0;
 }
 
+/*
+ * pcspkr_panic_beep() will beep the PC speaker on or off and is called
+ * when kernel panics. Beeping a speaker is useful for users running X
+ * who may not see the console and will help distingushing panics from
+ * "real" lockups.
+ */
+
+static void pcspkr_panic_beep(int value)
+{
+	unsigned int count = 0;
+
+	if (value > 20 && value < 32767)
+		count = PIT_TICK_RATE / value;
+
+	if (count) {
+		/* set command for counter 2, 2 byte write */
+		outb_p(0xB6, 0x43);
+		/* select desired HZ */
+		outb_p(count & 0xff, 0x42);
+		outb((count >> 8) & 0xff, 0x42);
+		/* enable counter 2 */
+		outb_p(inb_p(0x61) | 3, 0x61);
+	} else {
+		/* disable counter 2 */
+		outb(inb_p(0x61) & 0xFC, 0x61);
+	}
+}
+
 static int __devinit pcspkr_probe(struct platform_device *dev)
 {
 	struct input_dev *pcspkr_dev;
@@ -145,12 +173,16 @@
 
 static int __init pcspkr_init(void)
 {
+	panic_beep = pcspkr_panic_beep;
+
 	return platform_driver_register(&pcspkr_platform_driver);
 }
 
 static void __exit pcspkr_exit(void)
 {
 	platform_driver_unregister(&pcspkr_platform_driver);
+
+	panic_beep = NULL;
 }
 
 module_init(pcspkr_init);
diff -urN a/include/linux/kernel.h b/include/linux/kernel.h
--- a/include/linux/kernel.h	2010-04-10 12:24:29.000000000 +0900
+++ b/include/linux/kernel.h	2010-04-10 12:24:29.000000000 +0900
@@ -160,6 +160,7 @@
 
 extern struct atomic_notifier_head panic_notifier_list;
 extern long (*panic_blink)(int state);
+extern void (*panic_beep)(int value);
 NORET_TYPE void panic(const char * fmt, ...)
 	__attribute__ ((NORET_AND format (printf, 1, 2))) __cold;
 extern void oops_enter(void);
diff -urN a/kernel/panic.c b/kernel/panic.c
--- a/kernel/panic.c	2010-04-10 12:24:29.000000000 +0900
+++ b/kernel/panic.c	2010-04-10 12:24:29.000000000 +0900
@@ -24,6 +24,9 @@
 #include <linux/nmi.h>
 #include <linux/dmi.h>
 
+#define PANIC_OUTPUT_BLINK	(1 << 0)
+#define PANIC_OUTPUT_BLEEP	(1 << 1)
+#define PANIC_OUTPUT_ESTRADE	(PANIC_OUTPUT_BLINK | PANIC_OUTPUT_BLEEP)
 #ifdef CONFIG_PANIC_LONGSPIN_TIMER
 #define PANIC_TIMER_STEP 240
 #define PANIC_BLINK_SPD 5
@@ -31,6 +34,7 @@
 #define PANIC_TIMER_STEP 1
 #define PANIC_BLINK_SPD 20
 #endif
+#define PANIC_BEEP_HZ 880
 
 int panic_on_oops;
 static unsigned long tainted_mask;
@@ -39,6 +43,7 @@
 static DEFINE_SPINLOCK(pause_on_oops_lock);
 
 int panic_timeout;
+static int panic_output = PANIC_OUTPUT_BLINK;
 
 ATOMIC_NOTIFIER_HEAD(panic_notifier_list);
 
@@ -53,6 +58,13 @@
 long (*panic_blink)(int state);
 EXPORT_SYMBOL(panic_blink);
 
+static void no_beep(int value)
+{
+}
+
+void (*panic_beep)(int value);
+EXPORT_SYMBOL(panic_beep);
+
 static long panic_blink_enter(long count)
 {
 	int len;
@@ -61,16 +73,24 @@
 	static int first = 1;
 	static long next_count;
 
+	if (!(panic_output & PANIC_OUTPUT_ESTRADE))
+		return 0;
 	len = 3600 / PANIC_BLINK_SPD;
 	if (!first && count - next_count < 0)
 		return 0;
 	if (state) {
-		delay += panic_blink(0);
+		if (panic_output & PANIC_OUTPUT_BLINK)
+			delay += panic_blink(0);
+		if (panic_output & PANIC_OUTPUT_BLEEP)
+			panic_beep(0);
 		state = 0;
 		if (first)
 			first = 0;
 	} else {
-		delay += panic_blink(1);
+		if (panic_output & PANIC_OUTPUT_BLINK)
+			delay += panic_blink(1);
+		if (panic_output & PANIC_OUTPUT_BLEEP)
+			panic_beep(PANIC_BEEP_HZ);
 		state = 1;
 	}
 	next_count = count + len;
@@ -129,6 +149,8 @@
 
 	if (!panic_blink)
 		panic_blink = no_blink;
+	if (!panic_beep)
+		panic_beep = no_beep;
 
 	if (panic_timeout > 0) {
 		/*
@@ -434,4 +456,11 @@
 #endif
 
 core_param(panic, panic_timeout, int, 0644);
+/*  "panic_output=0" disables the blinking as it caused problems with
+ *  certain console switches.
+ *
+ *  "panic_output | 1" does the show using kbd leds.
+ *  "panic_output | 2" throws in bleeping via panic_beep().
+ */
+core_param(panic_output, panic_output, int, 0644);
 core_param(pause_on_oops, pause_on_oops, int, 0644);
