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); |
