summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorVojtech Pavlik <vojtech@suse.cz>2002-08-25 19:21:22 +0200
committerVojtech Pavlik <vojtech@suse.cz>2002-08-25 19:21:22 +0200
commit532c236e53d6e76b73dbb0b70b401a655e1daf07 (patch)
tree35dc51f77e63961047eab014f9f88394657a3b16 /drivers/input
parent46a704f660f681ba09847c1d2677c63f593ae21f (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.help9
-rw-r--r--drivers/input/Config.in2
-rw-r--r--drivers/input/Makefile2
-rw-r--r--drivers/input/input.c5
-rw-r--r--drivers/input/keyboard/amikbd.c2
-rw-r--r--drivers/input/keyboard/atkbd.c2
-rw-r--r--drivers/input/keyboard/newtonkbd.c2
-rw-r--r--drivers/input/keyboard/sunkbd.c3
-rw-r--r--drivers/input/keyboard/xtkbd.c2
-rw-r--r--drivers/input/misc/Config.help28
-rw-r--r--drivers/input/misc/Config.in8
-rw-r--r--drivers/input/misc/Makefile12
-rw-r--r--drivers/input/misc/pcspkr.c94
-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