* Re: PC speaker dead in 2.5.40?
2002-10-07 19:14 ` Vojtech Pavlik
@ 2002-10-07 9:46 ` Joseph Fannin
2002-10-07 10:27 ` PC speaker dead in 2.5.40? (resend) Joseph Fannin
2002-10-07 20:32 ` PC speaker dead in 2.5.40? Adrian Bunk
2 siblings, 0 replies; 9+ messages in thread
From: Joseph Fannin @ 2002-10-07 9:46 UTC (permalink / raw)
To: linux-kernel; +Cc: vojtech
[-- Attachment #1.1: Type: text/plain, Size: 833 bytes --]
On Mon, Oct 07, 2002 at 09:14:27PM +0200, Vojtech Pavlik wrote:
> On Mon, Oct 07, 2002 at 03:08:57AM -0400, Joseph Fannin wrote:
>
> > > Configuring a kernel with Sound support with either
> > > OSS or ALSA, I still get nothing from my PC speaker.
> > > Works fine under 2.4.18.
> >
> > Look under all the submenus in the Input section of
> > "menuconfig" for the speaker entry and enable it.
> >
> > There's a good technical reason why the speaker is an input
> > device, but hiding it in the menus is *bad*.
>
> Send me a patch that fixes this - if you know how.
Okay, find the attached patch against 2.5.40 which creates a new
"PC Speaker" submenu -- it's clearly labeled, and higher up on the
screen when running `make menuconfig`.
--
Joseph Fannin
jhf@rivenstone.net
[-- Attachment #1.2: pc-speaker.diff --]
[-- Type: text/plain, Size: 21241 bytes --]
diff -urN linux-2.5.40/drivers/input/Config.in linux-2.5.40-new/drivers/input/Config.in
--- linux-2.5.40/drivers/input/Config.in 2002-09-17 20:58:57.000000000 -0400
+++ linux-2.5.40-new/drivers/input/Config.in 2002-10-07 16:40:44.000000000 -0400
@@ -32,6 +32,7 @@
if [ "$CONFIG_INPUT" != "n" ]; then
source drivers/input/keyboard/Config.in
source drivers/input/mouse/Config.in
+ source drivers/input/speaker/Config.in
source drivers/input/joystick/Config.in
source drivers/input/touchscreen/Config.in
source drivers/input/misc/Config.in
diff -urN linux-2.5.40/drivers/input/Makefile linux-2.5.40-new/drivers/input/Makefile
--- linux-2.5.40/drivers/input/Makefile 2002-09-17 20:59:18.000000000 -0400
+++ linux-2.5.40-new/drivers/input/Makefile 2002-10-07 16:31:27.000000000 -0400
@@ -20,6 +20,7 @@
obj-$(CONFIG_INPUT_MOUSE) += mouse/
obj-$(CONFIG_INPUT_JOYSTICK) += joystick/
obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/
+obj-$(CONFIG_INPUT_SPEAKER) += speaker/
obj-$(CONFIG_INPUT_MISC) += misc/
# The global Rules.make.
diff -urN linux-2.5.40/drivers/input/misc/Config.help linux-2.5.40-new/drivers/input/misc/Config.help
--- linux-2.5.40/drivers/input/misc/Config.help 2002-09-17 20:59:20.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/Config.help 2002-10-07 16:35:52.000000000 -0400
@@ -6,29 +6,6 @@
If unsure, say Y.
-CONFIG_INPUT_PCSPKR
- Say Y here if you want the standard PC Speaker to be used for
- bells and whistles.
-
- If unsure, say Y.
-
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you want).
- The module will be called pcspkr.o. If you want to compile it as a
- module, say M here and read <file:Documentation/modules.txt>.
-
-CONFIG_INPUT_SPARCSPKR
- Say Y here if you want the standard Speaker on Sparc PCI systems
- to be used for bells and whistles.
-
- If unsure, say Y.
-
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you want).
- The module will be called pcspkr.o. If you want to compile it as a
- module, say M here and read <file:Documentation/modules.txt>.
-
-
CONFIG_INPUT_UINPUT
Say Y here if you want to support user level drivers for input
subsystem accessible under char device 10:223 - /dev/input/uinput.
diff -urN linux-2.5.40/drivers/input/misc/Config.in linux-2.5.40-new/drivers/input/misc/Config.in
--- linux-2.5.40/drivers/input/misc/Config.in 2002-09-17 20:59:04.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/Config.in 2002-10-07 16:37:15.000000000 -0400
@@ -4,8 +4,4 @@
bool 'Misc' CONFIG_INPUT_MISC
-dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC
-if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
- dep_tristate ' SPARC Speaker support' CONFIG_INPUT_SPARCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC
-fi
dep_tristate ' User level driver support' CONFIG_INPUT_UINPUT $CONFIG_INPUT $CONFIG_INPUT_MISC
diff -urN linux-2.5.40/drivers/input/misc/Makefile linux-2.5.40-new/drivers/input/misc/Makefile
--- linux-2.5.40/drivers/input/misc/Makefile 2002-09-17 20:59:00.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/Makefile 2002-10-07 16:36:04.000000000 -0400
@@ -4,8 +4,6 @@
# Each configuration option enables a list of files.
-obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
-obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_UINPUT) += uinput.o
# The global Rules.make.
diff -urN linux-2.5.40/drivers/input/misc/pcspkr.c linux-2.5.40-new/drivers/input/misc/pcspkr.c
--- linux-2.5.40/drivers/input/misc/pcspkr.c 2002-09-17 20:58:59.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/pcspkr.c 1969-12-31 19:00:00.000000000 -0500
@@ -1,94 +0,0 @@
-/*
- * PC Speaker beeper driver for Linux
- *
- * Copyright (c) 2002 Vojtech Pavlik
- * Copyright (c) 1992 Orest Zborowski
- *
- */
-
-/*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/input.h>
-#include <asm/io.h>
-
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
-MODULE_DESCRIPTION("PC Speaker beeper driver");
-MODULE_LICENSE("GPL");
-
-static char pcspkr_name[] = "PC Speaker";
-static char pcspkr_phys[] = "isa0061/input0";
-static struct input_dev pcspkr_dev;
-
-spinlock_t i8253_beep_lock = SPIN_LOCK_UNLOCKED;
-
-static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
-{
- unsigned int count = 0;
- unsigned long flags;
-
- if (type != EV_SND)
- return -1;
-
- switch (code) {
- case SND_BELL: if (value) value = 1000;
- case SND_TONE: break;
- default: return -1;
- }
-
- if (value > 20 && value < 32767)
- count = 1193182 / value;
-
- spin_lock_irqsave(&i8253_beep_lock, flags);
-
- if (count) {
- /* enable counter 2 */
- outb_p(inb_p(0x61) | 3, 0x61);
- /* 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);
- } else {
- /* disable counter 2 */
- outb(inb_p(0x61) & 0xFC, 0x61);
- }
-
- spin_unlock_irqrestore(&i8253_beep_lock, flags);
-
- return 0;
-}
-
-static int __init pcspkr_init(void)
-{
- pcspkr_dev.evbit[0] = BIT(EV_SND);
- pcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
- pcspkr_dev.event = pcspkr_event;
-
- pcspkr_dev.name = pcspkr_name;
- pcspkr_dev.phys = pcspkr_phys;
- pcspkr_dev.id.bustype = BUS_ISA;
- pcspkr_dev.id.vendor = 0x001f;
- pcspkr_dev.id.product = 0x0001;
- pcspkr_dev.id.version = 0x0100;
-
- input_register_device(&pcspkr_dev);
-
- printk(KERN_INFO "input: %s\n", pcspkr_name);
-
- return 0;
-}
-
-static void __exit pcspkr_exit(void)
-{
- input_unregister_device(&pcspkr_dev);
-}
-
-module_init(pcspkr_init);
-module_exit(pcspkr_exit);
diff -urN linux-2.5.40/drivers/input/misc/sparcspkr.c linux-2.5.40-new/drivers/input/misc/sparcspkr.c
--- linux-2.5.40/drivers/input/misc/sparcspkr.c 2002-09-17 20:58:55.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/sparcspkr.c 1969-12-31 19:00:00.000000000 -0500
@@ -1,189 +0,0 @@
-/*
- * Driver for PC-speaker like devices found on various Sparc systems.
- *
- * Copyright (c) 2002 Vojtech Pavlik
- * Copyright (c) 2002 David S. Miller (davem@redhat.com)
- */
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/input.h>
-
-#include <asm/io.h>
-#include <asm/ebus.h>
-#ifdef CONFIG_SPARC64
-#include <asm/isa.h>
-#endif
-
-MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
-MODULE_DESCRIPTION("PC Speaker beeper driver");
-MODULE_LICENSE("GPL");
-
-static unsigned long beep_iobase;
-
-static char *sparcspkr_isa_name = "Sparc ISA Speaker";
-static char *sparcspkr_ebus_name = "Sparc EBUS Speaker";
-static char *sparcspkr_phys = "sparc/input0";
-static struct input_dev sparcspkr_dev;
-
-spinlock_t beep_lock = SPIN_LOCK_UNLOCKED;
-
-static void __init init_sparcspkr_struct(void)
-{
- sparcspkr_dev.evbit[0] = BIT(EV_SND);
- sparcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
-
- sparcspkr_dev.phys = sparcspkr_phys;
- sparcspkr_dev.id.bustype = BUS_ISA;
- sparcspkr_dev.id.vendor = 0x001f;
- sparcspkr_dev.id.product = 0x0001;
- sparcspkr_dev.id.version = 0x0100;
-}
-
-static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
-{
- unsigned int count = 0;
- unsigned long flags;
-
- if (type != EV_SND)
- return -1;
-
- switch (code) {
- case SND_BELL: if (value) value = 1000;
- case SND_TONE: break;
- default: return -1;
- }
-
- if (value > 20 && value < 32767)
- count = 1193182 / value;
-
- spin_lock_irqsave(&beep_lock, flags);
-
- /* EBUS speaker only has on/off state, the frequency does not
- * appear to be programmable.
- */
- if (count) {
- if (beep_iobase & 0x2UL)
- outb(1, beep_iobase);
- else
- outl(1, beep_iobase);
- } else {
- if (beep_iobase & 0x2UL)
- outb(0, beep_iobase);
- else
- outl(0, beep_iobase);
- }
-
- spin_unlock_irqrestore(&beep_lock, flags);
-
- return 0;
-}
-
-static int __init init_ebus_beep(struct linux_ebus_device *edev)
-{
- beep_iobase = edev->resource[0].start;
-
- init_sparcspkr_struct();
-
- sparcspkr_dev.name = sparcspkr_ebus_name;
- sparcspkr_dev.event = ebus_spkr_event;
-
- input_register_device(&sparcspkr_dev);
-
- printk(KERN_INFO "input: %s\n", sparcspkr_ebus_name);
- return 0;
-}
-
-#ifdef CONFIG_SPARC64
-static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
-{
- unsigned int count = 0;
- unsigned long flags;
-
- if (type != EV_SND)
- return -1;
-
- switch (code) {
- case SND_BELL: if (value) value = 1000;
- case SND_TONE: break;
- default: return -1;
- }
-
- if (value > 20 && value < 32767)
- count = 1193182 / value;
-
- spin_lock_irqsave(&beep_lock, flags);
-
- if (count) {
- /* enable counter 2 */
- outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61);
- /* set command for counter 2, 2 byte write */
- outb(0xB6, beep_iobase + 0x43);
- /* select desired HZ */
- outb(count & 0xff, beep_iobase + 0x42);
- outb((count >> 8) & 0xff, beep_iobase + 0x42);
- } else {
- /* disable counter 2 */
- outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61);
- }
-
- spin_unlock_irqrestore(&beep_lock, flags);
-
- return 0;
-}
-
-static int __init init_isa_beep(struct isa_device *isa_dev)
-{
- beep_iobase = isa_dev->resource.start;
-
- init_sparcspkr_struct();
-
- sparcspkr_dev.name = sparcspkr_isa_name;
- sparcspkr_dev.event = isa_spkr_event;
- sparcspkr_dev.id.bustype = BUS_ISA;
-
- input_register_device(&sparcspkr_dev);
-
- printk(KERN_INFO "input: %s\n", sparcspkr_isa_name);
- return 0;
-}
-#endif
-
-static int __init sparcspkr_init(void)
-{
- struct linux_ebus *ebus;
- struct linux_ebus_device *edev = NULL;
-#ifdef CONFIG_SPARC64
- struct isa_bridge *isa_br;
- struct isa_device *isa_dev;
-#endif
-
- for_each_ebus(ebus) {
- for_each_ebusdev(edev, ebus) {
- if (!strcmp(edev->prom_name, "beep"))
- return init_ebus_beep(edev);
- }
- }
-#ifdef CONFIG_SPARC64
- for_each_isa(isa_br) {
- for_each_isadev(isa_dev, isa_br) {
- /* A hack, the beep device's base lives in
- * the DMA isa node.
- */
- if (!strcmp(isa_dev->prom_name, "dma"))
- return init_isa_beep(isa_dev);
- }
- }
-#endif
-
- return -ENODEV;
-}
-
-static void __exit sparcspkr_exit(void)
-{
- input_unregister_device(&sparcspkr_dev);
-}
-
-module_init(sparcspkr_init);
-module_exit(sparcspkr_exit);
diff -urN linux-2.5.40/drivers/input/speaker/Config.help linux-2.5.40-new/drivers/input/speaker/Config.help
--- linux-2.5.40/drivers/input/speaker/Config.help 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/Config.help 2002-10-07 16:35:20.000000000 -0400
@@ -0,0 +1,29 @@
+CONFIG_INPUT_SPEAKER
+ Say Y here, and a list available PC speaker drivers will be
+ displayed. These are not drivers for soundcards but for the
+ simple PC speaker "beeps". This option doesn't affect the kernel.
+
+ If unsure, say Y.
+
+CONFIG_INPUT_PCSPKR
+ Say Y here if you want the standard PC Speaker to be used for
+ bells and whistles.
+
+ If unsure, say Y.
+
+ This driver is also available as a module ( = code which can be
+ inserted in and removed from the running kernel whenever you want).
+ The module will be called pcspkr.o. If you want to compile it as a
+ module, say M here and read <file:Documentation/modules.txt>.
+
+CONFIG_INPUT_SPARCSPKR
+ Say Y here if you want the standard Speaker on Sparc PCI systems
+ to be used for bells and whistles.
+
+ If unsure, say Y.
+
+ This driver is also available as a module ( = code which can be
+ inserted in and removed from the running kernel whenever you want).
+ The module will be called pcspkr.o. If you want to compile it as a
+ module, say M here and read <file:Documentation/modules.txt>.
+
diff -urN linux-2.5.40/drivers/input/speaker/Config.in linux-2.5.40-new/drivers/input/speaker/Config.in
--- linux-2.5.40/drivers/input/speaker/Config.in 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/Config.in 2002-10-07 16:39:57.000000000 -0400
@@ -0,0 +1,11 @@
+#
+# Input misc drivers configuration
+#
+
+bool 'PC speakers' CONFIG_INPUT_SPEAKER
+
+dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_SPEAKER
+if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
+ dep_tristate ' SPARC Speaker support' CONFIG_INPUT_SPARCSPKR $CONFIG_INPUT $CONFIG_INPUT_SPEAKER
+fi
+
diff -urN linux-2.5.40/drivers/input/speaker/Makefile linux-2.5.40-new/drivers/input/speaker/Makefile
--- linux-2.5.40/drivers/input/speaker/Makefile 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/Makefile 2002-10-07 16:21:28.000000000 -0400
@@ -0,0 +1,12 @@
+#
+# Makefile for the input speaker drivers.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
+obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
+
+# The global Rules.make.
+
+include $(TOPDIR)/Rules.make
diff -urN linux-2.5.40/drivers/input/speaker/pcspkr.c linux-2.5.40-new/drivers/input/speaker/pcspkr.c
--- linux-2.5.40/drivers/input/speaker/pcspkr.c 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/pcspkr.c 2002-10-07 16:20:51.000000000 -0400
@@ -0,0 +1,94 @@
+/*
+ * PC Speaker beeper driver for Linux
+ *
+ * Copyright (c) 2002 Vojtech Pavlik
+ * Copyright (c) 1992 Orest Zborowski
+ *
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <asm/io.h>
+
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("PC Speaker beeper driver");
+MODULE_LICENSE("GPL");
+
+static char pcspkr_name[] = "PC Speaker";
+static char pcspkr_phys[] = "isa0061/input0";
+static struct input_dev pcspkr_dev;
+
+spinlock_t i8253_beep_lock = SPIN_LOCK_UNLOCKED;
+
+static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ unsigned int count = 0;
+ unsigned long flags;
+
+ if (type != EV_SND)
+ return -1;
+
+ switch (code) {
+ case SND_BELL: if (value) value = 1000;
+ case SND_TONE: break;
+ default: return -1;
+ }
+
+ if (value > 20 && value < 32767)
+ count = 1193182 / value;
+
+ spin_lock_irqsave(&i8253_beep_lock, flags);
+
+ if (count) {
+ /* enable counter 2 */
+ outb_p(inb_p(0x61) | 3, 0x61);
+ /* 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);
+ } else {
+ /* disable counter 2 */
+ outb(inb_p(0x61) & 0xFC, 0x61);
+ }
+
+ spin_unlock_irqrestore(&i8253_beep_lock, flags);
+
+ return 0;
+}
+
+static int __init pcspkr_init(void)
+{
+ pcspkr_dev.evbit[0] = BIT(EV_SND);
+ pcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
+ pcspkr_dev.event = pcspkr_event;
+
+ pcspkr_dev.name = pcspkr_name;
+ pcspkr_dev.phys = pcspkr_phys;
+ pcspkr_dev.id.bustype = BUS_ISA;
+ pcspkr_dev.id.vendor = 0x001f;
+ pcspkr_dev.id.product = 0x0001;
+ pcspkr_dev.id.version = 0x0100;
+
+ input_register_device(&pcspkr_dev);
+
+ printk(KERN_INFO "input: %s\n", pcspkr_name);
+
+ return 0;
+}
+
+static void __exit pcspkr_exit(void)
+{
+ input_unregister_device(&pcspkr_dev);
+}
+
+module_init(pcspkr_init);
+module_exit(pcspkr_exit);
diff -urN linux-2.5.40/drivers/input/speaker/sparcspkr.c linux-2.5.40-new/drivers/input/speaker/sparcspkr.c
--- linux-2.5.40/drivers/input/speaker/sparcspkr.c 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/sparcspkr.c 2002-10-07 16:20:51.000000000 -0400
@@ -0,0 +1,189 @@
+/*
+ * Driver for PC-speaker like devices found on various Sparc systems.
+ *
+ * Copyright (c) 2002 Vojtech Pavlik
+ * Copyright (c) 2002 David S. Miller (davem@redhat.com)
+ */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/input.h>
+
+#include <asm/io.h>
+#include <asm/ebus.h>
+#ifdef CONFIG_SPARC64
+#include <asm/isa.h>
+#endif
+
+MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
+MODULE_DESCRIPTION("PC Speaker beeper driver");
+MODULE_LICENSE("GPL");
+
+static unsigned long beep_iobase;
+
+static char *sparcspkr_isa_name = "Sparc ISA Speaker";
+static char *sparcspkr_ebus_name = "Sparc EBUS Speaker";
+static char *sparcspkr_phys = "sparc/input0";
+static struct input_dev sparcspkr_dev;
+
+spinlock_t beep_lock = SPIN_LOCK_UNLOCKED;
+
+static void __init init_sparcspkr_struct(void)
+{
+ sparcspkr_dev.evbit[0] = BIT(EV_SND);
+ sparcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
+
+ sparcspkr_dev.phys = sparcspkr_phys;
+ sparcspkr_dev.id.bustype = BUS_ISA;
+ sparcspkr_dev.id.vendor = 0x001f;
+ sparcspkr_dev.id.product = 0x0001;
+ sparcspkr_dev.id.version = 0x0100;
+}
+
+static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ unsigned int count = 0;
+ unsigned long flags;
+
+ if (type != EV_SND)
+ return -1;
+
+ switch (code) {
+ case SND_BELL: if (value) value = 1000;
+ case SND_TONE: break;
+ default: return -1;
+ }
+
+ if (value > 20 && value < 32767)
+ count = 1193182 / value;
+
+ spin_lock_irqsave(&beep_lock, flags);
+
+ /* EBUS speaker only has on/off state, the frequency does not
+ * appear to be programmable.
+ */
+ if (count) {
+ if (beep_iobase & 0x2UL)
+ outb(1, beep_iobase);
+ else
+ outl(1, beep_iobase);
+ } else {
+ if (beep_iobase & 0x2UL)
+ outb(0, beep_iobase);
+ else
+ outl(0, beep_iobase);
+ }
+
+ spin_unlock_irqrestore(&beep_lock, flags);
+
+ return 0;
+}
+
+static int __init init_ebus_beep(struct linux_ebus_device *edev)
+{
+ beep_iobase = edev->resource[0].start;
+
+ init_sparcspkr_struct();
+
+ sparcspkr_dev.name = sparcspkr_ebus_name;
+ sparcspkr_dev.event = ebus_spkr_event;
+
+ input_register_device(&sparcspkr_dev);
+
+ printk(KERN_INFO "input: %s\n", sparcspkr_ebus_name);
+ return 0;
+}
+
+#ifdef CONFIG_SPARC64
+static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ unsigned int count = 0;
+ unsigned long flags;
+
+ if (type != EV_SND)
+ return -1;
+
+ switch (code) {
+ case SND_BELL: if (value) value = 1000;
+ case SND_TONE: break;
+ default: return -1;
+ }
+
+ if (value > 20 && value < 32767)
+ count = 1193182 / value;
+
+ spin_lock_irqsave(&beep_lock, flags);
+
+ if (count) {
+ /* enable counter 2 */
+ outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61);
+ /* set command for counter 2, 2 byte write */
+ outb(0xB6, beep_iobase + 0x43);
+ /* select desired HZ */
+ outb(count & 0xff, beep_iobase + 0x42);
+ outb((count >> 8) & 0xff, beep_iobase + 0x42);
+ } else {
+ /* disable counter 2 */
+ outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61);
+ }
+
+ spin_unlock_irqrestore(&beep_lock, flags);
+
+ return 0;
+}
+
+static int __init init_isa_beep(struct isa_device *isa_dev)
+{
+ beep_iobase = isa_dev->resource.start;
+
+ init_sparcspkr_struct();
+
+ sparcspkr_dev.name = sparcspkr_isa_name;
+ sparcspkr_dev.event = isa_spkr_event;
+ sparcspkr_dev.id.bustype = BUS_ISA;
+
+ input_register_device(&sparcspkr_dev);
+
+ printk(KERN_INFO "input: %s\n", sparcspkr_isa_name);
+ return 0;
+}
+#endif
+
+static int __init sparcspkr_init(void)
+{
+ struct linux_ebus *ebus;
+ struct linux_ebus_device *edev = NULL;
+#ifdef CONFIG_SPARC64
+ struct isa_bridge *isa_br;
+ struct isa_device *isa_dev;
+#endif
+
+ for_each_ebus(ebus) {
+ for_each_ebusdev(edev, ebus) {
+ if (!strcmp(edev->prom_name, "beep"))
+ return init_ebus_beep(edev);
+ }
+ }
+#ifdef CONFIG_SPARC64
+ for_each_isa(isa_br) {
+ for_each_isadev(isa_dev, isa_br) {
+ /* A hack, the beep device's base lives in
+ * the DMA isa node.
+ */
+ if (!strcmp(isa_dev->prom_name, "dma"))
+ return init_isa_beep(isa_dev);
+ }
+ }
+#endif
+
+ return -ENODEV;
+}
+
+static void __exit sparcspkr_exit(void)
+{
+ input_unregister_device(&sparcspkr_dev);
+}
+
+module_init(sparcspkr_init);
+module_exit(sparcspkr_exit);
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: PC speaker dead in 2.5.40? (resend)
2002-10-07 19:14 ` Vojtech Pavlik
2002-10-07 9:46 ` Joseph Fannin
@ 2002-10-07 10:27 ` Joseph Fannin
2002-10-07 20:32 ` PC speaker dead in 2.5.40? Adrian Bunk
2 siblings, 0 replies; 9+ messages in thread
From: Joseph Fannin @ 2002-10-07 10:27 UTC (permalink / raw)
To: linux-kernel
[-- Attachment #1.1: Type: text/plain, Size: 952 bytes --]
On Mon, Oct 07, 2002 at 09:14:27PM +0200, Vojtech Pavlik wrote:
> On Mon, Oct 07, 2002 at 03:08:57AM -0400, Joseph Fannin wrote:
>
> > > Configuring a kernel with Sound support with either
> > > OSS or ALSA, I still get nothing from my PC speaker.
> > > Works fine under 2.4.18.
> >
> > Look under all the submenus in the Input section of
> > "menuconfig" for the speaker entry and enable it.
> >
> > There's a good technical reason why the speaker is an input
> > device, but hiding it in the menus is *bad*.
>
> Send me a patch that fixes this - if you know how.
Resend of this little patch -- vger didn't like the last one, I
think. This creates a new "PC Speaker" submenu -- it's clearly
marked and higher up on the "make menuconfig" screen rather than
hidden away under "misc".
--
Joseph Fannin
jhf@rivenstone.net
"Anyone who quotes me in their sig is an idiot." -- Rusty Russell.
[-- Attachment #1.2: pc-speaker.diff --]
[-- Type: text/plain, Size: 21241 bytes --]
diff -urN linux-2.5.40/drivers/input/Config.in linux-2.5.40-new/drivers/input/Config.in
--- linux-2.5.40/drivers/input/Config.in 2002-09-17 20:58:57.000000000 -0400
+++ linux-2.5.40-new/drivers/input/Config.in 2002-10-07 16:40:44.000000000 -0400
@@ -32,6 +32,7 @@
if [ "$CONFIG_INPUT" != "n" ]; then
source drivers/input/keyboard/Config.in
source drivers/input/mouse/Config.in
+ source drivers/input/speaker/Config.in
source drivers/input/joystick/Config.in
source drivers/input/touchscreen/Config.in
source drivers/input/misc/Config.in
diff -urN linux-2.5.40/drivers/input/Makefile linux-2.5.40-new/drivers/input/Makefile
--- linux-2.5.40/drivers/input/Makefile 2002-09-17 20:59:18.000000000 -0400
+++ linux-2.5.40-new/drivers/input/Makefile 2002-10-07 16:31:27.000000000 -0400
@@ -20,6 +20,7 @@
obj-$(CONFIG_INPUT_MOUSE) += mouse/
obj-$(CONFIG_INPUT_JOYSTICK) += joystick/
obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/
+obj-$(CONFIG_INPUT_SPEAKER) += speaker/
obj-$(CONFIG_INPUT_MISC) += misc/
# The global Rules.make.
diff -urN linux-2.5.40/drivers/input/misc/Config.help linux-2.5.40-new/drivers/input/misc/Config.help
--- linux-2.5.40/drivers/input/misc/Config.help 2002-09-17 20:59:20.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/Config.help 2002-10-07 16:35:52.000000000 -0400
@@ -6,29 +6,6 @@
If unsure, say Y.
-CONFIG_INPUT_PCSPKR
- Say Y here if you want the standard PC Speaker to be used for
- bells and whistles.
-
- If unsure, say Y.
-
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you want).
- The module will be called pcspkr.o. If you want to compile it as a
- module, say M here and read <file:Documentation/modules.txt>.
-
-CONFIG_INPUT_SPARCSPKR
- Say Y here if you want the standard Speaker on Sparc PCI systems
- to be used for bells and whistles.
-
- If unsure, say Y.
-
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you want).
- The module will be called pcspkr.o. If you want to compile it as a
- module, say M here and read <file:Documentation/modules.txt>.
-
-
CONFIG_INPUT_UINPUT
Say Y here if you want to support user level drivers for input
subsystem accessible under char device 10:223 - /dev/input/uinput.
diff -urN linux-2.5.40/drivers/input/misc/Config.in linux-2.5.40-new/drivers/input/misc/Config.in
--- linux-2.5.40/drivers/input/misc/Config.in 2002-09-17 20:59:04.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/Config.in 2002-10-07 16:37:15.000000000 -0400
@@ -4,8 +4,4 @@
bool 'Misc' CONFIG_INPUT_MISC
-dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC
-if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
- dep_tristate ' SPARC Speaker support' CONFIG_INPUT_SPARCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC
-fi
dep_tristate ' User level driver support' CONFIG_INPUT_UINPUT $CONFIG_INPUT $CONFIG_INPUT_MISC
diff -urN linux-2.5.40/drivers/input/misc/Makefile linux-2.5.40-new/drivers/input/misc/Makefile
--- linux-2.5.40/drivers/input/misc/Makefile 2002-09-17 20:59:00.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/Makefile 2002-10-07 16:36:04.000000000 -0400
@@ -4,8 +4,6 @@
# Each configuration option enables a list of files.
-obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
-obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_UINPUT) += uinput.o
# The global Rules.make.
diff -urN linux-2.5.40/drivers/input/misc/pcspkr.c linux-2.5.40-new/drivers/input/misc/pcspkr.c
--- linux-2.5.40/drivers/input/misc/pcspkr.c 2002-09-17 20:58:59.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/pcspkr.c 1969-12-31 19:00:00.000000000 -0500
@@ -1,94 +0,0 @@
-/*
- * PC Speaker beeper driver for Linux
- *
- * Copyright (c) 2002 Vojtech Pavlik
- * Copyright (c) 1992 Orest Zborowski
- *
- */
-
-/*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/input.h>
-#include <asm/io.h>
-
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
-MODULE_DESCRIPTION("PC Speaker beeper driver");
-MODULE_LICENSE("GPL");
-
-static char pcspkr_name[] = "PC Speaker";
-static char pcspkr_phys[] = "isa0061/input0";
-static struct input_dev pcspkr_dev;
-
-spinlock_t i8253_beep_lock = SPIN_LOCK_UNLOCKED;
-
-static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
-{
- unsigned int count = 0;
- unsigned long flags;
-
- if (type != EV_SND)
- return -1;
-
- switch (code) {
- case SND_BELL: if (value) value = 1000;
- case SND_TONE: break;
- default: return -1;
- }
-
- if (value > 20 && value < 32767)
- count = 1193182 / value;
-
- spin_lock_irqsave(&i8253_beep_lock, flags);
-
- if (count) {
- /* enable counter 2 */
- outb_p(inb_p(0x61) | 3, 0x61);
- /* 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);
- } else {
- /* disable counter 2 */
- outb(inb_p(0x61) & 0xFC, 0x61);
- }
-
- spin_unlock_irqrestore(&i8253_beep_lock, flags);
-
- return 0;
-}
-
-static int __init pcspkr_init(void)
-{
- pcspkr_dev.evbit[0] = BIT(EV_SND);
- pcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
- pcspkr_dev.event = pcspkr_event;
-
- pcspkr_dev.name = pcspkr_name;
- pcspkr_dev.phys = pcspkr_phys;
- pcspkr_dev.id.bustype = BUS_ISA;
- pcspkr_dev.id.vendor = 0x001f;
- pcspkr_dev.id.product = 0x0001;
- pcspkr_dev.id.version = 0x0100;
-
- input_register_device(&pcspkr_dev);
-
- printk(KERN_INFO "input: %s\n", pcspkr_name);
-
- return 0;
-}
-
-static void __exit pcspkr_exit(void)
-{
- input_unregister_device(&pcspkr_dev);
-}
-
-module_init(pcspkr_init);
-module_exit(pcspkr_exit);
diff -urN linux-2.5.40/drivers/input/misc/sparcspkr.c linux-2.5.40-new/drivers/input/misc/sparcspkr.c
--- linux-2.5.40/drivers/input/misc/sparcspkr.c 2002-09-17 20:58:55.000000000 -0400
+++ linux-2.5.40-new/drivers/input/misc/sparcspkr.c 1969-12-31 19:00:00.000000000 -0500
@@ -1,189 +0,0 @@
-/*
- * Driver for PC-speaker like devices found on various Sparc systems.
- *
- * Copyright (c) 2002 Vojtech Pavlik
- * Copyright (c) 2002 David S. Miller (davem@redhat.com)
- */
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/input.h>
-
-#include <asm/io.h>
-#include <asm/ebus.h>
-#ifdef CONFIG_SPARC64
-#include <asm/isa.h>
-#endif
-
-MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
-MODULE_DESCRIPTION("PC Speaker beeper driver");
-MODULE_LICENSE("GPL");
-
-static unsigned long beep_iobase;
-
-static char *sparcspkr_isa_name = "Sparc ISA Speaker";
-static char *sparcspkr_ebus_name = "Sparc EBUS Speaker";
-static char *sparcspkr_phys = "sparc/input0";
-static struct input_dev sparcspkr_dev;
-
-spinlock_t beep_lock = SPIN_LOCK_UNLOCKED;
-
-static void __init init_sparcspkr_struct(void)
-{
- sparcspkr_dev.evbit[0] = BIT(EV_SND);
- sparcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
-
- sparcspkr_dev.phys = sparcspkr_phys;
- sparcspkr_dev.id.bustype = BUS_ISA;
- sparcspkr_dev.id.vendor = 0x001f;
- sparcspkr_dev.id.product = 0x0001;
- sparcspkr_dev.id.version = 0x0100;
-}
-
-static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
-{
- unsigned int count = 0;
- unsigned long flags;
-
- if (type != EV_SND)
- return -1;
-
- switch (code) {
- case SND_BELL: if (value) value = 1000;
- case SND_TONE: break;
- default: return -1;
- }
-
- if (value > 20 && value < 32767)
- count = 1193182 / value;
-
- spin_lock_irqsave(&beep_lock, flags);
-
- /* EBUS speaker only has on/off state, the frequency does not
- * appear to be programmable.
- */
- if (count) {
- if (beep_iobase & 0x2UL)
- outb(1, beep_iobase);
- else
- outl(1, beep_iobase);
- } else {
- if (beep_iobase & 0x2UL)
- outb(0, beep_iobase);
- else
- outl(0, beep_iobase);
- }
-
- spin_unlock_irqrestore(&beep_lock, flags);
-
- return 0;
-}
-
-static int __init init_ebus_beep(struct linux_ebus_device *edev)
-{
- beep_iobase = edev->resource[0].start;
-
- init_sparcspkr_struct();
-
- sparcspkr_dev.name = sparcspkr_ebus_name;
- sparcspkr_dev.event = ebus_spkr_event;
-
- input_register_device(&sparcspkr_dev);
-
- printk(KERN_INFO "input: %s\n", sparcspkr_ebus_name);
- return 0;
-}
-
-#ifdef CONFIG_SPARC64
-static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
-{
- unsigned int count = 0;
- unsigned long flags;
-
- if (type != EV_SND)
- return -1;
-
- switch (code) {
- case SND_BELL: if (value) value = 1000;
- case SND_TONE: break;
- default: return -1;
- }
-
- if (value > 20 && value < 32767)
- count = 1193182 / value;
-
- spin_lock_irqsave(&beep_lock, flags);
-
- if (count) {
- /* enable counter 2 */
- outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61);
- /* set command for counter 2, 2 byte write */
- outb(0xB6, beep_iobase + 0x43);
- /* select desired HZ */
- outb(count & 0xff, beep_iobase + 0x42);
- outb((count >> 8) & 0xff, beep_iobase + 0x42);
- } else {
- /* disable counter 2 */
- outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61);
- }
-
- spin_unlock_irqrestore(&beep_lock, flags);
-
- return 0;
-}
-
-static int __init init_isa_beep(struct isa_device *isa_dev)
-{
- beep_iobase = isa_dev->resource.start;
-
- init_sparcspkr_struct();
-
- sparcspkr_dev.name = sparcspkr_isa_name;
- sparcspkr_dev.event = isa_spkr_event;
- sparcspkr_dev.id.bustype = BUS_ISA;
-
- input_register_device(&sparcspkr_dev);
-
- printk(KERN_INFO "input: %s\n", sparcspkr_isa_name);
- return 0;
-}
-#endif
-
-static int __init sparcspkr_init(void)
-{
- struct linux_ebus *ebus;
- struct linux_ebus_device *edev = NULL;
-#ifdef CONFIG_SPARC64
- struct isa_bridge *isa_br;
- struct isa_device *isa_dev;
-#endif
-
- for_each_ebus(ebus) {
- for_each_ebusdev(edev, ebus) {
- if (!strcmp(edev->prom_name, "beep"))
- return init_ebus_beep(edev);
- }
- }
-#ifdef CONFIG_SPARC64
- for_each_isa(isa_br) {
- for_each_isadev(isa_dev, isa_br) {
- /* A hack, the beep device's base lives in
- * the DMA isa node.
- */
- if (!strcmp(isa_dev->prom_name, "dma"))
- return init_isa_beep(isa_dev);
- }
- }
-#endif
-
- return -ENODEV;
-}
-
-static void __exit sparcspkr_exit(void)
-{
- input_unregister_device(&sparcspkr_dev);
-}
-
-module_init(sparcspkr_init);
-module_exit(sparcspkr_exit);
diff -urN linux-2.5.40/drivers/input/speaker/Config.help linux-2.5.40-new/drivers/input/speaker/Config.help
--- linux-2.5.40/drivers/input/speaker/Config.help 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/Config.help 2002-10-07 16:35:20.000000000 -0400
@@ -0,0 +1,29 @@
+CONFIG_INPUT_SPEAKER
+ Say Y here, and a list available PC speaker drivers will be
+ displayed. These are not drivers for soundcards but for the
+ simple PC speaker "beeps". This option doesn't affect the kernel.
+
+ If unsure, say Y.
+
+CONFIG_INPUT_PCSPKR
+ Say Y here if you want the standard PC Speaker to be used for
+ bells and whistles.
+
+ If unsure, say Y.
+
+ This driver is also available as a module ( = code which can be
+ inserted in and removed from the running kernel whenever you want).
+ The module will be called pcspkr.o. If you want to compile it as a
+ module, say M here and read <file:Documentation/modules.txt>.
+
+CONFIG_INPUT_SPARCSPKR
+ Say Y here if you want the standard Speaker on Sparc PCI systems
+ to be used for bells and whistles.
+
+ If unsure, say Y.
+
+ This driver is also available as a module ( = code which can be
+ inserted in and removed from the running kernel whenever you want).
+ The module will be called pcspkr.o. If you want to compile it as a
+ module, say M here and read <file:Documentation/modules.txt>.
+
diff -urN linux-2.5.40/drivers/input/speaker/Config.in linux-2.5.40-new/drivers/input/speaker/Config.in
--- linux-2.5.40/drivers/input/speaker/Config.in 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/Config.in 2002-10-07 16:39:57.000000000 -0400
@@ -0,0 +1,11 @@
+#
+# Input misc drivers configuration
+#
+
+bool 'PC speakers' CONFIG_INPUT_SPEAKER
+
+dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_SPEAKER
+if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
+ dep_tristate ' SPARC Speaker support' CONFIG_INPUT_SPARCSPKR $CONFIG_INPUT $CONFIG_INPUT_SPEAKER
+fi
+
diff -urN linux-2.5.40/drivers/input/speaker/Makefile linux-2.5.40-new/drivers/input/speaker/Makefile
--- linux-2.5.40/drivers/input/speaker/Makefile 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/Makefile 2002-10-07 16:21:28.000000000 -0400
@@ -0,0 +1,12 @@
+#
+# Makefile for the input speaker drivers.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
+obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
+
+# The global Rules.make.
+
+include $(TOPDIR)/Rules.make
diff -urN linux-2.5.40/drivers/input/speaker/pcspkr.c linux-2.5.40-new/drivers/input/speaker/pcspkr.c
--- linux-2.5.40/drivers/input/speaker/pcspkr.c 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/pcspkr.c 2002-10-07 16:20:51.000000000 -0400
@@ -0,0 +1,94 @@
+/*
+ * PC Speaker beeper driver for Linux
+ *
+ * Copyright (c) 2002 Vojtech Pavlik
+ * Copyright (c) 1992 Orest Zborowski
+ *
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <asm/io.h>
+
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("PC Speaker beeper driver");
+MODULE_LICENSE("GPL");
+
+static char pcspkr_name[] = "PC Speaker";
+static char pcspkr_phys[] = "isa0061/input0";
+static struct input_dev pcspkr_dev;
+
+spinlock_t i8253_beep_lock = SPIN_LOCK_UNLOCKED;
+
+static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ unsigned int count = 0;
+ unsigned long flags;
+
+ if (type != EV_SND)
+ return -1;
+
+ switch (code) {
+ case SND_BELL: if (value) value = 1000;
+ case SND_TONE: break;
+ default: return -1;
+ }
+
+ if (value > 20 && value < 32767)
+ count = 1193182 / value;
+
+ spin_lock_irqsave(&i8253_beep_lock, flags);
+
+ if (count) {
+ /* enable counter 2 */
+ outb_p(inb_p(0x61) | 3, 0x61);
+ /* 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);
+ } else {
+ /* disable counter 2 */
+ outb(inb_p(0x61) & 0xFC, 0x61);
+ }
+
+ spin_unlock_irqrestore(&i8253_beep_lock, flags);
+
+ return 0;
+}
+
+static int __init pcspkr_init(void)
+{
+ pcspkr_dev.evbit[0] = BIT(EV_SND);
+ pcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
+ pcspkr_dev.event = pcspkr_event;
+
+ pcspkr_dev.name = pcspkr_name;
+ pcspkr_dev.phys = pcspkr_phys;
+ pcspkr_dev.id.bustype = BUS_ISA;
+ pcspkr_dev.id.vendor = 0x001f;
+ pcspkr_dev.id.product = 0x0001;
+ pcspkr_dev.id.version = 0x0100;
+
+ input_register_device(&pcspkr_dev);
+
+ printk(KERN_INFO "input: %s\n", pcspkr_name);
+
+ return 0;
+}
+
+static void __exit pcspkr_exit(void)
+{
+ input_unregister_device(&pcspkr_dev);
+}
+
+module_init(pcspkr_init);
+module_exit(pcspkr_exit);
diff -urN linux-2.5.40/drivers/input/speaker/sparcspkr.c linux-2.5.40-new/drivers/input/speaker/sparcspkr.c
--- linux-2.5.40/drivers/input/speaker/sparcspkr.c 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.40-new/drivers/input/speaker/sparcspkr.c 2002-10-07 16:20:51.000000000 -0400
@@ -0,0 +1,189 @@
+/*
+ * Driver for PC-speaker like devices found on various Sparc systems.
+ *
+ * Copyright (c) 2002 Vojtech Pavlik
+ * Copyright (c) 2002 David S. Miller (davem@redhat.com)
+ */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/input.h>
+
+#include <asm/io.h>
+#include <asm/ebus.h>
+#ifdef CONFIG_SPARC64
+#include <asm/isa.h>
+#endif
+
+MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
+MODULE_DESCRIPTION("PC Speaker beeper driver");
+MODULE_LICENSE("GPL");
+
+static unsigned long beep_iobase;
+
+static char *sparcspkr_isa_name = "Sparc ISA Speaker";
+static char *sparcspkr_ebus_name = "Sparc EBUS Speaker";
+static char *sparcspkr_phys = "sparc/input0";
+static struct input_dev sparcspkr_dev;
+
+spinlock_t beep_lock = SPIN_LOCK_UNLOCKED;
+
+static void __init init_sparcspkr_struct(void)
+{
+ sparcspkr_dev.evbit[0] = BIT(EV_SND);
+ sparcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
+
+ sparcspkr_dev.phys = sparcspkr_phys;
+ sparcspkr_dev.id.bustype = BUS_ISA;
+ sparcspkr_dev.id.vendor = 0x001f;
+ sparcspkr_dev.id.product = 0x0001;
+ sparcspkr_dev.id.version = 0x0100;
+}
+
+static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ unsigned int count = 0;
+ unsigned long flags;
+
+ if (type != EV_SND)
+ return -1;
+
+ switch (code) {
+ case SND_BELL: if (value) value = 1000;
+ case SND_TONE: break;
+ default: return -1;
+ }
+
+ if (value > 20 && value < 32767)
+ count = 1193182 / value;
+
+ spin_lock_irqsave(&beep_lock, flags);
+
+ /* EBUS speaker only has on/off state, the frequency does not
+ * appear to be programmable.
+ */
+ if (count) {
+ if (beep_iobase & 0x2UL)
+ outb(1, beep_iobase);
+ else
+ outl(1, beep_iobase);
+ } else {
+ if (beep_iobase & 0x2UL)
+ outb(0, beep_iobase);
+ else
+ outl(0, beep_iobase);
+ }
+
+ spin_unlock_irqrestore(&beep_lock, flags);
+
+ return 0;
+}
+
+static int __init init_ebus_beep(struct linux_ebus_device *edev)
+{
+ beep_iobase = edev->resource[0].start;
+
+ init_sparcspkr_struct();
+
+ sparcspkr_dev.name = sparcspkr_ebus_name;
+ sparcspkr_dev.event = ebus_spkr_event;
+
+ input_register_device(&sparcspkr_dev);
+
+ printk(KERN_INFO "input: %s\n", sparcspkr_ebus_name);
+ return 0;
+}
+
+#ifdef CONFIG_SPARC64
+static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+{
+ unsigned int count = 0;
+ unsigned long flags;
+
+ if (type != EV_SND)
+ return -1;
+
+ switch (code) {
+ case SND_BELL: if (value) value = 1000;
+ case SND_TONE: break;
+ default: return -1;
+ }
+
+ if (value > 20 && value < 32767)
+ count = 1193182 / value;
+
+ spin_lock_irqsave(&beep_lock, flags);
+
+ if (count) {
+ /* enable counter 2 */
+ outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61);
+ /* set command for counter 2, 2 byte write */
+ outb(0xB6, beep_iobase + 0x43);
+ /* select desired HZ */
+ outb(count & 0xff, beep_iobase + 0x42);
+ outb((count >> 8) & 0xff, beep_iobase + 0x42);
+ } else {
+ /* disable counter 2 */
+ outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61);
+ }
+
+ spin_unlock_irqrestore(&beep_lock, flags);
+
+ return 0;
+}
+
+static int __init init_isa_beep(struct isa_device *isa_dev)
+{
+ beep_iobase = isa_dev->resource.start;
+
+ init_sparcspkr_struct();
+
+ sparcspkr_dev.name = sparcspkr_isa_name;
+ sparcspkr_dev.event = isa_spkr_event;
+ sparcspkr_dev.id.bustype = BUS_ISA;
+
+ input_register_device(&sparcspkr_dev);
+
+ printk(KERN_INFO "input: %s\n", sparcspkr_isa_name);
+ return 0;
+}
+#endif
+
+static int __init sparcspkr_init(void)
+{
+ struct linux_ebus *ebus;
+ struct linux_ebus_device *edev = NULL;
+#ifdef CONFIG_SPARC64
+ struct isa_bridge *isa_br;
+ struct isa_device *isa_dev;
+#endif
+
+ for_each_ebus(ebus) {
+ for_each_ebusdev(edev, ebus) {
+ if (!strcmp(edev->prom_name, "beep"))
+ return init_ebus_beep(edev);
+ }
+ }
+#ifdef CONFIG_SPARC64
+ for_each_isa(isa_br) {
+ for_each_isadev(isa_dev, isa_br) {
+ /* A hack, the beep device's base lives in
+ * the DMA isa node.
+ */
+ if (!strcmp(isa_dev->prom_name, "dma"))
+ return init_isa_beep(isa_dev);
+ }
+ }
+#endif
+
+ return -ENODEV;
+}
+
+static void __exit sparcspkr_exit(void)
+{
+ input_unregister_device(&sparcspkr_dev);
+}
+
+module_init(sparcspkr_init);
+module_exit(sparcspkr_exit);
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: PC speaker dead in 2.5.40?
2002-10-07 19:14 ` Vojtech Pavlik
2002-10-07 9:46 ` Joseph Fannin
2002-10-07 10:27 ` PC speaker dead in 2.5.40? (resend) Joseph Fannin
@ 2002-10-07 20:32 ` Adrian Bunk
2002-10-07 20:58 ` Chris Friesen
2 siblings, 1 reply; 9+ messages in thread
From: Adrian Bunk @ 2002-10-07 20:32 UTC (permalink / raw)
To: Vojtech Pavlik; +Cc: linux-kernel
On Mon, 7 Oct 2002, Vojtech Pavlik wrote:
> On Mon, Oct 07, 2002 at 03:08:57AM -0400, Joseph Fannin wrote:
>...
> > There's a good technical reason why the speaker is an input
> > device, but hiding it in the menus is *bad*.
>
> Send me a patch that fixes this - if you know how.
IMHO the problem istn't to make a patch, it's more a "policy" question:
The problem is that from the point of view of a _user_ it's quite
surprising to see the speaker support at the input devices - and if the
speaker doesn't work you wouldn't search for an option under "Input device
support". From a programmers point of view "Input device support" might be
the best place but it will produce much confusion among many users. Is it
perhaps possible to move the speaker support to "Character devices"?
TIA
Adrian
--
You only think this is a free country. Like the US the UK spends a lot of
time explaining its a free country because its a police state.
Alan Cox
^ permalink raw reply [flat|nested] 9+ messages in thread