From: jhf@rivenstone.net (Joseph Fannin)
To: linux-kernel@vger.kernel.org
Subject: Re: PC speaker dead in 2.5.40? (resend)
Date: Mon, 7 Oct 2002 06:27:41 -0400 [thread overview]
Message-ID: <20021007102739.GA4342@rivenstone.net> (raw)
In-Reply-To: <20021007211427.A833@ucw.cz>
[-- 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 --]
next prev parent reply other threads:[~2002-10-07 22:11 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-07 16:58 PC speaker dead in 2.5.40? Steve Dover
2002-10-07 7:08 ` Joseph Fannin
2002-10-07 19:14 ` Vojtech Pavlik
2002-10-07 9:46 ` Joseph Fannin
2002-10-07 10:27 ` Joseph Fannin [this message]
2002-10-07 20:32 ` Adrian Bunk
2002-10-07 20:58 ` Chris Friesen
2002-10-07 16:45 ` Rob Landley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20021007102739.GA4342@rivenstone.net \
--to=jhf@rivenstone.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.