aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorFrans Pop <elendil@planet.nl>2009-03-04 14:55:28 -0500
committerLen Brown <len.brown@intel.com>2009-03-15 23:45:28 -0400
commit4c395bdd3f2ca8f7e8efad881e16071182c3b8ca (patch)
treea4fa0cc0a856b8d49e8eb4f889398fbd90087ead /drivers/platform
parent326d8519fc97be186c55ac605c3a7c957c758ae1 (diff)
hp-wmi: notify of a potential docking state change on resume
It is possible that the system gets docked or undocked while it's suspended. Generate an input event on resume to notify user space if there was a state change. As it is a switch, we can generate the event unconditionally; the input layer will only pass it on if there is an actual change. Signed-off-by: Frans Pop <elendil@planet.nl> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/hp-wmi.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
index f41135f2fb29..50d9019de2be 100644
--- a/drivers/platform/x86/hp-wmi.c
+++ b/drivers/platform/x86/hp-wmi.c
@@ -53,6 +53,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
53 53
54static int __init hp_wmi_bios_setup(struct platform_device *device); 54static int __init hp_wmi_bios_setup(struct platform_device *device);
55static int __exit hp_wmi_bios_remove(struct platform_device *device); 55static int __exit hp_wmi_bios_remove(struct platform_device *device);
56static int hp_wmi_resume_handler(struct platform_device *device);
56 57
57struct bios_args { 58struct bios_args {
58 u32 signature; 59 u32 signature;
@@ -101,6 +102,7 @@ static struct platform_driver hp_wmi_driver = {
101 }, 102 },
102 .probe = hp_wmi_bios_setup, 103 .probe = hp_wmi_bios_setup,
103 .remove = hp_wmi_bios_remove, 104 .remove = hp_wmi_bios_remove,
105 .resume = hp_wmi_resume_handler,
104}; 106};
105 107
106static int hp_wmi_perform_query(int query, int write, int value) 108static int hp_wmi_perform_query(int query, int write, int value)
@@ -487,6 +489,29 @@ static int __exit hp_wmi_bios_remove(struct platform_device *device)
487 return 0; 489 return 0;
488} 490}
489 491
492static int hp_wmi_resume_handler(struct platform_device *device)
493{
494 struct key_entry *key;
495
496 /*
497 * Docking state may have changed while suspended, so trigger
498 * an input event for the current state. As this is a switch,
499 * the input layer will only actually pass it on if the state
500 * changed.
501 */
502 for (key = hp_wmi_keymap; key->type != KE_END; key++) {
503 switch (key->type) {
504 case KE_SW:
505 input_report_switch(hp_wmi_input_dev, key->keycode,
506 hp_wmi_dock_state());
507 input_sync(hp_wmi_input_dev);
508 break;
509 }
510 }
511
512 return 0;
513}
514
490static int __init hp_wmi_init(void) 515static int __init hp_wmi_init(void)
491{ 516{
492 int err; 517 int err;