diff options
| author | Vojtech Pavlik <vojtech@suse.cz> | 2002-08-25 19:21:22 +0200 |
|---|---|---|
| committer | Vojtech Pavlik <vojtech@suse.cz> | 2002-08-25 19:21:22 +0200 |
| commit | 532c236e53d6e76b73dbb0b70b401a655e1daf07 (patch) | |
| tree | 35dc51f77e63961047eab014f9f88394657a3b16 /drivers/input | |
| parent | 46a704f660f681ba09847c1d2677c63f593ae21f (diff) | |
This (re)implements getkeycode/setkeycode, kbd_rate and kd_mksound
as functions interfacing to the input core. PC-Speaker handling is
moved to a separate file. Uinput is moved to a input/misc directory.
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/Config.help | 9 | ||||
| -rw-r--r-- | drivers/input/Config.in | 2 | ||||
| -rw-r--r-- | drivers/input/Makefile | 2 | ||||
| -rw-r--r-- | drivers/input/input.c | 5 | ||||
| -rw-r--r-- | drivers/input/keyboard/amikbd.c | 2 | ||||
| -rw-r--r-- | drivers/input/keyboard/atkbd.c | 2 | ||||
| -rw-r--r-- | drivers/input/keyboard/newtonkbd.c | 2 | ||||
| -rw-r--r-- | drivers/input/keyboard/sunkbd.c | 3 | ||||
| -rw-r--r-- | drivers/input/keyboard/xtkbd.c | 2 | ||||
| -rw-r--r-- | drivers/input/misc/Config.help | 28 | ||||
| -rw-r--r-- | drivers/input/misc/Config.in | 8 | ||||
| -rw-r--r-- | drivers/input/misc/Makefile | 12 | ||||
| -rw-r--r-- | drivers/input/misc/pcspkr.c | 94 | ||||
| -rw-r--r-- | drivers/input/misc/uinput.c (renamed from drivers/input/uinput.c) | 0 |
14 files changed, 157 insertions, 14 deletions
diff --git a/drivers/input/Config.help b/drivers/input/Config.help index 8ebdeaea24a7..2e3ff3acd8c9 100644 --- a/drivers/input/Config.help +++ b/drivers/input/Config.help @@ -88,12 +88,3 @@ CONFIG_INPUT_EVBUG inserted in and removed from the running kernel whenever you want). The module will be called joydev.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. - - 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 uinput.o. If you want to compile it as a - module, say M here and read <file:Documentation/modules.txt>. diff --git a/drivers/input/Config.in b/drivers/input/Config.in index f1c79594f041..0568cfd77e2d 100644 --- a/drivers/input/Config.in +++ b/drivers/input/Config.in @@ -22,7 +22,6 @@ if [ "$CONFIG_INPUT_TSDEV" != "n" ]; then fi dep_tristate ' Event interface' CONFIG_INPUT_EVDEV $CONFIG_INPUT dep_tristate ' Event debugging' CONFIG_INPUT_EVBUG $CONFIG_INPUT -dep_tristate ' User level driver support' CONFIG_INPUT_UINPUT $CONFIG_INPUT $CONFIG_EXPERIMENTAL comment 'Input I/O drivers' source drivers/input/gameport/Config.in @@ -34,6 +33,7 @@ if [ "$CONFIG_INPUT" != "n" ]; then source drivers/input/mouse/Config.in source drivers/input/joystick/Config.in source drivers/input/touchscreen/Config.in + source drivers/input/misc/Config.in fi endmenu diff --git a/drivers/input/Makefile b/drivers/input/Makefile index 64983696a66f..f7232ccdf1ec 100644 --- a/drivers/input/Makefile +++ b/drivers/input/Makefile @@ -15,12 +15,12 @@ obj-$(CONFIG_INPUT_EVDEV) += evdev.o obj-$(CONFIG_INPUT_TSDEV) += tsdev.o obj-$(CONFIG_INPUT_POWER) += power.o obj-$(CONFIG_INPUT_EVBUG) += evbug.o -obj-$(CONFIG_INPUT_UINPUT) += uinput.o obj-$(CONFIG_INPUT_KEYBOARD) += keyboard/ obj-$(CONFIG_INPUT_MOUSE) += mouse/ obj-$(CONFIG_INPUT_JOYSTICK) += joystick/ obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/ +obj-$(CONFIG_INPUT_MISC) += misc/ # The global Rules.make. diff --git a/drivers/input/input.c b/drivers/input/input.c index 0bd17fbd49fd..da4ed6e6dcf5 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -105,7 +105,7 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in change_bit(code, dev->key); - if (test_bit(EV_REP, dev->evbit) && value) { + if (test_bit(EV_REP, dev->evbit) && dev->rep[REP_PERIOD] && value) { dev->repeat_key = code; mod_timer(&dev->timer, jiffies + dev->rep[REP_DELAY]); } @@ -165,10 +165,9 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in case EV_SND: - if (code > SND_MAX || !test_bit(code, dev->sndbit) || !!test_bit(code, dev->snd) == value) + if (code > SND_MAX || !test_bit(code, dev->sndbit)) return; - change_bit(code, dev->snd); if (dev->event) dev->event(dev, type, code, value); break; diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c index c3ea9648ec59..d9db20739a26 100644 --- a/drivers/input/keyboard/amikbd.c +++ b/drivers/input/keyboard/amikbd.c @@ -114,6 +114,8 @@ static int __init amikbd_init(void) amikbd_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); amikbd_dev.keycode = amikbd_keycode; + amikbd_dev.keycodesize = sizeof(unsigned char); + amikbd_dev.keycodemax = ARRAY_SIZE(amikbd_keycode); for (i = 0; i < 0x78; i++) if (amikbd_keycode[i]) diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 479e0ab9fe5d..63ae062f92a6 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -470,6 +470,8 @@ static void atkbd_connect(struct serio *serio, struct serio_dev *dev) atkbd->serio = serio; atkbd->dev.keycode = atkbd->keycode; + atkbd->dev.keycodesize = sizeof(unsigned char); + atkbd->dev.keycodemax = ARRAY_SIZE(atkbd_set2_keycode); atkbd->dev.event = atkbd_event; atkbd->dev.private = atkbd; diff --git a/drivers/input/keyboard/newtonkbd.c b/drivers/input/keyboard/newtonkbd.c index 2c7fff08b1ab..11e08e58d9ac 100644 --- a/drivers/input/keyboard/newtonkbd.c +++ b/drivers/input/keyboard/newtonkbd.c @@ -94,6 +94,8 @@ void nkbd_connect(struct serio *serio, struct serio_dev *dev) nkbd->serio = serio; nkbd->dev.keycode = nkbd->keycode; + nkbd->dev.keycodesize = sizeof(unsigned char); + nkbd->dev.keycodemax = ARRAY_SIZE(nkbd_keycode); nkbd->dev.private = nkbd; serio->private = nkbd; diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c index 8e41f20ad590..4145d5a04ecb 100644 --- a/drivers/input/keyboard/sunkbd.c +++ b/drivers/input/keyboard/sunkbd.c @@ -245,6 +245,9 @@ static void sunkbd_connect(struct serio *serio, struct serio_dev *dev) sunkbd->tq.data = sunkbd; sunkbd->dev.keycode = sunkbd->keycode; + sunkbd->dev.keycodesize = sizeof(unsigned char); + sunkbd->dev.keycodemax = ARRAY_SIZE(sunkbd_keycode); + sunkbd->dev.event = sunkbd_event; sunkbd->dev.private = sunkbd; diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c index bcf4eb098fdf..57c6a06afba9 100644 --- a/drivers/input/keyboard/xtkbd.c +++ b/drivers/input/keyboard/xtkbd.c @@ -101,6 +101,8 @@ void xtkbd_connect(struct serio *serio, struct serio_dev *dev) xtkbd->serio = serio; xtkbd->dev.keycode = xtkbd->keycode; + xtkbd->dev.keycodesize = sizeof(unsigned char); + xtkbd->dev.keycodemax = ARRAY_SIZE(xtkbd_keycode); xtkbd->dev.private = xtkbd; serio->private = xtkbd; diff --git a/drivers/input/misc/Config.help b/drivers/input/misc/Config.help new file mode 100644 index 000000000000..8aa138cf520d --- /dev/null +++ b/drivers/input/misc/Config.help @@ -0,0 +1,28 @@ +CONFIG_INPUT_MISC + + Say Y here, and a list of miscellaneous input drivers will be displayed. + Everything that didn't fit into the other categories is here. 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_UINPUT + Say Y here if you want to support user level drivers for input + subsystem accessible under char device 10:223 - /dev/input/uinput. + + 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 uinput.o. If you want to compile it as a + module, say M here and read <file:Documentation/modules.txt>. diff --git a/drivers/input/misc/Config.in b/drivers/input/misc/Config.in new file mode 100644 index 000000000000..ac5ff787314b --- /dev/null +++ b/drivers/input/misc/Config.in @@ -0,0 +1,8 @@ +# +# Input misc drivers configuration +# + +bool 'Misc' CONFIG_INPUT_MISC + +dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC +dep_tristate ' User level driver support' CONFIG_INPUT_UINPUT $CONFIG_INPUT $CONFIG_INPUT_MISC diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile new file mode 100644 index 000000000000..9d8fc29e0ec4 --- /dev/null +++ b/drivers/input/misc/Makefile @@ -0,0 +1,12 @@ +# +# Makefile for the input misc drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o +obj-$(CONFIG_INPUT_UINPUT) += uinput.o + +# The global Rules.make. + +include $(TOPDIR)/Rules.make diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c new file mode 100644 index 000000000000..198fee230bdd --- /dev/null +++ b/drivers/input/misc/pcspkr.c @@ -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 --git a/drivers/input/uinput.c b/drivers/input/misc/uinput.c index dc72f6b2c493..dc72f6b2c493 100644 --- a/drivers/input/uinput.c +++ b/drivers/input/misc/uinput.c |
