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>
This commit is contained in:
parent
326d8519fc
commit
4c395bdd3f
|
@ -53,6 +53,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
|
||||||
|
|
||||||
static int __init hp_wmi_bios_setup(struct platform_device *device);
|
static int __init hp_wmi_bios_setup(struct platform_device *device);
|
||||||
static int __exit hp_wmi_bios_remove(struct platform_device *device);
|
static int __exit hp_wmi_bios_remove(struct platform_device *device);
|
||||||
|
static int hp_wmi_resume_handler(struct platform_device *device);
|
||||||
|
|
||||||
struct bios_args {
|
struct bios_args {
|
||||||
u32 signature;
|
u32 signature;
|
||||||
|
@ -101,6 +102,7 @@ static struct platform_driver hp_wmi_driver = {
|
||||||
},
|
},
|
||||||
.probe = hp_wmi_bios_setup,
|
.probe = hp_wmi_bios_setup,
|
||||||
.remove = hp_wmi_bios_remove,
|
.remove = hp_wmi_bios_remove,
|
||||||
|
.resume = hp_wmi_resume_handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int hp_wmi_perform_query(int query, int write, int value)
|
static 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)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hp_wmi_resume_handler(struct platform_device *device)
|
||||||
|
{
|
||||||
|
struct key_entry *key;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Docking state may have changed while suspended, so trigger
|
||||||
|
* an input event for the current state. As this is a switch,
|
||||||
|
* the input layer will only actually pass it on if the state
|
||||||
|
* changed.
|
||||||
|
*/
|
||||||
|
for (key = hp_wmi_keymap; key->type != KE_END; key++) {
|
||||||
|
switch (key->type) {
|
||||||
|
case KE_SW:
|
||||||
|
input_report_switch(hp_wmi_input_dev, key->keycode,
|
||||||
|
hp_wmi_dock_state());
|
||||||
|
input_sync(hp_wmi_input_dev);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int __init hp_wmi_init(void)
|
static int __init hp_wmi_init(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
Loading…
Reference in a new issue