]> git.neil.brown.name Git - history.git/commitdiff
input: Support for NEC PC-9800 beeper and support for Kana Lock LED.
authorOsamu Tomita <tomita@cinet.co.jp>
Wed, 12 Feb 2003 11:49:26 +0000 (12:49 +0100)
committerVojtech Pavlik <vojtech@suse.cz>
Wed, 12 Feb 2003 11:49:26 +0000 (12:49 +0100)
drivers/char/keyboard.c
drivers/input/misc/98spkr.c [new file with mode: 0644]
drivers/input/misc/Kconfig
drivers/input/misc/Makefile
include/linux/kbd_kern.h
include/linux/keyboard.h

index e388f305f524a77ca6690c8ebca6d87596074c39..ed453a23e4de9f9dea23e6b4793c1ebe0efe3e06 100644 (file)
@@ -48,21 +48,21 @@ extern void ctrl_alt_del(void);
  * Exported functions/variables
  */
 
-#ifndef KBD_DEFMODE
 #define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META))
-#endif
 
-#ifndef KBD_DEFLEDS
 /*
  * Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
- * This seems a good reason to start with NumLock off.
+ * This seems a good reason to start with NumLock off. On PC9800 however there
+ * is no NumLock key and everyone expects the keypad to be used for numbers.
  */
+
+#ifdef CONFIG_X86_PC9800
+#define KBD_DEFLEDS (1 << VC_NUMLOCK)
+#else
 #define KBD_DEFLEDS 0
 #endif
 
-#ifndef KBD_DEFLOCK
 #define KBD_DEFLOCK 0
-#endif
 
 void compute_shiftstate(void);
 
diff --git a/drivers/input/misc/98spkr.c b/drivers/input/misc/98spkr.c
new file mode 100644 (file)
index 0000000..d50ac2a
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ *  PC-9800 Speaker beeper driver for Linux
+ *
+ *  Copyright (c) 2002 Osamu Tomita
+ *  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("Osamu Tomita <tomita@cinet.co.jp>");
+MODULE_DESCRIPTION("PC-9800 Speaker beeper driver");
+MODULE_LICENSE("GPL");
+
+static char spkr98_name[] = "PC-9801 Speaker";
+static char spkr98_phys[] = "isa3fdb/input0";
+static struct input_dev spkr98_dev;
+
+spinlock_t i8253_beep_lock = SPIN_LOCK_UNLOCKED;
+
+static int spkr98_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 = CLOCK_TICK_RATE / value;
+       
+       spin_lock_irqsave(&i8253_beep_lock, flags);
+
+       if (count) {
+               outb(0x76, 0x3fdf);
+               outb(0, 0x5f);
+               outb(count & 0xff, 0x3fdb);
+               outb(0, 0x5f);
+               outb((count >> 8) & 0xff, 0x3fdb);
+               /* beep on */
+               outb(6, 0x37);
+       } else {
+               /* beep off */
+               outb(7, 0x37);
+       }
+
+       spin_unlock_irqrestore(&i8253_beep_lock, flags);
+
+       return 0;
+}
+
+static int __init spkr98_init(void)
+{
+       spkr98_dev.evbit[0] = BIT(EV_SND);
+       spkr98_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
+       spkr98_dev.event = spkr98_event;
+
+       spkr98_dev.name = spkr98_name;
+       spkr98_dev.phys = spkr98_phys;
+       spkr98_dev.id.bustype = BUS_ISA;
+       spkr98_dev.id.vendor = 0x001f;
+       spkr98_dev.id.product = 0x0001;
+       spkr98_dev.id.version = 0x0100;
+
+       input_register_device(&spkr98_dev);
+
+        printk(KERN_INFO "input: %s\n", spkr98_name);
+
+       return 0;
+}
+
+static void __exit spkr98_exit(void)
+{
+        input_unregister_device(&spkr98_dev);
+}
+
+module_init(spkr98_init);
+module_exit(spkr98_exit);
index 9f2772a32d697e13504b650f2fa9467ff747024d..6fb4451fec73c675c4cd6f20621b3635fd384375 100644 (file)
@@ -44,6 +44,10 @@ config INPUT_M68K_BEEP
        tristate "M68k Beeper support"
        depends on M68K && INPUT && INPUT_MISC
 
+config INPUT_98SPKR
+       tristate "PC-9800 Speaker support"
+       depends on X86_PC9800 && INPUT && INPUT_MISC
+
 config INPUT_UINPUT
        tristate "User level driver support"
        depends on INPUT && INPUT_MISC
index 908b5bb0f8979756d430c263e61a22bf2f8fb2c8..3dd91a1f968b08faa29ef2bf3f0fe621ebac8f72 100644 (file)
@@ -7,5 +7,6 @@
 obj-$(CONFIG_INPUT_SPARCSPKR)          += sparcspkr.o
 obj-$(CONFIG_INPUT_PCSPKR)             += pcspkr.o
 obj-$(CONFIG_INPUT_M68K_BEEP)          += m68kspkr.o
+obj-$(CONFIG_INPUT_98SPKR)             += 98spkr.o
 obj-$(CONFIG_INPUT_UINPUT)             += uinput.o
 obj-$(CONFIG_INPUT_GSC)                        += gsc_ps2.o
index 8e6d600dc5342aa3e2bfc7035dd3aa009e24bddc..7428198111eb1c1e914b38d21f1f6ee1a64e44db 100644 (file)
@@ -43,11 +43,12 @@ struct kbd_struct {
 #define LED_SHOW_IOCTL 1        /* only change leds upon ioctl */
 #define LED_SHOW_MEM 2          /* `heartbeat': peek into memory */
 
-       unsigned char ledflagstate:3;   /* flags, not lights */
-       unsigned char default_ledflagstate:3;
+       unsigned char ledflagstate:4;   /* flags, not lights */
+       unsigned char default_ledflagstate:4;
 #define VC_SCROLLOCK   0       /* scroll-lock mode */
 #define VC_NUMLOCK     1       /* numeric lock mode */
 #define VC_CAPSLOCK    2       /* capslock mode */
+#define VC_KANALOCK    3       /* kanalock mode */
 
        unsigned char kbdmode:2;        /* one 2-bit value */
 #define VC_XLATE       0       /* translate keycodes using keymap */
index 5bd97c23e72b8289d14f0b700df5658eb8f17768..a7fcf94e5a0dd01be84d0fdbe3d71259f4d4c31e 100644 (file)
@@ -9,6 +9,7 @@
 #define KG_ALT         3
 #define KG_ALTGR       1
 #define KG_SHIFTL      4
+#define KG_KANASHIFT   4
 #define KG_SHIFTR      5
 #define KG_CTRLL       6
 #define KG_CTRLR       7