Re: keyboard leds not restored after s2ram in 2.6.32-rc6-00166-g799dd75
From: Mikko Vinni <hidden>
Date: 2009-11-11 20:05:42
Also in:
linux-input
Hi, From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
quoted
my laptop shows the caps lock and scroll lock leds as being on after s2ram (and resume), even though they are off. If I press the caps lock key, the caps lock led stays on, the num lock led turns off, and the screen unlock screen warns about the caps lock being on.Thank you for the report. Could youplease tell me if the patch below fixes the problem?
Yes, it does. Thanks, now my HP-dv5 is happy. I did some tests suspending with the caps lock actually on, and it seems that in that case the user might still be confused (caps lock is on but led is off). At least on this machine this patch doesn't affect this theoretical problem either way (2.6.31 behaves similarly), so it is ok. Mikko
quoted hunk ↗ jump to hunk
Thanks! -- Dmitry Input: force LED reset on resume From: Dmitry Torokhov We should be sending EV_LED event down to drivers upon resume even in cases when in-kernel state of the LED is off since device could come up with some leds turned on. Reported-by: Mikko Vinni Signed-off-by: Dmitry Torokhov --- drivers/input/input.c | 29 ++++++++++++++++++----------- 1 files changed, 18 insertions(+), 11 deletions(-)diff --git a/drivers/input/input.c b/drivers/input/input.c index 61069b2..77b6efe 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c@@ -1298,17 +1298,24 @@ static int input_dev_uevent(struct device *device,struct kobj_uevent_env *env) return 0; } -#define INPUT_DO_TOGGLE(dev, type, bits, on) \ - do { \ - int i; \ - if (!test_bit(EV_##type, dev->evbit)) \ - break; \ - for (i = 0; i < type##_MAX; i++) { \ - if (!test_bit(i, dev->bits##bit) || \ - !test_bit(i, dev->bits)) \ - continue; \ - dev->event(dev, EV_##type, i, on); \ - } \ +#define INPUT_DO_TOGGLE(dev, type, bits, on) \ + do { \ + int i; \ + bool active; \ + \ + if (!test_bit(EV_##type, dev->evbit)) \ + break; \ + \ + for (i = 0; i < type##_MAX; i++) { \ + if (!test_bit(i, dev->bits##bit)) \ + continue; \ + \ + active = test_bit(i, dev->bits); \ + if (!active && !on) \ + continue; \ + \ + dev->event(dev, EV_##type, i, on ? active : 0); \ + } \ } while (0) #ifdef CONFIG_PM