1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2008 Red Hat <mjg@redhat.com>
6 * Copyright (C) 2010, 2011 Anssi Hannula <anssi.hannula@iki.fi>
8 * Portions based on wistron_btns.c:
9 * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
10 * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
11 * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/slab.h>
20 #include <linux/types.h>
21 #include <linux/input.h>
22 #include <linux/input/sparse-keymap.h>
23 #include <linux/platform_device.h>
24 #include <linux/platform_profile.h>
25 #include <linux/hwmon.h>
26 #include <linux/acpi.h>
27 #include <linux/mutex.h>
28 #include <linux/cleanup.h>
29 #include <linux/power_supply.h>
30 #include <linux/rfkill.h>
31 #include <linux/string.h>
32 #include <linux/dmi.h>
34 MODULE_AUTHOR("Matthew Garrett <mjg59@srcf.ucam.org>");
35 MODULE_DESCRIPTION("HP laptop WMI driver");
36 MODULE_LICENSE("GPL");
38 MODULE_ALIAS("wmi:95F24279-4D7B-4334-9387-ACCDC67EF61C");
39 MODULE_ALIAS("wmi:5FB7F034-2C63-45E9-BE91-3D44E2C707E4");
41 #define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"
42 #define HPWMI_BIOS_GUID "5FB7F034-2C63-45E9-BE91-3D44E2C707E4"
44 #define HP_OMEN_EC_THERMAL_PROFILE_FLAGS_OFFSET 0x62
45 #define HP_OMEN_EC_THERMAL_PROFILE_TIMER_OFFSET 0x63
46 #define HP_OMEN_EC_THERMAL_PROFILE_OFFSET 0x95
48 #define ACPI_AC_CLASS "ac_adapter"
50 #define zero_if_sup(tmp) (zero_insize_support?0:sizeof(tmp)) // use when zero insize is required
52 /* DMI board names of devices that should use the omen specific path for
54 * This was obtained by taking a look in the windows omen command center
55 * app and parsing a json file that they use to figure out what capabilities
56 * the device should have.
57 * A device is considered an omen if the DisplayName in that list contains
58 * "OMEN", and it can use the thermal profile stuff if the "Feature" array
59 * contains "PerformanceControl".
61 static const char * const omen_thermal_profile_boards
[] = {
62 "84DA", "84DB", "84DC", "8574", "8575", "860A", "87B5", "8572", "8573",
63 "8600", "8601", "8602", "8605", "8606", "8607", "8746", "8747", "8749",
64 "874A", "8603", "8604", "8748", "886B", "886C", "878A", "878B", "878C",
65 "88C8", "88CB", "8786", "8787", "8788", "88D1", "88D2", "88F4", "88FD",
66 "88F5", "88F6", "88F7", "88FE", "88FF", "8900", "8901", "8902", "8912",
67 "8917", "8918", "8949", "894A", "89EB", "8BAD", "8A42"
70 /* DMI Board names of Omen laptops that are specifically set to be thermal
71 * profile version 0 by the Omen Command Center app, regardless of what
72 * the get system design information WMI call returns
74 static const char * const omen_thermal_profile_force_v0_boards
[] = {
75 "8607", "8746", "8747", "8749", "874A", "8748"
78 /* DMI board names of Omen laptops that have a thermal profile timer which will
79 * cause the embedded controller to set the thermal profile back to
80 * "balanced" when reaching zero.
82 static const char * const omen_timed_thermal_profile_boards
[] = {
86 /* DMI Board names of Victus laptops */
87 static const char * const victus_thermal_profile_boards
[] = {
93 HPWMI_BLUETOOTH
= 0x1,
98 enum hp_wmi_event_ids
{
99 HPWMI_DOCK_EVENT
= 0x01,
100 HPWMI_PARK_HDD
= 0x02,
101 HPWMI_SMART_ADAPTER
= 0x03,
102 HPWMI_BEZEL_BUTTON
= 0x04,
103 HPWMI_WIRELESS
= 0x05,
104 HPWMI_CPU_BATTERY_THROTTLE
= 0x06,
105 HPWMI_LOCK_SWITCH
= 0x07,
106 HPWMI_LID_SWITCH
= 0x08,
107 HPWMI_SCREEN_ROTATION
= 0x09,
108 HPWMI_COOLSENSE_SYSTEM_MOBILE
= 0x0A,
109 HPWMI_COOLSENSE_SYSTEM_HOT
= 0x0B,
110 HPWMI_PROXIMITY_SENSOR
= 0x0C,
111 HPWMI_BACKLIT_KB_BRIGHTNESS
= 0x0D,
112 HPWMI_PEAKSHIFT_PERIOD
= 0x0F,
113 HPWMI_BATTERY_CHARGE_PERIOD
= 0x10,
114 HPWMI_SANITIZATION_MODE
= 0x17,
115 HPWMI_CAMERA_TOGGLE
= 0x1A,
116 HPWMI_OMEN_KEY
= 0x1D,
117 HPWMI_SMART_EXPERIENCE_APP
= 0x21,
121 * struct bios_args buffer is dynamically allocated. New WMI command types
122 * were introduced that exceeds 128-byte data size. Changes to handle
123 * the data size allocation scheme were kept in hp_wmi_perform_qurey function.
133 enum hp_wmi_commandtype
{
134 HPWMI_DISPLAY_QUERY
= 0x01,
135 HPWMI_HDDTEMP_QUERY
= 0x02,
136 HPWMI_ALS_QUERY
= 0x03,
137 HPWMI_HARDWARE_QUERY
= 0x04,
138 HPWMI_WIRELESS_QUERY
= 0x05,
139 HPWMI_BATTERY_QUERY
= 0x07,
140 HPWMI_BIOS_QUERY
= 0x09,
141 HPWMI_FEATURE_QUERY
= 0x0b,
142 HPWMI_HOTKEY_QUERY
= 0x0c,
143 HPWMI_FEATURE2_QUERY
= 0x0d,
144 HPWMI_WIRELESS2_QUERY
= 0x1b,
145 HPWMI_POSTCODEERROR_QUERY
= 0x2a,
146 HPWMI_SYSTEM_DEVICE_MODE
= 0x40,
147 HPWMI_THERMAL_PROFILE_QUERY
= 0x4c,
150 enum hp_wmi_gm_commandtype
{
151 HPWMI_FAN_SPEED_GET_QUERY
= 0x11,
152 HPWMI_SET_PERFORMANCE_MODE
= 0x1A,
153 HPWMI_FAN_SPEED_MAX_GET_QUERY
= 0x26,
154 HPWMI_FAN_SPEED_MAX_SET_QUERY
= 0x27,
155 HPWMI_GET_SYSTEM_DESIGN_DATA
= 0x28,
158 enum hp_wmi_command
{
165 enum hp_wmi_hardware_mask
{
166 HPWMI_DOCK_MASK
= 0x01,
167 HPWMI_TABLET_MASK
= 0x04,
175 enum hp_return_value
{
176 HPWMI_RET_WRONG_SIGNATURE
= 0x02,
177 HPWMI_RET_UNKNOWN_COMMAND
= 0x03,
178 HPWMI_RET_UNKNOWN_CMDTYPE
= 0x04,
179 HPWMI_RET_INVALID_PARAMETERS
= 0x05,
182 enum hp_wireless2_bits
{
183 HPWMI_POWER_STATE
= 0x01,
184 HPWMI_POWER_SOFT
= 0x02,
185 HPWMI_POWER_BIOS
= 0x04,
186 HPWMI_POWER_HARD
= 0x08,
187 HPWMI_POWER_FW_OR_HW
= HPWMI_POWER_BIOS
| HPWMI_POWER_HARD
,
190 enum hp_thermal_profile_omen_v0
{
191 HP_OMEN_V0_THERMAL_PROFILE_DEFAULT
= 0x00,
192 HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE
= 0x01,
193 HP_OMEN_V0_THERMAL_PROFILE_COOL
= 0x02,
196 enum hp_thermal_profile_omen_v1
{
197 HP_OMEN_V1_THERMAL_PROFILE_DEFAULT
= 0x30,
198 HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE
= 0x31,
199 HP_OMEN_V1_THERMAL_PROFILE_COOL
= 0x50,
202 enum hp_thermal_profile_omen_flags
{
203 HP_OMEN_EC_FLAGS_TURBO
= 0x04,
204 HP_OMEN_EC_FLAGS_NOTIMER
= 0x02,
205 HP_OMEN_EC_FLAGS_JUSTSET
= 0x01,
208 enum hp_thermal_profile_victus
{
209 HP_VICTUS_THERMAL_PROFILE_DEFAULT
= 0x00,
210 HP_VICTUS_THERMAL_PROFILE_PERFORMANCE
= 0x01,
211 HP_VICTUS_THERMAL_PROFILE_QUIET
= 0x03,
214 enum hp_thermal_profile
{
215 HP_THERMAL_PROFILE_PERFORMANCE
= 0x00,
216 HP_THERMAL_PROFILE_DEFAULT
= 0x01,
217 HP_THERMAL_PROFILE_COOL
= 0x02,
218 HP_THERMAL_PROFILE_QUIET
= 0x03,
221 #define IS_HWBLOCKED(x) ((x & HPWMI_POWER_FW_OR_HW) != HPWMI_POWER_FW_OR_HW)
222 #define IS_SWBLOCKED(x) !(x & HPWMI_POWER_SOFT)
224 struct bios_rfkill2_device_state
{
229 u16 subsys_vendor_id
;
230 u16 subsys_product_id
;
236 /* 7 devices fit into the 128 byte buffer */
237 #define HPWMI_MAX_RFKILL2_DEVICES 7
239 struct bios_rfkill2_state
{
243 struct bios_rfkill2_device_state device
[HPWMI_MAX_RFKILL2_DEVICES
];
246 static const struct key_entry hp_wmi_keymap
[] = {
247 { KE_KEY
, 0x02, { KEY_BRIGHTNESSUP
} },
248 { KE_KEY
, 0x03, { KEY_BRIGHTNESSDOWN
} },
249 { KE_KEY
, 0x270, { KEY_MICMUTE
} },
250 { KE_KEY
, 0x20e6, { KEY_PROG1
} },
251 { KE_KEY
, 0x20e8, { KEY_MEDIA
} },
252 { KE_KEY
, 0x2142, { KEY_MEDIA
} },
253 { KE_KEY
, 0x213b, { KEY_INFO
} },
254 { KE_KEY
, 0x2169, { KEY_ROTATE_DISPLAY
} },
255 { KE_KEY
, 0x216a, { KEY_SETUP
} },
256 { KE_IGNORE
, 0x21a4, }, /* Win Lock On */
257 { KE_IGNORE
, 0x121a4, }, /* Win Lock Off */
258 { KE_KEY
, 0x21a5, { KEY_PROG2
} }, /* HP Omen Key */
259 { KE_KEY
, 0x21a7, { KEY_FN_ESC
} },
260 { KE_KEY
, 0x21a8, { KEY_PROG2
} }, /* HP Envy x360 programmable key */
261 { KE_KEY
, 0x21a9, { KEY_TOUCHPAD_OFF
} },
262 { KE_KEY
, 0x121a9, { KEY_TOUCHPAD_ON
} },
263 { KE_KEY
, 0x231b, { KEY_HELP
} },
268 * Mutex for the active_platform_profile variable,
269 * see omen_powersource_event.
271 static DEFINE_MUTEX(active_platform_profile_lock
);
273 static struct input_dev
*hp_wmi_input_dev
;
274 static struct input_dev
*camera_shutter_input_dev
;
275 static struct platform_device
*hp_wmi_platform_dev
;
276 static struct platform_profile_handler platform_profile_handler
;
277 static struct notifier_block platform_power_source_nb
;
278 static enum platform_profile_option active_platform_profile
;
279 static bool platform_profile_support
;
280 static bool zero_insize_support
;
282 static struct rfkill
*wifi_rfkill
;
283 static struct rfkill
*bluetooth_rfkill
;
284 static struct rfkill
*wwan_rfkill
;
286 struct rfkill2_device
{
289 struct rfkill
*rfkill
;
292 static int rfkill2_count
;
293 static struct rfkill2_device rfkill2
[HPWMI_MAX_RFKILL2_DEVICES
];
296 * Chassis Types values were obtained from SMBIOS reference
297 * specification version 3.00. A complete list of system enclosures
298 * and chassis types is available on Table 17.
300 static const char * const tablet_chassis_types
[] = {
302 "31", /* Convertible */
303 "32" /* Detachable */
306 #define DEVICE_MODE_TABLET 0x06
308 /* map output size to the corresponding WMI method id */
309 static inline int encode_outsize_for_pvsz(int outsize
)
325 * hp_wmi_perform_query
327 * query: The commandtype (enum hp_wmi_commandtype)
328 * write: The command (enum hp_wmi_command)
329 * buffer: Buffer used as input and/or output
330 * insize: Size of input buffer
331 * outsize: Size of output buffer
333 * returns zero on success
334 * an HP WMI query specific error code (which is positive)
335 * -EINVAL if the query was not successful at all
336 * -EINVAL if the output buffer size exceeds buffersize
338 * Note: The buffersize must at least be the maximum of the input and output
339 * size. E.g. Battery info query is defined to have 1 byte input
340 * and 128 byte output. The caller would do:
341 * buffer = kzalloc(128, GFP_KERNEL);
342 * ret = hp_wmi_perform_query(HPWMI_BATTERY_QUERY, HPWMI_READ, buffer, 1, 128)
344 static int hp_wmi_perform_query(int query
, enum hp_wmi_command command
,
345 void *buffer
, int insize
, int outsize
)
347 struct acpi_buffer input
, output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
348 struct bios_return
*bios_return
;
349 union acpi_object
*obj
= NULL
;
350 struct bios_args
*args
= NULL
;
351 int mid
, actual_insize
, actual_outsize
;
352 size_t bios_args_size
;
355 mid
= encode_outsize_for_pvsz(outsize
);
356 if (WARN_ON(mid
< 0))
359 actual_insize
= max(insize
, 128);
360 bios_args_size
= struct_size(args
, data
, actual_insize
);
361 args
= kmalloc(bios_args_size
, GFP_KERNEL
);
365 input
.length
= bios_args_size
;
366 input
.pointer
= args
;
368 args
->signature
= 0x55434553;
369 args
->command
= command
;
370 args
->commandtype
= query
;
371 args
->datasize
= insize
;
372 memcpy(args
->data
, buffer
, flex_array_size(args
, data
, insize
));
374 ret
= wmi_evaluate_method(HPWMI_BIOS_GUID
, 0, mid
, &input
, &output
);
378 obj
= output
.pointer
;
384 if (obj
->type
!= ACPI_TYPE_BUFFER
) {
385 pr_warn("query 0x%x returned an invalid object 0x%x\n", query
, ret
);
390 bios_return
= (struct bios_return
*)obj
->buffer
.pointer
;
391 ret
= bios_return
->return_code
;
394 if (ret
!= HPWMI_RET_UNKNOWN_COMMAND
&&
395 ret
!= HPWMI_RET_UNKNOWN_CMDTYPE
)
396 pr_warn("query 0x%x returned error 0x%x\n", query
, ret
);
400 /* Ignore output data of zero size */
404 actual_outsize
= min(outsize
, (int)(obj
->buffer
.length
- sizeof(*bios_return
)));
405 memcpy(buffer
, obj
->buffer
.pointer
+ sizeof(*bios_return
), actual_outsize
);
406 memset(buffer
+ actual_outsize
, 0, outsize
- actual_outsize
);
414 static int hp_wmi_get_fan_speed(int fan
)
417 char fan_data
[4] = { fan
, 0, 0, 0 };
419 int ret
= hp_wmi_perform_query(HPWMI_FAN_SPEED_GET_QUERY
, HPWMI_GM
,
420 &fan_data
, sizeof(char),
429 return (fsh
<< 8) | fsl
;
432 static int hp_wmi_read_int(int query
)
436 ret
= hp_wmi_perform_query(query
, HPWMI_READ
, &val
,
437 zero_if_sup(val
), sizeof(val
));
440 return ret
< 0 ? ret
: -EINVAL
;
445 static int hp_wmi_get_dock_state(void)
447 int state
= hp_wmi_read_int(HPWMI_HARDWARE_QUERY
);
452 return !!(state
& HPWMI_DOCK_MASK
);
455 static int hp_wmi_get_tablet_mode(void)
457 char system_device_mode
[4] = { 0 };
458 const char *chassis_type
;
462 chassis_type
= dmi_get_system_info(DMI_CHASSIS_TYPE
);
466 tablet_found
= match_string(tablet_chassis_types
,
467 ARRAY_SIZE(tablet_chassis_types
),
472 ret
= hp_wmi_perform_query(HPWMI_SYSTEM_DEVICE_MODE
, HPWMI_READ
,
473 system_device_mode
, zero_if_sup(system_device_mode
),
474 sizeof(system_device_mode
));
478 return system_device_mode
[0] == DEVICE_MODE_TABLET
;
481 static int omen_thermal_profile_set(int mode
)
483 /* The Omen Control Center actively sets the first byte of the buffer to
484 * 255, so let's mimic this behaviour to be as close as possible to
485 * the original software.
487 char buffer
[2] = {-1, mode
};
490 ret
= hp_wmi_perform_query(HPWMI_SET_PERFORMANCE_MODE
, HPWMI_GM
,
491 &buffer
, sizeof(buffer
), 0);
494 return ret
< 0 ? ret
: -EINVAL
;
499 static bool is_omen_thermal_profile(void)
501 const char *board_name
= dmi_get_system_info(DMI_BOARD_NAME
);
506 return match_string(omen_thermal_profile_boards
,
507 ARRAY_SIZE(omen_thermal_profile_boards
),
511 static int omen_get_thermal_policy_version(void)
513 unsigned char buffer
[8] = { 0 };
516 const char *board_name
= dmi_get_system_info(DMI_BOARD_NAME
);
519 int matches
= match_string(omen_thermal_profile_force_v0_boards
,
520 ARRAY_SIZE(omen_thermal_profile_force_v0_boards
),
526 ret
= hp_wmi_perform_query(HPWMI_GET_SYSTEM_DESIGN_DATA
, HPWMI_GM
,
527 &buffer
, sizeof(buffer
), sizeof(buffer
));
530 return ret
< 0 ? ret
: -EINVAL
;
535 static int omen_thermal_profile_get(void)
539 int ret
= ec_read(HP_OMEN_EC_THERMAL_PROFILE_OFFSET
, &data
);
547 static int hp_wmi_fan_speed_max_set(int enabled
)
551 ret
= hp_wmi_perform_query(HPWMI_FAN_SPEED_MAX_SET_QUERY
, HPWMI_GM
,
552 &enabled
, sizeof(enabled
), 0);
555 return ret
< 0 ? ret
: -EINVAL
;
560 static int hp_wmi_fan_speed_max_get(void)
564 ret
= hp_wmi_perform_query(HPWMI_FAN_SPEED_MAX_GET_QUERY
, HPWMI_GM
,
565 &val
, zero_if_sup(val
), sizeof(val
));
568 return ret
< 0 ? ret
: -EINVAL
;
573 static int __init
hp_wmi_bios_2008_later(void)
576 int ret
= hp_wmi_perform_query(HPWMI_FEATURE_QUERY
, HPWMI_READ
, &state
,
577 zero_if_sup(state
), sizeof(state
));
581 return (ret
== HPWMI_RET_UNKNOWN_CMDTYPE
) ? 0 : -ENXIO
;
584 static int __init
hp_wmi_bios_2009_later(void)
587 int ret
= hp_wmi_perform_query(HPWMI_FEATURE2_QUERY
, HPWMI_READ
, &state
,
588 zero_if_sup(state
), sizeof(state
));
592 return (ret
== HPWMI_RET_UNKNOWN_CMDTYPE
) ? 0 : -ENXIO
;
595 static int __init
hp_wmi_enable_hotkeys(void)
598 int ret
= hp_wmi_perform_query(HPWMI_BIOS_QUERY
, HPWMI_WRITE
, &value
,
601 return ret
<= 0 ? ret
: -EINVAL
;
604 static int hp_wmi_set_block(void *data
, bool blocked
)
606 enum hp_wmi_radio r
= (long)data
;
607 int query
= BIT(r
+ 8) | ((!blocked
) << r
);
610 ret
= hp_wmi_perform_query(HPWMI_WIRELESS_QUERY
, HPWMI_WRITE
,
611 &query
, sizeof(query
), 0);
613 return ret
<= 0 ? ret
: -EINVAL
;
616 static const struct rfkill_ops hp_wmi_rfkill_ops
= {
617 .set_block
= hp_wmi_set_block
,
620 static bool hp_wmi_get_sw_state(enum hp_wmi_radio r
)
622 int mask
= 0x200 << (r
* 8);
624 int wireless
= hp_wmi_read_int(HPWMI_WIRELESS_QUERY
);
626 /* TBD: Pass error */
627 WARN_ONCE(wireless
< 0, "error executing HPWMI_WIRELESS_QUERY");
629 return !(wireless
& mask
);
632 static bool hp_wmi_get_hw_state(enum hp_wmi_radio r
)
634 int mask
= 0x800 << (r
* 8);
636 int wireless
= hp_wmi_read_int(HPWMI_WIRELESS_QUERY
);
638 /* TBD: Pass error */
639 WARN_ONCE(wireless
< 0, "error executing HPWMI_WIRELESS_QUERY");
641 return !(wireless
& mask
);
644 static int hp_wmi_rfkill2_set_block(void *data
, bool blocked
)
646 int rfkill_id
= (int)(long)data
;
647 char buffer
[4] = { 0x01, 0x00, rfkill_id
, !blocked
};
650 ret
= hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY
, HPWMI_WRITE
,
651 buffer
, sizeof(buffer
), 0);
653 return ret
<= 0 ? ret
: -EINVAL
;
656 static const struct rfkill_ops hp_wmi_rfkill2_ops
= {
657 .set_block
= hp_wmi_rfkill2_set_block
,
660 static int hp_wmi_rfkill2_refresh(void)
662 struct bios_rfkill2_state state
;
665 err
= hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY
, HPWMI_READ
, &state
,
666 zero_if_sup(state
), sizeof(state
));
670 for (i
= 0; i
< rfkill2_count
; i
++) {
671 int num
= rfkill2
[i
].num
;
672 struct bios_rfkill2_device_state
*devstate
;
674 devstate
= &state
.device
[num
];
676 if (num
>= state
.count
||
677 devstate
->rfkill_id
!= rfkill2
[i
].id
) {
678 pr_warn("power configuration of the wireless devices unexpectedly changed\n");
682 rfkill_set_states(rfkill2
[i
].rfkill
,
683 IS_SWBLOCKED(devstate
->power
),
684 IS_HWBLOCKED(devstate
->power
));
690 static ssize_t
display_show(struct device
*dev
, struct device_attribute
*attr
,
693 int value
= hp_wmi_read_int(HPWMI_DISPLAY_QUERY
);
697 return sysfs_emit(buf
, "%d\n", value
);
700 static ssize_t
hddtemp_show(struct device
*dev
, struct device_attribute
*attr
,
703 int value
= hp_wmi_read_int(HPWMI_HDDTEMP_QUERY
);
707 return sysfs_emit(buf
, "%d\n", value
);
710 static ssize_t
als_show(struct device
*dev
, struct device_attribute
*attr
,
713 int value
= hp_wmi_read_int(HPWMI_ALS_QUERY
);
717 return sysfs_emit(buf
, "%d\n", value
);
720 static ssize_t
dock_show(struct device
*dev
, struct device_attribute
*attr
,
723 int value
= hp_wmi_get_dock_state();
727 return sysfs_emit(buf
, "%d\n", value
);
730 static ssize_t
tablet_show(struct device
*dev
, struct device_attribute
*attr
,
733 int value
= hp_wmi_get_tablet_mode();
737 return sysfs_emit(buf
, "%d\n", value
);
740 static ssize_t
postcode_show(struct device
*dev
, struct device_attribute
*attr
,
743 /* Get the POST error code of previous boot failure. */
744 int value
= hp_wmi_read_int(HPWMI_POSTCODEERROR_QUERY
);
748 return sysfs_emit(buf
, "0x%x\n", value
);
751 static ssize_t
als_store(struct device
*dev
, struct device_attribute
*attr
,
752 const char *buf
, size_t count
)
757 ret
= kstrtou32(buf
, 10, &tmp
);
761 ret
= hp_wmi_perform_query(HPWMI_ALS_QUERY
, HPWMI_WRITE
, &tmp
,
764 return ret
< 0 ? ret
: -EINVAL
;
769 static ssize_t
postcode_store(struct device
*dev
, struct device_attribute
*attr
,
770 const char *buf
, size_t count
)
776 ret
= kstrtobool(buf
, &clear
);
783 /* Clear the POST error code. It is kept until cleared. */
784 ret
= hp_wmi_perform_query(HPWMI_POSTCODEERROR_QUERY
, HPWMI_WRITE
, &tmp
,
787 return ret
< 0 ? ret
: -EINVAL
;
792 static int camera_shutter_input_setup(void)
796 camera_shutter_input_dev
= input_allocate_device();
797 if (!camera_shutter_input_dev
)
800 camera_shutter_input_dev
->name
= "HP WMI camera shutter";
801 camera_shutter_input_dev
->phys
= "wmi/input1";
802 camera_shutter_input_dev
->id
.bustype
= BUS_HOST
;
804 __set_bit(EV_SW
, camera_shutter_input_dev
->evbit
);
805 __set_bit(SW_CAMERA_LENS_COVER
, camera_shutter_input_dev
->swbit
);
807 err
= input_register_device(camera_shutter_input_dev
);
814 input_free_device(camera_shutter_input_dev
);
815 camera_shutter_input_dev
= NULL
;
819 static DEVICE_ATTR_RO(display
);
820 static DEVICE_ATTR_RO(hddtemp
);
821 static DEVICE_ATTR_RW(als
);
822 static DEVICE_ATTR_RO(dock
);
823 static DEVICE_ATTR_RO(tablet
);
824 static DEVICE_ATTR_RW(postcode
);
826 static struct attribute
*hp_wmi_attrs
[] = {
827 &dev_attr_display
.attr
,
828 &dev_attr_hddtemp
.attr
,
831 &dev_attr_tablet
.attr
,
832 &dev_attr_postcode
.attr
,
835 ATTRIBUTE_GROUPS(hp_wmi
);
837 static void hp_wmi_notify(union acpi_object
*obj
, void *context
)
839 u32 event_id
, event_data
;
845 if (obj
->type
!= ACPI_TYPE_BUFFER
) {
846 pr_info("Unknown response received %d\n", obj
->type
);
851 * Depending on ACPI version the concatenation of id and event data
852 * inside _WED function will result in a 8 or 16 byte buffer.
854 location
= (u32
*)obj
->buffer
.pointer
;
855 if (obj
->buffer
.length
== 8) {
856 event_id
= *location
;
857 event_data
= *(location
+ 1);
858 } else if (obj
->buffer
.length
== 16) {
859 event_id
= *location
;
860 event_data
= *(location
+ 2);
862 pr_info("Unknown buffer length %d\n", obj
->buffer
.length
);
867 case HPWMI_DOCK_EVENT
:
868 if (test_bit(SW_DOCK
, hp_wmi_input_dev
->swbit
))
869 input_report_switch(hp_wmi_input_dev
, SW_DOCK
,
870 hp_wmi_get_dock_state());
871 if (test_bit(SW_TABLET_MODE
, hp_wmi_input_dev
->swbit
))
872 input_report_switch(hp_wmi_input_dev
, SW_TABLET_MODE
,
873 hp_wmi_get_tablet_mode());
874 input_sync(hp_wmi_input_dev
);
878 case HPWMI_SMART_ADAPTER
:
880 case HPWMI_BEZEL_BUTTON
:
881 key_code
= hp_wmi_read_int(HPWMI_HOTKEY_QUERY
);
885 if (!sparse_keymap_report_event(hp_wmi_input_dev
,
887 pr_info("Unknown key code - 0x%x\n", key_code
);
890 if (event_data
) /* Only should be true for HP Omen */
891 key_code
= event_data
;
893 key_code
= hp_wmi_read_int(HPWMI_HOTKEY_QUERY
);
895 if (!sparse_keymap_report_event(hp_wmi_input_dev
,
897 pr_info("Unknown key code - 0x%x\n", key_code
);
901 hp_wmi_rfkill2_refresh();
906 rfkill_set_states(wifi_rfkill
,
907 hp_wmi_get_sw_state(HPWMI_WIFI
),
908 hp_wmi_get_hw_state(HPWMI_WIFI
));
909 if (bluetooth_rfkill
)
910 rfkill_set_states(bluetooth_rfkill
,
911 hp_wmi_get_sw_state(HPWMI_BLUETOOTH
),
912 hp_wmi_get_hw_state(HPWMI_BLUETOOTH
));
914 rfkill_set_states(wwan_rfkill
,
915 hp_wmi_get_sw_state(HPWMI_WWAN
),
916 hp_wmi_get_hw_state(HPWMI_WWAN
));
918 case HPWMI_CPU_BATTERY_THROTTLE
:
919 pr_info("Unimplemented CPU throttle because of 3 Cell battery event detected\n");
921 case HPWMI_LOCK_SWITCH
:
923 case HPWMI_LID_SWITCH
:
925 case HPWMI_SCREEN_ROTATION
:
927 case HPWMI_COOLSENSE_SYSTEM_MOBILE
:
929 case HPWMI_COOLSENSE_SYSTEM_HOT
:
931 case HPWMI_PROXIMITY_SENSOR
:
933 case HPWMI_BACKLIT_KB_BRIGHTNESS
:
935 case HPWMI_PEAKSHIFT_PERIOD
:
937 case HPWMI_BATTERY_CHARGE_PERIOD
:
939 case HPWMI_SANITIZATION_MODE
:
941 case HPWMI_CAMERA_TOGGLE
:
942 if (!camera_shutter_input_dev
)
943 if (camera_shutter_input_setup()) {
944 pr_err("Failed to setup camera shutter input device\n");
947 if (event_data
== 0xff)
948 input_report_switch(camera_shutter_input_dev
, SW_CAMERA_LENS_COVER
, 1);
949 else if (event_data
== 0xfe)
950 input_report_switch(camera_shutter_input_dev
, SW_CAMERA_LENS_COVER
, 0);
952 pr_warn("Unknown camera shutter state - 0x%x\n", event_data
);
953 input_sync(camera_shutter_input_dev
);
955 case HPWMI_SMART_EXPERIENCE_APP
:
958 pr_info("Unknown event_id - %d - 0x%x\n", event_id
, event_data
);
963 static int __init
hp_wmi_input_setup(void)
968 hp_wmi_input_dev
= input_allocate_device();
969 if (!hp_wmi_input_dev
)
972 hp_wmi_input_dev
->name
= "HP WMI hotkeys";
973 hp_wmi_input_dev
->phys
= "wmi/input0";
974 hp_wmi_input_dev
->id
.bustype
= BUS_HOST
;
976 __set_bit(EV_SW
, hp_wmi_input_dev
->evbit
);
979 val
= hp_wmi_get_dock_state();
981 __set_bit(SW_DOCK
, hp_wmi_input_dev
->swbit
);
982 input_report_switch(hp_wmi_input_dev
, SW_DOCK
, val
);
986 val
= hp_wmi_get_tablet_mode();
988 __set_bit(SW_TABLET_MODE
, hp_wmi_input_dev
->swbit
);
989 input_report_switch(hp_wmi_input_dev
, SW_TABLET_MODE
, val
);
992 err
= sparse_keymap_setup(hp_wmi_input_dev
, hp_wmi_keymap
, NULL
);
996 /* Set initial hardware state */
997 input_sync(hp_wmi_input_dev
);
999 if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later())
1000 hp_wmi_enable_hotkeys();
1002 status
= wmi_install_notify_handler(HPWMI_EVENT_GUID
, hp_wmi_notify
, NULL
);
1003 if (ACPI_FAILURE(status
)) {
1008 err
= input_register_device(hp_wmi_input_dev
);
1010 goto err_uninstall_notifier
;
1014 err_uninstall_notifier
:
1015 wmi_remove_notify_handler(HPWMI_EVENT_GUID
);
1017 input_free_device(hp_wmi_input_dev
);
1021 static void hp_wmi_input_destroy(void)
1023 wmi_remove_notify_handler(HPWMI_EVENT_GUID
);
1024 input_unregister_device(hp_wmi_input_dev
);
1027 static int __init
hp_wmi_rfkill_setup(struct platform_device
*device
)
1031 wireless
= hp_wmi_read_int(HPWMI_WIRELESS_QUERY
);
1035 err
= hp_wmi_perform_query(HPWMI_WIRELESS_QUERY
, HPWMI_WRITE
, &wireless
,
1036 sizeof(wireless
), 0);
1040 if (wireless
& 0x1) {
1041 wifi_rfkill
= rfkill_alloc("hp-wifi", &device
->dev
,
1044 (void *) HPWMI_WIFI
);
1047 rfkill_init_sw_state(wifi_rfkill
,
1048 hp_wmi_get_sw_state(HPWMI_WIFI
));
1049 rfkill_set_hw_state(wifi_rfkill
,
1050 hp_wmi_get_hw_state(HPWMI_WIFI
));
1051 err
= rfkill_register(wifi_rfkill
);
1053 goto register_wifi_error
;
1056 if (wireless
& 0x2) {
1057 bluetooth_rfkill
= rfkill_alloc("hp-bluetooth", &device
->dev
,
1058 RFKILL_TYPE_BLUETOOTH
,
1060 (void *) HPWMI_BLUETOOTH
);
1061 if (!bluetooth_rfkill
) {
1063 goto register_bluetooth_error
;
1065 rfkill_init_sw_state(bluetooth_rfkill
,
1066 hp_wmi_get_sw_state(HPWMI_BLUETOOTH
));
1067 rfkill_set_hw_state(bluetooth_rfkill
,
1068 hp_wmi_get_hw_state(HPWMI_BLUETOOTH
));
1069 err
= rfkill_register(bluetooth_rfkill
);
1071 goto register_bluetooth_error
;
1074 if (wireless
& 0x4) {
1075 wwan_rfkill
= rfkill_alloc("hp-wwan", &device
->dev
,
1078 (void *) HPWMI_WWAN
);
1081 goto register_wwan_error
;
1083 rfkill_init_sw_state(wwan_rfkill
,
1084 hp_wmi_get_sw_state(HPWMI_WWAN
));
1085 rfkill_set_hw_state(wwan_rfkill
,
1086 hp_wmi_get_hw_state(HPWMI_WWAN
));
1087 err
= rfkill_register(wwan_rfkill
);
1089 goto register_wwan_error
;
1094 register_wwan_error
:
1095 rfkill_destroy(wwan_rfkill
);
1097 if (bluetooth_rfkill
)
1098 rfkill_unregister(bluetooth_rfkill
);
1099 register_bluetooth_error
:
1100 rfkill_destroy(bluetooth_rfkill
);
1101 bluetooth_rfkill
= NULL
;
1103 rfkill_unregister(wifi_rfkill
);
1104 register_wifi_error
:
1105 rfkill_destroy(wifi_rfkill
);
1110 static int __init
hp_wmi_rfkill2_setup(struct platform_device
*device
)
1112 struct bios_rfkill2_state state
;
1115 err
= hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY
, HPWMI_READ
, &state
,
1116 zero_if_sup(state
), sizeof(state
));
1118 return err
< 0 ? err
: -EINVAL
;
1120 if (state
.count
> HPWMI_MAX_RFKILL2_DEVICES
) {
1121 pr_warn("unable to parse 0x1b query output\n");
1125 for (i
= 0; i
< state
.count
; i
++) {
1126 struct rfkill
*rfkill
;
1127 enum rfkill_type type
;
1130 switch (state
.device
[i
].radio_type
) {
1132 type
= RFKILL_TYPE_WLAN
;
1135 case HPWMI_BLUETOOTH
:
1136 type
= RFKILL_TYPE_BLUETOOTH
;
1137 name
= "hp-bluetooth";
1140 type
= RFKILL_TYPE_WWAN
;
1144 type
= RFKILL_TYPE_GPS
;
1148 pr_warn("unknown device type 0x%x\n",
1149 state
.device
[i
].radio_type
);
1153 if (!state
.device
[i
].vendor_id
) {
1154 pr_warn("zero device %d while %d reported\n",
1159 rfkill
= rfkill_alloc(name
, &device
->dev
, type
,
1160 &hp_wmi_rfkill2_ops
, (void *)(long)i
);
1166 rfkill2
[rfkill2_count
].id
= state
.device
[i
].rfkill_id
;
1167 rfkill2
[rfkill2_count
].num
= i
;
1168 rfkill2
[rfkill2_count
].rfkill
= rfkill
;
1170 rfkill_init_sw_state(rfkill
,
1171 IS_SWBLOCKED(state
.device
[i
].power
));
1172 rfkill_set_hw_state(rfkill
,
1173 IS_HWBLOCKED(state
.device
[i
].power
));
1175 if (!(state
.device
[i
].power
& HPWMI_POWER_BIOS
))
1176 pr_info("device %s blocked by BIOS\n", name
);
1178 err
= rfkill_register(rfkill
);
1180 rfkill_destroy(rfkill
);
1189 for (; rfkill2_count
> 0; rfkill2_count
--) {
1190 rfkill_unregister(rfkill2
[rfkill2_count
- 1].rfkill
);
1191 rfkill_destroy(rfkill2
[rfkill2_count
- 1].rfkill
);
1196 static int platform_profile_omen_get_ec(enum platform_profile_option
*profile
)
1200 tp
= omen_thermal_profile_get();
1205 case HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE
:
1206 case HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE
:
1207 *profile
= PLATFORM_PROFILE_PERFORMANCE
;
1209 case HP_OMEN_V0_THERMAL_PROFILE_DEFAULT
:
1210 case HP_OMEN_V1_THERMAL_PROFILE_DEFAULT
:
1211 *profile
= PLATFORM_PROFILE_BALANCED
;
1213 case HP_OMEN_V0_THERMAL_PROFILE_COOL
:
1214 case HP_OMEN_V1_THERMAL_PROFILE_COOL
:
1215 *profile
= PLATFORM_PROFILE_COOL
;
1224 static int platform_profile_omen_get(struct platform_profile_handler
*pprof
,
1225 enum platform_profile_option
*profile
)
1228 * We directly return the stored platform profile, as the embedded
1229 * controller will not accept switching to the performance option when
1230 * the conditions are not met (e.g. the laptop is not plugged in).
1232 * If we directly return what the EC reports, the platform profile will
1233 * immediately "switch back" to normal mode, which is against the
1234 * expected behaviour from a userspace point of view, as described in
1235 * the Platform Profile Section page of the kernel documentation.
1237 * See also omen_powersource_event.
1239 guard(mutex
)(&active_platform_profile_lock
);
1240 *profile
= active_platform_profile
;
1245 static bool has_omen_thermal_profile_ec_timer(void)
1247 const char *board_name
= dmi_get_system_info(DMI_BOARD_NAME
);
1252 return match_string(omen_timed_thermal_profile_boards
,
1253 ARRAY_SIZE(omen_timed_thermal_profile_boards
),
1257 inline int omen_thermal_profile_ec_flags_set(enum hp_thermal_profile_omen_flags flags
)
1259 return ec_write(HP_OMEN_EC_THERMAL_PROFILE_FLAGS_OFFSET
, flags
);
1262 inline int omen_thermal_profile_ec_timer_set(u8 value
)
1264 return ec_write(HP_OMEN_EC_THERMAL_PROFILE_TIMER_OFFSET
, value
);
1267 static int platform_profile_omen_set_ec(enum platform_profile_option profile
)
1269 int err
, tp
, tp_version
;
1270 enum hp_thermal_profile_omen_flags flags
= 0;
1272 tp_version
= omen_get_thermal_policy_version();
1274 if (tp_version
< 0 || tp_version
> 1)
1278 case PLATFORM_PROFILE_PERFORMANCE
:
1279 if (tp_version
== 0)
1280 tp
= HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE
;
1282 tp
= HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE
;
1284 case PLATFORM_PROFILE_BALANCED
:
1285 if (tp_version
== 0)
1286 tp
= HP_OMEN_V0_THERMAL_PROFILE_DEFAULT
;
1288 tp
= HP_OMEN_V1_THERMAL_PROFILE_DEFAULT
;
1290 case PLATFORM_PROFILE_COOL
:
1291 if (tp_version
== 0)
1292 tp
= HP_OMEN_V0_THERMAL_PROFILE_COOL
;
1294 tp
= HP_OMEN_V1_THERMAL_PROFILE_COOL
;
1300 err
= omen_thermal_profile_set(tp
);
1304 if (has_omen_thermal_profile_ec_timer()) {
1305 err
= omen_thermal_profile_ec_timer_set(0);
1309 if (profile
== PLATFORM_PROFILE_PERFORMANCE
)
1310 flags
= HP_OMEN_EC_FLAGS_NOTIMER
|
1311 HP_OMEN_EC_FLAGS_TURBO
;
1313 err
= omen_thermal_profile_ec_flags_set(flags
);
1321 static int platform_profile_omen_set(struct platform_profile_handler
*pprof
,
1322 enum platform_profile_option profile
)
1326 guard(mutex
)(&active_platform_profile_lock
);
1328 err
= platform_profile_omen_set_ec(profile
);
1332 active_platform_profile
= profile
;
1337 static int thermal_profile_get(void)
1339 return hp_wmi_read_int(HPWMI_THERMAL_PROFILE_QUERY
);
1342 static int thermal_profile_set(int thermal_profile
)
1344 return hp_wmi_perform_query(HPWMI_THERMAL_PROFILE_QUERY
, HPWMI_WRITE
, &thermal_profile
,
1345 sizeof(thermal_profile
), 0);
1348 static int hp_wmi_platform_profile_get(struct platform_profile_handler
*pprof
,
1349 enum platform_profile_option
*profile
)
1353 tp
= thermal_profile_get();
1358 case HP_THERMAL_PROFILE_PERFORMANCE
:
1359 *profile
= PLATFORM_PROFILE_PERFORMANCE
;
1361 case HP_THERMAL_PROFILE_DEFAULT
:
1362 *profile
= PLATFORM_PROFILE_BALANCED
;
1364 case HP_THERMAL_PROFILE_COOL
:
1365 *profile
= PLATFORM_PROFILE_COOL
;
1367 case HP_THERMAL_PROFILE_QUIET
:
1368 *profile
= PLATFORM_PROFILE_QUIET
;
1377 static int hp_wmi_platform_profile_set(struct platform_profile_handler
*pprof
,
1378 enum platform_profile_option profile
)
1383 case PLATFORM_PROFILE_PERFORMANCE
:
1384 tp
= HP_THERMAL_PROFILE_PERFORMANCE
;
1386 case PLATFORM_PROFILE_BALANCED
:
1387 tp
= HP_THERMAL_PROFILE_DEFAULT
;
1389 case PLATFORM_PROFILE_COOL
:
1390 tp
= HP_THERMAL_PROFILE_COOL
;
1392 case PLATFORM_PROFILE_QUIET
:
1393 tp
= HP_THERMAL_PROFILE_QUIET
;
1399 err
= thermal_profile_set(tp
);
1406 static bool is_victus_thermal_profile(void)
1408 const char *board_name
= dmi_get_system_info(DMI_BOARD_NAME
);
1413 return match_string(victus_thermal_profile_boards
,
1414 ARRAY_SIZE(victus_thermal_profile_boards
),
1418 static int platform_profile_victus_get_ec(enum platform_profile_option
*profile
)
1422 tp
= omen_thermal_profile_get();
1427 case HP_VICTUS_THERMAL_PROFILE_PERFORMANCE
:
1428 *profile
= PLATFORM_PROFILE_PERFORMANCE
;
1430 case HP_VICTUS_THERMAL_PROFILE_DEFAULT
:
1431 *profile
= PLATFORM_PROFILE_BALANCED
;
1433 case HP_VICTUS_THERMAL_PROFILE_QUIET
:
1434 *profile
= PLATFORM_PROFILE_QUIET
;
1443 static int platform_profile_victus_get(struct platform_profile_handler
*pprof
,
1444 enum platform_profile_option
*profile
)
1446 /* Same behaviour as platform_profile_omen_get */
1447 return platform_profile_omen_get(pprof
, profile
);
1450 static int platform_profile_victus_set_ec(enum platform_profile_option profile
)
1455 case PLATFORM_PROFILE_PERFORMANCE
:
1456 tp
= HP_VICTUS_THERMAL_PROFILE_PERFORMANCE
;
1458 case PLATFORM_PROFILE_BALANCED
:
1459 tp
= HP_VICTUS_THERMAL_PROFILE_DEFAULT
;
1461 case PLATFORM_PROFILE_QUIET
:
1462 tp
= HP_VICTUS_THERMAL_PROFILE_QUIET
;
1468 err
= omen_thermal_profile_set(tp
);
1475 static int platform_profile_victus_set(struct platform_profile_handler
*pprof
,
1476 enum platform_profile_option profile
)
1480 guard(mutex
)(&active_platform_profile_lock
);
1482 err
= platform_profile_victus_set_ec(profile
);
1486 active_platform_profile
= profile
;
1491 static int omen_powersource_event(struct notifier_block
*nb
,
1492 unsigned long value
,
1495 struct acpi_bus_event
*event_entry
= data
;
1496 enum platform_profile_option actual_profile
;
1499 if (strcmp(event_entry
->device_class
, ACPI_AC_CLASS
) != 0)
1502 pr_debug("Received power source device event\n");
1504 guard(mutex
)(&active_platform_profile_lock
);
1507 * This handler can only be called on Omen and Victus models, so
1508 * there's no need to call is_victus_thermal_profile() here.
1510 if (is_omen_thermal_profile())
1511 err
= platform_profile_omen_get_ec(&actual_profile
);
1513 err
= platform_profile_victus_get_ec(&actual_profile
);
1517 * Although we failed to get the current platform profile, we
1518 * still want the other event consumers to process it.
1520 pr_warn("Failed to read current platform profile (%d)\n", err
);
1525 * If we're back on AC and that the user-chosen power profile is
1526 * different from what the EC reports, we restore the user-chosen
1529 if (power_supply_is_system_supplied() <= 0 ||
1530 active_platform_profile
== actual_profile
) {
1531 pr_debug("Platform profile update skipped, conditions unmet\n");
1535 if (is_omen_thermal_profile())
1536 err
= platform_profile_omen_set_ec(active_platform_profile
);
1538 err
= platform_profile_victus_set_ec(active_platform_profile
);
1541 pr_warn("Failed to restore platform profile (%d)\n", err
);
1548 static int omen_register_powersource_event_handler(void)
1552 platform_power_source_nb
.notifier_call
= omen_powersource_event
;
1553 err
= register_acpi_notifier(&platform_power_source_nb
);
1556 pr_warn("Failed to install ACPI power source notify handler\n");
1563 static inline void omen_unregister_powersource_event_handler(void)
1565 unregister_acpi_notifier(&platform_power_source_nb
);
1568 static int thermal_profile_setup(void)
1572 if (is_omen_thermal_profile()) {
1573 err
= platform_profile_omen_get_ec(&active_platform_profile
);
1578 * call thermal profile write command to ensure that the
1579 * firmware correctly sets the OEM variables
1581 err
= platform_profile_omen_set_ec(active_platform_profile
);
1585 platform_profile_handler
.profile_get
= platform_profile_omen_get
;
1586 platform_profile_handler
.profile_set
= platform_profile_omen_set
;
1588 set_bit(PLATFORM_PROFILE_COOL
, platform_profile_handler
.choices
);
1589 } else if (is_victus_thermal_profile()) {
1590 err
= platform_profile_victus_get_ec(&active_platform_profile
);
1595 * call thermal profile write command to ensure that the
1596 * firmware correctly sets the OEM variables
1598 err
= platform_profile_victus_set_ec(active_platform_profile
);
1602 platform_profile_handler
.profile_get
= platform_profile_victus_get
;
1603 platform_profile_handler
.profile_set
= platform_profile_victus_set
;
1605 set_bit(PLATFORM_PROFILE_QUIET
, platform_profile_handler
.choices
);
1607 tp
= thermal_profile_get();
1613 * call thermal profile write command to ensure that the
1614 * firmware correctly sets the OEM variables for the DPTF
1616 err
= thermal_profile_set(tp
);
1620 platform_profile_handler
.profile_get
= hp_wmi_platform_profile_get
;
1621 platform_profile_handler
.profile_set
= hp_wmi_platform_profile_set
;
1623 set_bit(PLATFORM_PROFILE_QUIET
, platform_profile_handler
.choices
);
1624 set_bit(PLATFORM_PROFILE_COOL
, platform_profile_handler
.choices
);
1627 set_bit(PLATFORM_PROFILE_BALANCED
, platform_profile_handler
.choices
);
1628 set_bit(PLATFORM_PROFILE_PERFORMANCE
, platform_profile_handler
.choices
);
1630 err
= platform_profile_register(&platform_profile_handler
);
1634 platform_profile_support
= true;
1639 static int hp_wmi_hwmon_init(void);
1641 static int __init
hp_wmi_bios_setup(struct platform_device
*device
)
1644 /* clear detected rfkill devices */
1646 bluetooth_rfkill
= NULL
;
1651 * In pre-2009 BIOS, command 1Bh return 0x4 to indicate that
1652 * BIOS no longer controls the power for the wireless
1653 * devices. All features supported by this command will no
1654 * longer be supported.
1656 if (!hp_wmi_bios_2009_later()) {
1657 if (hp_wmi_rfkill_setup(device
))
1658 hp_wmi_rfkill2_setup(device
);
1661 err
= hp_wmi_hwmon_init();
1666 thermal_profile_setup();
1671 static void __exit
hp_wmi_bios_remove(struct platform_device
*device
)
1675 for (i
= 0; i
< rfkill2_count
; i
++) {
1676 rfkill_unregister(rfkill2
[i
].rfkill
);
1677 rfkill_destroy(rfkill2
[i
].rfkill
);
1681 rfkill_unregister(wifi_rfkill
);
1682 rfkill_destroy(wifi_rfkill
);
1684 if (bluetooth_rfkill
) {
1685 rfkill_unregister(bluetooth_rfkill
);
1686 rfkill_destroy(bluetooth_rfkill
);
1689 rfkill_unregister(wwan_rfkill
);
1690 rfkill_destroy(wwan_rfkill
);
1693 if (platform_profile_support
)
1694 platform_profile_remove();
1697 static int hp_wmi_resume_handler(struct device
*device
)
1700 * Hardware state may have changed while suspended, so trigger
1701 * input events for the current state. As this is a switch,
1702 * the input layer will only actually pass it on if the state
1705 if (hp_wmi_input_dev
) {
1706 if (test_bit(SW_DOCK
, hp_wmi_input_dev
->swbit
))
1707 input_report_switch(hp_wmi_input_dev
, SW_DOCK
,
1708 hp_wmi_get_dock_state());
1709 if (test_bit(SW_TABLET_MODE
, hp_wmi_input_dev
->swbit
))
1710 input_report_switch(hp_wmi_input_dev
, SW_TABLET_MODE
,
1711 hp_wmi_get_tablet_mode());
1712 input_sync(hp_wmi_input_dev
);
1716 hp_wmi_rfkill2_refresh();
1719 rfkill_set_states(wifi_rfkill
,
1720 hp_wmi_get_sw_state(HPWMI_WIFI
),
1721 hp_wmi_get_hw_state(HPWMI_WIFI
));
1722 if (bluetooth_rfkill
)
1723 rfkill_set_states(bluetooth_rfkill
,
1724 hp_wmi_get_sw_state(HPWMI_BLUETOOTH
),
1725 hp_wmi_get_hw_state(HPWMI_BLUETOOTH
));
1727 rfkill_set_states(wwan_rfkill
,
1728 hp_wmi_get_sw_state(HPWMI_WWAN
),
1729 hp_wmi_get_hw_state(HPWMI_WWAN
));
1734 static const struct dev_pm_ops hp_wmi_pm_ops
= {
1735 .resume
= hp_wmi_resume_handler
,
1736 .restore
= hp_wmi_resume_handler
,
1740 * hp_wmi_bios_remove() lives in .exit.text. For drivers registered via
1741 * module_platform_driver_probe() this is ok because they cannot get unbound at
1742 * runtime. So mark the driver struct with __refdata to prevent modpost
1743 * triggering a section mismatch warning.
1745 static struct platform_driver hp_wmi_driver __refdata
= {
1748 .pm
= &hp_wmi_pm_ops
,
1749 .dev_groups
= hp_wmi_groups
,
1751 .remove
= __exit_p(hp_wmi_bios_remove
),
1754 static umode_t
hp_wmi_hwmon_is_visible(const void *data
,
1755 enum hwmon_sensor_types type
,
1756 u32 attr
, int channel
)
1762 if (hp_wmi_get_fan_speed(channel
) >= 0)
1772 static int hp_wmi_hwmon_read(struct device
*dev
, enum hwmon_sensor_types type
,
1773 u32 attr
, int channel
, long *val
)
1779 ret
= hp_wmi_get_fan_speed(channel
);
1786 switch (hp_wmi_fan_speed_max_get()) {
1788 /* 0 is automatic fan, which is 2 for hwmon */
1792 /* 1 is max fan, which is 0
1793 * (no fan speed control) for hwmon
1798 /* shouldn't happen */
1806 static int hp_wmi_hwmon_write(struct device
*dev
, enum hwmon_sensor_types type
,
1807 u32 attr
, int channel
, long val
)
1813 /* 0 is no fan speed control (max), which is 1 for us */
1814 return hp_wmi_fan_speed_max_set(1);
1816 /* 2 is automatic speed control, which is 0 for us */
1817 return hp_wmi_fan_speed_max_set(0);
1819 /* we don't support manual fan speed control */
1827 static const struct hwmon_channel_info
* const info
[] = {
1828 HWMON_CHANNEL_INFO(fan
, HWMON_F_INPUT
, HWMON_F_INPUT
),
1829 HWMON_CHANNEL_INFO(pwm
, HWMON_PWM_ENABLE
),
1833 static const struct hwmon_ops ops
= {
1834 .is_visible
= hp_wmi_hwmon_is_visible
,
1835 .read
= hp_wmi_hwmon_read
,
1836 .write
= hp_wmi_hwmon_write
,
1839 static const struct hwmon_chip_info chip_info
= {
1844 static int hp_wmi_hwmon_init(void)
1846 struct device
*dev
= &hp_wmi_platform_dev
->dev
;
1847 struct device
*hwmon
;
1849 hwmon
= devm_hwmon_device_register_with_info(dev
, "hp", &hp_wmi_driver
,
1852 if (IS_ERR(hwmon
)) {
1853 dev_err(dev
, "Could not register hp hwmon device\n");
1854 return PTR_ERR(hwmon
);
1860 static int __init
hp_wmi_init(void)
1862 int event_capable
= wmi_has_guid(HPWMI_EVENT_GUID
);
1863 int bios_capable
= wmi_has_guid(HPWMI_BIOS_GUID
);
1866 if (!bios_capable
&& !event_capable
)
1869 if (hp_wmi_perform_query(HPWMI_HARDWARE_QUERY
, HPWMI_READ
, &tmp
,
1870 sizeof(tmp
), sizeof(tmp
)) == HPWMI_RET_INVALID_PARAMETERS
)
1871 zero_insize_support
= true;
1873 if (event_capable
) {
1874 err
= hp_wmi_input_setup();
1880 hp_wmi_platform_dev
=
1881 platform_device_register_simple("hp-wmi", PLATFORM_DEVID_NONE
, NULL
, 0);
1882 if (IS_ERR(hp_wmi_platform_dev
)) {
1883 err
= PTR_ERR(hp_wmi_platform_dev
);
1884 goto err_destroy_input
;
1887 err
= platform_driver_probe(&hp_wmi_driver
, hp_wmi_bios_setup
);
1889 goto err_unregister_device
;
1892 if (is_omen_thermal_profile() || is_victus_thermal_profile()) {
1893 err
= omen_register_powersource_event_handler();
1895 goto err_unregister_device
;
1900 err_unregister_device
:
1901 platform_device_unregister(hp_wmi_platform_dev
);
1904 hp_wmi_input_destroy();
1908 module_init(hp_wmi_init
);
1910 static void __exit
hp_wmi_exit(void)
1912 if (is_omen_thermal_profile() || is_victus_thermal_profile())
1913 omen_unregister_powersource_event_handler();
1915 if (wmi_has_guid(HPWMI_EVENT_GUID
))
1916 hp_wmi_input_destroy();
1918 if (camera_shutter_input_dev
)
1919 input_unregister_device(camera_shutter_input_dev
);
1921 if (hp_wmi_platform_dev
) {
1922 platform_device_unregister(hp_wmi_platform_dev
);
1923 platform_driver_unregister(&hp_wmi_driver
);
1926 module_exit(hp_wmi_exit
);