[patch] input: Let newly connected keyboards pickup the LED state. [4/14]

Vojtech Pavlik
2003-02-12T10:52:55Z

ChangeSet@1.1007, 2003-02-12 10:35:04+01:00, zaitcev@redhat.com
input: Let newly connected keyboards pickup the LED state.

keyboard.c | 23 ++++++++++++++++++++---
1 files changed, 20 insertions(+), 3 deletions(-)

===================================================================

diff -Nru a/drivers/char/keyboard.c b/drivers/char/keyboard.c
--- a/drivers/char/keyboard.c Wed Feb 12 11:57:13 2003
+++ b/drivers/char/keyboard.c Wed Feb 12 11:57:13 2003
@@ -894,9 +894,9 @@
* Aside from timing (which isn't really that important for
* keyboard interrupts as they happen often), using the software
* interrupt routines for this thing allows us to easily mask
- * this when we don't want any of the above to happen. Not yet
- * used, but this allows for easy and efficient race-condition
- * prevention later on.
+ * this when we don't want any of the above to happen.
+ * This allows for easy and efficient race-condition prevention
+ * for kbd_refresh_leds => input_event(dev, EV_LED, ...) => ...
*/

static void kbd_bh(unsigned long dummy)
@@ -918,6 +918,22 @@

DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0);

+/*
+ * This allows a newly plugged keyboard to pick the LED state.
+ */
+void kbd_refresh_leds(struct input_handle *handle)
+{
+ unsigned char leds = ledstate;
+
+ tasklet_disable(&keyboard_tasklet);
+ if (leds != 0xff) {
+ input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01));
+ input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02));
+ input_event(handle->dev, EV_LED, LED_CAPSL, !!(leds & 0x04));
+ }
+ tasklet_enable(&keyboard_tasklet);
+}
+
#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64) || defined(CONFIG_PARISC)

static unsigned short x86_keycodes[256] =
@@ -1160,6 +1176,7 @@
handle->name = kbd_name;

input_open_device(handle);
+ kbd_refresh_leds(handle);

return handle;
}