diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/keyboard.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 056ebe84b81d..38de44b87506 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
@@ -988,7 +988,7 @@ static inline unsigned char getleds(void) | |||
988 | * interrupt routines for this thing allows us to easily mask | 988 | * interrupt routines for this thing allows us to easily mask |
989 | * this when we don't want any of the above to happen. | 989 | * this when we don't want any of the above to happen. |
990 | * This allows for easy and efficient race-condition prevention | 990 | * This allows for easy and efficient race-condition prevention |
991 | * for kbd_refresh_leds => input_event(dev, EV_LED, ...) => ... | 991 | * for kbd_start => input_event(dev, EV_LED, ...) => ... |
992 | */ | 992 | */ |
993 | 993 | ||
994 | static void kbd_bh(unsigned long dummy) | 994 | static void kbd_bh(unsigned long dummy) |
@@ -1011,23 +1011,6 @@ static void kbd_bh(unsigned long dummy) | |||
1011 | 1011 | ||
1012 | DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0); | 1012 | DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0); |
1013 | 1013 | ||
1014 | /* | ||
1015 | * This allows a newly plugged keyboard to pick the LED state. | ||
1016 | */ | ||
1017 | static void kbd_refresh_leds(struct input_handle *handle) | ||
1018 | { | ||
1019 | unsigned char leds = ledstate; | ||
1020 | |||
1021 | tasklet_disable(&keyboard_tasklet); | ||
1022 | if (leds != 0xff) { | ||
1023 | input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01)); | ||
1024 | input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02)); | ||
1025 | input_event(handle->dev, EV_LED, LED_CAPSL, !!(leds & 0x04)); | ||
1026 | input_sync(handle->dev); | ||
1027 | } | ||
1028 | tasklet_enable(&keyboard_tasklet); | ||
1029 | } | ||
1030 | |||
1031 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\ | 1014 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\ |
1032 | defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\ | 1015 | defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\ |
1033 | defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\ | 1016 | defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\ |
@@ -1307,7 +1290,6 @@ static struct input_handle *kbd_connect(struct input_handler *handler, | |||
1307 | handle->name = "kbd"; | 1290 | handle->name = "kbd"; |
1308 | 1291 | ||
1309 | input_open_device(handle); | 1292 | input_open_device(handle); |
1310 | kbd_refresh_leds(handle); | ||
1311 | 1293 | ||
1312 | return handle; | 1294 | return handle; |
1313 | } | 1295 | } |
@@ -1318,6 +1300,24 @@ static void kbd_disconnect(struct input_handle *handle) | |||
1318 | kfree(handle); | 1300 | kfree(handle); |
1319 | } | 1301 | } |
1320 | 1302 | ||
1303 | /* | ||
1304 | * Start keyboard handler on the new keyboard by refreshing LED state to | ||
1305 | * match the rest of the system. | ||
1306 | */ | ||
1307 | static void kbd_start(struct input_handle *handle) | ||
1308 | { | ||
1309 | unsigned char leds = ledstate; | ||
1310 | |||
1311 | tasklet_disable(&keyboard_tasklet); | ||
1312 | if (leds != 0xff) { | ||
1313 | input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01)); | ||
1314 | input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02)); | ||
1315 | input_event(handle->dev, EV_LED, LED_CAPSL, !!(leds & 0x04)); | ||
1316 | input_sync(handle->dev); | ||
1317 | } | ||
1318 | tasklet_enable(&keyboard_tasklet); | ||
1319 | } | ||
1320 | |||
1321 | static struct input_device_id kbd_ids[] = { | 1321 | static struct input_device_id kbd_ids[] = { |
1322 | { | 1322 | { |
1323 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT, | 1323 | .flags = INPUT_DEVICE_ID_MATCH_EVBIT, |
@@ -1338,6 +1338,7 @@ static struct input_handler kbd_handler = { | |||
1338 | .event = kbd_event, | 1338 | .event = kbd_event, |
1339 | .connect = kbd_connect, | 1339 | .connect = kbd_connect, |
1340 | .disconnect = kbd_disconnect, | 1340 | .disconnect = kbd_disconnect, |
1341 | .start = kbd_start, | ||
1341 | .name = "kbd", | 1342 | .name = "kbd", |
1342 | .id_table = kbd_ids, | 1343 | .id_table = kbd_ids, |
1343 | }; | 1344 | }; |