diff options
Diffstat (limited to 'drivers/platform/x86/hp-wmi.c')
| -rw-r--r-- | drivers/platform/x86/hp-wmi.c | 32 | 
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 1c86fa0857c..484a8673b83 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c @@ -53,7 +53,9 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");  #define HPWMI_ALS_QUERY 0x3  #define HPWMI_HARDWARE_QUERY 0x4  #define HPWMI_WIRELESS_QUERY 0x5 +#define HPWMI_BIOS_QUERY 0x9  #define HPWMI_HOTKEY_QUERY 0xc +#define HPWMI_FEATURE_QUERY 0xd  #define HPWMI_WIRELESS2_QUERY 0x1b  #define HPWMI_POSTCODEERROR_QUERY 0x2a @@ -143,6 +145,7 @@ static const struct key_entry hp_wmi_keymap[] = {  	{ KE_KEY, 0x2142, { KEY_MEDIA } },  	{ KE_KEY, 0x213b, { KEY_INFO } },  	{ KE_KEY, 0x2169, { KEY_DIRECTION } }, +	{ KE_KEY, 0x216a, { KEY_SETUP } },  	{ KE_KEY, 0x231b, { KEY_HELP } },  	{ KE_END, 0 }  }; @@ -292,6 +295,30 @@ static int hp_wmi_tablet_state(void)  	return (state & 0x4) ? 1 : 0;  } +static int hp_wmi_bios_2009_later(void) +{ +	int state = 0; +	int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state, +				       sizeof(state), sizeof(state)); +	if (ret) +		return ret; + +	return (state & 0x10) ? 1 : 0; +} + +static int hp_wmi_enable_hotkeys(void) +{ +	int ret; +	int query = 0x6e; + +	ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query), +				   0); + +	if (ret) +		return -EINVAL; +	return 0; +} +  static int hp_wmi_set_block(void *data, bool blocked)  {  	enum hp_wmi_radio r = (enum hp_wmi_radio) data; @@ -636,6 +663,9 @@ static int __init hp_wmi_input_setup(void)  			    hp_wmi_tablet_state());  	input_sync(hp_wmi_input_dev); +	if (hp_wmi_bios_2009_later() == 4) +		hp_wmi_enable_hotkeys(); +  	status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL);  	if (ACPI_FAILURE(status)) {  		err = -EIO; @@ -871,7 +901,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)  	gps_rfkill = NULL;  	rfkill2_count = 0; -	if (hp_wmi_rfkill_setup(device)) +	if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device))  		hp_wmi_rfkill2_setup(device);  	err = device_create_file(&device->dev, &dev_attr_display);  | 
