]> git.neil.brown.name Git - history.git/commitdiff
input: Let newly connected keyboards pickup the LED state.
authorPete Zaitcev <zaitcev@redhat.com>
Wed, 12 Feb 2003 11:35:04 +0000 (12:35 +0100)
committerVojtech Pavlik <vojtech@suse.cz>
Wed, 12 Feb 2003 11:35:04 +0000 (12:35 +0100)
drivers/char/keyboard.c

index 855be974e7f184761febe5969add178dd709a3ce..aec9a2b74a288a1cc7cb15e263e3b6f23b4ac854 100644 (file)
@@ -894,9 +894,9 @@ static inline unsigned char getleds(void)
  * 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 @@ static void kbd_bh(unsigned long dummy)
 
 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 @@ static struct input_handle *kbd_connect(struct input_handler *handler,
        handle->name = kbd_name;
 
        input_open_device(handle);
+       kbd_refresh_leds(handle);
 
        return handle;
 }