diff options
author | Dexuan Cui <decui@microsoft.com> | 2014-08-06 16:33:54 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-08-06 17:10:06 -0400 |
commit | 62238f3aadc9bc56da70100e19ec61b9f8d72a5f (patch) | |
tree | bca445a27b9a4f75d53fbafc7f145278b3328e4c | |
parent | e179d5fa8d6dd0df62bc7ba2a6ee777f7d1142b5 (diff) |
Input: hyperv-keyboard - register as a wakeup source
With this patch, we can press a key to wake up the VM after the VM executes
"echo freeze > /sys/power/state".
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r-- | drivers/input/serio/hyperv-keyboard.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/input/serio/hyperv-keyboard.c b/drivers/input/serio/hyperv-keyboard.c index 613261994621..e74e5d6e5f9f 100644 --- a/drivers/input/serio/hyperv-keyboard.c +++ b/drivers/input/serio/hyperv-keyboard.c | |||
@@ -170,6 +170,15 @@ static void hv_kbd_on_receive(struct hv_device *hv_dev, | |||
170 | serio_interrupt(kbd_dev->hv_serio, scan_code, 0); | 170 | serio_interrupt(kbd_dev->hv_serio, scan_code, 0); |
171 | } | 171 | } |
172 | spin_unlock_irqrestore(&kbd_dev->lock, flags); | 172 | spin_unlock_irqrestore(&kbd_dev->lock, flags); |
173 | |||
174 | /* | ||
175 | * Only trigger a wakeup on key down, otherwise | ||
176 | * "echo freeze > /sys/power/state" can't really enter the | ||
177 | * state because the Enter-UP can trigger a wakeup at once. | ||
178 | */ | ||
179 | if (!(info & IS_BREAK)) | ||
180 | pm_wakeup_event(&hv_dev->device, 0); | ||
181 | |||
173 | break; | 182 | break; |
174 | 183 | ||
175 | default: | 184 | default: |
@@ -376,6 +385,9 @@ static int hv_kbd_probe(struct hv_device *hv_dev, | |||
376 | goto err_close_vmbus; | 385 | goto err_close_vmbus; |
377 | 386 | ||
378 | serio_register_port(kbd_dev->hv_serio); | 387 | serio_register_port(kbd_dev->hv_serio); |
388 | |||
389 | device_init_wakeup(&hv_dev->device, true); | ||
390 | |||
379 | return 0; | 391 | return 0; |
380 | 392 | ||
381 | err_close_vmbus: | 393 | err_close_vmbus: |
@@ -390,6 +402,7 @@ static int hv_kbd_remove(struct hv_device *hv_dev) | |||
390 | { | 402 | { |
391 | struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev); | 403 | struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev); |
392 | 404 | ||
405 | device_init_wakeup(&hv_dev->device, false); | ||
393 | serio_unregister_port(kbd_dev->hv_serio); | 406 | serio_unregister_port(kbd_dev->hv_serio); |
394 | vmbus_close(hv_dev->channel); | 407 | vmbus_close(hv_dev->channel); |
395 | kfree(kbd_dev); | 408 | kfree(kbd_dev); |