Messages in this thread Patch in this message | | | Date | Mon, 7 Oct 2002 06:27:41 -0400 | Subject | Re: PC speaker dead in 2.5.40? (resend) | From | (Joseph Fannin) |
| |
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. 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);[unhandled content-type:application/pgp-signature] | |