1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Asus PC WMI hotkey driver
5 * Copyright(C) 2010 Intel Corporation.
8 * Portions based on wistron_btns.c:
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 #include <linux/acpi.h>
17 #include <linux/backlight.h>
18 #include <linux/debugfs.h>
19 #include <linux/dmi.h>
21 #include <linux/hwmon.h>
22 #include <linux/hwmon-sysfs.h>
23 #include <linux/init.h>
24 #include <linux/input.h>
25 #include <linux/input/sparse-keymap.h>
26 #include <linux/kernel.h>
27 #include <linux/leds.h>
28 #include <linux/minmax.h>
29 #include <linux/module.h>
30 #include <linux/pci.h>
31 #include <linux/pci_hotplug.h>
32 #include <linux/platform_data/x86/asus-wmi.h>
33 #include <linux/platform_device.h>
34 #include <linux/platform_profile.h>
35 #include <linux/power_supply.h>
36 #include <linux/rfkill.h>
37 #include <linux/seq_file.h>
38 #include <linux/slab.h>
39 #include <linux/types.h>
40 #include <linux/units.h>
42 #include <acpi/battery.h>
43 #include <acpi/video.h>
49 MODULE_DESCRIPTION("Asus Generic WMI Driver");
50 MODULE_LICENSE("GPL");
52 static bool fnlock_default = true;
53 module_param(fnlock_default, bool, 0444);
55 #define to_asus_wmi_driver(pdrv) \
56 (container_of((pdrv), struct asus_wmi_driver, platform_driver))
58 #define ASUS_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66"
60 #define NOTIFY_BRNUP_MIN 0x11
61 #define NOTIFY_BRNUP_MAX 0x1f
62 #define NOTIFY_BRNDOWN_MIN 0x20
63 #define NOTIFY_BRNDOWN_MAX 0x2e
64 #define NOTIFY_FNLOCK_TOGGLE 0x4e
65 #define NOTIFY_KBD_DOCK_CHANGE 0x75
66 #define NOTIFY_KBD_BRTUP 0xc4
67 #define NOTIFY_KBD_BRTDWN 0xc5
68 #define NOTIFY_KBD_BRTTOGGLE 0xc7
69 #define NOTIFY_KBD_FBM 0x99
70 #define NOTIFY_KBD_TTP 0xae
71 #define NOTIFY_LID_FLIP 0xfa
72 #define NOTIFY_LID_FLIP_ROG 0xbd
74 #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0)
76 #define ASUS_MID_FAN_DESC "mid_fan"
77 #define ASUS_GPU_FAN_DESC "gpu_fan"
78 #define ASUS_FAN_DESC "cpu_fan"
79 #define ASUS_FAN_MFUN 0x13
80 #define ASUS_FAN_SFUN_READ 0x06
81 #define ASUS_FAN_SFUN_WRITE 0x07
83 /* Based on standard hwmon pwmX_enable values */
84 #define ASUS_FAN_CTRL_FULLSPEED 0
85 #define ASUS_FAN_CTRL_MANUAL 1
86 #define ASUS_FAN_CTRL_AUTO 2
88 #define ASUS_FAN_BOOST_MODE_NORMAL 0
89 #define ASUS_FAN_BOOST_MODE_OVERBOOST 1
90 #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK 0x01
91 #define ASUS_FAN_BOOST_MODE_SILENT 2
92 #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02
93 #define ASUS_FAN_BOOST_MODES_MASK 0x03
95 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0
96 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1
97 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2
99 #define USB_INTEL_XUSB2PR 0xD0
100 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
102 #define ASUS_ACPI_UID_ASUSWMI "ASUSWMI"
103 #define ASUS_ACPI_UID_ATK "ATK"
105 #define WMI_EVENT_QUEUE_SIZE 0x10
106 #define WMI_EVENT_QUEUE_END 0x1
107 #define WMI_EVENT_MASK 0xFFFF
108 /* The WMI hotkey event value is always the same. */
109 #define WMI_EVENT_VALUE_ATK 0xFF
111 #define WMI_EVENT_MASK 0xFFFF
113 #define FAN_CURVE_POINTS 8
114 #define FAN_CURVE_BUF_LEN 32
115 #define FAN_CURVE_DEV_CPU 0x00
116 #define FAN_CURVE_DEV_GPU 0x01
117 #define FAN_CURVE_DEV_MID 0x02
118 /* Mask to determine if setting temperature or percentage */
119 #define FAN_CURVE_PWM_MASK 0x04
121 /* Limits for tunables available on ASUS ROG laptops */
122 #define PPT_TOTAL_MIN 5
123 #define PPT_TOTAL_MAX 250
124 #define PPT_CPU_MIN 5
125 #define PPT_CPU_MAX 130
126 #define NVIDIA_BOOST_MIN 5
127 #define NVIDIA_BOOST_MAX 25
128 #define NVIDIA_TEMP_MIN 75
129 #define NVIDIA_TEMP_MAX 87
131 #define ASUS_SCREENPAD_BRIGHT_MIN 20
132 #define ASUS_SCREENPAD_BRIGHT_MAX 255
133 #define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
135 static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
137 static int throttle_thermal_policy_write(struct asus_wmi *);
139 static bool ashs_present(void)
142 while (ashs_ids[i]) {
143 if (acpi_dev_found(ashs_ids[i++]))
152 u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */
154 u32 arg4; /* Some ROG laptops require a full 5 input args */
159 * Struct that's used for all methods called via AGFN. Naming is
160 * identically to the AML code.
163 u16 mfun; /* probably "Multi-function" to be called */
164 u16 sfun; /* probably "Sub-function" to be called */
165 u16 len; /* size of the hole struct, including subfunction fields */
166 u8 stas; /* not used by now */
167 u8 err; /* zero on success */
170 /* struct used for calling fan read and write methods */
171 struct agfn_fan_args {
172 struct agfn_args agfn; /* common fields */
173 u8 fan; /* fan number: 0: set auto mode 1: 1st fan */
174 u32 speed; /* read: RPM/100 - write: 0-255 */
178 * <platform>/ - debugfs root directory
179 * dev_id - current dev_id
180 * ctrl_param - current ctrl_param
181 * method_id - current method_id
182 * devs - call DEVS(dev_id, ctrl_param) and print result
183 * dsts - call DSTS(dev_id) and print result
184 * call - call method_id(dev_id, ctrl_param) and print result
186 struct asus_wmi_debug {
194 struct asus_wmi *asus;
195 struct rfkill *rfkill;
201 FAN_TYPE_AGFN, /* deprecated on newer platforms */
202 FAN_TYPE_SPEC83, /* starting in Spec 8.3, use CPU_FAN_CTRL */
205 struct fan_curve_data {
208 u8 temps[FAN_CURVE_POINTS];
209 u8 percents[FAN_CURVE_POINTS];
216 bool wmi_event_queue;
218 struct input_dev *inputdev;
219 struct backlight_device *backlight_device;
220 struct backlight_device *screenpad_backlight_device;
221 struct platform_device *platform_device;
223 struct led_classdev wlan_led;
225 struct led_classdev tpd_led;
227 struct led_classdev kbd_led;
229 struct led_classdev lightbar_led;
231 struct led_classdev micmute_led;
232 struct workqueue_struct *led_workqueue;
233 struct work_struct tpd_led_work;
234 struct work_struct wlan_led_work;
235 struct work_struct lightbar_led_work;
237 struct asus_rfkill wlan;
238 struct asus_rfkill bluetooth;
239 struct asus_rfkill wimax;
240 struct asus_rfkill wwan3g;
241 struct asus_rfkill gps;
242 struct asus_rfkill uwb;
244 int tablet_switch_event_code;
245 u32 tablet_switch_dev_id;
246 bool tablet_switch_inverted;
248 enum fan_type fan_type;
249 enum fan_type gpu_fan_type;
250 enum fan_type mid_fan_type;
252 int gpu_fan_pwm_mode;
253 int mid_fan_pwm_mode;
256 bool fan_boost_mode_available;
257 u8 fan_boost_mode_mask;
260 bool charge_mode_available;
261 bool egpu_enable_available;
262 bool egpu_connect_available;
263 bool dgpu_disable_available;
264 bool gpu_mux_mode_available;
266 /* Tunables provided by ASUS for gaming laptops */
267 bool ppt_pl2_sppt_available;
268 bool ppt_pl1_spl_available;
269 bool ppt_apu_sppt_available;
270 bool ppt_plat_sppt_available;
271 bool ppt_fppt_available;
272 bool nv_dyn_boost_available;
273 bool nv_temp_tgt_available;
275 bool kbd_rgb_mode_available;
276 bool kbd_rgb_state_available;
278 bool throttle_thermal_policy_available;
279 u8 throttle_thermal_policy_mode;
281 bool cpu_fan_curve_available;
282 bool gpu_fan_curve_available;
283 bool mid_fan_curve_available;
284 struct fan_curve_data custom_fan_curves[3];
286 struct platform_profile_handler platform_profile_handler;
287 bool platform_profile_support;
289 // The RSOC controls the maximum charging percentage.
290 bool battery_rsoc_available;
292 bool panel_overdrive_available;
293 bool mini_led_mode_available;
295 struct hotplug_slot hotplug_slot;
296 struct mutex hotplug_lock;
297 struct mutex wmi_lock;
298 struct workqueue_struct *hotplug_workqueue;
299 struct work_struct hotplug_work;
303 struct asus_wmi_debug debug;
305 struct asus_wmi_driver *driver;
308 /* WMI ************************************************************************/
310 static int asus_wmi_evaluate_method3(u32 method_id,
311 u32 arg0, u32 arg1, u32 arg2, u32 *retval)
313 struct bios_args args = {
318 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
319 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
321 union acpi_object *obj;
324 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
327 if (ACPI_FAILURE(status))
330 obj = (union acpi_object *)output.pointer;
331 if (obj && obj->type == ACPI_TYPE_INTEGER)
332 tmp = (u32) obj->integer.value;
339 if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
345 int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
347 return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval);
349 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
351 static int asus_wmi_evaluate_method5(u32 method_id,
352 u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *retval)
354 struct bios_args args = {
361 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
362 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
364 union acpi_object *obj;
367 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
370 if (ACPI_FAILURE(status))
373 obj = (union acpi_object *)output.pointer;
374 if (obj && obj->type == ACPI_TYPE_INTEGER)
375 tmp = (u32) obj->integer.value;
382 if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
389 * Returns as an error if the method output is not a buffer. Typically this
390 * means that the method called is unsupported.
392 static int asus_wmi_evaluate_method_buf(u32 method_id,
393 u32 arg0, u32 arg1, u8 *ret_buffer, size_t size)
395 struct bios_args args = {
400 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
401 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
403 union acpi_object *obj;
406 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
409 if (ACPI_FAILURE(status))
412 obj = (union acpi_object *)output.pointer;
415 case ACPI_TYPE_BUFFER:
416 if (obj->buffer.length > size) {
420 if (obj->buffer.length == 0) {
425 memcpy(ret_buffer, obj->buffer.pointer, obj->buffer.length);
427 case ACPI_TYPE_INTEGER:
428 err = (u32)obj->integer.value;
430 if (err == ASUS_WMI_UNSUPPORTED_METHOD)
433 * At least one method returns a 0 with no buffer if no arg
434 * is provided, such as ASUS_WMI_DEVID_CPU_FAN_CURVE
452 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
454 struct acpi_buffer input;
460 * Copy to dma capable address otherwise memory corruption occurs as
461 * bios has to be able to access it.
463 input.pointer = kmemdup(args.pointer, args.length, GFP_DMA | GFP_KERNEL);
464 input.length = args.length;
467 phys_addr = virt_to_phys(input.pointer);
469 status = asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN,
470 phys_addr, 0, &retval);
472 memcpy(args.pointer, input.pointer, args.length);
474 kfree(input.pointer);
481 static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
483 return asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
486 static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
489 return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
493 /* Helper for special devices with magic return codes */
494 static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
495 u32 dev_id, u32 mask)
500 err = asus_wmi_get_devstate(asus, dev_id, &retval);
504 if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
507 if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
508 if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
512 return retval & mask;
515 static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
517 return asus_wmi_get_devstate_bits(asus, dev_id,
518 ASUS_WMI_DSTS_STATUS_BIT);
521 static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
524 int status = asus_wmi_get_devstate(asus, dev_id, &retval);
526 return status == 0 && (retval & ASUS_WMI_DSTS_PRESENCE_BIT);
529 /* Input **********************************************************************/
530 static void asus_wmi_tablet_sw_report(struct asus_wmi *asus, bool value)
532 input_report_switch(asus->inputdev, SW_TABLET_MODE,
533 asus->tablet_switch_inverted ? !value : value);
534 input_sync(asus->inputdev);
537 static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code)
539 struct device *dev = &asus->platform_device->dev;
542 result = asus_wmi_get_devstate_simple(asus, dev_id);
544 input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
545 asus_wmi_tablet_sw_report(asus, result);
546 asus->tablet_switch_dev_id = dev_id;
547 asus->tablet_switch_event_code = event_code;
548 } else if (result == -ENODEV) {
549 dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
551 dev_err(dev, "Error checking for tablet-mode-switch: %d\n", result);
555 static int asus_wmi_input_init(struct asus_wmi *asus)
557 struct device *dev = &asus->platform_device->dev;
560 asus->inputdev = input_allocate_device();
564 asus->inputdev->name = asus->driver->input_name;
565 asus->inputdev->phys = asus->driver->input_phys;
566 asus->inputdev->id.bustype = BUS_HOST;
567 asus->inputdev->dev.parent = dev;
568 set_bit(EV_REP, asus->inputdev->evbit);
570 err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
574 switch (asus->driver->quirks->tablet_switch_mode) {
575 case asus_wmi_no_tablet_switch:
577 case asus_wmi_kbd_dock_devid:
578 asus->tablet_switch_inverted = true;
579 asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE);
581 case asus_wmi_lid_flip_devid:
582 asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP, NOTIFY_LID_FLIP);
584 case asus_wmi_lid_flip_rog_devid:
585 asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP_ROG, NOTIFY_LID_FLIP_ROG);
589 err = input_register_device(asus->inputdev);
596 input_free_device(asus->inputdev);
600 static void asus_wmi_input_exit(struct asus_wmi *asus)
603 input_unregister_device(asus->inputdev);
605 asus->inputdev = NULL;
608 /* Tablet mode ****************************************************************/
610 static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus)
614 if (!asus->tablet_switch_dev_id)
617 result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id);
619 asus_wmi_tablet_sw_report(asus, result);
622 /* Charging mode, 1=Barrel, 2=USB ******************************************/
623 static ssize_t charge_mode_show(struct device *dev,
624 struct device_attribute *attr, char *buf)
626 struct asus_wmi *asus = dev_get_drvdata(dev);
629 result = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CHARGE_MODE, &value);
633 return sysfs_emit(buf, "%d\n", value & 0xff);
636 static DEVICE_ATTR_RO(charge_mode);
638 /* dGPU ********************************************************************/
639 static ssize_t dgpu_disable_show(struct device *dev,
640 struct device_attribute *attr, char *buf)
642 struct asus_wmi *asus = dev_get_drvdata(dev);
645 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
649 return sysfs_emit(buf, "%d\n", result);
653 * A user may be required to store the value twice, typcial store first, then
654 * rescan PCI bus to activate power, then store a second time to save correctly.
655 * The reason for this is that an extra code path in the ACPI is enabled when
656 * the device and bus are powered.
658 static ssize_t dgpu_disable_store(struct device *dev,
659 struct device_attribute *attr,
660 const char *buf, size_t count)
665 struct asus_wmi *asus = dev_get_drvdata(dev);
667 result = kstrtou32(buf, 10, &disable);
674 if (asus->gpu_mux_mode_available) {
675 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
677 /* An error here may signal greater failure of GPU handling */
679 if (!result && disable) {
681 pr_warn("Can not disable dGPU when the MUX is in dGPU mode: %d\n", err);
686 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU, disable, &result);
688 pr_warn("Failed to set dgpu disable: %d\n", err);
693 pr_warn("Failed to set dgpu disable (result): 0x%x\n", result);
697 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "dgpu_disable");
701 static DEVICE_ATTR_RW(dgpu_disable);
703 /* eGPU ********************************************************************/
704 static ssize_t egpu_enable_show(struct device *dev,
705 struct device_attribute *attr, char *buf)
707 struct asus_wmi *asus = dev_get_drvdata(dev);
710 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
714 return sysfs_emit(buf, "%d\n", result);
717 /* The ACPI call to enable the eGPU also disables the internal dGPU */
718 static ssize_t egpu_enable_store(struct device *dev,
719 struct device_attribute *attr,
720 const char *buf, size_t count)
725 struct asus_wmi *asus = dev_get_drvdata(dev);
727 err = kstrtou32(buf, 10, &enable);
734 err = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
736 pr_warn("Failed to get egpu connection status: %d\n", err);
740 if (asus->gpu_mux_mode_available) {
741 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
743 /* An error here may signal greater failure of GPU handling */
744 pr_warn("Failed to get gpu mux status: %d\n", result);
747 if (!result && enable) {
749 pr_warn("Can not enable eGPU when the MUX is in dGPU mode: %d\n", err);
754 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU, enable, &result);
756 pr_warn("Failed to set egpu state: %d\n", err);
761 pr_warn("Failed to set egpu state (retval): 0x%x\n", result);
765 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "egpu_enable");
769 static DEVICE_ATTR_RW(egpu_enable);
771 /* Is eGPU connected? *********************************************************/
772 static ssize_t egpu_connected_show(struct device *dev,
773 struct device_attribute *attr, char *buf)
775 struct asus_wmi *asus = dev_get_drvdata(dev);
778 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
782 return sysfs_emit(buf, "%d\n", result);
785 static DEVICE_ATTR_RO(egpu_connected);
787 /* gpu mux switch *************************************************************/
788 static ssize_t gpu_mux_mode_show(struct device *dev,
789 struct device_attribute *attr, char *buf)
791 struct asus_wmi *asus = dev_get_drvdata(dev);
794 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
798 return sysfs_emit(buf, "%d\n", result);
801 static ssize_t gpu_mux_mode_store(struct device *dev,
802 struct device_attribute *attr,
803 const char *buf, size_t count)
805 struct asus_wmi *asus = dev_get_drvdata(dev);
809 err = kstrtou32(buf, 10, &optimus);
816 if (asus->dgpu_disable_available) {
817 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
819 /* An error here may signal greater failure of GPU handling */
821 if (result && !optimus) {
823 pr_warn("Can not switch MUX to dGPU mode when dGPU is disabled: %d\n", err);
828 if (asus->egpu_enable_available) {
829 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
831 /* An error here may signal greater failure of GPU handling */
833 if (result && !optimus) {
835 pr_warn("Can not switch MUX to dGPU mode when eGPU is enabled: %d\n", err);
840 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_MUX, optimus, &result);
842 dev_err(dev, "Failed to set GPU MUX mode: %d\n", err);
845 /* !1 is considered a fail by ASUS */
847 dev_warn(dev, "Failed to set GPU MUX mode (result): 0x%x\n", result);
851 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "gpu_mux_mode");
855 static DEVICE_ATTR_RW(gpu_mux_mode);
857 /* TUF Laptop Keyboard RGB Modes **********************************************/
858 static ssize_t kbd_rgb_mode_store(struct device *dev,
859 struct device_attribute *attr,
860 const char *buf, size_t count)
862 u32 cmd, mode, r, g, b, speed;
865 if (sscanf(buf, "%d %d %d %d %d %d", &cmd, &mode, &r, &g, &b, &speed) != 6)
868 /* B3 is set and B4 is save to BIOS */
880 /* These are the known usable modes across all TUF/ROG */
881 if (mode >= 12 || mode == 9)
898 err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, ASUS_WMI_DEVID_TUF_RGB_MODE,
899 cmd | (mode << 8) | (r << 16) | (g << 24), b | (speed << 8), NULL);
905 static DEVICE_ATTR_WO(kbd_rgb_mode);
907 static ssize_t kbd_rgb_mode_index_show(struct device *device,
908 struct device_attribute *attr,
911 return sysfs_emit(buf, "%s\n", "cmd mode red green blue speed");
913 static DEVICE_ATTR_RO(kbd_rgb_mode_index);
915 static struct attribute *kbd_rgb_mode_attrs[] = {
916 &dev_attr_kbd_rgb_mode.attr,
917 &dev_attr_kbd_rgb_mode_index.attr,
921 static const struct attribute_group kbd_rgb_mode_group = {
922 .attrs = kbd_rgb_mode_attrs,
925 /* TUF Laptop Keyboard RGB State **********************************************/
926 static ssize_t kbd_rgb_state_store(struct device *dev,
927 struct device_attribute *attr,
928 const char *buf, size_t count)
930 u32 flags, cmd, boot, awake, sleep, keyboard;
933 if (sscanf(buf, "%d %d %d %d %d", &cmd, &boot, &awake, &sleep, &keyboard) != 5)
949 /* 0xbd is the required default arg0 for the method. Nothing happens otherwise */
950 err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS,
951 ASUS_WMI_DEVID_TUF_RGB_STATE, 0xbd | cmd << 8 | (flags << 16), 0, NULL);
957 static DEVICE_ATTR_WO(kbd_rgb_state);
959 static ssize_t kbd_rgb_state_index_show(struct device *device,
960 struct device_attribute *attr,
963 return sysfs_emit(buf, "%s\n", "cmd boot awake sleep keyboard");
965 static DEVICE_ATTR_RO(kbd_rgb_state_index);
967 static struct attribute *kbd_rgb_state_attrs[] = {
968 &dev_attr_kbd_rgb_state.attr,
969 &dev_attr_kbd_rgb_state_index.attr,
973 static const struct attribute_group kbd_rgb_state_group = {
974 .attrs = kbd_rgb_state_attrs,
977 static const struct attribute_group *kbd_rgb_mode_groups[] = {
983 /* Tunable: PPT: Intel=PL1, AMD=SPPT *****************************************/
984 static ssize_t ppt_pl2_sppt_store(struct device *dev,
985 struct device_attribute *attr,
986 const char *buf, size_t count)
991 struct asus_wmi *asus = dev_get_drvdata(dev);
993 result = kstrtou32(buf, 10, &value);
997 if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1000 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL2_SPPT, value, &result);
1002 pr_warn("Failed to set ppt_pl2_sppt: %d\n", err);
1007 pr_warn("Failed to set ppt_pl2_sppt (result): 0x%x\n", result);
1011 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl2_sppt");
1015 static DEVICE_ATTR_WO(ppt_pl2_sppt);
1017 /* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/
1018 static ssize_t ppt_pl1_spl_store(struct device *dev,
1019 struct device_attribute *attr,
1020 const char *buf, size_t count)
1025 struct asus_wmi *asus = dev_get_drvdata(dev);
1027 result = kstrtou32(buf, 10, &value);
1031 if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1034 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL1_SPL, value, &result);
1036 pr_warn("Failed to set ppt_pl1_spl: %d\n", err);
1041 pr_warn("Failed to set ppt_pl1_spl (result): 0x%x\n", result);
1045 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl1_spl");
1049 static DEVICE_ATTR_WO(ppt_pl1_spl);
1051 /* Tunable: PPT APU FPPT ******************************************************/
1052 static ssize_t ppt_fppt_store(struct device *dev,
1053 struct device_attribute *attr,
1054 const char *buf, size_t count)
1059 struct asus_wmi *asus = dev_get_drvdata(dev);
1061 result = kstrtou32(buf, 10, &value);
1065 if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1068 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_FPPT, value, &result);
1070 pr_warn("Failed to set ppt_fppt: %d\n", err);
1075 pr_warn("Failed to set ppt_fppt (result): 0x%x\n", result);
1079 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_fpu_sppt");
1083 static DEVICE_ATTR_WO(ppt_fppt);
1085 /* Tunable: PPT APU SPPT *****************************************************/
1086 static ssize_t ppt_apu_sppt_store(struct device *dev,
1087 struct device_attribute *attr,
1088 const char *buf, size_t count)
1093 struct asus_wmi *asus = dev_get_drvdata(dev);
1095 result = kstrtou32(buf, 10, &value);
1099 if (value < PPT_CPU_MIN || value > PPT_CPU_MAX)
1102 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_APU_SPPT, value, &result);
1104 pr_warn("Failed to set ppt_apu_sppt: %d\n", err);
1109 pr_warn("Failed to set ppt_apu_sppt (result): 0x%x\n", result);
1113 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_apu_sppt");
1117 static DEVICE_ATTR_WO(ppt_apu_sppt);
1119 /* Tunable: PPT platform SPPT ************************************************/
1120 static ssize_t ppt_platform_sppt_store(struct device *dev,
1121 struct device_attribute *attr,
1122 const char *buf, size_t count)
1127 struct asus_wmi *asus = dev_get_drvdata(dev);
1129 result = kstrtou32(buf, 10, &value);
1133 if (value < PPT_CPU_MIN || value > PPT_CPU_MAX)
1136 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PLAT_SPPT, value, &result);
1138 pr_warn("Failed to set ppt_platform_sppt: %d\n", err);
1143 pr_warn("Failed to set ppt_platform_sppt (result): 0x%x\n", result);
1147 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_platform_sppt");
1151 static DEVICE_ATTR_WO(ppt_platform_sppt);
1153 /* Tunable: NVIDIA dynamic boost *********************************************/
1154 static ssize_t nv_dynamic_boost_store(struct device *dev,
1155 struct device_attribute *attr,
1156 const char *buf, size_t count)
1161 struct asus_wmi *asus = dev_get_drvdata(dev);
1163 result = kstrtou32(buf, 10, &value);
1167 if (value < NVIDIA_BOOST_MIN || value > NVIDIA_BOOST_MAX)
1170 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_DYN_BOOST, value, &result);
1172 pr_warn("Failed to set nv_dynamic_boost: %d\n", err);
1177 pr_warn("Failed to set nv_dynamic_boost (result): 0x%x\n", result);
1181 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_dynamic_boost");
1185 static DEVICE_ATTR_WO(nv_dynamic_boost);
1187 /* Tunable: NVIDIA temperature target ****************************************/
1188 static ssize_t nv_temp_target_store(struct device *dev,
1189 struct device_attribute *attr,
1190 const char *buf, size_t count)
1195 struct asus_wmi *asus = dev_get_drvdata(dev);
1197 result = kstrtou32(buf, 10, &value);
1201 if (value < NVIDIA_TEMP_MIN || value > NVIDIA_TEMP_MAX)
1204 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_THERM_TARGET, value, &result);
1206 pr_warn("Failed to set nv_temp_target: %d\n", err);
1211 pr_warn("Failed to set nv_temp_target (result): 0x%x\n", result);
1215 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_temp_target");
1219 static DEVICE_ATTR_WO(nv_temp_target);
1221 /* Battery ********************************************************************/
1223 /* The battery maximum charging percentage */
1224 static int charge_end_threshold;
1226 static ssize_t charge_control_end_threshold_store(struct device *dev,
1227 struct device_attribute *attr,
1228 const char *buf, size_t count)
1232 ret = kstrtouint(buf, 10, &value);
1236 if (value < 0 || value > 100)
1239 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, value, &rv);
1246 /* There isn't any method in the DSDT to read the threshold, so we
1247 * save the threshold.
1249 charge_end_threshold = value;
1253 static ssize_t charge_control_end_threshold_show(struct device *device,
1254 struct device_attribute *attr,
1257 return sysfs_emit(buf, "%d\n", charge_end_threshold);
1260 static DEVICE_ATTR_RW(charge_control_end_threshold);
1262 static int asus_wmi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
1264 /* The WMI method does not provide a way to specific a battery, so we
1265 * just assume it is the first battery.
1266 * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
1267 * battery is named BATT.
1269 if (strcmp(battery->desc->name, "BAT0") != 0 &&
1270 strcmp(battery->desc->name, "BAT1") != 0 &&
1271 strcmp(battery->desc->name, "BATC") != 0 &&
1272 strcmp(battery->desc->name, "BATT") != 0)
1275 if (device_create_file(&battery->dev,
1276 &dev_attr_charge_control_end_threshold))
1279 /* The charge threshold is only reset when the system is power cycled,
1280 * and we can't get the current threshold so let set it to 100% when
1281 * a battery is added.
1283 asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, 100, NULL);
1284 charge_end_threshold = 100;
1289 static int asus_wmi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
1291 device_remove_file(&battery->dev,
1292 &dev_attr_charge_control_end_threshold);
1296 static struct acpi_battery_hook battery_hook = {
1297 .add_battery = asus_wmi_battery_add,
1298 .remove_battery = asus_wmi_battery_remove,
1299 .name = "ASUS Battery Extension",
1302 static void asus_wmi_battery_init(struct asus_wmi *asus)
1304 asus->battery_rsoc_available = false;
1305 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_RSOC)) {
1306 asus->battery_rsoc_available = true;
1307 battery_hook_register(&battery_hook);
1311 static void asus_wmi_battery_exit(struct asus_wmi *asus)
1313 if (asus->battery_rsoc_available)
1314 battery_hook_unregister(&battery_hook);
1317 /* LEDs ***********************************************************************/
1320 * These functions actually update the LED's, and are called from a
1321 * workqueue. By doing this as separate work rather than when the LED
1322 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
1323 * potentially bad time, such as a timer interrupt.
1325 static void tpd_led_update(struct work_struct *work)
1328 struct asus_wmi *asus;
1330 asus = container_of(work, struct asus_wmi, tpd_led_work);
1332 ctrl_param = asus->tpd_led_wk;
1333 asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
1336 static void tpd_led_set(struct led_classdev *led_cdev,
1337 enum led_brightness value)
1339 struct asus_wmi *asus;
1341 asus = container_of(led_cdev, struct asus_wmi, tpd_led);
1343 asus->tpd_led_wk = !!value;
1344 queue_work(asus->led_workqueue, &asus->tpd_led_work);
1347 static int read_tpd_led_state(struct asus_wmi *asus)
1349 return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
1352 static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
1354 struct asus_wmi *asus;
1356 asus = container_of(led_cdev, struct asus_wmi, tpd_led);
1358 return read_tpd_led_state(asus);
1361 static void kbd_led_update(struct asus_wmi *asus)
1365 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
1366 asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
1369 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
1375 * bit 7: light on/off
1376 * bit 8-10: environment (0: dark, 1: normal, 2: light)
1377 * bit 17: status unknown
1379 retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
1382 /* Unknown status is considered as off */
1383 if (retval == 0x8000)
1390 *level = retval & 0x7F;
1392 *env = (retval >> 8) & 0x7F;
1396 static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
1398 struct asus_wmi *asus;
1401 asus = container_of(led_cdev, struct asus_wmi, kbd_led);
1402 max_level = asus->kbd_led.max_brightness;
1404 asus->kbd_led_wk = clamp_val(value, 0, max_level);
1405 kbd_led_update(asus);
1408 static void kbd_led_set(struct led_classdev *led_cdev,
1409 enum led_brightness value)
1411 /* Prevent disabling keyboard backlight on module unregister */
1412 if (led_cdev->flags & LED_UNREGISTERING)
1415 do_kbd_led_set(led_cdev, value);
1418 static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
1420 struct led_classdev *led_cdev = &asus->kbd_led;
1422 do_kbd_led_set(led_cdev, value);
1423 led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
1426 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
1428 struct asus_wmi *asus;
1431 asus = container_of(led_cdev, struct asus_wmi, kbd_led);
1433 retval = kbd_led_read(asus, &value, NULL);
1440 static int wlan_led_unknown_state(struct asus_wmi *asus)
1444 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
1446 return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
1449 static void wlan_led_update(struct work_struct *work)
1452 struct asus_wmi *asus;
1454 asus = container_of(work, struct asus_wmi, wlan_led_work);
1456 ctrl_param = asus->wlan_led_wk;
1457 asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
1460 static void wlan_led_set(struct led_classdev *led_cdev,
1461 enum led_brightness value)
1463 struct asus_wmi *asus;
1465 asus = container_of(led_cdev, struct asus_wmi, wlan_led);
1467 asus->wlan_led_wk = !!value;
1468 queue_work(asus->led_workqueue, &asus->wlan_led_work);
1471 static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
1473 struct asus_wmi *asus;
1476 asus = container_of(led_cdev, struct asus_wmi, wlan_led);
1477 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
1479 return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1482 static void lightbar_led_update(struct work_struct *work)
1484 struct asus_wmi *asus;
1487 asus = container_of(work, struct asus_wmi, lightbar_led_work);
1489 ctrl_param = asus->lightbar_led_wk;
1490 asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR, ctrl_param, NULL);
1493 static void lightbar_led_set(struct led_classdev *led_cdev,
1494 enum led_brightness value)
1496 struct asus_wmi *asus;
1498 asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
1500 asus->lightbar_led_wk = !!value;
1501 queue_work(asus->led_workqueue, &asus->lightbar_led_work);
1504 static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev)
1506 struct asus_wmi *asus;
1509 asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
1510 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
1512 return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
1515 static int micmute_led_set(struct led_classdev *led_cdev,
1516 enum led_brightness brightness)
1518 int state = brightness != LED_OFF;
1521 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MICMUTE_LED, state, NULL);
1522 return err < 0 ? err : 0;
1525 static void asus_wmi_led_exit(struct asus_wmi *asus)
1527 led_classdev_unregister(&asus->kbd_led);
1528 led_classdev_unregister(&asus->tpd_led);
1529 led_classdev_unregister(&asus->wlan_led);
1530 led_classdev_unregister(&asus->lightbar_led);
1531 led_classdev_unregister(&asus->micmute_led);
1533 if (asus->led_workqueue)
1534 destroy_workqueue(asus->led_workqueue);
1537 static int asus_wmi_led_init(struct asus_wmi *asus)
1539 int rv = 0, num_rgb_groups = 0, led_val;
1541 if (asus->kbd_rgb_mode_available)
1542 kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_mode_group;
1543 if (asus->kbd_rgb_state_available)
1544 kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_state_group;
1546 asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
1547 if (!asus->led_workqueue)
1550 if (read_tpd_led_state(asus) >= 0) {
1551 INIT_WORK(&asus->tpd_led_work, tpd_led_update);
1553 asus->tpd_led.name = "asus::touchpad";
1554 asus->tpd_led.brightness_set = tpd_led_set;
1555 asus->tpd_led.brightness_get = tpd_led_get;
1556 asus->tpd_led.max_brightness = 1;
1558 rv = led_classdev_register(&asus->platform_device->dev,
1564 if (!kbd_led_read(asus, &led_val, NULL)) {
1565 asus->kbd_led_wk = led_val;
1566 asus->kbd_led.name = "asus::kbd_backlight";
1567 asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
1568 asus->kbd_led.brightness_set = kbd_led_set;
1569 asus->kbd_led.brightness_get = kbd_led_get;
1570 asus->kbd_led.max_brightness = 3;
1572 if (num_rgb_groups != 0)
1573 asus->kbd_led.groups = kbd_rgb_mode_groups;
1575 rv = led_classdev_register(&asus->platform_device->dev,
1581 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED)
1582 && (asus->driver->quirks->wapf > 0)) {
1583 INIT_WORK(&asus->wlan_led_work, wlan_led_update);
1585 asus->wlan_led.name = "asus::wlan";
1586 asus->wlan_led.brightness_set = wlan_led_set;
1587 if (!wlan_led_unknown_state(asus))
1588 asus->wlan_led.brightness_get = wlan_led_get;
1589 asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
1590 asus->wlan_led.max_brightness = 1;
1591 asus->wlan_led.default_trigger = "asus-wlan";
1593 rv = led_classdev_register(&asus->platform_device->dev,
1599 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_LIGHTBAR)) {
1600 INIT_WORK(&asus->lightbar_led_work, lightbar_led_update);
1602 asus->lightbar_led.name = "asus::lightbar";
1603 asus->lightbar_led.brightness_set = lightbar_led_set;
1604 asus->lightbar_led.brightness_get = lightbar_led_get;
1605 asus->lightbar_led.max_brightness = 1;
1607 rv = led_classdev_register(&asus->platform_device->dev,
1608 &asus->lightbar_led);
1611 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MICMUTE_LED)) {
1612 asus->micmute_led.name = "platform::micmute";
1613 asus->micmute_led.max_brightness = 1;
1614 asus->micmute_led.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE);
1615 asus->micmute_led.brightness_set_blocking = micmute_led_set;
1616 asus->micmute_led.default_trigger = "audio-micmute";
1618 rv = led_classdev_register(&asus->platform_device->dev,
1619 &asus->micmute_led);
1626 asus_wmi_led_exit(asus);
1631 /* RF *************************************************************************/
1634 * PCI hotplug (for wlan rfkill)
1636 static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
1638 int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1645 static void asus_rfkill_hotplug(struct asus_wmi *asus)
1647 struct pci_dev *dev;
1648 struct pci_bus *bus;
1653 mutex_lock(&asus->wmi_lock);
1654 blocked = asus_wlan_rfkill_blocked(asus);
1655 mutex_unlock(&asus->wmi_lock);
1657 mutex_lock(&asus->hotplug_lock);
1658 pci_lock_rescan_remove();
1660 if (asus->wlan.rfkill)
1661 rfkill_set_sw_state(asus->wlan.rfkill, blocked);
1663 if (asus->hotplug_slot.ops) {
1664 bus = pci_find_bus(0, 1);
1666 pr_warn("Unable to find PCI bus 1?\n");
1670 if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
1671 pr_err("Unable to read PCI config space?\n");
1674 absent = (l == 0xffffffff);
1676 if (blocked != absent) {
1677 pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
1678 blocked ? "blocked" : "unblocked",
1679 absent ? "absent" : "present");
1680 pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
1685 dev = pci_get_slot(bus, 0);
1687 /* Device already present */
1691 dev = pci_scan_single_device(bus, 0);
1693 pci_bus_assign_resources(bus);
1694 pci_bus_add_device(dev);
1697 dev = pci_get_slot(bus, 0);
1699 pci_stop_and_remove_bus_device(dev);
1706 pci_unlock_rescan_remove();
1707 mutex_unlock(&asus->hotplug_lock);
1710 static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
1712 struct asus_wmi *asus = data;
1714 if (event != ACPI_NOTIFY_BUS_CHECK)
1718 * We can't call directly asus_rfkill_hotplug because most
1719 * of the time WMBC is still being executed and not reetrant.
1720 * There is currently no way to tell ACPICA that we want this
1721 * method to be serialized, we schedule a asus_rfkill_hotplug
1722 * call later, in a safer context.
1724 queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
1727 static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
1732 status = acpi_get_handle(NULL, node, &handle);
1733 if (ACPI_FAILURE(status))
1736 status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1737 asus_rfkill_notify, asus);
1738 if (ACPI_FAILURE(status))
1739 pr_warn("Failed to register notify on %s\n", node);
1744 static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
1746 acpi_status status = AE_OK;
1749 status = acpi_get_handle(NULL, node, &handle);
1750 if (ACPI_FAILURE(status))
1753 status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1754 asus_rfkill_notify);
1755 if (ACPI_FAILURE(status))
1756 pr_err("Error removing rfkill notify handler %s\n", node);
1759 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
1762 struct asus_wmi *asus = container_of(hotplug_slot,
1763 struct asus_wmi, hotplug_slot);
1764 int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1773 static const struct hotplug_slot_ops asus_hotplug_slot_ops = {
1774 .get_adapter_status = asus_get_adapter_status,
1775 .get_power_status = asus_get_adapter_status,
1778 static void asus_hotplug_work(struct work_struct *work)
1780 struct asus_wmi *asus;
1782 asus = container_of(work, struct asus_wmi, hotplug_work);
1783 asus_rfkill_hotplug(asus);
1786 static int asus_setup_pci_hotplug(struct asus_wmi *asus)
1789 struct pci_bus *bus = pci_find_bus(0, 1);
1792 pr_err("Unable to find wifi PCI bus\n");
1796 asus->hotplug_workqueue =
1797 create_singlethread_workqueue("hotplug_workqueue");
1798 if (!asus->hotplug_workqueue)
1799 goto error_workqueue;
1801 INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
1803 asus->hotplug_slot.ops = &asus_hotplug_slot_ops;
1805 ret = pci_hp_register(&asus->hotplug_slot, bus, 0, "asus-wifi");
1807 pr_err("Unable to register hotplug slot - %d\n", ret);
1808 goto error_register;
1814 asus->hotplug_slot.ops = NULL;
1815 destroy_workqueue(asus->hotplug_workqueue);
1823 static int asus_rfkill_set(void *data, bool blocked)
1825 struct asus_rfkill *priv = data;
1826 u32 ctrl_param = !blocked;
1827 u32 dev_id = priv->dev_id;
1830 * If the user bit is set, BIOS can't set and record the wlan status,
1831 * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
1832 * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
1833 * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
1834 * while setting the wlan status through WMI.
1835 * This is also the behavior that windows app will do.
1837 if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1838 priv->asus->driver->wlan_ctrl_by_user)
1839 dev_id = ASUS_WMI_DEVID_WLAN_LED;
1841 return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
1844 static void asus_rfkill_query(struct rfkill *rfkill, void *data)
1846 struct asus_rfkill *priv = data;
1849 result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
1854 rfkill_set_sw_state(priv->rfkill, !result);
1857 static int asus_rfkill_wlan_set(void *data, bool blocked)
1859 struct asus_rfkill *priv = data;
1860 struct asus_wmi *asus = priv->asus;
1864 * This handler is enabled only if hotplug is enabled.
1865 * In this case, the asus_wmi_set_devstate() will
1866 * trigger a wmi notification and we need to wait
1867 * this call to finish before being able to call
1870 mutex_lock(&asus->wmi_lock);
1871 ret = asus_rfkill_set(data, blocked);
1872 mutex_unlock(&asus->wmi_lock);
1876 static const struct rfkill_ops asus_rfkill_wlan_ops = {
1877 .set_block = asus_rfkill_wlan_set,
1878 .query = asus_rfkill_query,
1881 static const struct rfkill_ops asus_rfkill_ops = {
1882 .set_block = asus_rfkill_set,
1883 .query = asus_rfkill_query,
1886 static int asus_new_rfkill(struct asus_wmi *asus,
1887 struct asus_rfkill *arfkill,
1888 const char *name, enum rfkill_type type, int dev_id)
1890 int result = asus_wmi_get_devstate_simple(asus, dev_id);
1891 struct rfkill **rfkill = &arfkill->rfkill;
1896 arfkill->dev_id = dev_id;
1897 arfkill->asus = asus;
1899 if (dev_id == ASUS_WMI_DEVID_WLAN &&
1900 asus->driver->quirks->hotplug_wireless)
1901 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
1902 &asus_rfkill_wlan_ops, arfkill);
1904 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
1905 &asus_rfkill_ops, arfkill);
1910 if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1911 (asus->driver->quirks->wapf > 0))
1912 rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
1914 rfkill_init_sw_state(*rfkill, !result);
1915 result = rfkill_register(*rfkill);
1917 rfkill_destroy(*rfkill);
1924 static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
1926 if (asus->driver->wlan_ctrl_by_user && ashs_present())
1929 asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
1930 asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
1931 asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
1932 if (asus->wlan.rfkill) {
1933 rfkill_unregister(asus->wlan.rfkill);
1934 rfkill_destroy(asus->wlan.rfkill);
1935 asus->wlan.rfkill = NULL;
1938 * Refresh pci hotplug in case the rfkill state was changed after
1939 * asus_unregister_rfkill_notifier()
1941 asus_rfkill_hotplug(asus);
1942 if (asus->hotplug_slot.ops)
1943 pci_hp_deregister(&asus->hotplug_slot);
1944 if (asus->hotplug_workqueue)
1945 destroy_workqueue(asus->hotplug_workqueue);
1947 if (asus->bluetooth.rfkill) {
1948 rfkill_unregister(asus->bluetooth.rfkill);
1949 rfkill_destroy(asus->bluetooth.rfkill);
1950 asus->bluetooth.rfkill = NULL;
1952 if (asus->wimax.rfkill) {
1953 rfkill_unregister(asus->wimax.rfkill);
1954 rfkill_destroy(asus->wimax.rfkill);
1955 asus->wimax.rfkill = NULL;
1957 if (asus->wwan3g.rfkill) {
1958 rfkill_unregister(asus->wwan3g.rfkill);
1959 rfkill_destroy(asus->wwan3g.rfkill);
1960 asus->wwan3g.rfkill = NULL;
1962 if (asus->gps.rfkill) {
1963 rfkill_unregister(asus->gps.rfkill);
1964 rfkill_destroy(asus->gps.rfkill);
1965 asus->gps.rfkill = NULL;
1967 if (asus->uwb.rfkill) {
1968 rfkill_unregister(asus->uwb.rfkill);
1969 rfkill_destroy(asus->uwb.rfkill);
1970 asus->uwb.rfkill = NULL;
1974 static int asus_wmi_rfkill_init(struct asus_wmi *asus)
1978 mutex_init(&asus->hotplug_lock);
1979 mutex_init(&asus->wmi_lock);
1981 result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
1982 RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
1984 if (result && result != -ENODEV)
1987 result = asus_new_rfkill(asus, &asus->bluetooth,
1988 "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
1989 ASUS_WMI_DEVID_BLUETOOTH);
1991 if (result && result != -ENODEV)
1994 result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
1995 RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
1997 if (result && result != -ENODEV)
2000 result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
2001 RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
2003 if (result && result != -ENODEV)
2006 result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
2007 RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
2009 if (result && result != -ENODEV)
2012 result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
2013 RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
2015 if (result && result != -ENODEV)
2018 if (!asus->driver->quirks->hotplug_wireless)
2021 result = asus_setup_pci_hotplug(asus);
2023 * If we get -EBUSY then something else is handling the PCI hotplug -
2024 * don't fail in this case
2026 if (result == -EBUSY)
2029 asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
2030 asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
2031 asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
2033 * Refresh pci hotplug in case the rfkill state was changed during
2036 asus_rfkill_hotplug(asus);
2039 if (result && result != -ENODEV)
2040 asus_wmi_rfkill_exit(asus);
2042 if (result == -ENODEV)
2048 /* Panel Overdrive ************************************************************/
2049 static ssize_t panel_od_show(struct device *dev,
2050 struct device_attribute *attr, char *buf)
2052 struct asus_wmi *asus = dev_get_drvdata(dev);
2055 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_PANEL_OD);
2059 return sysfs_emit(buf, "%d\n", result);
2062 static ssize_t panel_od_store(struct device *dev,
2063 struct device_attribute *attr,
2064 const char *buf, size_t count)
2069 struct asus_wmi *asus = dev_get_drvdata(dev);
2071 result = kstrtou32(buf, 10, &overdrive);
2078 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PANEL_OD, overdrive, &result);
2081 pr_warn("Failed to set panel overdrive: %d\n", err);
2086 pr_warn("Failed to set panel overdrive (result): 0x%x\n", result);
2090 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "panel_od");
2094 static DEVICE_ATTR_RW(panel_od);
2096 /* Mini-LED mode **************************************************************/
2097 static ssize_t mini_led_mode_show(struct device *dev,
2098 struct device_attribute *attr, char *buf)
2100 struct asus_wmi *asus = dev_get_drvdata(dev);
2103 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
2107 return sysfs_emit(buf, "%d\n", result);
2110 static ssize_t mini_led_mode_store(struct device *dev,
2111 struct device_attribute *attr,
2112 const char *buf, size_t count)
2117 struct asus_wmi *asus = dev_get_drvdata(dev);
2119 result = kstrtou32(buf, 10, &mode);
2126 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MINI_LED_MODE, mode, &result);
2129 pr_warn("Failed to set mini-LED: %d\n", err);
2134 pr_warn("Failed to set mini-LED mode (result): 0x%x\n", result);
2138 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "mini_led_mode");
2142 static DEVICE_ATTR_RW(mini_led_mode);
2144 /* Quirks *********************************************************************/
2146 static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
2148 struct pci_dev *xhci_pdev;
2149 u32 orig_ports_available;
2150 u32 ports_available = asus->driver->quirks->xusb2pr;
2152 xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
2153 PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI,
2159 pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
2160 &orig_ports_available);
2162 pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
2163 cpu_to_le32(ports_available));
2165 pci_dev_put(xhci_pdev);
2167 pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
2168 orig_ports_available, ports_available);
2172 * Some devices dont support or have borcken get_als method
2173 * but still support set method.
2175 static void asus_wmi_set_als(void)
2177 asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE, 1, NULL);
2180 /* Hwmon device ***************************************************************/
2182 static int asus_agfn_fan_speed_read(struct asus_wmi *asus, int fan,
2185 struct agfn_fan_args args = {
2186 .agfn.len = sizeof(args),
2187 .agfn.mfun = ASUS_FAN_MFUN,
2188 .agfn.sfun = ASUS_FAN_SFUN_READ,
2192 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2198 status = asus_wmi_evaluate_method_agfn(input);
2200 if (status || args.agfn.err)
2204 *speed = args.speed;
2209 static int asus_agfn_fan_speed_write(struct asus_wmi *asus, int fan,
2212 struct agfn_fan_args args = {
2213 .agfn.len = sizeof(args),
2214 .agfn.mfun = ASUS_FAN_MFUN,
2215 .agfn.sfun = ASUS_FAN_SFUN_WRITE,
2217 .speed = speed ? *speed : 0,
2219 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2222 /* 1: for setting 1st fan's speed 0: setting auto mode */
2223 if (fan != 1 && fan != 0)
2226 status = asus_wmi_evaluate_method_agfn(input);
2228 if (status || args.agfn.err)
2231 if (speed && fan == 1)
2232 asus->agfn_pwm = *speed;
2238 * Check if we can read the speed of one fan. If true we assume we can also
2241 static bool asus_wmi_has_agfn_fan(struct asus_wmi *asus)
2247 status = asus_agfn_fan_speed_read(asus, 1, &speed);
2251 status = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
2256 * We need to find a better way, probably using sfun,
2258 * Currently we disable it if:
2259 * - ASUS_WMI_UNSUPPORTED_METHOD is returned
2260 * - reverved bits are non-zero
2261 * - sfun and presence bit are not set
2263 return !(value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
2264 || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)));
2267 static int asus_fan_set_auto(struct asus_wmi *asus)
2272 switch (asus->fan_type) {
2273 case FAN_TYPE_SPEC83:
2274 status = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
2284 status = asus_agfn_fan_speed_write(asus, 0, NULL);
2294 * Modern models like the G713 also have GPU fan control (this is not AGFN)
2296 if (asus->gpu_fan_type == FAN_TYPE_SPEC83) {
2297 status = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
2309 static ssize_t pwm1_show(struct device *dev,
2310 struct device_attribute *attr,
2313 struct asus_wmi *asus = dev_get_drvdata(dev);
2317 /* If we already set a value then just return it */
2318 if (asus->agfn_pwm >= 0)
2319 return sprintf(buf, "%d\n", asus->agfn_pwm);
2322 * If we haven't set already set a value through the AGFN interface,
2323 * we read a current value through the (now-deprecated) FAN_CTRL device.
2325 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
2331 if (value == 1) /* Low Speed */
2333 else if (value == 2)
2335 else if (value == 3)
2338 pr_err("Unknown fan speed %#x\n", value);
2342 return sysfs_emit(buf, "%d\n", value);
2345 static ssize_t pwm1_store(struct device *dev,
2346 struct device_attribute *attr,
2347 const char *buf, size_t count) {
2348 struct asus_wmi *asus = dev_get_drvdata(dev);
2353 ret = kstrtouint(buf, 10, &value);
2357 value = clamp(value, 0, 255);
2359 state = asus_agfn_fan_speed_write(asus, 1, &value);
2361 pr_warn("Setting fan speed failed: %d\n", state);
2363 asus->fan_pwm_mode = ASUS_FAN_CTRL_MANUAL;
2368 static ssize_t fan1_input_show(struct device *dev,
2369 struct device_attribute *attr,
2372 struct asus_wmi *asus = dev_get_drvdata(dev);
2376 switch (asus->fan_type) {
2377 case FAN_TYPE_SPEC83:
2378 ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL,
2387 /* no speed readable on manual mode */
2388 if (asus->fan_pwm_mode == ASUS_FAN_CTRL_MANUAL)
2391 ret = asus_agfn_fan_speed_read(asus, 1, &value);
2393 pr_warn("reading fan speed failed: %d\n", ret);
2402 return sysfs_emit(buf, "%d\n", value < 0 ? -1 : value * 100);
2405 static ssize_t pwm1_enable_show(struct device *dev,
2406 struct device_attribute *attr,
2409 struct asus_wmi *asus = dev_get_drvdata(dev);
2412 * Just read back the cached pwm mode.
2414 * For the CPU_FAN device, the spec indicates that we should be
2415 * able to read the device status and consult bit 19 to see if we
2416 * are in Full On or Automatic mode. However, this does not work
2417 * in practice on X532FL at least (the bit is always 0) and there's
2418 * also nothing in the DSDT to indicate that this behaviour exists.
2420 return sysfs_emit(buf, "%d\n", asus->fan_pwm_mode);
2423 static ssize_t pwm1_enable_store(struct device *dev,
2424 struct device_attribute *attr,
2425 const char *buf, size_t count)
2427 struct asus_wmi *asus = dev_get_drvdata(dev);
2434 ret = kstrtouint(buf, 10, &state);
2438 if (asus->fan_type == FAN_TYPE_SPEC83) {
2439 switch (state) { /* standard documented hwmon values */
2440 case ASUS_FAN_CTRL_FULLSPEED:
2443 case ASUS_FAN_CTRL_AUTO:
2450 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
2457 } else if (asus->fan_type == FAN_TYPE_AGFN) {
2459 case ASUS_FAN_CTRL_MANUAL:
2462 case ASUS_FAN_CTRL_AUTO:
2463 status = asus_fan_set_auto(asus);
2473 asus->fan_pwm_mode = state;
2475 /* Must set to disabled if mode is toggled */
2476 if (asus->cpu_fan_curve_available)
2477 asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
2478 if (asus->gpu_fan_curve_available)
2479 asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
2480 if (asus->mid_fan_curve_available)
2481 asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
2486 static ssize_t fan1_label_show(struct device *dev,
2487 struct device_attribute *attr,
2490 return sysfs_emit(buf, "%s\n", ASUS_FAN_DESC);
2493 static ssize_t asus_hwmon_temp1(struct device *dev,
2494 struct device_attribute *attr,
2497 struct asus_wmi *asus = dev_get_drvdata(dev);
2501 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
2505 return sprintf(buf, "%ld\n",
2506 deci_kelvin_to_millicelsius(value & 0xFFFF));
2509 /* GPU fan on modern ROG laptops */
2510 static ssize_t fan2_input_show(struct device *dev,
2511 struct device_attribute *attr,
2514 struct asus_wmi *asus = dev_get_drvdata(dev);
2518 ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL, &value);
2524 return sysfs_emit(buf, "%d\n", value * 100);
2527 static ssize_t fan2_label_show(struct device *dev,
2528 struct device_attribute *attr,
2531 return sysfs_emit(buf, "%s\n", ASUS_GPU_FAN_DESC);
2534 /* Middle/Center fan on modern ROG laptops */
2535 static ssize_t fan3_input_show(struct device *dev,
2536 struct device_attribute *attr,
2539 struct asus_wmi *asus = dev_get_drvdata(dev);
2543 ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_MID_FAN_CTRL, &value);
2549 return sysfs_emit(buf, "%d\n", value * 100);
2552 static ssize_t fan3_label_show(struct device *dev,
2553 struct device_attribute *attr,
2556 return sysfs_emit(buf, "%s\n", ASUS_MID_FAN_DESC);
2559 static ssize_t pwm2_enable_show(struct device *dev,
2560 struct device_attribute *attr,
2563 struct asus_wmi *asus = dev_get_drvdata(dev);
2565 return sysfs_emit(buf, "%d\n", asus->gpu_fan_pwm_mode);
2568 static ssize_t pwm2_enable_store(struct device *dev,
2569 struct device_attribute *attr,
2570 const char *buf, size_t count)
2572 struct asus_wmi *asus = dev_get_drvdata(dev);
2578 ret = kstrtouint(buf, 10, &state);
2582 switch (state) { /* standard documented hwmon values */
2583 case ASUS_FAN_CTRL_FULLSPEED:
2586 case ASUS_FAN_CTRL_AUTO:
2593 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
2601 asus->gpu_fan_pwm_mode = state;
2605 static ssize_t pwm3_enable_show(struct device *dev,
2606 struct device_attribute *attr,
2609 struct asus_wmi *asus = dev_get_drvdata(dev);
2611 return sysfs_emit(buf, "%d\n", asus->mid_fan_pwm_mode);
2614 static ssize_t pwm3_enable_store(struct device *dev,
2615 struct device_attribute *attr,
2616 const char *buf, size_t count)
2618 struct asus_wmi *asus = dev_get_drvdata(dev);
2624 ret = kstrtouint(buf, 10, &state);
2628 switch (state) { /* standard documented hwmon values */
2629 case ASUS_FAN_CTRL_FULLSPEED:
2632 case ASUS_FAN_CTRL_AUTO:
2639 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_MID_FAN_CTRL,
2647 asus->mid_fan_pwm_mode = state;
2652 static DEVICE_ATTR_RW(pwm1);
2653 static DEVICE_ATTR_RW(pwm1_enable);
2654 static DEVICE_ATTR_RO(fan1_input);
2655 static DEVICE_ATTR_RO(fan1_label);
2656 /* Fan2 - GPU fan */
2657 static DEVICE_ATTR_RW(pwm2_enable);
2658 static DEVICE_ATTR_RO(fan2_input);
2659 static DEVICE_ATTR_RO(fan2_label);
2660 /* Fan3 - Middle/center fan */
2661 static DEVICE_ATTR_RW(pwm3_enable);
2662 static DEVICE_ATTR_RO(fan3_input);
2663 static DEVICE_ATTR_RO(fan3_label);
2666 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
2668 static struct attribute *hwmon_attributes[] = {
2669 &dev_attr_pwm1.attr,
2670 &dev_attr_pwm1_enable.attr,
2671 &dev_attr_pwm2_enable.attr,
2672 &dev_attr_pwm3_enable.attr,
2673 &dev_attr_fan1_input.attr,
2674 &dev_attr_fan1_label.attr,
2675 &dev_attr_fan2_input.attr,
2676 &dev_attr_fan2_label.attr,
2677 &dev_attr_fan3_input.attr,
2678 &dev_attr_fan3_label.attr,
2680 &dev_attr_temp1_input.attr,
2684 static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
2685 struct attribute *attr, int idx)
2687 struct device *dev = kobj_to_dev(kobj);
2688 struct asus_wmi *asus = dev_get_drvdata(dev->parent);
2689 u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
2691 if (attr == &dev_attr_pwm1.attr) {
2692 if (asus->fan_type != FAN_TYPE_AGFN)
2694 } else if (attr == &dev_attr_fan1_input.attr
2695 || attr == &dev_attr_fan1_label.attr
2696 || attr == &dev_attr_pwm1_enable.attr) {
2697 if (asus->fan_type == FAN_TYPE_NONE)
2699 } else if (attr == &dev_attr_fan2_input.attr
2700 || attr == &dev_attr_fan2_label.attr
2701 || attr == &dev_attr_pwm2_enable.attr) {
2702 if (asus->gpu_fan_type == FAN_TYPE_NONE)
2704 } else if (attr == &dev_attr_fan3_input.attr
2705 || attr == &dev_attr_fan3_label.attr
2706 || attr == &dev_attr_pwm3_enable.attr) {
2707 if (asus->mid_fan_type == FAN_TYPE_NONE)
2709 } else if (attr == &dev_attr_temp1_input.attr) {
2710 int err = asus_wmi_get_devstate(asus,
2711 ASUS_WMI_DEVID_THERMAL_CTRL,
2715 return 0; /* can't return negative here */
2718 * If the temperature value in deci-Kelvin is near the absolute
2719 * zero temperature, something is clearly wrong
2721 if (value == 0 || value == 1)
2728 static const struct attribute_group hwmon_attribute_group = {
2729 .is_visible = asus_hwmon_sysfs_is_visible,
2730 .attrs = hwmon_attributes
2732 __ATTRIBUTE_GROUPS(hwmon_attribute);
2734 static int asus_wmi_hwmon_init(struct asus_wmi *asus)
2736 struct device *dev = &asus->platform_device->dev;
2737 struct device *hwmon;
2739 hwmon = devm_hwmon_device_register_with_groups(dev, "asus", asus,
2740 hwmon_attribute_groups);
2742 if (IS_ERR(hwmon)) {
2743 pr_err("Could not register asus hwmon device\n");
2744 return PTR_ERR(hwmon);
2749 static int asus_wmi_fan_init(struct asus_wmi *asus)
2751 asus->gpu_fan_type = FAN_TYPE_NONE;
2752 asus->mid_fan_type = FAN_TYPE_NONE;
2753 asus->fan_type = FAN_TYPE_NONE;
2754 asus->agfn_pwm = -1;
2756 if (asus->driver->quirks->wmi_ignore_fan)
2757 asus->fan_type = FAN_TYPE_NONE;
2758 else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))
2759 asus->fan_type = FAN_TYPE_SPEC83;
2760 else if (asus_wmi_has_agfn_fan(asus))
2761 asus->fan_type = FAN_TYPE_AGFN;
2763 /* Modern models like G713 also have GPU fan control */
2764 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL))
2765 asus->gpu_fan_type = FAN_TYPE_SPEC83;
2767 /* Some models also have a center/middle fan */
2768 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MID_FAN_CTRL))
2769 asus->mid_fan_type = FAN_TYPE_SPEC83;
2771 if (asus->fan_type == FAN_TYPE_NONE)
2774 asus_fan_set_auto(asus);
2775 asus->fan_pwm_mode = ASUS_FAN_CTRL_AUTO;
2779 /* Fan mode *******************************************************************/
2781 static int fan_boost_mode_check_present(struct asus_wmi *asus)
2786 asus->fan_boost_mode_available = false;
2788 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE,
2797 if ((result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
2798 (result & ASUS_FAN_BOOST_MODES_MASK)) {
2799 asus->fan_boost_mode_available = true;
2800 asus->fan_boost_mode_mask = result & ASUS_FAN_BOOST_MODES_MASK;
2806 static int fan_boost_mode_write(struct asus_wmi *asus)
2812 value = asus->fan_boost_mode;
2814 pr_info("Set fan boost mode: %u\n", value);
2815 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value,
2818 sysfs_notify(&asus->platform_device->dev.kobj, NULL,
2822 pr_warn("Failed to set fan boost mode: %d\n", err);
2827 pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
2835 static int fan_boost_mode_switch_next(struct asus_wmi *asus)
2837 u8 mask = asus->fan_boost_mode_mask;
2839 if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_NORMAL) {
2840 if (mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK)
2841 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST;
2842 else if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
2843 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
2844 } else if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
2845 if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
2846 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
2848 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
2850 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
2853 return fan_boost_mode_write(asus);
2856 static ssize_t fan_boost_mode_show(struct device *dev,
2857 struct device_attribute *attr, char *buf)
2859 struct asus_wmi *asus = dev_get_drvdata(dev);
2861 return sysfs_emit(buf, "%d\n", asus->fan_boost_mode);
2864 static ssize_t fan_boost_mode_store(struct device *dev,
2865 struct device_attribute *attr,
2866 const char *buf, size_t count)
2868 struct asus_wmi *asus = dev_get_drvdata(dev);
2869 u8 mask = asus->fan_boost_mode_mask;
2873 result = kstrtou8(buf, 10, &new_mode);
2875 pr_warn("Trying to store invalid value\n");
2879 if (new_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
2880 if (!(mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK))
2882 } else if (new_mode == ASUS_FAN_BOOST_MODE_SILENT) {
2883 if (!(mask & ASUS_FAN_BOOST_MODE_SILENT_MASK))
2885 } else if (new_mode != ASUS_FAN_BOOST_MODE_NORMAL) {
2889 asus->fan_boost_mode = new_mode;
2890 fan_boost_mode_write(asus);
2895 // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
2896 static DEVICE_ATTR_RW(fan_boost_mode);
2898 /* Custom fan curves **********************************************************/
2900 static void fan_curve_copy_from_buf(struct fan_curve_data *data, u8 *buf)
2904 for (i = 0; i < FAN_CURVE_POINTS; i++) {
2905 data->temps[i] = buf[i];
2908 for (i = 0; i < FAN_CURVE_POINTS; i++) {
2910 255 * buf[i + FAN_CURVE_POINTS] / 100;
2914 static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev)
2916 struct fan_curve_data *curves;
2917 u8 buf[FAN_CURVE_BUF_LEN];
2921 if (asus->throttle_thermal_policy_available)
2922 mode = asus->throttle_thermal_policy_mode;
2923 /* DEVID_<C/G>PU_FAN_CURVE is switched for OVERBOOST vs SILENT */
2929 err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf,
2932 pr_warn("%s (0x%08x) failed: %d\n", __func__, fan_dev, err);
2936 fan_idx = FAN_CURVE_DEV_CPU;
2937 if (fan_dev == ASUS_WMI_DEVID_GPU_FAN_CURVE)
2938 fan_idx = FAN_CURVE_DEV_GPU;
2940 if (fan_dev == ASUS_WMI_DEVID_MID_FAN_CURVE)
2941 fan_idx = FAN_CURVE_DEV_MID;
2943 curves = &asus->custom_fan_curves[fan_idx];
2944 curves->device_id = fan_dev;
2946 fan_curve_copy_from_buf(curves, buf);
2950 /* Check if capability exists, and populate defaults */
2951 static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
2958 if (asus->fan_type == FAN_TYPE_NONE)
2961 err = fan_curve_get_factory_default(asus, fan_dev);
2970 /* Determine which fan the attribute is for if SENSOR_ATTR */
2971 static struct fan_curve_data *fan_curve_attr_select(struct asus_wmi *asus,
2972 struct device_attribute *attr)
2974 int index = to_sensor_dev_attr(attr)->index;
2976 return &asus->custom_fan_curves[index];
2979 /* Determine which fan the attribute is for if SENSOR_ATTR_2 */
2980 static struct fan_curve_data *fan_curve_attr_2_select(struct asus_wmi *asus,
2981 struct device_attribute *attr)
2983 int nr = to_sensor_dev_attr_2(attr)->nr;
2985 return &asus->custom_fan_curves[nr & ~FAN_CURVE_PWM_MASK];
2988 static ssize_t fan_curve_show(struct device *dev,
2989 struct device_attribute *attr, char *buf)
2991 struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
2992 struct asus_wmi *asus = dev_get_drvdata(dev);
2993 struct fan_curve_data *data;
2994 int value, pwm, index;
2996 data = fan_curve_attr_2_select(asus, attr);
2997 pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
2998 index = dev_attr->index;
3001 value = data->percents[index];
3003 value = data->temps[index];
3005 return sysfs_emit(buf, "%d\n", value);
3009 * "fan_dev" is the related WMI method such as ASUS_WMI_DEVID_CPU_FAN_CURVE.
3011 static int fan_curve_write(struct asus_wmi *asus,
3012 struct fan_curve_data *data)
3014 u32 arg1 = 0, arg2 = 0, arg3 = 0, arg4 = 0;
3015 u8 *percents = data->percents;
3016 u8 *temps = data->temps;
3017 int ret, i, shift = 0;
3022 for (i = 0; i < FAN_CURVE_POINTS / 2; i++) {
3023 arg1 += (temps[i]) << shift;
3024 arg2 += (temps[i + 4]) << shift;
3025 /* Scale to percentage for device */
3026 arg3 += (100 * percents[i] / 255) << shift;
3027 arg4 += (100 * percents[i + 4] / 255) << shift;
3031 return asus_wmi_evaluate_method5(ASUS_WMI_METHODID_DEVS,
3033 arg1, arg2, arg3, arg4, &ret);
3036 static ssize_t fan_curve_store(struct device *dev,
3037 struct device_attribute *attr, const char *buf,
3040 struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
3041 struct asus_wmi *asus = dev_get_drvdata(dev);
3042 struct fan_curve_data *data;
3043 int err, pwm, index;
3046 data = fan_curve_attr_2_select(asus, attr);
3047 pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
3048 index = dev_attr->index;
3050 err = kstrtou8(buf, 10, &value);
3055 data->percents[index] = value;
3057 data->temps[index] = value;
3060 * Mark as disabled so the user has to explicitly enable to apply a
3061 * changed fan curve. This prevents potential lockups from writing out
3062 * many changes as one-write-per-change.
3064 data->enabled = false;
3069 static ssize_t fan_curve_enable_show(struct device *dev,
3070 struct device_attribute *attr, char *buf)
3072 struct asus_wmi *asus = dev_get_drvdata(dev);
3073 struct fan_curve_data *data;
3076 data = fan_curve_attr_select(asus, attr);
3081 return sysfs_emit(buf, "%d\n", out);
3084 static ssize_t fan_curve_enable_store(struct device *dev,
3085 struct device_attribute *attr,
3086 const char *buf, size_t count)
3088 struct asus_wmi *asus = dev_get_drvdata(dev);
3089 struct fan_curve_data *data;
3092 data = fan_curve_attr_select(asus, attr);
3094 err = kstrtoint(buf, 10, &value);
3100 data->enabled = true;
3103 data->enabled = false;
3106 * Auto + reset the fan curve data to defaults. Make it an explicit
3107 * option so that users don't accidentally overwrite a set fan curve.
3110 err = fan_curve_get_factory_default(asus, data->device_id);
3113 data->enabled = false;
3119 if (data->enabled) {
3120 err = fan_curve_write(asus, data);
3125 * For machines with throttle this is the only way to reset fans
3126 * to default mode of operation (does not erase curve data).
3128 if (asus->throttle_thermal_policy_available) {
3129 err = throttle_thermal_policy_write(asus);
3132 /* Similar is true for laptops with this fan */
3133 } else if (asus->fan_type == FAN_TYPE_SPEC83) {
3134 err = asus_fan_set_auto(asus);
3138 /* Safeguard against fautly ACPI tables */
3139 err = fan_curve_get_factory_default(asus, data->device_id);
3142 err = fan_curve_write(asus, data);
3151 static SENSOR_DEVICE_ATTR_RW(pwm1_enable, fan_curve_enable, FAN_CURVE_DEV_CPU);
3152 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_temp, fan_curve,
3153 FAN_CURVE_DEV_CPU, 0);
3154 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_temp, fan_curve,
3155 FAN_CURVE_DEV_CPU, 1);
3156 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_temp, fan_curve,
3157 FAN_CURVE_DEV_CPU, 2);
3158 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_temp, fan_curve,
3159 FAN_CURVE_DEV_CPU, 3);
3160 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_temp, fan_curve,
3161 FAN_CURVE_DEV_CPU, 4);
3162 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_temp, fan_curve,
3163 FAN_CURVE_DEV_CPU, 5);
3164 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_temp, fan_curve,
3165 FAN_CURVE_DEV_CPU, 6);
3166 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp, fan_curve,
3167 FAN_CURVE_DEV_CPU, 7);
3169 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_pwm, fan_curve,
3170 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 0);
3171 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_pwm, fan_curve,
3172 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 1);
3173 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_pwm, fan_curve,
3174 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 2);
3175 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_pwm, fan_curve,
3176 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 3);
3177 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_pwm, fan_curve,
3178 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 4);
3179 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_pwm, fan_curve,
3180 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 5);
3181 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_pwm, fan_curve,
3182 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 6);
3183 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_pwm, fan_curve,
3184 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 7);
3187 static SENSOR_DEVICE_ATTR_RW(pwm2_enable, fan_curve_enable, FAN_CURVE_DEV_GPU);
3188 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_temp, fan_curve,
3189 FAN_CURVE_DEV_GPU, 0);
3190 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_temp, fan_curve,
3191 FAN_CURVE_DEV_GPU, 1);
3192 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_temp, fan_curve,
3193 FAN_CURVE_DEV_GPU, 2);
3194 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_temp, fan_curve,
3195 FAN_CURVE_DEV_GPU, 3);
3196 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_temp, fan_curve,
3197 FAN_CURVE_DEV_GPU, 4);
3198 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_temp, fan_curve,
3199 FAN_CURVE_DEV_GPU, 5);
3200 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_temp, fan_curve,
3201 FAN_CURVE_DEV_GPU, 6);
3202 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_temp, fan_curve,
3203 FAN_CURVE_DEV_GPU, 7);
3205 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_pwm, fan_curve,
3206 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 0);
3207 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_pwm, fan_curve,
3208 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 1);
3209 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_pwm, fan_curve,
3210 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 2);
3211 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_pwm, fan_curve,
3212 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 3);
3213 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_pwm, fan_curve,
3214 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 4);
3215 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_pwm, fan_curve,
3216 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 5);
3217 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm, fan_curve,
3218 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 6);
3219 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve,
3220 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7);
3223 static SENSOR_DEVICE_ATTR_RW(pwm3_enable, fan_curve_enable, FAN_CURVE_DEV_MID);
3224 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_temp, fan_curve,
3225 FAN_CURVE_DEV_MID, 0);
3226 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_temp, fan_curve,
3227 FAN_CURVE_DEV_MID, 1);
3228 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_temp, fan_curve,
3229 FAN_CURVE_DEV_MID, 2);
3230 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_temp, fan_curve,
3231 FAN_CURVE_DEV_MID, 3);
3232 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_temp, fan_curve,
3233 FAN_CURVE_DEV_MID, 4);
3234 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_temp, fan_curve,
3235 FAN_CURVE_DEV_MID, 5);
3236 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_temp, fan_curve,
3237 FAN_CURVE_DEV_MID, 6);
3238 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_temp, fan_curve,
3239 FAN_CURVE_DEV_MID, 7);
3241 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_pwm, fan_curve,
3242 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 0);
3243 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_pwm, fan_curve,
3244 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 1);
3245 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_pwm, fan_curve,
3246 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 2);
3247 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_pwm, fan_curve,
3248 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 3);
3249 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_pwm, fan_curve,
3250 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 4);
3251 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_pwm, fan_curve,
3252 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 5);
3253 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_pwm, fan_curve,
3254 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 6);
3255 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_pwm, fan_curve,
3256 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 7);
3258 static struct attribute *asus_fan_curve_attr[] = {
3260 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
3261 &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
3262 &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
3263 &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
3264 &sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
3265 &sensor_dev_attr_pwm1_auto_point5_temp.dev_attr.attr,
3266 &sensor_dev_attr_pwm1_auto_point6_temp.dev_attr.attr,
3267 &sensor_dev_attr_pwm1_auto_point7_temp.dev_attr.attr,
3268 &sensor_dev_attr_pwm1_auto_point8_temp.dev_attr.attr,
3269 &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
3270 &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
3271 &sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
3272 &sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
3273 &sensor_dev_attr_pwm1_auto_point5_pwm.dev_attr.attr,
3274 &sensor_dev_attr_pwm1_auto_point6_pwm.dev_attr.attr,
3275 &sensor_dev_attr_pwm1_auto_point7_pwm.dev_attr.attr,
3276 &sensor_dev_attr_pwm1_auto_point8_pwm.dev_attr.attr,
3278 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
3279 &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
3280 &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
3281 &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
3282 &sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
3283 &sensor_dev_attr_pwm2_auto_point5_temp.dev_attr.attr,
3284 &sensor_dev_attr_pwm2_auto_point6_temp.dev_attr.attr,
3285 &sensor_dev_attr_pwm2_auto_point7_temp.dev_attr.attr,
3286 &sensor_dev_attr_pwm2_auto_point8_temp.dev_attr.attr,
3287 &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
3288 &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
3289 &sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
3290 &sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
3291 &sensor_dev_attr_pwm2_auto_point5_pwm.dev_attr.attr,
3292 &sensor_dev_attr_pwm2_auto_point6_pwm.dev_attr.attr,
3293 &sensor_dev_attr_pwm2_auto_point7_pwm.dev_attr.attr,
3294 &sensor_dev_attr_pwm2_auto_point8_pwm.dev_attr.attr,
3296 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
3297 &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
3298 &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
3299 &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
3300 &sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
3301 &sensor_dev_attr_pwm3_auto_point5_temp.dev_attr.attr,
3302 &sensor_dev_attr_pwm3_auto_point6_temp.dev_attr.attr,
3303 &sensor_dev_attr_pwm3_auto_point7_temp.dev_attr.attr,
3304 &sensor_dev_attr_pwm3_auto_point8_temp.dev_attr.attr,
3305 &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
3306 &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
3307 &sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
3308 &sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
3309 &sensor_dev_attr_pwm3_auto_point5_pwm.dev_attr.attr,
3310 &sensor_dev_attr_pwm3_auto_point6_pwm.dev_attr.attr,
3311 &sensor_dev_attr_pwm3_auto_point7_pwm.dev_attr.attr,
3312 &sensor_dev_attr_pwm3_auto_point8_pwm.dev_attr.attr,
3316 static umode_t asus_fan_curve_is_visible(struct kobject *kobj,
3317 struct attribute *attr, int idx)
3319 struct device *dev = kobj_to_dev(kobj);
3320 struct asus_wmi *asus = dev_get_drvdata(dev->parent);
3323 * Check the char instead of casting attr as there are two attr types
3324 * involved here (attr1 and attr2)
3326 if (asus->cpu_fan_curve_available && attr->name[3] == '1')
3329 if (asus->gpu_fan_curve_available && attr->name[3] == '2')
3332 if (asus->mid_fan_curve_available && attr->name[3] == '3')
3338 static const struct attribute_group asus_fan_curve_attr_group = {
3339 .is_visible = asus_fan_curve_is_visible,
3340 .attrs = asus_fan_curve_attr,
3342 __ATTRIBUTE_GROUPS(asus_fan_curve_attr);
3345 * Must be initialised after throttle_thermal_policy_check_present() as
3346 * we check the status of throttle_thermal_policy_available during init.
3348 static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
3350 struct device *dev = &asus->platform_device->dev;
3351 struct device *hwmon;
3354 err = fan_curve_check_present(asus, &asus->cpu_fan_curve_available,
3355 ASUS_WMI_DEVID_CPU_FAN_CURVE);
3359 err = fan_curve_check_present(asus, &asus->gpu_fan_curve_available,
3360 ASUS_WMI_DEVID_GPU_FAN_CURVE);
3364 err = fan_curve_check_present(asus, &asus->mid_fan_curve_available,
3365 ASUS_WMI_DEVID_MID_FAN_CURVE);
3369 if (!asus->cpu_fan_curve_available
3370 && !asus->gpu_fan_curve_available
3371 && !asus->mid_fan_curve_available)
3374 hwmon = devm_hwmon_device_register_with_groups(
3375 dev, "asus_custom_fan_curve", asus, asus_fan_curve_attr_groups);
3377 if (IS_ERR(hwmon)) {
3379 "Could not register asus_custom_fan_curve device\n");
3380 return PTR_ERR(hwmon);
3386 /* Throttle thermal policy ****************************************************/
3388 static int throttle_thermal_policy_check_present(struct asus_wmi *asus)
3393 asus->throttle_thermal_policy_available = false;
3395 err = asus_wmi_get_devstate(asus,
3396 ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
3404 if (result & ASUS_WMI_DSTS_PRESENCE_BIT)
3405 asus->throttle_thermal_policy_available = true;
3410 static int throttle_thermal_policy_write(struct asus_wmi *asus)
3416 value = asus->throttle_thermal_policy_mode;
3418 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
3421 sysfs_notify(&asus->platform_device->dev.kobj, NULL,
3422 "throttle_thermal_policy");
3425 pr_warn("Failed to set throttle thermal policy: %d\n", err);
3430 pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n",
3435 /* Must set to disabled if mode is toggled */
3436 if (asus->cpu_fan_curve_available)
3437 asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
3438 if (asus->gpu_fan_curve_available)
3439 asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
3440 if (asus->mid_fan_curve_available)
3441 asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
3446 static int throttle_thermal_policy_set_default(struct asus_wmi *asus)
3448 if (!asus->throttle_thermal_policy_available)
3451 asus->throttle_thermal_policy_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3452 return throttle_thermal_policy_write(asus);
3455 static int throttle_thermal_policy_switch_next(struct asus_wmi *asus)
3457 u8 new_mode = asus->throttle_thermal_policy_mode + 1;
3460 if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
3461 new_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3463 asus->throttle_thermal_policy_mode = new_mode;
3464 err = throttle_thermal_policy_write(asus);
3469 * Ensure that platform_profile updates userspace with the change to ensure
3470 * that platform_profile and throttle_thermal_policy_mode are in sync.
3472 platform_profile_notify();
3477 static ssize_t throttle_thermal_policy_show(struct device *dev,
3478 struct device_attribute *attr, char *buf)
3480 struct asus_wmi *asus = dev_get_drvdata(dev);
3481 u8 mode = asus->throttle_thermal_policy_mode;
3483 return sysfs_emit(buf, "%d\n", mode);
3486 static ssize_t throttle_thermal_policy_store(struct device *dev,
3487 struct device_attribute *attr,
3488 const char *buf, size_t count)
3490 struct asus_wmi *asus = dev_get_drvdata(dev);
3495 result = kstrtou8(buf, 10, &new_mode);
3499 if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
3502 asus->throttle_thermal_policy_mode = new_mode;
3503 err = throttle_thermal_policy_write(asus);
3508 * Ensure that platform_profile updates userspace with the change to ensure
3509 * that platform_profile and throttle_thermal_policy_mode are in sync.
3511 platform_profile_notify();
3516 // Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
3517 static DEVICE_ATTR_RW(throttle_thermal_policy);
3519 /* Platform profile ***********************************************************/
3520 static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
3521 enum platform_profile_option *profile)
3523 struct asus_wmi *asus;
3526 asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
3528 tp = asus->throttle_thermal_policy_mode;
3531 case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
3532 *profile = PLATFORM_PROFILE_BALANCED;
3534 case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
3535 *profile = PLATFORM_PROFILE_PERFORMANCE;
3537 case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
3538 *profile = PLATFORM_PROFILE_QUIET;
3547 static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,
3548 enum platform_profile_option profile)
3550 struct asus_wmi *asus;
3553 asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
3556 case PLATFORM_PROFILE_PERFORMANCE:
3557 tp = ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST;
3559 case PLATFORM_PROFILE_BALANCED:
3560 tp = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3562 case PLATFORM_PROFILE_QUIET:
3563 tp = ASUS_THROTTLE_THERMAL_POLICY_SILENT;
3569 asus->throttle_thermal_policy_mode = tp;
3570 return throttle_thermal_policy_write(asus);
3573 static int platform_profile_setup(struct asus_wmi *asus)
3575 struct device *dev = &asus->platform_device->dev;
3579 * Not an error if a component platform_profile relies on is unavailable
3580 * so early return, skipping the setup of platform_profile.
3582 if (!asus->throttle_thermal_policy_available)
3585 dev_info(dev, "Using throttle_thermal_policy for platform_profile support\n");
3587 asus->platform_profile_handler.profile_get = asus_wmi_platform_profile_get;
3588 asus->platform_profile_handler.profile_set = asus_wmi_platform_profile_set;
3590 set_bit(PLATFORM_PROFILE_QUIET, asus->platform_profile_handler.choices);
3591 set_bit(PLATFORM_PROFILE_BALANCED,
3592 asus->platform_profile_handler.choices);
3593 set_bit(PLATFORM_PROFILE_PERFORMANCE,
3594 asus->platform_profile_handler.choices);
3596 err = platform_profile_register(&asus->platform_profile_handler);
3600 asus->platform_profile_support = true;
3604 /* Backlight ******************************************************************/
3606 static int read_backlight_power(struct asus_wmi *asus)
3610 if (asus->driver->quirks->store_backlight_power)
3611 ret = !asus->driver->panel_power;
3613 ret = asus_wmi_get_devstate_simple(asus,
3614 ASUS_WMI_DEVID_BACKLIGHT);
3619 return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
3622 static int read_brightness_max(struct asus_wmi *asus)
3627 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
3631 retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
3640 static int read_brightness(struct backlight_device *bd)
3642 struct asus_wmi *asus = bl_get_data(bd);
3646 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
3650 return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
3653 static u32 get_scalar_command(struct backlight_device *bd)
3655 struct asus_wmi *asus = bl_get_data(bd);
3658 if ((asus->driver->brightness < bd->props.brightness) ||
3659 bd->props.brightness == bd->props.max_brightness)
3660 ctrl_param = 0x00008001;
3661 else if ((asus->driver->brightness > bd->props.brightness) ||
3662 bd->props.brightness == 0)
3663 ctrl_param = 0x00008000;
3665 asus->driver->brightness = bd->props.brightness;
3670 static int update_bl_status(struct backlight_device *bd)
3672 struct asus_wmi *asus = bl_get_data(bd);
3676 power = read_backlight_power(asus);
3677 if (power != -ENODEV && bd->props.power != power) {
3678 ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
3679 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
3681 if (asus->driver->quirks->store_backlight_power)
3682 asus->driver->panel_power = bd->props.power;
3684 /* When using scalar brightness, updating the brightness
3685 * will mess with the backlight power */
3686 if (asus->driver->quirks->scalar_panel_brightness)
3690 if (asus->driver->quirks->scalar_panel_brightness)
3691 ctrl_param = get_scalar_command(bd);
3693 ctrl_param = bd->props.brightness;
3695 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
3701 static const struct backlight_ops asus_wmi_bl_ops = {
3702 .get_brightness = read_brightness,
3703 .update_status = update_bl_status,
3706 static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
3708 struct backlight_device *bd = asus->backlight_device;
3709 int old = bd->props.brightness;
3712 if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
3713 new = code - NOTIFY_BRNUP_MIN + 1;
3714 else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
3715 new = code - NOTIFY_BRNDOWN_MIN;
3717 bd->props.brightness = new;
3718 backlight_update_status(bd);
3719 backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
3724 static int asus_wmi_backlight_init(struct asus_wmi *asus)
3726 struct backlight_device *bd;
3727 struct backlight_properties props;
3731 max = read_brightness_max(asus);
3735 power = read_backlight_power(asus);
3736 if (power == -ENODEV)
3737 power = FB_BLANK_UNBLANK;
3741 memset(&props, 0, sizeof(struct backlight_properties));
3742 props.type = BACKLIGHT_PLATFORM;
3743 props.max_brightness = max;
3744 bd = backlight_device_register(asus->driver->name,
3745 &asus->platform_device->dev, asus,
3746 &asus_wmi_bl_ops, &props);
3748 pr_err("Could not register backlight device\n");
3752 asus->backlight_device = bd;
3754 if (asus->driver->quirks->store_backlight_power)
3755 asus->driver->panel_power = power;
3757 bd->props.brightness = read_brightness(bd);
3758 bd->props.power = power;
3759 backlight_update_status(bd);
3761 asus->driver->brightness = bd->props.brightness;
3766 static void asus_wmi_backlight_exit(struct asus_wmi *asus)
3768 backlight_device_unregister(asus->backlight_device);
3770 asus->backlight_device = NULL;
3773 static int is_display_toggle(int code)
3775 /* display toggle keys */
3776 if ((code >= 0x61 && code <= 0x67) ||
3777 (code >= 0x8c && code <= 0x93) ||
3778 (code >= 0xa0 && code <= 0xa7) ||
3779 (code >= 0xd0 && code <= 0xd5))
3785 /* Screenpad backlight *******************************************************/
3787 static int read_screenpad_backlight_power(struct asus_wmi *asus)
3791 ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_SCREENPAD_POWER);
3795 return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
3798 static int read_screenpad_brightness(struct backlight_device *bd)
3800 struct asus_wmi *asus = bl_get_data(bd);
3804 err = read_screenpad_backlight_power(asus);
3807 /* The device brightness can only be read if powered, so return stored */
3808 if (err == FB_BLANK_POWERDOWN)
3809 return asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
3811 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &retval);
3815 return (retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK) - ASUS_SCREENPAD_BRIGHT_MIN;
3818 static int update_screenpad_bl_status(struct backlight_device *bd)
3820 struct asus_wmi *asus = bl_get_data(bd);
3824 power = read_screenpad_backlight_power(asus);
3828 if (bd->props.power != power) {
3829 if (power != FB_BLANK_UNBLANK) {
3830 /* Only brightness > 0 can power it back on */
3831 ctrl_param = asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
3832 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT,
3835 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER, 0, NULL);
3837 } else if (power == FB_BLANK_UNBLANK) {
3838 /* Only set brightness if powered on or we get invalid/unsync state */
3839 ctrl_param = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
3840 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ctrl_param, NULL);
3843 /* Ensure brightness is stored to turn back on with */
3845 asus->driver->screenpad_brightness = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
3850 static const struct backlight_ops asus_screenpad_bl_ops = {
3851 .get_brightness = read_screenpad_brightness,
3852 .update_status = update_screenpad_bl_status,
3853 .options = BL_CORE_SUSPENDRESUME,
3856 static int asus_screenpad_init(struct asus_wmi *asus)
3858 struct backlight_device *bd;
3859 struct backlight_properties props;
3863 power = read_screenpad_backlight_power(asus);
3867 if (power != FB_BLANK_POWERDOWN) {
3868 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &brightness);
3872 /* default to an acceptable min brightness on boot if too low */
3873 if (brightness < ASUS_SCREENPAD_BRIGHT_MIN)
3874 brightness = ASUS_SCREENPAD_BRIGHT_DEFAULT;
3876 memset(&props, 0, sizeof(struct backlight_properties));
3877 props.type = BACKLIGHT_RAW; /* ensure this bd is last to be picked */
3878 props.max_brightness = ASUS_SCREENPAD_BRIGHT_MAX - ASUS_SCREENPAD_BRIGHT_MIN;
3879 bd = backlight_device_register("asus_screenpad",
3880 &asus->platform_device->dev, asus,
3881 &asus_screenpad_bl_ops, &props);
3883 pr_err("Could not register backlight device\n");
3887 asus->screenpad_backlight_device = bd;
3888 asus->driver->screenpad_brightness = brightness;
3889 bd->props.brightness = brightness - ASUS_SCREENPAD_BRIGHT_MIN;
3890 bd->props.power = power;
3891 backlight_update_status(bd);
3896 static void asus_screenpad_exit(struct asus_wmi *asus)
3898 backlight_device_unregister(asus->screenpad_backlight_device);
3900 asus->screenpad_backlight_device = NULL;
3903 /* Fn-lock ********************************************************************/
3905 static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus)
3909 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FNLOCK, &result);
3911 return (result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
3912 !(result & ASUS_WMI_FNLOCK_BIOS_DISABLED);
3915 static void asus_wmi_fnlock_update(struct asus_wmi *asus)
3917 int mode = asus->fnlock_locked;
3919 asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK, mode, NULL);
3922 /* WMI events *****************************************************************/
3924 static int asus_wmi_get_event_code(u32 value)
3926 struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
3927 union acpi_object *obj;
3931 status = wmi_get_event_data(value, &response);
3932 if (ACPI_FAILURE(status)) {
3933 pr_warn("Failed to get WMI notify code: %s\n",
3934 acpi_format_exception(status));
3938 obj = (union acpi_object *)response.pointer;
3940 if (obj && obj->type == ACPI_TYPE_INTEGER)
3941 code = (int)(obj->integer.value & WMI_EVENT_MASK);
3949 static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
3951 unsigned int key_value = 1;
3952 bool autorelease = 1;
3954 if (asus->driver->key_filter) {
3955 asus->driver->key_filter(asus->driver, &code, &key_value,
3957 if (code == ASUS_WMI_KEY_IGNORE)
3961 if (acpi_video_get_backlight_type() == acpi_backlight_vendor &&
3962 code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNDOWN_MAX) {
3963 asus_wmi_backlight_notify(asus, code);
3967 if (code == NOTIFY_KBD_BRTUP) {
3968 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
3971 if (code == NOTIFY_KBD_BRTDWN) {
3972 kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
3975 if (code == NOTIFY_KBD_BRTTOGGLE) {
3976 if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
3977 kbd_led_set_by_kbd(asus, 0);
3979 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
3983 if (code == NOTIFY_FNLOCK_TOGGLE) {
3984 asus->fnlock_locked = !asus->fnlock_locked;
3985 asus_wmi_fnlock_update(asus);
3989 if (code == asus->tablet_switch_event_code) {
3990 asus_wmi_tablet_mode_get_state(asus);
3994 if (code == NOTIFY_KBD_FBM || code == NOTIFY_KBD_TTP) {
3995 if (asus->fan_boost_mode_available)
3996 fan_boost_mode_switch_next(asus);
3997 if (asus->throttle_thermal_policy_available)
3998 throttle_thermal_policy_switch_next(asus);
4003 if (is_display_toggle(code) && asus->driver->quirks->no_display_toggle)
4006 if (!sparse_keymap_report_event(asus->inputdev, code,
4007 key_value, autorelease))
4008 pr_info("Unknown key code 0x%x\n", code);
4011 static void asus_wmi_notify(u32 value, void *context)
4013 struct asus_wmi *asus = context;
4017 for (i = 0; i < WMI_EVENT_QUEUE_SIZE + 1; i++) {
4018 code = asus_wmi_get_event_code(value);
4020 pr_warn("Failed to get notify code: %d\n", code);
4024 if (code == WMI_EVENT_QUEUE_END || code == WMI_EVENT_MASK)
4027 asus_wmi_handle_event_code(code, asus);
4030 * Double check that queue is present:
4031 * ATK (with queue) uses 0xff, ASUSWMI (without) 0xd2.
4033 if (!asus->wmi_event_queue || value != WMI_EVENT_VALUE_ATK)
4037 pr_warn("Failed to process event queue, last code: 0x%x\n", code);
4040 static int asus_wmi_notify_queue_flush(struct asus_wmi *asus)
4045 for (i = 0; i < WMI_EVENT_QUEUE_SIZE + 1; i++) {
4046 code = asus_wmi_get_event_code(WMI_EVENT_VALUE_ATK);
4048 pr_warn("Failed to get event during flush: %d\n", code);
4052 if (code == WMI_EVENT_QUEUE_END || code == WMI_EVENT_MASK)
4056 pr_warn("Failed to flush event queue\n");
4060 /* Sysfs **********************************************************************/
4062 static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
4063 const char *buf, size_t count)
4068 value = asus_wmi_get_devstate_simple(asus, devid);
4072 err = kstrtoint(buf, 0, &value);
4076 err = asus_wmi_set_devstate(devid, value, &retval);
4083 static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
4085 int value = asus_wmi_get_devstate_simple(asus, devid);
4090 return sprintf(buf, "%d\n", value);
4093 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
4094 static ssize_t show_##_name(struct device *dev, \
4095 struct device_attribute *attr, \
4098 struct asus_wmi *asus = dev_get_drvdata(dev); \
4100 return show_sys_wmi(asus, _cm, buf); \
4102 static ssize_t store_##_name(struct device *dev, \
4103 struct device_attribute *attr, \
4104 const char *buf, size_t count) \
4106 struct asus_wmi *asus = dev_get_drvdata(dev); \
4108 return store_sys_wmi(asus, _cm, buf, count); \
4110 static struct device_attribute dev_attr_##_name = { \
4112 .name = __stringify(_name), \
4114 .show = show_##_name, \
4115 .store = store_##_name, \
4118 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
4119 ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
4120 ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
4121 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
4122 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable, 0644, ASUS_WMI_DEVID_ALS_ENABLE);
4124 static ssize_t cpufv_store(struct device *dev, struct device_attribute *attr,
4125 const char *buf, size_t count)
4129 rv = kstrtoint(buf, 0, &value);
4133 if (value < 0 || value > 2)
4136 rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
4143 static DEVICE_ATTR_WO(cpufv);
4145 static struct attribute *platform_attributes[] = {
4146 &dev_attr_cpufv.attr,
4147 &dev_attr_camera.attr,
4148 &dev_attr_cardr.attr,
4149 &dev_attr_touchpad.attr,
4150 &dev_attr_charge_mode.attr,
4151 &dev_attr_egpu_enable.attr,
4152 &dev_attr_egpu_connected.attr,
4153 &dev_attr_dgpu_disable.attr,
4154 &dev_attr_gpu_mux_mode.attr,
4155 &dev_attr_lid_resume.attr,
4156 &dev_attr_als_enable.attr,
4157 &dev_attr_fan_boost_mode.attr,
4158 &dev_attr_throttle_thermal_policy.attr,
4159 &dev_attr_ppt_pl2_sppt.attr,
4160 &dev_attr_ppt_pl1_spl.attr,
4161 &dev_attr_ppt_fppt.attr,
4162 &dev_attr_ppt_apu_sppt.attr,
4163 &dev_attr_ppt_platform_sppt.attr,
4164 &dev_attr_nv_dynamic_boost.attr,
4165 &dev_attr_nv_temp_target.attr,
4166 &dev_attr_panel_od.attr,
4167 &dev_attr_mini_led_mode.attr,
4171 static umode_t asus_sysfs_is_visible(struct kobject *kobj,
4172 struct attribute *attr, int idx)
4174 struct device *dev = kobj_to_dev(kobj);
4175 struct asus_wmi *asus = dev_get_drvdata(dev);
4179 if (attr == &dev_attr_camera.attr)
4180 devid = ASUS_WMI_DEVID_CAMERA;
4181 else if (attr == &dev_attr_cardr.attr)
4182 devid = ASUS_WMI_DEVID_CARDREADER;
4183 else if (attr == &dev_attr_touchpad.attr)
4184 devid = ASUS_WMI_DEVID_TOUCHPAD;
4185 else if (attr == &dev_attr_lid_resume.attr)
4186 devid = ASUS_WMI_DEVID_LID_RESUME;
4187 else if (attr == &dev_attr_als_enable.attr)
4188 devid = ASUS_WMI_DEVID_ALS_ENABLE;
4189 else if (attr == &dev_attr_charge_mode.attr)
4190 ok = asus->charge_mode_available;
4191 else if (attr == &dev_attr_egpu_enable.attr)
4192 ok = asus->egpu_enable_available;
4193 else if (attr == &dev_attr_egpu_connected.attr)
4194 ok = asus->egpu_connect_available;
4195 else if (attr == &dev_attr_dgpu_disable.attr)
4196 ok = asus->dgpu_disable_available;
4197 else if (attr == &dev_attr_gpu_mux_mode.attr)
4198 ok = asus->gpu_mux_mode_available;
4199 else if (attr == &dev_attr_fan_boost_mode.attr)
4200 ok = asus->fan_boost_mode_available;
4201 else if (attr == &dev_attr_throttle_thermal_policy.attr)
4202 ok = asus->throttle_thermal_policy_available;
4203 else if (attr == &dev_attr_ppt_pl2_sppt.attr)
4204 ok = asus->ppt_pl2_sppt_available;
4205 else if (attr == &dev_attr_ppt_pl1_spl.attr)
4206 ok = asus->ppt_pl1_spl_available;
4207 else if (attr == &dev_attr_ppt_fppt.attr)
4208 ok = asus->ppt_fppt_available;
4209 else if (attr == &dev_attr_ppt_apu_sppt.attr)
4210 ok = asus->ppt_apu_sppt_available;
4211 else if (attr == &dev_attr_ppt_platform_sppt.attr)
4212 ok = asus->ppt_plat_sppt_available;
4213 else if (attr == &dev_attr_nv_dynamic_boost.attr)
4214 ok = asus->nv_dyn_boost_available;
4215 else if (attr == &dev_attr_nv_temp_target.attr)
4216 ok = asus->nv_temp_tgt_available;
4217 else if (attr == &dev_attr_panel_od.attr)
4218 ok = asus->panel_overdrive_available;
4219 else if (attr == &dev_attr_mini_led_mode.attr)
4220 ok = asus->mini_led_mode_available;
4223 ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
4225 return ok ? attr->mode : 0;
4228 static const struct attribute_group platform_attribute_group = {
4229 .is_visible = asus_sysfs_is_visible,
4230 .attrs = platform_attributes
4233 static void asus_wmi_sysfs_exit(struct platform_device *device)
4235 sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
4238 static int asus_wmi_sysfs_init(struct platform_device *device)
4240 return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
4243 /* Platform device ************************************************************/
4245 static int asus_wmi_platform_init(struct asus_wmi *asus)
4247 struct device *dev = &asus->platform_device->dev;
4251 /* INIT enable hotkeys on some models */
4252 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
4253 pr_info("Initialization: %#x\n", rv);
4255 /* We don't know yet what to do with this version... */
4256 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
4257 pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
4262 * The SFUN method probably allows the original driver to get the list
4263 * of features supported by a given model. For now, 0x0100 or 0x0800
4264 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
4265 * The significance of others is yet to be found.
4267 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
4268 pr_info("SFUN value: %#x\n", rv);
4273 * Eee PC and Notebooks seems to have different method_id for DSTS,
4274 * but it may also be related to the BIOS's SPEC.
4275 * Note, on most Eeepc, there is no way to check if a method exist
4276 * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
4277 * but once again, SPEC may probably be used for that kind of things.
4279 * Additionally at least TUF Gaming series laptops return nothing for
4280 * unknown methods, so the detection in this way is not possible.
4282 * There is strong indication that only ACPI WMI devices that have _UID
4283 * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
4285 wmi_uid = wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID);
4289 if (!strcmp(wmi_uid, ASUS_ACPI_UID_ASUSWMI)) {
4290 dev_info(dev, "Detected ASUSWMI, use DCTS\n");
4291 asus->dsts_id = ASUS_WMI_METHODID_DCTS;
4293 dev_info(dev, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid);
4294 asus->dsts_id = ASUS_WMI_METHODID_DSTS;
4298 * Some devices can have multiple event codes stored in a queue before
4299 * the module load if it was unloaded intermittently after calling
4300 * the INIT method (enables event handling). The WMI notify handler is
4301 * expected to retrieve all event codes until a retrieved code equals
4302 * queue end marker (One or Ones). Old codes are flushed from the queue
4303 * upon module load. Not enabling this when it should be has minimal
4304 * visible impact so fall back if anything goes wrong.
4306 wmi_uid = wmi_get_acpi_device_uid(asus->driver->event_guid);
4307 if (wmi_uid && !strcmp(wmi_uid, ASUS_ACPI_UID_ATK)) {
4308 dev_info(dev, "Detected ATK, enable event queue\n");
4310 if (!asus_wmi_notify_queue_flush(asus))
4311 asus->wmi_event_queue = true;
4314 /* CWAP allow to define the behavior of the Fn+F2 key,
4315 * this method doesn't seems to be present on Eee PCs */
4316 if (asus->driver->quirks->wapf >= 0)
4317 asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
4318 asus->driver->quirks->wapf, NULL);
4323 /* debugfs ********************************************************************/
4325 struct asus_wmi_debugfs_node {
4326 struct asus_wmi *asus;
4328 int (*show) (struct seq_file *m, void *data);
4331 static int show_dsts(struct seq_file *m, void *data)
4333 struct asus_wmi *asus = m->private;
4337 err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
4341 seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
4346 static int show_devs(struct seq_file *m, void *data)
4348 struct asus_wmi *asus = m->private;
4352 err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
4357 seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
4358 asus->debug.ctrl_param, retval);
4363 static int show_call(struct seq_file *m, void *data)
4365 struct asus_wmi *asus = m->private;
4366 struct bios_args args = {
4367 .arg0 = asus->debug.dev_id,
4368 .arg1 = asus->debug.ctrl_param,
4370 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
4371 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
4372 union acpi_object *obj;
4375 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
4376 0, asus->debug.method_id,
4379 if (ACPI_FAILURE(status))
4382 obj = (union acpi_object *)output.pointer;
4383 if (obj && obj->type == ACPI_TYPE_INTEGER)
4384 seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
4385 asus->debug.dev_id, asus->debug.ctrl_param,
4386 (u32) obj->integer.value);
4388 seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
4389 asus->debug.dev_id, asus->debug.ctrl_param,
4390 obj ? obj->type : -1);
4397 static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
4398 {NULL, "devs", show_devs},
4399 {NULL, "dsts", show_dsts},
4400 {NULL, "call", show_call},
4403 static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
4405 struct asus_wmi_debugfs_node *node = inode->i_private;
4407 return single_open(file, node->show, node->asus);
4410 static const struct file_operations asus_wmi_debugfs_io_ops = {
4411 .owner = THIS_MODULE,
4412 .open = asus_wmi_debugfs_open,
4414 .llseek = seq_lseek,
4415 .release = single_release,
4418 static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
4420 debugfs_remove_recursive(asus->debug.root);
4423 static void asus_wmi_debugfs_init(struct asus_wmi *asus)
4427 asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
4429 debugfs_create_x32("method_id", S_IRUGO | S_IWUSR, asus->debug.root,
4430 &asus->debug.method_id);
4432 debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR, asus->debug.root,
4433 &asus->debug.dev_id);
4435 debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR, asus->debug.root,
4436 &asus->debug.ctrl_param);
4438 for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
4439 struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
4442 debugfs_create_file(node->name, S_IFREG | S_IRUGO,
4443 asus->debug.root, node,
4444 &asus_wmi_debugfs_io_ops);
4448 /* Init / exit ****************************************************************/
4450 static int asus_wmi_add(struct platform_device *pdev)
4452 struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
4453 struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
4454 struct asus_wmi *asus;
4459 asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
4463 asus->driver = wdrv;
4464 asus->platform_device = pdev;
4465 wdrv->platform_device = pdev;
4466 platform_set_drvdata(asus->platform_device, asus);
4468 if (wdrv->detect_quirks)
4469 wdrv->detect_quirks(asus->driver);
4471 err = asus_wmi_platform_init(asus);
4475 asus->charge_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CHARGE_MODE);
4476 asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
4477 asus->egpu_connect_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
4478 asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU);
4479 asus->gpu_mux_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX);
4480 asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE);
4481 asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE);
4482 asus->ppt_pl2_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL2_SPPT);
4483 asus->ppt_pl1_spl_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL1_SPL);
4484 asus->ppt_fppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_FPPT);
4485 asus->ppt_apu_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_APU_SPPT);
4486 asus->ppt_plat_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PLAT_SPPT);
4487 asus->nv_dyn_boost_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_DYN_BOOST);
4488 asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
4489 asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
4490 asus->mini_led_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
4492 err = fan_boost_mode_check_present(asus);
4494 goto fail_fan_boost_mode;
4496 err = throttle_thermal_policy_check_present(asus);
4498 goto fail_throttle_thermal_policy;
4500 throttle_thermal_policy_set_default(asus);
4502 err = platform_profile_setup(asus);
4504 goto fail_platform_profile_setup;
4506 err = asus_wmi_sysfs_init(asus->platform_device);
4510 err = asus_wmi_input_init(asus);
4514 err = asus_wmi_fan_init(asus); /* probably no problems on error */
4516 err = asus_wmi_hwmon_init(asus);
4520 err = asus_wmi_custom_fan_curve_init(asus);
4522 goto fail_custom_fan_curve;
4524 err = asus_wmi_led_init(asus);
4528 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
4529 if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
4530 asus->driver->wlan_ctrl_by_user = 1;
4532 if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
4533 err = asus_wmi_rfkill_init(asus);
4538 if (asus->driver->quirks->wmi_force_als_set)
4541 if (asus->driver->quirks->xusb2pr)
4542 asus_wmi_set_xusb2pr(asus);
4544 if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
4545 err = asus_wmi_backlight_init(asus);
4546 if (err && err != -ENODEV)
4547 goto fail_backlight;
4548 } else if (asus->driver->quirks->wmi_backlight_set_devstate)
4549 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);
4551 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT)) {
4552 err = asus_screenpad_init(asus);
4553 if (err && err != -ENODEV)
4554 goto fail_screenpad;
4557 if (asus_wmi_has_fnlock_key(asus)) {
4558 asus->fnlock_locked = fnlock_default;
4559 asus_wmi_fnlock_update(asus);
4562 status = wmi_install_notify_handler(asus->driver->event_guid,
4563 asus_wmi_notify, asus);
4564 if (ACPI_FAILURE(status)) {
4565 pr_err("Unable to register notify handler - %d\n", status);
4567 goto fail_wmi_handler;
4570 asus_wmi_battery_init(asus);
4572 asus_wmi_debugfs_init(asus);
4577 asus_wmi_backlight_exit(asus);
4579 asus_wmi_rfkill_exit(asus);
4581 asus_screenpad_exit(asus);
4583 asus_wmi_led_exit(asus);
4586 asus_wmi_input_exit(asus);
4588 asus_wmi_sysfs_exit(asus->platform_device);
4590 fail_throttle_thermal_policy:
4591 fail_custom_fan_curve:
4592 fail_platform_profile_setup:
4593 if (asus->platform_profile_support)
4594 platform_profile_remove();
4595 fail_fan_boost_mode:
4601 static int asus_wmi_remove(struct platform_device *device)
4603 struct asus_wmi *asus;
4605 asus = platform_get_drvdata(device);
4606 wmi_remove_notify_handler(asus->driver->event_guid);
4607 asus_wmi_backlight_exit(asus);
4608 asus_screenpad_exit(asus);
4609 asus_wmi_input_exit(asus);
4610 asus_wmi_led_exit(asus);
4611 asus_wmi_rfkill_exit(asus);
4612 asus_wmi_debugfs_exit(asus);
4613 asus_wmi_sysfs_exit(asus->platform_device);
4614 asus_fan_set_auto(asus);
4615 throttle_thermal_policy_set_default(asus);
4616 asus_wmi_battery_exit(asus);
4618 if (asus->platform_profile_support)
4619 platform_profile_remove();
4625 /* Platform driver - hibernate/resume callbacks *******************************/
4627 static int asus_hotk_thaw(struct device *device)
4629 struct asus_wmi *asus = dev_get_drvdata(device);
4631 if (asus->wlan.rfkill) {
4635 * Work around bios bug - acpi _PTS turns off the wireless led
4636 * during suspend. Normally it restores it on resume, but
4637 * we should kick it ourselves in case hibernation is aborted.
4639 wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
4640 asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
4646 static int asus_hotk_resume(struct device *device)
4648 struct asus_wmi *asus = dev_get_drvdata(device);
4650 if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
4651 kbd_led_update(asus);
4653 if (asus_wmi_has_fnlock_key(asus))
4654 asus_wmi_fnlock_update(asus);
4656 asus_wmi_tablet_mode_get_state(asus);
4660 static int asus_hotk_restore(struct device *device)
4662 struct asus_wmi *asus = dev_get_drvdata(device);
4665 /* Refresh both wlan rfkill state and pci hotplug */
4666 if (asus->wlan.rfkill)
4667 asus_rfkill_hotplug(asus);
4669 if (asus->bluetooth.rfkill) {
4670 bl = !asus_wmi_get_devstate_simple(asus,
4671 ASUS_WMI_DEVID_BLUETOOTH);
4672 rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
4674 if (asus->wimax.rfkill) {
4675 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
4676 rfkill_set_sw_state(asus->wimax.rfkill, bl);
4678 if (asus->wwan3g.rfkill) {
4679 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
4680 rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
4682 if (asus->gps.rfkill) {
4683 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
4684 rfkill_set_sw_state(asus->gps.rfkill, bl);
4686 if (asus->uwb.rfkill) {
4687 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
4688 rfkill_set_sw_state(asus->uwb.rfkill, bl);
4690 if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
4691 kbd_led_update(asus);
4693 if (asus_wmi_has_fnlock_key(asus))
4694 asus_wmi_fnlock_update(asus);
4696 asus_wmi_tablet_mode_get_state(asus);
4700 static const struct dev_pm_ops asus_pm_ops = {
4701 .thaw = asus_hotk_thaw,
4702 .restore = asus_hotk_restore,
4703 .resume = asus_hotk_resume,
4706 /* Registration ***************************************************************/
4708 static int asus_wmi_probe(struct platform_device *pdev)
4710 struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
4711 struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
4714 if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
4715 pr_warn("ASUS Management GUID not found\n");
4719 if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
4720 pr_warn("ASUS Event GUID not found\n");
4725 ret = wdrv->probe(pdev);
4730 return asus_wmi_add(pdev);
4735 int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
4737 struct platform_driver *platform_driver;
4738 struct platform_device *platform_device;
4743 platform_driver = &driver->platform_driver;
4744 platform_driver->remove = asus_wmi_remove;
4745 platform_driver->driver.owner = driver->owner;
4746 platform_driver->driver.name = driver->name;
4747 platform_driver->driver.pm = &asus_pm_ops;
4749 platform_device = platform_create_bundle(platform_driver,
4752 if (IS_ERR(platform_device))
4753 return PTR_ERR(platform_device);
4758 EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
4760 void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
4762 platform_device_unregister(driver->platform_device);
4763 platform_driver_unregister(&driver->platform_driver);
4766 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
4768 static int __init asus_wmi_init(void)
4770 pr_info("ASUS WMI generic driver loaded\n");
4774 static void __exit asus_wmi_exit(void)
4776 pr_info("ASUS WMI generic driver unloaded\n");
4779 module_init(asus_wmi_init);
4780 module_exit(asus_wmi_exit);