diff options
Diffstat (limited to 'drivers/platform/x86/hp-wmi.c')
-rw-r--r-- | drivers/platform/x86/hp-wmi.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 06697315a088..fb4dd7b3ee71 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
@@ -54,8 +54,9 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4"); | |||
54 | #define HPWMI_HARDWARE_QUERY 0x4 | 54 | #define HPWMI_HARDWARE_QUERY 0x4 |
55 | #define HPWMI_WIRELESS_QUERY 0x5 | 55 | #define HPWMI_WIRELESS_QUERY 0x5 |
56 | #define HPWMI_BIOS_QUERY 0x9 | 56 | #define HPWMI_BIOS_QUERY 0x9 |
57 | #define HPWMI_FEATURE_QUERY 0xb | ||
57 | #define HPWMI_HOTKEY_QUERY 0xc | 58 | #define HPWMI_HOTKEY_QUERY 0xc |
58 | #define HPWMI_FEATURE_QUERY 0xd | 59 | #define HPWMI_FEATURE2_QUERY 0xd |
59 | #define HPWMI_WIRELESS2_QUERY 0x1b | 60 | #define HPWMI_WIRELESS2_QUERY 0x1b |
60 | #define HPWMI_POSTCODEERROR_QUERY 0x2a | 61 | #define HPWMI_POSTCODEERROR_QUERY 0x2a |
61 | 62 | ||
@@ -295,25 +296,33 @@ static int hp_wmi_tablet_state(void) | |||
295 | return (state & 0x4) ? 1 : 0; | 296 | return (state & 0x4) ? 1 : 0; |
296 | } | 297 | } |
297 | 298 | ||
298 | static int __init hp_wmi_bios_2009_later(void) | 299 | static int __init hp_wmi_bios_2008_later(void) |
299 | { | 300 | { |
300 | int state = 0; | 301 | int state = 0; |
301 | int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state, | 302 | int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state, |
302 | sizeof(state), sizeof(state)); | 303 | sizeof(state), sizeof(state)); |
303 | if (ret) | 304 | if (!ret) |
304 | return ret; | 305 | return 1; |
305 | 306 | ||
306 | return (state & 0x10) ? 1 : 0; | 307 | return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO; |
307 | } | 308 | } |
308 | 309 | ||
309 | static int hp_wmi_enable_hotkeys(void) | 310 | static int __init hp_wmi_bios_2009_later(void) |
310 | { | 311 | { |
311 | int ret; | 312 | int state = 0; |
312 | int query = 0x6e; | 313 | int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, 0, &state, |
314 | sizeof(state), sizeof(state)); | ||
315 | if (!ret) | ||
316 | return 1; | ||
313 | 317 | ||
314 | ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query), | 318 | return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO; |
315 | 0); | 319 | } |
316 | 320 | ||
321 | static int __init hp_wmi_enable_hotkeys(void) | ||
322 | { | ||
323 | int value = 0x6e; | ||
324 | int ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &value, | ||
325 | sizeof(value), 0); | ||
317 | if (ret) | 326 | if (ret) |
318 | return -EINVAL; | 327 | return -EINVAL; |
319 | return 0; | 328 | return 0; |
@@ -663,7 +672,7 @@ static int __init hp_wmi_input_setup(void) | |||
663 | hp_wmi_tablet_state()); | 672 | hp_wmi_tablet_state()); |
664 | input_sync(hp_wmi_input_dev); | 673 | input_sync(hp_wmi_input_dev); |
665 | 674 | ||
666 | if (hp_wmi_bios_2009_later() == 4) | 675 | if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later()) |
667 | hp_wmi_enable_hotkeys(); | 676 | hp_wmi_enable_hotkeys(); |
668 | 677 | ||
669 | status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL); | 678 | status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL); |