diff options
Diffstat (limited to 'drivers/input/keyboard/atkbd.c')
-rw-r--r-- | drivers/input/keyboard/atkbd.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 73b530424729..de520386f13f 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -574,11 +574,22 @@ static void atkbd_event_work(struct work_struct *work) | |||
574 | 574 | ||
575 | mutex_lock(&atkbd->event_mutex); | 575 | mutex_lock(&atkbd->event_mutex); |
576 | 576 | ||
577 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) | 577 | if (!atkbd->enabled) { |
578 | atkbd_set_leds(atkbd); | 578 | /* |
579 | * Serio ports are resumed asynchronously so while driver core | ||
580 | * thinks that device is already fully operational in reality | ||
581 | * it may not be ready yet. In this case we need to keep | ||
582 | * rescheduling till reconnect completes. | ||
583 | */ | ||
584 | schedule_delayed_work(&atkbd->event_work, | ||
585 | msecs_to_jiffies(100)); | ||
586 | } else { | ||
587 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) | ||
588 | atkbd_set_leds(atkbd); | ||
579 | 589 | ||
580 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) | 590 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) |
581 | atkbd_set_repeat_rate(atkbd); | 591 | atkbd_set_repeat_rate(atkbd); |
592 | } | ||
582 | 593 | ||
583 | mutex_unlock(&atkbd->event_mutex); | 594 | mutex_unlock(&atkbd->event_mutex); |
584 | } | 595 | } |