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/delay.h>
20 #include <linux/dmi.h>
22 #include <linux/hwmon.h>
23 #include <linux/hwmon-sysfs.h>
24 #include <linux/init.h>
25 #include <linux/input.h>
26 #include <linux/input/sparse-keymap.h>
27 #include <linux/kernel.h>
28 #include <linux/leds.h>
29 #include <linux/minmax.h>
30 #include <linux/module.h>
31 #include <linux/pci.h>
32 #include <linux/pci_hotplug.h>
33 #include <linux/platform_data/x86/asus-wmi.h>
34 #include <linux/platform_device.h>
35 #include <linux/platform_profile.h>
36 #include <linux/power_supply.h>
37 #include <linux/rfkill.h>
38 #include <linux/seq_file.h>
39 #include <linux/slab.h>
40 #include <linux/types.h>
41 #include <linux/units.h>
43 #include <acpi/battery.h>
44 #include <acpi/video.h>
50 MODULE_DESCRIPTION("Asus Generic WMI Driver");
51 MODULE_LICENSE("GPL");
53 static bool fnlock_default = true;
54 module_param(fnlock_default, bool, 0444);
56 #define to_asus_wmi_driver(pdrv) \
57 (container_of((pdrv), struct asus_wmi_driver, platform_driver))
59 #define ASUS_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66"
61 #define NOTIFY_BRNUP_MIN 0x11
62 #define NOTIFY_BRNUP_MAX 0x1f
63 #define NOTIFY_BRNDOWN_MIN 0x20
64 #define NOTIFY_BRNDOWN_MAX 0x2e
65 #define NOTIFY_FNLOCK_TOGGLE 0x4e
66 #define NOTIFY_KBD_DOCK_CHANGE 0x75
67 #define NOTIFY_KBD_BRTUP 0xc4
68 #define NOTIFY_KBD_BRTDWN 0xc5
69 #define NOTIFY_KBD_BRTTOGGLE 0xc7
70 #define NOTIFY_KBD_FBM 0x99
71 #define NOTIFY_KBD_TTP 0xae
72 #define NOTIFY_LID_FLIP 0xfa
73 #define NOTIFY_LID_FLIP_ROG 0xbd
75 #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0)
77 #define ASUS_MID_FAN_DESC "mid_fan"
78 #define ASUS_GPU_FAN_DESC "gpu_fan"
79 #define ASUS_FAN_DESC "cpu_fan"
80 #define ASUS_FAN_MFUN 0x13
81 #define ASUS_FAN_SFUN_READ 0x06
82 #define ASUS_FAN_SFUN_WRITE 0x07
84 /* Based on standard hwmon pwmX_enable values */
85 #define ASUS_FAN_CTRL_FULLSPEED 0
86 #define ASUS_FAN_CTRL_MANUAL 1
87 #define ASUS_FAN_CTRL_AUTO 2
89 #define ASUS_FAN_BOOST_MODE_NORMAL 0
90 #define ASUS_FAN_BOOST_MODE_OVERBOOST 1
91 #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK 0x01
92 #define ASUS_FAN_BOOST_MODE_SILENT 2
93 #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02
94 #define ASUS_FAN_BOOST_MODES_MASK 0x03
96 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0
97 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1
98 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2
100 #define USB_INTEL_XUSB2PR 0xD0
101 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
103 #define ASUS_ACPI_UID_ASUSWMI "ASUSWMI"
105 #define WMI_EVENT_MASK 0xFFFF
107 #define FAN_CURVE_POINTS 8
108 #define FAN_CURVE_BUF_LEN 32
109 #define FAN_CURVE_DEV_CPU 0x00
110 #define FAN_CURVE_DEV_GPU 0x01
111 #define FAN_CURVE_DEV_MID 0x02
112 /* Mask to determine if setting temperature or percentage */
113 #define FAN_CURVE_PWM_MASK 0x04
115 /* Limits for tunables available on ASUS ROG laptops */
116 #define PPT_TOTAL_MIN 5
117 #define PPT_TOTAL_MAX 250
118 #define PPT_CPU_MIN 5
119 #define PPT_CPU_MAX 130
120 #define NVIDIA_BOOST_MIN 5
121 #define NVIDIA_BOOST_MAX 25
122 #define NVIDIA_TEMP_MIN 75
123 #define NVIDIA_TEMP_MAX 87
125 #define ASUS_SCREENPAD_BRIGHT_MIN 20
126 #define ASUS_SCREENPAD_BRIGHT_MAX 255
127 #define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
129 #define ASUS_MINI_LED_MODE_MASK 0x03
130 /* Standard modes for devices with only on/off */
131 #define ASUS_MINI_LED_OFF 0x00
132 #define ASUS_MINI_LED_ON 0x01
133 /* New mode on some devices, define here to clarify remapping later */
134 #define ASUS_MINI_LED_STRONG_MODE 0x02
135 /* New modes for devices with 3 mini-led mode types */
136 #define ASUS_MINI_LED_2024_WEAK 0x00
137 #define ASUS_MINI_LED_2024_STRONG 0x01
138 #define ASUS_MINI_LED_2024_OFF 0x02
140 /* Controls the power state of the USB0 hub on ROG Ally which input is on */
141 #define ASUS_USB0_PWR_EC0_CSEE "\\_SB.PCI0.SBRG.EC0.CSEE"
142 /* 300ms so far seems to produce a reliable result on AC and battery */
143 #define ASUS_USB0_PWR_EC0_CSEE_WAIT 1500
145 static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
147 static int throttle_thermal_policy_write(struct asus_wmi *);
149 static bool ashs_present(void)
152 while (ashs_ids[i]) {
153 if (acpi_dev_found(ashs_ids[i++]))
162 u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */
164 u32 arg4; /* Some ROG laptops require a full 5 input args */
169 * Struct that's used for all methods called via AGFN. Naming is
170 * identically to the AML code.
173 u16 mfun; /* probably "Multi-function" to be called */
174 u16 sfun; /* probably "Sub-function" to be called */
175 u16 len; /* size of the hole struct, including subfunction fields */
176 u8 stas; /* not used by now */
177 u8 err; /* zero on success */
180 /* struct used for calling fan read and write methods */
181 struct agfn_fan_args {
182 struct agfn_args agfn; /* common fields */
183 u8 fan; /* fan number: 0: set auto mode 1: 1st fan */
184 u32 speed; /* read: RPM/100 - write: 0-255 */
188 * <platform>/ - debugfs root directory
189 * dev_id - current dev_id
190 * ctrl_param - current ctrl_param
191 * method_id - current method_id
192 * devs - call DEVS(dev_id, ctrl_param) and print result
193 * dsts - call DSTS(dev_id) and print result
194 * call - call method_id(dev_id, ctrl_param) and print result
196 struct asus_wmi_debug {
204 struct asus_wmi *asus;
205 struct rfkill *rfkill;
211 FAN_TYPE_AGFN, /* deprecated on newer platforms */
212 FAN_TYPE_SPEC83, /* starting in Spec 8.3, use CPU_FAN_CTRL */
215 struct fan_curve_data {
218 u8 temps[FAN_CURVE_POINTS];
219 u8 percents[FAN_CURVE_POINTS];
227 struct input_dev *inputdev;
228 struct backlight_device *backlight_device;
229 struct backlight_device *screenpad_backlight_device;
230 struct platform_device *platform_device;
232 struct led_classdev wlan_led;
234 struct led_classdev tpd_led;
236 struct led_classdev kbd_led;
238 struct led_classdev lightbar_led;
240 struct led_classdev micmute_led;
241 struct led_classdev camera_led;
242 struct workqueue_struct *led_workqueue;
243 struct work_struct tpd_led_work;
244 struct work_struct wlan_led_work;
245 struct work_struct lightbar_led_work;
247 struct asus_rfkill wlan;
248 struct asus_rfkill bluetooth;
249 struct asus_rfkill wimax;
250 struct asus_rfkill wwan3g;
251 struct asus_rfkill gps;
252 struct asus_rfkill uwb;
254 int tablet_switch_event_code;
255 u32 tablet_switch_dev_id;
256 bool tablet_switch_inverted;
258 /* The ROG Ally device requires the MCU USB device be disconnected before suspend */
259 bool ally_mcu_usb_switch;
261 enum fan_type fan_type;
262 enum fan_type gpu_fan_type;
263 enum fan_type mid_fan_type;
265 int gpu_fan_pwm_mode;
266 int mid_fan_pwm_mode;
269 bool fan_boost_mode_available;
270 u8 fan_boost_mode_mask;
273 bool egpu_enable_available;
274 bool dgpu_disable_available;
277 /* Tunables provided by ASUS for gaming laptops */
281 u32 ppt_platform_sppt;
283 u32 nv_dynamic_boost;
287 bool kbd_rgb_state_available;
289 bool throttle_thermal_policy_available;
290 u8 throttle_thermal_policy_mode;
292 bool cpu_fan_curve_available;
293 bool gpu_fan_curve_available;
294 bool mid_fan_curve_available;
295 struct fan_curve_data custom_fan_curves[3];
297 struct platform_profile_handler platform_profile_handler;
298 bool platform_profile_support;
300 // The RSOC controls the maximum charging percentage.
301 bool battery_rsoc_available;
303 bool panel_overdrive_available;
306 struct hotplug_slot hotplug_slot;
307 struct mutex hotplug_lock;
308 struct mutex wmi_lock;
309 struct workqueue_struct *hotplug_workqueue;
310 struct work_struct hotplug_work;
314 struct asus_wmi_debug debug;
316 struct asus_wmi_driver *driver;
319 /* WMI ************************************************************************/
321 static int asus_wmi_evaluate_method3(u32 method_id,
322 u32 arg0, u32 arg1, u32 arg2, u32 *retval)
324 struct bios_args args = {
329 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
330 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
332 union acpi_object *obj;
335 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
338 if (ACPI_FAILURE(status))
341 obj = (union acpi_object *)output.pointer;
342 if (obj && obj->type == ACPI_TYPE_INTEGER)
343 tmp = (u32) obj->integer.value;
350 if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
356 int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
358 return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval);
360 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
362 static int asus_wmi_evaluate_method5(u32 method_id,
363 u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *retval)
365 struct bios_args args = {
372 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
373 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
375 union acpi_object *obj;
378 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
381 if (ACPI_FAILURE(status))
384 obj = (union acpi_object *)output.pointer;
385 if (obj && obj->type == ACPI_TYPE_INTEGER)
386 tmp = (u32) obj->integer.value;
393 if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
400 * Returns as an error if the method output is not a buffer. Typically this
401 * means that the method called is unsupported.
403 static int asus_wmi_evaluate_method_buf(u32 method_id,
404 u32 arg0, u32 arg1, u8 *ret_buffer, size_t size)
406 struct bios_args args = {
411 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
412 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
414 union acpi_object *obj;
417 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
420 if (ACPI_FAILURE(status))
423 obj = (union acpi_object *)output.pointer;
426 case ACPI_TYPE_BUFFER:
427 if (obj->buffer.length > size) {
431 if (obj->buffer.length == 0) {
436 memcpy(ret_buffer, obj->buffer.pointer, obj->buffer.length);
438 case ACPI_TYPE_INTEGER:
439 err = (u32)obj->integer.value;
441 if (err == ASUS_WMI_UNSUPPORTED_METHOD)
444 * At least one method returns a 0 with no buffer if no arg
445 * is provided, such as ASUS_WMI_DEVID_CPU_FAN_CURVE
463 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
465 struct acpi_buffer input;
471 * Copy to dma capable address otherwise memory corruption occurs as
472 * bios has to be able to access it.
474 input.pointer = kmemdup(args.pointer, args.length, GFP_DMA | GFP_KERNEL);
475 input.length = args.length;
478 phys_addr = virt_to_phys(input.pointer);
480 status = asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN,
481 phys_addr, 0, &retval);
483 memcpy(args.pointer, input.pointer, args.length);
485 kfree(input.pointer);
492 static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
496 err = asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
507 static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
510 return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
514 /* Helper for special devices with magic return codes */
515 static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
516 u32 dev_id, u32 mask)
521 err = asus_wmi_get_devstate(asus, dev_id, &retval);
525 if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
528 if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
529 if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
533 return retval & mask;
536 static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
538 return asus_wmi_get_devstate_bits(asus, dev_id,
539 ASUS_WMI_DSTS_STATUS_BIT);
542 static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
545 int status = asus_wmi_get_devstate(asus, dev_id, &retval);
547 return status == 0 && (retval & ASUS_WMI_DSTS_PRESENCE_BIT);
550 /* Input **********************************************************************/
551 static void asus_wmi_tablet_sw_report(struct asus_wmi *asus, bool value)
553 input_report_switch(asus->inputdev, SW_TABLET_MODE,
554 asus->tablet_switch_inverted ? !value : value);
555 input_sync(asus->inputdev);
558 static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code)
560 struct device *dev = &asus->platform_device->dev;
563 result = asus_wmi_get_devstate_simple(asus, dev_id);
565 input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
566 asus_wmi_tablet_sw_report(asus, result);
567 asus->tablet_switch_dev_id = dev_id;
568 asus->tablet_switch_event_code = event_code;
569 } else if (result == -ENODEV) {
570 dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
572 dev_err(dev, "Error checking for tablet-mode-switch: %d\n", result);
576 static int asus_wmi_input_init(struct asus_wmi *asus)
578 struct device *dev = &asus->platform_device->dev;
581 asus->inputdev = input_allocate_device();
585 asus->inputdev->name = asus->driver->input_name;
586 asus->inputdev->phys = asus->driver->input_phys;
587 asus->inputdev->id.bustype = BUS_HOST;
588 asus->inputdev->dev.parent = dev;
589 set_bit(EV_REP, asus->inputdev->evbit);
591 err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
595 switch (asus->driver->quirks->tablet_switch_mode) {
596 case asus_wmi_no_tablet_switch:
598 case asus_wmi_kbd_dock_devid:
599 asus->tablet_switch_inverted = true;
600 asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE);
602 case asus_wmi_lid_flip_devid:
603 asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP, NOTIFY_LID_FLIP);
605 case asus_wmi_lid_flip_rog_devid:
606 asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP_ROG, NOTIFY_LID_FLIP_ROG);
610 err = input_register_device(asus->inputdev);
617 input_free_device(asus->inputdev);
621 static void asus_wmi_input_exit(struct asus_wmi *asus)
624 input_unregister_device(asus->inputdev);
626 asus->inputdev = NULL;
629 /* Tablet mode ****************************************************************/
631 static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus)
635 if (!asus->tablet_switch_dev_id)
638 result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id);
640 asus_wmi_tablet_sw_report(asus, result);
643 /* Charging mode, 1=Barrel, 2=USB ******************************************/
644 static ssize_t charge_mode_show(struct device *dev,
645 struct device_attribute *attr, char *buf)
647 struct asus_wmi *asus = dev_get_drvdata(dev);
650 result = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CHARGE_MODE, &value);
654 return sysfs_emit(buf, "%d\n", value & 0xff);
657 static DEVICE_ATTR_RO(charge_mode);
659 /* dGPU ********************************************************************/
660 static ssize_t dgpu_disable_show(struct device *dev,
661 struct device_attribute *attr, char *buf)
663 struct asus_wmi *asus = dev_get_drvdata(dev);
666 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
670 return sysfs_emit(buf, "%d\n", result);
674 * A user may be required to store the value twice, typcial store first, then
675 * rescan PCI bus to activate power, then store a second time to save correctly.
676 * The reason for this is that an extra code path in the ACPI is enabled when
677 * the device and bus are powered.
679 static ssize_t dgpu_disable_store(struct device *dev,
680 struct device_attribute *attr,
681 const char *buf, size_t count)
686 struct asus_wmi *asus = dev_get_drvdata(dev);
688 result = kstrtou32(buf, 10, &disable);
695 if (asus->gpu_mux_dev) {
696 result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
698 /* An error here may signal greater failure of GPU handling */
700 if (!result && disable) {
702 pr_warn("Can not disable dGPU when the MUX is in dGPU mode: %d\n", err);
707 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU, disable, &result);
709 pr_warn("Failed to set dgpu disable: %d\n", err);
714 pr_warn("Failed to set dgpu disable (result): 0x%x\n", result);
718 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "dgpu_disable");
722 static DEVICE_ATTR_RW(dgpu_disable);
724 /* eGPU ********************************************************************/
725 static ssize_t egpu_enable_show(struct device *dev,
726 struct device_attribute *attr, char *buf)
728 struct asus_wmi *asus = dev_get_drvdata(dev);
731 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
735 return sysfs_emit(buf, "%d\n", result);
738 /* The ACPI call to enable the eGPU also disables the internal dGPU */
739 static ssize_t egpu_enable_store(struct device *dev,
740 struct device_attribute *attr,
741 const char *buf, size_t count)
746 struct asus_wmi *asus = dev_get_drvdata(dev);
748 err = kstrtou32(buf, 10, &enable);
755 err = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
757 pr_warn("Failed to get egpu connection status: %d\n", err);
761 if (asus->gpu_mux_dev) {
762 result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
764 /* An error here may signal greater failure of GPU handling */
765 pr_warn("Failed to get gpu mux status: %d\n", result);
768 if (!result && enable) {
770 pr_warn("Can not enable eGPU when the MUX is in dGPU mode: %d\n", err);
775 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU, enable, &result);
777 pr_warn("Failed to set egpu state: %d\n", err);
782 pr_warn("Failed to set egpu state (retval): 0x%x\n", result);
786 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "egpu_enable");
790 static DEVICE_ATTR_RW(egpu_enable);
792 /* Is eGPU connected? *********************************************************/
793 static ssize_t egpu_connected_show(struct device *dev,
794 struct device_attribute *attr, char *buf)
796 struct asus_wmi *asus = dev_get_drvdata(dev);
799 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
803 return sysfs_emit(buf, "%d\n", result);
806 static DEVICE_ATTR_RO(egpu_connected);
808 /* gpu mux switch *************************************************************/
809 static ssize_t gpu_mux_mode_show(struct device *dev,
810 struct device_attribute *attr, char *buf)
812 struct asus_wmi *asus = dev_get_drvdata(dev);
815 result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
819 return sysfs_emit(buf, "%d\n", result);
822 static ssize_t gpu_mux_mode_store(struct device *dev,
823 struct device_attribute *attr,
824 const char *buf, size_t count)
826 struct asus_wmi *asus = dev_get_drvdata(dev);
830 err = kstrtou32(buf, 10, &optimus);
837 if (asus->dgpu_disable_available) {
838 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
840 /* An error here may signal greater failure of GPU handling */
842 if (result && !optimus) {
844 pr_warn("Can not switch MUX to dGPU mode when dGPU is disabled: %d\n", err);
849 if (asus->egpu_enable_available) {
850 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
852 /* An error here may signal greater failure of GPU handling */
854 if (result && !optimus) {
856 pr_warn("Can not switch MUX to dGPU mode when eGPU is enabled: %d\n", err);
861 err = asus_wmi_set_devstate(asus->gpu_mux_dev, optimus, &result);
863 dev_err(dev, "Failed to set GPU MUX mode: %d\n", err);
866 /* !1 is considered a fail by ASUS */
868 dev_warn(dev, "Failed to set GPU MUX mode (result): 0x%x\n", result);
872 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "gpu_mux_mode");
876 static DEVICE_ATTR_RW(gpu_mux_mode);
878 /* TUF Laptop Keyboard RGB Modes **********************************************/
879 static ssize_t kbd_rgb_mode_store(struct device *dev,
880 struct device_attribute *attr,
881 const char *buf, size_t count)
883 u32 cmd, mode, r, g, b, speed;
884 struct led_classdev *led;
885 struct asus_wmi *asus;
888 led = dev_get_drvdata(dev);
889 asus = container_of(led, struct asus_wmi, kbd_led);
891 if (sscanf(buf, "%d %d %d %d %d %d", &cmd, &mode, &r, &g, &b, &speed) != 6)
894 /* B3 is set and B4 is save to BIOS */
906 /* These are the known usable modes across all TUF/ROG */
907 if (mode >= 12 || mode == 9)
924 err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, asus->kbd_rgb_dev,
925 cmd | (mode << 8) | (r << 16) | (g << 24), b | (speed << 8), NULL);
931 static DEVICE_ATTR_WO(kbd_rgb_mode);
933 static DEVICE_STRING_ATTR_RO(kbd_rgb_mode_index, 0444,
934 "cmd mode red green blue speed");
936 static struct attribute *kbd_rgb_mode_attrs[] = {
937 &dev_attr_kbd_rgb_mode.attr,
938 &dev_attr_kbd_rgb_mode_index.attr.attr,
942 static const struct attribute_group kbd_rgb_mode_group = {
943 .attrs = kbd_rgb_mode_attrs,
946 /* TUF Laptop Keyboard RGB State **********************************************/
947 static ssize_t kbd_rgb_state_store(struct device *dev,
948 struct device_attribute *attr,
949 const char *buf, size_t count)
951 u32 flags, cmd, boot, awake, sleep, keyboard;
954 if (sscanf(buf, "%d %d %d %d %d", &cmd, &boot, &awake, &sleep, &keyboard) != 5)
970 /* 0xbd is the required default arg0 for the method. Nothing happens otherwise */
971 err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS,
972 ASUS_WMI_DEVID_TUF_RGB_STATE, 0xbd | cmd << 8 | (flags << 16), 0, NULL);
978 static DEVICE_ATTR_WO(kbd_rgb_state);
980 static DEVICE_STRING_ATTR_RO(kbd_rgb_state_index, 0444,
981 "cmd boot awake sleep keyboard");
983 static struct attribute *kbd_rgb_state_attrs[] = {
984 &dev_attr_kbd_rgb_state.attr,
985 &dev_attr_kbd_rgb_state_index.attr.attr,
989 static const struct attribute_group kbd_rgb_state_group = {
990 .attrs = kbd_rgb_state_attrs,
993 static const struct attribute_group *kbd_rgb_mode_groups[] = {
999 /* Tunable: PPT: Intel=PL1, AMD=SPPT *****************************************/
1000 static ssize_t ppt_pl2_sppt_store(struct device *dev,
1001 struct device_attribute *attr,
1002 const char *buf, size_t count)
1004 struct asus_wmi *asus = dev_get_drvdata(dev);
1008 result = kstrtou32(buf, 10, &value);
1012 if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1015 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL2_SPPT, value, &result);
1017 pr_warn("Failed to set ppt_pl2_sppt: %d\n", err);
1022 pr_warn("Failed to set ppt_pl2_sppt (result): 0x%x\n", result);
1026 asus->ppt_pl2_sppt = value;
1027 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl2_sppt");
1032 static ssize_t ppt_pl2_sppt_show(struct device *dev,
1033 struct device_attribute *attr,
1036 struct asus_wmi *asus = dev_get_drvdata(dev);
1038 return sysfs_emit(buf, "%u\n", asus->ppt_pl2_sppt);
1040 static DEVICE_ATTR_RW(ppt_pl2_sppt);
1042 /* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/
1043 static ssize_t ppt_pl1_spl_store(struct device *dev,
1044 struct device_attribute *attr,
1045 const char *buf, size_t count)
1047 struct asus_wmi *asus = dev_get_drvdata(dev);
1051 result = kstrtou32(buf, 10, &value);
1055 if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1058 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL1_SPL, value, &result);
1060 pr_warn("Failed to set ppt_pl1_spl: %d\n", err);
1065 pr_warn("Failed to set ppt_pl1_spl (result): 0x%x\n", result);
1069 asus->ppt_pl1_spl = value;
1070 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl1_spl");
1074 static ssize_t ppt_pl1_spl_show(struct device *dev,
1075 struct device_attribute *attr,
1078 struct asus_wmi *asus = dev_get_drvdata(dev);
1080 return sysfs_emit(buf, "%u\n", asus->ppt_pl1_spl);
1082 static DEVICE_ATTR_RW(ppt_pl1_spl);
1084 /* Tunable: PPT APU FPPT ******************************************************/
1085 static ssize_t ppt_fppt_store(struct device *dev,
1086 struct device_attribute *attr,
1087 const char *buf, size_t count)
1089 struct asus_wmi *asus = dev_get_drvdata(dev);
1093 result = kstrtou32(buf, 10, &value);
1097 if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1100 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_FPPT, value, &result);
1102 pr_warn("Failed to set ppt_fppt: %d\n", err);
1107 pr_warn("Failed to set ppt_fppt (result): 0x%x\n", result);
1111 asus->ppt_fppt = value;
1112 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_fpu_sppt");
1117 static ssize_t ppt_fppt_show(struct device *dev,
1118 struct device_attribute *attr,
1121 struct asus_wmi *asus = dev_get_drvdata(dev);
1123 return sysfs_emit(buf, "%u\n", asus->ppt_fppt);
1125 static DEVICE_ATTR_RW(ppt_fppt);
1127 /* Tunable: PPT APU SPPT *****************************************************/
1128 static ssize_t ppt_apu_sppt_store(struct device *dev,
1129 struct device_attribute *attr,
1130 const char *buf, size_t count)
1132 struct asus_wmi *asus = dev_get_drvdata(dev);
1136 result = kstrtou32(buf, 10, &value);
1140 if (value < PPT_CPU_MIN || value > PPT_CPU_MAX)
1143 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_APU_SPPT, value, &result);
1145 pr_warn("Failed to set ppt_apu_sppt: %d\n", err);
1150 pr_warn("Failed to set ppt_apu_sppt (result): 0x%x\n", result);
1154 asus->ppt_apu_sppt = value;
1155 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_apu_sppt");
1160 static ssize_t ppt_apu_sppt_show(struct device *dev,
1161 struct device_attribute *attr,
1164 struct asus_wmi *asus = dev_get_drvdata(dev);
1166 return sysfs_emit(buf, "%u\n", asus->ppt_apu_sppt);
1168 static DEVICE_ATTR_RW(ppt_apu_sppt);
1170 /* Tunable: PPT platform SPPT ************************************************/
1171 static ssize_t ppt_platform_sppt_store(struct device *dev,
1172 struct device_attribute *attr,
1173 const char *buf, size_t count)
1175 struct asus_wmi *asus = dev_get_drvdata(dev);
1179 result = kstrtou32(buf, 10, &value);
1183 if (value < PPT_CPU_MIN || value > PPT_CPU_MAX)
1186 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PLAT_SPPT, value, &result);
1188 pr_warn("Failed to set ppt_platform_sppt: %d\n", err);
1193 pr_warn("Failed to set ppt_platform_sppt (result): 0x%x\n", result);
1197 asus->ppt_platform_sppt = value;
1198 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_platform_sppt");
1203 static ssize_t ppt_platform_sppt_show(struct device *dev,
1204 struct device_attribute *attr,
1207 struct asus_wmi *asus = dev_get_drvdata(dev);
1209 return sysfs_emit(buf, "%u\n", asus->ppt_platform_sppt);
1211 static DEVICE_ATTR_RW(ppt_platform_sppt);
1213 /* Tunable: NVIDIA dynamic boost *********************************************/
1214 static ssize_t nv_dynamic_boost_store(struct device *dev,
1215 struct device_attribute *attr,
1216 const char *buf, size_t count)
1218 struct asus_wmi *asus = dev_get_drvdata(dev);
1222 result = kstrtou32(buf, 10, &value);
1226 if (value < NVIDIA_BOOST_MIN || value > NVIDIA_BOOST_MAX)
1229 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_DYN_BOOST, value, &result);
1231 pr_warn("Failed to set nv_dynamic_boost: %d\n", err);
1236 pr_warn("Failed to set nv_dynamic_boost (result): 0x%x\n", result);
1240 asus->nv_dynamic_boost = value;
1241 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_dynamic_boost");
1246 static ssize_t nv_dynamic_boost_show(struct device *dev,
1247 struct device_attribute *attr,
1250 struct asus_wmi *asus = dev_get_drvdata(dev);
1252 return sysfs_emit(buf, "%u\n", asus->nv_dynamic_boost);
1254 static DEVICE_ATTR_RW(nv_dynamic_boost);
1256 /* Tunable: NVIDIA temperature target ****************************************/
1257 static ssize_t nv_temp_target_store(struct device *dev,
1258 struct device_attribute *attr,
1259 const char *buf, size_t count)
1261 struct asus_wmi *asus = dev_get_drvdata(dev);
1265 result = kstrtou32(buf, 10, &value);
1269 if (value < NVIDIA_TEMP_MIN || value > NVIDIA_TEMP_MAX)
1272 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_THERM_TARGET, value, &result);
1274 pr_warn("Failed to set nv_temp_target: %d\n", err);
1279 pr_warn("Failed to set nv_temp_target (result): 0x%x\n", result);
1283 asus->nv_temp_target = value;
1284 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_temp_target");
1289 static ssize_t nv_temp_target_show(struct device *dev,
1290 struct device_attribute *attr,
1293 struct asus_wmi *asus = dev_get_drvdata(dev);
1295 return sysfs_emit(buf, "%u\n", asus->nv_temp_target);
1297 static DEVICE_ATTR_RW(nv_temp_target);
1299 /* Ally MCU Powersave ********************************************************/
1300 static ssize_t mcu_powersave_show(struct device *dev,
1301 struct device_attribute *attr, char *buf)
1303 struct asus_wmi *asus = dev_get_drvdata(dev);
1306 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MCU_POWERSAVE);
1310 return sysfs_emit(buf, "%d\n", result);
1313 static ssize_t mcu_powersave_store(struct device *dev,
1314 struct device_attribute *attr,
1315 const char *buf, size_t count)
1320 struct asus_wmi *asus = dev_get_drvdata(dev);
1322 result = kstrtou32(buf, 10, &enable);
1329 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MCU_POWERSAVE, enable, &result);
1331 pr_warn("Failed to set MCU powersave: %d\n", err);
1336 pr_warn("Failed to set MCU powersave (result): 0x%x\n", result);
1340 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "mcu_powersave");
1344 static DEVICE_ATTR_RW(mcu_powersave);
1346 /* Battery ********************************************************************/
1348 /* The battery maximum charging percentage */
1349 static int charge_end_threshold;
1351 static ssize_t charge_control_end_threshold_store(struct device *dev,
1352 struct device_attribute *attr,
1353 const char *buf, size_t count)
1357 ret = kstrtouint(buf, 10, &value);
1361 if (value < 0 || value > 100)
1364 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, value, &rv);
1371 /* There isn't any method in the DSDT to read the threshold, so we
1372 * save the threshold.
1374 charge_end_threshold = value;
1378 static ssize_t charge_control_end_threshold_show(struct device *device,
1379 struct device_attribute *attr,
1382 return sysfs_emit(buf, "%d\n", charge_end_threshold);
1385 static DEVICE_ATTR_RW(charge_control_end_threshold);
1387 static int asus_wmi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
1389 /* The WMI method does not provide a way to specific a battery, so we
1390 * just assume it is the first battery.
1391 * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
1392 * battery is named BATT.
1394 if (strcmp(battery->desc->name, "BAT0") != 0 &&
1395 strcmp(battery->desc->name, "BAT1") != 0 &&
1396 strcmp(battery->desc->name, "BATC") != 0 &&
1397 strcmp(battery->desc->name, "BATT") != 0)
1400 if (device_create_file(&battery->dev,
1401 &dev_attr_charge_control_end_threshold))
1404 /* The charge threshold is only reset when the system is power cycled,
1405 * and we can't get the current threshold so let set it to 100% when
1406 * a battery is added.
1408 asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, 100, NULL);
1409 charge_end_threshold = 100;
1414 static int asus_wmi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
1416 device_remove_file(&battery->dev,
1417 &dev_attr_charge_control_end_threshold);
1421 static struct acpi_battery_hook battery_hook = {
1422 .add_battery = asus_wmi_battery_add,
1423 .remove_battery = asus_wmi_battery_remove,
1424 .name = "ASUS Battery Extension",
1427 static void asus_wmi_battery_init(struct asus_wmi *asus)
1429 asus->battery_rsoc_available = false;
1430 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_RSOC)) {
1431 asus->battery_rsoc_available = true;
1432 battery_hook_register(&battery_hook);
1436 static void asus_wmi_battery_exit(struct asus_wmi *asus)
1438 if (asus->battery_rsoc_available)
1439 battery_hook_unregister(&battery_hook);
1442 /* LEDs ***********************************************************************/
1445 * These functions actually update the LED's, and are called from a
1446 * workqueue. By doing this as separate work rather than when the LED
1447 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
1448 * potentially bad time, such as a timer interrupt.
1450 static void tpd_led_update(struct work_struct *work)
1453 struct asus_wmi *asus;
1455 asus = container_of(work, struct asus_wmi, tpd_led_work);
1457 ctrl_param = asus->tpd_led_wk;
1458 asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
1461 static void tpd_led_set(struct led_classdev *led_cdev,
1462 enum led_brightness value)
1464 struct asus_wmi *asus;
1466 asus = container_of(led_cdev, struct asus_wmi, tpd_led);
1468 asus->tpd_led_wk = !!value;
1469 queue_work(asus->led_workqueue, &asus->tpd_led_work);
1472 static int read_tpd_led_state(struct asus_wmi *asus)
1474 return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
1477 static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
1479 struct asus_wmi *asus;
1481 asus = container_of(led_cdev, struct asus_wmi, tpd_led);
1483 return read_tpd_led_state(asus);
1486 static void kbd_led_update(struct asus_wmi *asus)
1490 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
1491 asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
1494 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
1500 * bit 7: light on/off
1501 * bit 8-10: environment (0: dark, 1: normal, 2: light)
1502 * bit 17: status unknown
1504 retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
1507 /* Unknown status is considered as off */
1508 if (retval == 0x8000)
1515 *level = retval & 0x7F;
1517 *env = (retval >> 8) & 0x7F;
1521 static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
1523 struct asus_wmi *asus;
1526 asus = container_of(led_cdev, struct asus_wmi, kbd_led);
1527 max_level = asus->kbd_led.max_brightness;
1529 asus->kbd_led_wk = clamp_val(value, 0, max_level);
1530 kbd_led_update(asus);
1533 static void kbd_led_set(struct led_classdev *led_cdev,
1534 enum led_brightness value)
1536 /* Prevent disabling keyboard backlight on module unregister */
1537 if (led_cdev->flags & LED_UNREGISTERING)
1540 do_kbd_led_set(led_cdev, value);
1543 static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
1545 struct led_classdev *led_cdev = &asus->kbd_led;
1547 do_kbd_led_set(led_cdev, value);
1548 led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
1551 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
1553 struct asus_wmi *asus;
1556 asus = container_of(led_cdev, struct asus_wmi, kbd_led);
1558 retval = kbd_led_read(asus, &value, NULL);
1565 static int wlan_led_unknown_state(struct asus_wmi *asus)
1569 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
1571 return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
1574 static void wlan_led_update(struct work_struct *work)
1577 struct asus_wmi *asus;
1579 asus = container_of(work, struct asus_wmi, wlan_led_work);
1581 ctrl_param = asus->wlan_led_wk;
1582 asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
1585 static void wlan_led_set(struct led_classdev *led_cdev,
1586 enum led_brightness value)
1588 struct asus_wmi *asus;
1590 asus = container_of(led_cdev, struct asus_wmi, wlan_led);
1592 asus->wlan_led_wk = !!value;
1593 queue_work(asus->led_workqueue, &asus->wlan_led_work);
1596 static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
1598 struct asus_wmi *asus;
1601 asus = container_of(led_cdev, struct asus_wmi, wlan_led);
1602 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
1604 return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1607 static void lightbar_led_update(struct work_struct *work)
1609 struct asus_wmi *asus;
1612 asus = container_of(work, struct asus_wmi, lightbar_led_work);
1614 ctrl_param = asus->lightbar_led_wk;
1615 asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR, ctrl_param, NULL);
1618 static void lightbar_led_set(struct led_classdev *led_cdev,
1619 enum led_brightness value)
1621 struct asus_wmi *asus;
1623 asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
1625 asus->lightbar_led_wk = !!value;
1626 queue_work(asus->led_workqueue, &asus->lightbar_led_work);
1629 static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev)
1631 struct asus_wmi *asus;
1634 asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
1635 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
1637 return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
1640 static int micmute_led_set(struct led_classdev *led_cdev,
1641 enum led_brightness brightness)
1643 int state = brightness != LED_OFF;
1646 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MICMUTE_LED, state, NULL);
1647 return err < 0 ? err : 0;
1650 static enum led_brightness camera_led_get(struct led_classdev *led_cdev)
1652 struct asus_wmi *asus;
1655 asus = container_of(led_cdev, struct asus_wmi, camera_led);
1656 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CAMERA_LED, &result);
1658 return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1661 static int camera_led_set(struct led_classdev *led_cdev,
1662 enum led_brightness brightness)
1664 int state = brightness != LED_OFF;
1667 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_CAMERA_LED, state, NULL);
1668 return err < 0 ? err : 0;
1671 static void asus_wmi_led_exit(struct asus_wmi *asus)
1673 led_classdev_unregister(&asus->kbd_led);
1674 led_classdev_unregister(&asus->tpd_led);
1675 led_classdev_unregister(&asus->wlan_led);
1676 led_classdev_unregister(&asus->lightbar_led);
1677 led_classdev_unregister(&asus->micmute_led);
1678 led_classdev_unregister(&asus->camera_led);
1680 if (asus->led_workqueue)
1681 destroy_workqueue(asus->led_workqueue);
1684 static int asus_wmi_led_init(struct asus_wmi *asus)
1686 int rv = 0, num_rgb_groups = 0, led_val;
1688 if (asus->kbd_rgb_dev)
1689 kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_mode_group;
1690 if (asus->kbd_rgb_state_available)
1691 kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_state_group;
1693 asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
1694 if (!asus->led_workqueue)
1697 if (read_tpd_led_state(asus) >= 0) {
1698 INIT_WORK(&asus->tpd_led_work, tpd_led_update);
1700 asus->tpd_led.name = "asus::touchpad";
1701 asus->tpd_led.brightness_set = tpd_led_set;
1702 asus->tpd_led.brightness_get = tpd_led_get;
1703 asus->tpd_led.max_brightness = 1;
1705 rv = led_classdev_register(&asus->platform_device->dev,
1711 if (!kbd_led_read(asus, &led_val, NULL)) {
1712 asus->kbd_led_wk = led_val;
1713 asus->kbd_led.name = "asus::kbd_backlight";
1714 asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
1715 asus->kbd_led.brightness_set = kbd_led_set;
1716 asus->kbd_led.brightness_get = kbd_led_get;
1717 asus->kbd_led.max_brightness = 3;
1719 if (num_rgb_groups != 0)
1720 asus->kbd_led.groups = kbd_rgb_mode_groups;
1722 rv = led_classdev_register(&asus->platform_device->dev,
1728 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED)
1729 && (asus->driver->quirks->wapf > 0)) {
1730 INIT_WORK(&asus->wlan_led_work, wlan_led_update);
1732 asus->wlan_led.name = "asus::wlan";
1733 asus->wlan_led.brightness_set = wlan_led_set;
1734 if (!wlan_led_unknown_state(asus))
1735 asus->wlan_led.brightness_get = wlan_led_get;
1736 asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
1737 asus->wlan_led.max_brightness = 1;
1738 asus->wlan_led.default_trigger = "asus-wlan";
1740 rv = led_classdev_register(&asus->platform_device->dev,
1746 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_LIGHTBAR)) {
1747 INIT_WORK(&asus->lightbar_led_work, lightbar_led_update);
1749 asus->lightbar_led.name = "asus::lightbar";
1750 asus->lightbar_led.brightness_set = lightbar_led_set;
1751 asus->lightbar_led.brightness_get = lightbar_led_get;
1752 asus->lightbar_led.max_brightness = 1;
1754 rv = led_classdev_register(&asus->platform_device->dev,
1755 &asus->lightbar_led);
1758 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MICMUTE_LED)) {
1759 asus->micmute_led.name = "platform::micmute";
1760 asus->micmute_led.max_brightness = 1;
1761 asus->micmute_led.brightness_set_blocking = micmute_led_set;
1762 asus->micmute_led.default_trigger = "audio-micmute";
1764 rv = led_classdev_register(&asus->platform_device->dev,
1765 &asus->micmute_led);
1770 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CAMERA_LED)) {
1771 asus->camera_led.name = "asus::camera";
1772 asus->camera_led.max_brightness = 1;
1773 asus->camera_led.brightness_get = camera_led_get;
1774 asus->camera_led.brightness_set_blocking = camera_led_set;
1776 rv = led_classdev_register(&asus->platform_device->dev,
1784 asus_wmi_led_exit(asus);
1789 /* RF *************************************************************************/
1792 * PCI hotplug (for wlan rfkill)
1794 static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
1796 int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1803 static void asus_rfkill_hotplug(struct asus_wmi *asus)
1805 struct pci_dev *dev;
1806 struct pci_bus *bus;
1811 mutex_lock(&asus->wmi_lock);
1812 blocked = asus_wlan_rfkill_blocked(asus);
1813 mutex_unlock(&asus->wmi_lock);
1815 mutex_lock(&asus->hotplug_lock);
1816 pci_lock_rescan_remove();
1818 if (asus->wlan.rfkill)
1819 rfkill_set_sw_state(asus->wlan.rfkill, blocked);
1821 if (asus->hotplug_slot.ops) {
1822 bus = pci_find_bus(0, 1);
1824 pr_warn("Unable to find PCI bus 1?\n");
1828 if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
1829 pr_err("Unable to read PCI config space?\n");
1832 absent = (l == 0xffffffff);
1834 if (blocked != absent) {
1835 pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
1836 blocked ? "blocked" : "unblocked",
1837 absent ? "absent" : "present");
1838 pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
1843 dev = pci_get_slot(bus, 0);
1845 /* Device already present */
1849 dev = pci_scan_single_device(bus, 0);
1851 pci_bus_assign_resources(bus);
1852 pci_bus_add_device(dev);
1855 dev = pci_get_slot(bus, 0);
1857 pci_stop_and_remove_bus_device(dev);
1864 pci_unlock_rescan_remove();
1865 mutex_unlock(&asus->hotplug_lock);
1868 static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
1870 struct asus_wmi *asus = data;
1872 if (event != ACPI_NOTIFY_BUS_CHECK)
1876 * We can't call directly asus_rfkill_hotplug because most
1877 * of the time WMBC is still being executed and not reetrant.
1878 * There is currently no way to tell ACPICA that we want this
1879 * method to be serialized, we schedule a asus_rfkill_hotplug
1880 * call later, in a safer context.
1882 queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
1885 static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
1890 status = acpi_get_handle(NULL, node, &handle);
1891 if (ACPI_FAILURE(status))
1894 status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1895 asus_rfkill_notify, asus);
1896 if (ACPI_FAILURE(status))
1897 pr_warn("Failed to register notify on %s\n", node);
1902 static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
1904 acpi_status status = AE_OK;
1907 status = acpi_get_handle(NULL, node, &handle);
1908 if (ACPI_FAILURE(status))
1911 status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1912 asus_rfkill_notify);
1913 if (ACPI_FAILURE(status))
1914 pr_err("Error removing rfkill notify handler %s\n", node);
1917 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
1920 struct asus_wmi *asus = container_of(hotplug_slot,
1921 struct asus_wmi, hotplug_slot);
1922 int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1931 static const struct hotplug_slot_ops asus_hotplug_slot_ops = {
1932 .get_adapter_status = asus_get_adapter_status,
1933 .get_power_status = asus_get_adapter_status,
1936 static void asus_hotplug_work(struct work_struct *work)
1938 struct asus_wmi *asus;
1940 asus = container_of(work, struct asus_wmi, hotplug_work);
1941 asus_rfkill_hotplug(asus);
1944 static int asus_setup_pci_hotplug(struct asus_wmi *asus)
1947 struct pci_bus *bus = pci_find_bus(0, 1);
1950 pr_err("Unable to find wifi PCI bus\n");
1954 asus->hotplug_workqueue =
1955 create_singlethread_workqueue("hotplug_workqueue");
1956 if (!asus->hotplug_workqueue)
1957 goto error_workqueue;
1959 INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
1961 asus->hotplug_slot.ops = &asus_hotplug_slot_ops;
1963 ret = pci_hp_register(&asus->hotplug_slot, bus, 0, "asus-wifi");
1965 pr_err("Unable to register hotplug slot - %d\n", ret);
1966 goto error_register;
1972 asus->hotplug_slot.ops = NULL;
1973 destroy_workqueue(asus->hotplug_workqueue);
1981 static int asus_rfkill_set(void *data, bool blocked)
1983 struct asus_rfkill *priv = data;
1984 u32 ctrl_param = !blocked;
1985 u32 dev_id = priv->dev_id;
1988 * If the user bit is set, BIOS can't set and record the wlan status,
1989 * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
1990 * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
1991 * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
1992 * while setting the wlan status through WMI.
1993 * This is also the behavior that windows app will do.
1995 if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1996 priv->asus->driver->wlan_ctrl_by_user)
1997 dev_id = ASUS_WMI_DEVID_WLAN_LED;
1999 return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
2002 static void asus_rfkill_query(struct rfkill *rfkill, void *data)
2004 struct asus_rfkill *priv = data;
2007 result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
2012 rfkill_set_sw_state(priv->rfkill, !result);
2015 static int asus_rfkill_wlan_set(void *data, bool blocked)
2017 struct asus_rfkill *priv = data;
2018 struct asus_wmi *asus = priv->asus;
2022 * This handler is enabled only if hotplug is enabled.
2023 * In this case, the asus_wmi_set_devstate() will
2024 * trigger a wmi notification and we need to wait
2025 * this call to finish before being able to call
2028 mutex_lock(&asus->wmi_lock);
2029 ret = asus_rfkill_set(data, blocked);
2030 mutex_unlock(&asus->wmi_lock);
2034 static const struct rfkill_ops asus_rfkill_wlan_ops = {
2035 .set_block = asus_rfkill_wlan_set,
2036 .query = asus_rfkill_query,
2039 static const struct rfkill_ops asus_rfkill_ops = {
2040 .set_block = asus_rfkill_set,
2041 .query = asus_rfkill_query,
2044 static int asus_new_rfkill(struct asus_wmi *asus,
2045 struct asus_rfkill *arfkill,
2046 const char *name, enum rfkill_type type, int dev_id)
2048 int result = asus_wmi_get_devstate_simple(asus, dev_id);
2049 struct rfkill **rfkill = &arfkill->rfkill;
2054 arfkill->dev_id = dev_id;
2055 arfkill->asus = asus;
2057 if (dev_id == ASUS_WMI_DEVID_WLAN &&
2058 asus->driver->quirks->hotplug_wireless)
2059 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
2060 &asus_rfkill_wlan_ops, arfkill);
2062 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
2063 &asus_rfkill_ops, arfkill);
2068 if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
2069 (asus->driver->quirks->wapf > 0))
2070 rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
2072 rfkill_init_sw_state(*rfkill, !result);
2073 result = rfkill_register(*rfkill);
2075 rfkill_destroy(*rfkill);
2082 static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
2084 if (asus->driver->wlan_ctrl_by_user && ashs_present())
2087 asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
2088 asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
2089 asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
2090 if (asus->wlan.rfkill) {
2091 rfkill_unregister(asus->wlan.rfkill);
2092 rfkill_destroy(asus->wlan.rfkill);
2093 asus->wlan.rfkill = NULL;
2096 * Refresh pci hotplug in case the rfkill state was changed after
2097 * asus_unregister_rfkill_notifier()
2099 asus_rfkill_hotplug(asus);
2100 if (asus->hotplug_slot.ops)
2101 pci_hp_deregister(&asus->hotplug_slot);
2102 if (asus->hotplug_workqueue)
2103 destroy_workqueue(asus->hotplug_workqueue);
2105 if (asus->bluetooth.rfkill) {
2106 rfkill_unregister(asus->bluetooth.rfkill);
2107 rfkill_destroy(asus->bluetooth.rfkill);
2108 asus->bluetooth.rfkill = NULL;
2110 if (asus->wimax.rfkill) {
2111 rfkill_unregister(asus->wimax.rfkill);
2112 rfkill_destroy(asus->wimax.rfkill);
2113 asus->wimax.rfkill = NULL;
2115 if (asus->wwan3g.rfkill) {
2116 rfkill_unregister(asus->wwan3g.rfkill);
2117 rfkill_destroy(asus->wwan3g.rfkill);
2118 asus->wwan3g.rfkill = NULL;
2120 if (asus->gps.rfkill) {
2121 rfkill_unregister(asus->gps.rfkill);
2122 rfkill_destroy(asus->gps.rfkill);
2123 asus->gps.rfkill = NULL;
2125 if (asus->uwb.rfkill) {
2126 rfkill_unregister(asus->uwb.rfkill);
2127 rfkill_destroy(asus->uwb.rfkill);
2128 asus->uwb.rfkill = NULL;
2132 static int asus_wmi_rfkill_init(struct asus_wmi *asus)
2136 mutex_init(&asus->hotplug_lock);
2137 mutex_init(&asus->wmi_lock);
2139 result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
2140 RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
2142 if (result && result != -ENODEV)
2145 result = asus_new_rfkill(asus, &asus->bluetooth,
2146 "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
2147 ASUS_WMI_DEVID_BLUETOOTH);
2149 if (result && result != -ENODEV)
2152 result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
2153 RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
2155 if (result && result != -ENODEV)
2158 result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
2159 RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
2161 if (result && result != -ENODEV)
2164 result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
2165 RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
2167 if (result && result != -ENODEV)
2170 result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
2171 RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
2173 if (result && result != -ENODEV)
2176 if (!asus->driver->quirks->hotplug_wireless)
2179 result = asus_setup_pci_hotplug(asus);
2181 * If we get -EBUSY then something else is handling the PCI hotplug -
2182 * don't fail in this case
2184 if (result == -EBUSY)
2187 asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
2188 asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
2189 asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
2191 * Refresh pci hotplug in case the rfkill state was changed during
2194 asus_rfkill_hotplug(asus);
2197 if (result && result != -ENODEV)
2198 asus_wmi_rfkill_exit(asus);
2200 if (result == -ENODEV)
2206 /* Panel Overdrive ************************************************************/
2207 static ssize_t panel_od_show(struct device *dev,
2208 struct device_attribute *attr, char *buf)
2210 struct asus_wmi *asus = dev_get_drvdata(dev);
2213 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_PANEL_OD);
2217 return sysfs_emit(buf, "%d\n", result);
2220 static ssize_t panel_od_store(struct device *dev,
2221 struct device_attribute *attr,
2222 const char *buf, size_t count)
2227 struct asus_wmi *asus = dev_get_drvdata(dev);
2229 result = kstrtou32(buf, 10, &overdrive);
2236 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PANEL_OD, overdrive, &result);
2239 pr_warn("Failed to set panel overdrive: %d\n", err);
2244 pr_warn("Failed to set panel overdrive (result): 0x%x\n", result);
2248 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "panel_od");
2252 static DEVICE_ATTR_RW(panel_od);
2254 /* Bootup sound ***************************************************************/
2256 static ssize_t boot_sound_show(struct device *dev,
2257 struct device_attribute *attr, char *buf)
2259 struct asus_wmi *asus = dev_get_drvdata(dev);
2262 result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_BOOT_SOUND);
2266 return sysfs_emit(buf, "%d\n", result);
2269 static ssize_t boot_sound_store(struct device *dev,
2270 struct device_attribute *attr,
2271 const char *buf, size_t count)
2276 struct asus_wmi *asus = dev_get_drvdata(dev);
2278 result = kstrtou32(buf, 10, &snd);
2285 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BOOT_SOUND, snd, &result);
2287 pr_warn("Failed to set boot sound: %d\n", err);
2292 pr_warn("Failed to set panel boot sound (result): 0x%x\n", result);
2296 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "boot_sound");
2300 static DEVICE_ATTR_RW(boot_sound);
2302 /* Mini-LED mode **************************************************************/
2303 static ssize_t mini_led_mode_show(struct device *dev,
2304 struct device_attribute *attr, char *buf)
2306 struct asus_wmi *asus = dev_get_drvdata(dev);
2310 err = asus_wmi_get_devstate(asus, asus->mini_led_dev_id, &value);
2313 value = value & ASUS_MINI_LED_MODE_MASK;
2316 * Remap the mode values to match previous generation mini-led. The last gen
2317 * WMI 0 == off, while on this version WMI 2 ==off (flipped).
2319 if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2) {
2321 case ASUS_MINI_LED_2024_WEAK:
2322 value = ASUS_MINI_LED_ON;
2324 case ASUS_MINI_LED_2024_STRONG:
2325 value = ASUS_MINI_LED_STRONG_MODE;
2327 case ASUS_MINI_LED_2024_OFF:
2328 value = ASUS_MINI_LED_OFF;
2333 return sysfs_emit(buf, "%d\n", value);
2336 static ssize_t mini_led_mode_store(struct device *dev,
2337 struct device_attribute *attr,
2338 const char *buf, size_t count)
2343 struct asus_wmi *asus = dev_get_drvdata(dev);
2345 result = kstrtou32(buf, 10, &mode);
2349 if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE &&
2350 mode > ASUS_MINI_LED_ON)
2352 if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2 &&
2353 mode > ASUS_MINI_LED_STRONG_MODE)
2357 * Remap the mode values so expected behaviour is the same as the last
2358 * generation of mini-LED with 0 == off, 1 == on.
2360 if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2) {
2362 case ASUS_MINI_LED_OFF:
2363 mode = ASUS_MINI_LED_2024_OFF;
2365 case ASUS_MINI_LED_ON:
2366 mode = ASUS_MINI_LED_2024_WEAK;
2368 case ASUS_MINI_LED_STRONG_MODE:
2369 mode = ASUS_MINI_LED_2024_STRONG;
2374 err = asus_wmi_set_devstate(asus->mini_led_dev_id, mode, &result);
2376 pr_warn("Failed to set mini-LED: %d\n", err);
2381 pr_warn("Failed to set mini-LED mode (result): 0x%x\n", result);
2385 sysfs_notify(&asus->platform_device->dev.kobj, NULL, "mini_led_mode");
2389 static DEVICE_ATTR_RW(mini_led_mode);
2391 static ssize_t available_mini_led_mode_show(struct device *dev,
2392 struct device_attribute *attr, char *buf)
2394 struct asus_wmi *asus = dev_get_drvdata(dev);
2396 switch (asus->mini_led_dev_id) {
2397 case ASUS_WMI_DEVID_MINI_LED_MODE:
2398 return sysfs_emit(buf, "0 1\n");
2399 case ASUS_WMI_DEVID_MINI_LED_MODE2:
2400 return sysfs_emit(buf, "0 1 2\n");
2403 return sysfs_emit(buf, "0\n");
2406 static DEVICE_ATTR_RO(available_mini_led_mode);
2408 /* Quirks *********************************************************************/
2410 static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
2412 struct pci_dev *xhci_pdev;
2413 u32 orig_ports_available;
2414 u32 ports_available = asus->driver->quirks->xusb2pr;
2416 xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
2417 PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI,
2423 pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
2424 &orig_ports_available);
2426 pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
2427 cpu_to_le32(ports_available));
2429 pci_dev_put(xhci_pdev);
2431 pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
2432 orig_ports_available, ports_available);
2436 * Some devices dont support or have borcken get_als method
2437 * but still support set method.
2439 static void asus_wmi_set_als(void)
2441 asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE, 1, NULL);
2444 /* Hwmon device ***************************************************************/
2446 static int asus_agfn_fan_speed_read(struct asus_wmi *asus, int fan,
2449 struct agfn_fan_args args = {
2450 .agfn.len = sizeof(args),
2451 .agfn.mfun = ASUS_FAN_MFUN,
2452 .agfn.sfun = ASUS_FAN_SFUN_READ,
2456 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2462 status = asus_wmi_evaluate_method_agfn(input);
2464 if (status || args.agfn.err)
2468 *speed = args.speed;
2473 static int asus_agfn_fan_speed_write(struct asus_wmi *asus, int fan,
2476 struct agfn_fan_args args = {
2477 .agfn.len = sizeof(args),
2478 .agfn.mfun = ASUS_FAN_MFUN,
2479 .agfn.sfun = ASUS_FAN_SFUN_WRITE,
2481 .speed = speed ? *speed : 0,
2483 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2486 /* 1: for setting 1st fan's speed 0: setting auto mode */
2487 if (fan != 1 && fan != 0)
2490 status = asus_wmi_evaluate_method_agfn(input);
2492 if (status || args.agfn.err)
2495 if (speed && fan == 1)
2496 asus->agfn_pwm = *speed;
2502 * Check if we can read the speed of one fan. If true we assume we can also
2505 static bool asus_wmi_has_agfn_fan(struct asus_wmi *asus)
2511 status = asus_agfn_fan_speed_read(asus, 1, &speed);
2515 status = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
2520 * We need to find a better way, probably using sfun,
2522 * Currently we disable it if:
2523 * - ASUS_WMI_UNSUPPORTED_METHOD is returned
2524 * - reverved bits are non-zero
2525 * - sfun and presence bit are not set
2527 return !(value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
2528 || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)));
2531 static int asus_fan_set_auto(struct asus_wmi *asus)
2536 switch (asus->fan_type) {
2537 case FAN_TYPE_SPEC83:
2538 status = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
2548 status = asus_agfn_fan_speed_write(asus, 0, NULL);
2558 * Modern models like the G713 also have GPU fan control (this is not AGFN)
2560 if (asus->gpu_fan_type == FAN_TYPE_SPEC83) {
2561 status = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
2573 static ssize_t pwm1_show(struct device *dev,
2574 struct device_attribute *attr,
2577 struct asus_wmi *asus = dev_get_drvdata(dev);
2581 /* If we already set a value then just return it */
2582 if (asus->agfn_pwm >= 0)
2583 return sysfs_emit(buf, "%d\n", asus->agfn_pwm);
2586 * If we haven't set already set a value through the AGFN interface,
2587 * we read a current value through the (now-deprecated) FAN_CTRL device.
2589 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
2595 if (value == 1) /* Low Speed */
2597 else if (value == 2)
2599 else if (value == 3)
2602 pr_err("Unknown fan speed %#x\n", value);
2606 return sysfs_emit(buf, "%d\n", value);
2609 static ssize_t pwm1_store(struct device *dev,
2610 struct device_attribute *attr,
2611 const char *buf, size_t count) {
2612 struct asus_wmi *asus = dev_get_drvdata(dev);
2617 ret = kstrtouint(buf, 10, &value);
2621 value = clamp(value, 0, 255);
2623 state = asus_agfn_fan_speed_write(asus, 1, &value);
2625 pr_warn("Setting fan speed failed: %d\n", state);
2627 asus->fan_pwm_mode = ASUS_FAN_CTRL_MANUAL;
2632 static ssize_t fan1_input_show(struct device *dev,
2633 struct device_attribute *attr,
2636 struct asus_wmi *asus = dev_get_drvdata(dev);
2640 switch (asus->fan_type) {
2641 case FAN_TYPE_SPEC83:
2642 ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL,
2651 /* no speed readable on manual mode */
2652 if (asus->fan_pwm_mode == ASUS_FAN_CTRL_MANUAL)
2655 ret = asus_agfn_fan_speed_read(asus, 1, &value);
2657 pr_warn("reading fan speed failed: %d\n", ret);
2666 return sysfs_emit(buf, "%d\n", value < 0 ? -1 : value * 100);
2669 static ssize_t pwm1_enable_show(struct device *dev,
2670 struct device_attribute *attr,
2673 struct asus_wmi *asus = dev_get_drvdata(dev);
2676 * Just read back the cached pwm mode.
2678 * For the CPU_FAN device, the spec indicates that we should be
2679 * able to read the device status and consult bit 19 to see if we
2680 * are in Full On or Automatic mode. However, this does not work
2681 * in practice on X532FL at least (the bit is always 0) and there's
2682 * also nothing in the DSDT to indicate that this behaviour exists.
2684 return sysfs_emit(buf, "%d\n", asus->fan_pwm_mode);
2687 static ssize_t pwm1_enable_store(struct device *dev,
2688 struct device_attribute *attr,
2689 const char *buf, size_t count)
2691 struct asus_wmi *asus = dev_get_drvdata(dev);
2698 ret = kstrtouint(buf, 10, &state);
2702 if (asus->fan_type == FAN_TYPE_SPEC83) {
2703 switch (state) { /* standard documented hwmon values */
2704 case ASUS_FAN_CTRL_FULLSPEED:
2707 case ASUS_FAN_CTRL_AUTO:
2714 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
2721 } else if (asus->fan_type == FAN_TYPE_AGFN) {
2723 case ASUS_FAN_CTRL_MANUAL:
2726 case ASUS_FAN_CTRL_AUTO:
2727 status = asus_fan_set_auto(asus);
2737 asus->fan_pwm_mode = state;
2739 /* Must set to disabled if mode is toggled */
2740 if (asus->cpu_fan_curve_available)
2741 asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
2742 if (asus->gpu_fan_curve_available)
2743 asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
2744 if (asus->mid_fan_curve_available)
2745 asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
2750 static ssize_t asus_hwmon_temp1(struct device *dev,
2751 struct device_attribute *attr,
2754 struct asus_wmi *asus = dev_get_drvdata(dev);
2758 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
2762 return sysfs_emit(buf, "%ld\n",
2763 deci_kelvin_to_millicelsius(value & 0xFFFF));
2766 /* GPU fan on modern ROG laptops */
2767 static ssize_t fan2_input_show(struct device *dev,
2768 struct device_attribute *attr,
2771 struct asus_wmi *asus = dev_get_drvdata(dev);
2775 ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL, &value);
2781 return sysfs_emit(buf, "%d\n", value * 100);
2784 /* Middle/Center fan on modern ROG laptops */
2785 static ssize_t fan3_input_show(struct device *dev,
2786 struct device_attribute *attr,
2789 struct asus_wmi *asus = dev_get_drvdata(dev);
2793 ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_MID_FAN_CTRL, &value);
2799 return sysfs_emit(buf, "%d\n", value * 100);
2802 static ssize_t pwm2_enable_show(struct device *dev,
2803 struct device_attribute *attr,
2806 struct asus_wmi *asus = dev_get_drvdata(dev);
2808 return sysfs_emit(buf, "%d\n", asus->gpu_fan_pwm_mode);
2811 static ssize_t pwm2_enable_store(struct device *dev,
2812 struct device_attribute *attr,
2813 const char *buf, size_t count)
2815 struct asus_wmi *asus = dev_get_drvdata(dev);
2821 ret = kstrtouint(buf, 10, &state);
2825 switch (state) { /* standard documented hwmon values */
2826 case ASUS_FAN_CTRL_FULLSPEED:
2829 case ASUS_FAN_CTRL_AUTO:
2836 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
2844 asus->gpu_fan_pwm_mode = state;
2848 static ssize_t pwm3_enable_show(struct device *dev,
2849 struct device_attribute *attr,
2852 struct asus_wmi *asus = dev_get_drvdata(dev);
2854 return sysfs_emit(buf, "%d\n", asus->mid_fan_pwm_mode);
2857 static ssize_t pwm3_enable_store(struct device *dev,
2858 struct device_attribute *attr,
2859 const char *buf, size_t count)
2861 struct asus_wmi *asus = dev_get_drvdata(dev);
2867 ret = kstrtouint(buf, 10, &state);
2871 switch (state) { /* standard documented hwmon values */
2872 case ASUS_FAN_CTRL_FULLSPEED:
2875 case ASUS_FAN_CTRL_AUTO:
2882 ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_MID_FAN_CTRL,
2890 asus->mid_fan_pwm_mode = state;
2895 static DEVICE_ATTR_RW(pwm1);
2896 static DEVICE_ATTR_RW(pwm1_enable);
2897 static DEVICE_ATTR_RO(fan1_input);
2898 static DEVICE_STRING_ATTR_RO(fan1_label, 0444, ASUS_FAN_DESC);
2900 /* Fan2 - GPU fan */
2901 static DEVICE_ATTR_RW(pwm2_enable);
2902 static DEVICE_ATTR_RO(fan2_input);
2903 static DEVICE_STRING_ATTR_RO(fan2_label, 0444, ASUS_GPU_FAN_DESC);
2904 /* Fan3 - Middle/center fan */
2905 static DEVICE_ATTR_RW(pwm3_enable);
2906 static DEVICE_ATTR_RO(fan3_input);
2907 static DEVICE_STRING_ATTR_RO(fan3_label, 0444, ASUS_MID_FAN_DESC);
2910 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
2912 static struct attribute *hwmon_attributes[] = {
2913 &dev_attr_pwm1.attr,
2914 &dev_attr_pwm1_enable.attr,
2915 &dev_attr_pwm2_enable.attr,
2916 &dev_attr_pwm3_enable.attr,
2917 &dev_attr_fan1_input.attr,
2918 &dev_attr_fan1_label.attr.attr,
2919 &dev_attr_fan2_input.attr,
2920 &dev_attr_fan2_label.attr.attr,
2921 &dev_attr_fan3_input.attr,
2922 &dev_attr_fan3_label.attr.attr,
2924 &dev_attr_temp1_input.attr,
2928 static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
2929 struct attribute *attr, int idx)
2931 struct device *dev = kobj_to_dev(kobj);
2932 struct asus_wmi *asus = dev_get_drvdata(dev->parent);
2933 u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
2935 if (attr == &dev_attr_pwm1.attr) {
2936 if (asus->fan_type != FAN_TYPE_AGFN)
2938 } else if (attr == &dev_attr_fan1_input.attr
2939 || attr == &dev_attr_fan1_label.attr.attr
2940 || attr == &dev_attr_pwm1_enable.attr) {
2941 if (asus->fan_type == FAN_TYPE_NONE)
2943 } else if (attr == &dev_attr_fan2_input.attr
2944 || attr == &dev_attr_fan2_label.attr.attr
2945 || attr == &dev_attr_pwm2_enable.attr) {
2946 if (asus->gpu_fan_type == FAN_TYPE_NONE)
2948 } else if (attr == &dev_attr_fan3_input.attr
2949 || attr == &dev_attr_fan3_label.attr.attr
2950 || attr == &dev_attr_pwm3_enable.attr) {
2951 if (asus->mid_fan_type == FAN_TYPE_NONE)
2953 } else if (attr == &dev_attr_temp1_input.attr) {
2954 int err = asus_wmi_get_devstate(asus,
2955 ASUS_WMI_DEVID_THERMAL_CTRL,
2959 return 0; /* can't return negative here */
2962 * If the temperature value in deci-Kelvin is near the absolute
2963 * zero temperature, something is clearly wrong
2965 if (value == 0 || value == 1)
2972 static const struct attribute_group hwmon_attribute_group = {
2973 .is_visible = asus_hwmon_sysfs_is_visible,
2974 .attrs = hwmon_attributes
2976 __ATTRIBUTE_GROUPS(hwmon_attribute);
2978 static int asus_wmi_hwmon_init(struct asus_wmi *asus)
2980 struct device *dev = &asus->platform_device->dev;
2981 struct device *hwmon;
2983 hwmon = devm_hwmon_device_register_with_groups(dev, "asus", asus,
2984 hwmon_attribute_groups);
2986 if (IS_ERR(hwmon)) {
2987 pr_err("Could not register asus hwmon device\n");
2988 return PTR_ERR(hwmon);
2993 static int asus_wmi_fan_init(struct asus_wmi *asus)
2995 asus->gpu_fan_type = FAN_TYPE_NONE;
2996 asus->mid_fan_type = FAN_TYPE_NONE;
2997 asus->fan_type = FAN_TYPE_NONE;
2998 asus->agfn_pwm = -1;
3000 if (asus->driver->quirks->wmi_ignore_fan)
3001 asus->fan_type = FAN_TYPE_NONE;
3002 else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))
3003 asus->fan_type = FAN_TYPE_SPEC83;
3004 else if (asus_wmi_has_agfn_fan(asus))
3005 asus->fan_type = FAN_TYPE_AGFN;
3007 /* Modern models like G713 also have GPU fan control */
3008 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL))
3009 asus->gpu_fan_type = FAN_TYPE_SPEC83;
3011 /* Some models also have a center/middle fan */
3012 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MID_FAN_CTRL))
3013 asus->mid_fan_type = FAN_TYPE_SPEC83;
3015 if (asus->fan_type == FAN_TYPE_NONE)
3018 asus_fan_set_auto(asus);
3019 asus->fan_pwm_mode = ASUS_FAN_CTRL_AUTO;
3023 /* Fan mode *******************************************************************/
3025 static int fan_boost_mode_check_present(struct asus_wmi *asus)
3030 asus->fan_boost_mode_available = false;
3032 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE,
3041 if ((result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
3042 (result & ASUS_FAN_BOOST_MODES_MASK)) {
3043 asus->fan_boost_mode_available = true;
3044 asus->fan_boost_mode_mask = result & ASUS_FAN_BOOST_MODES_MASK;
3050 static int fan_boost_mode_write(struct asus_wmi *asus)
3056 value = asus->fan_boost_mode;
3058 pr_info("Set fan boost mode: %u\n", value);
3059 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value,
3062 sysfs_notify(&asus->platform_device->dev.kobj, NULL,
3066 pr_warn("Failed to set fan boost mode: %d\n", err);
3071 pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
3079 static int fan_boost_mode_switch_next(struct asus_wmi *asus)
3081 u8 mask = asus->fan_boost_mode_mask;
3083 if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_NORMAL) {
3084 if (mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK)
3085 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST;
3086 else if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
3087 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
3088 } else if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
3089 if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
3090 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
3092 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
3094 asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
3097 return fan_boost_mode_write(asus);
3100 static ssize_t fan_boost_mode_show(struct device *dev,
3101 struct device_attribute *attr, char *buf)
3103 struct asus_wmi *asus = dev_get_drvdata(dev);
3105 return sysfs_emit(buf, "%d\n", asus->fan_boost_mode);
3108 static ssize_t fan_boost_mode_store(struct device *dev,
3109 struct device_attribute *attr,
3110 const char *buf, size_t count)
3112 struct asus_wmi *asus = dev_get_drvdata(dev);
3113 u8 mask = asus->fan_boost_mode_mask;
3117 result = kstrtou8(buf, 10, &new_mode);
3119 pr_warn("Trying to store invalid value\n");
3123 if (new_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
3124 if (!(mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK))
3126 } else if (new_mode == ASUS_FAN_BOOST_MODE_SILENT) {
3127 if (!(mask & ASUS_FAN_BOOST_MODE_SILENT_MASK))
3129 } else if (new_mode != ASUS_FAN_BOOST_MODE_NORMAL) {
3133 asus->fan_boost_mode = new_mode;
3134 fan_boost_mode_write(asus);
3139 // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
3140 static DEVICE_ATTR_RW(fan_boost_mode);
3142 /* Custom fan curves **********************************************************/
3144 static void fan_curve_copy_from_buf(struct fan_curve_data *data, u8 *buf)
3148 for (i = 0; i < FAN_CURVE_POINTS; i++) {
3149 data->temps[i] = buf[i];
3152 for (i = 0; i < FAN_CURVE_POINTS; i++) {
3154 255 * buf[i + FAN_CURVE_POINTS] / 100;
3158 static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev)
3160 struct fan_curve_data *curves;
3161 u8 buf[FAN_CURVE_BUF_LEN];
3165 if (asus->throttle_thermal_policy_available)
3166 mode = asus->throttle_thermal_policy_mode;
3167 /* DEVID_<C/G>PU_FAN_CURVE is switched for OVERBOOST vs SILENT */
3173 err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf,
3176 pr_warn("%s (0x%08x) failed: %d\n", __func__, fan_dev, err);
3180 fan_idx = FAN_CURVE_DEV_CPU;
3181 if (fan_dev == ASUS_WMI_DEVID_GPU_FAN_CURVE)
3182 fan_idx = FAN_CURVE_DEV_GPU;
3184 if (fan_dev == ASUS_WMI_DEVID_MID_FAN_CURVE)
3185 fan_idx = FAN_CURVE_DEV_MID;
3187 curves = &asus->custom_fan_curves[fan_idx];
3188 curves->device_id = fan_dev;
3190 fan_curve_copy_from_buf(curves, buf);
3194 /* Check if capability exists, and populate defaults */
3195 static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
3202 if (asus->fan_type == FAN_TYPE_NONE)
3205 err = fan_curve_get_factory_default(asus, fan_dev);
3214 /* Determine which fan the attribute is for if SENSOR_ATTR */
3215 static struct fan_curve_data *fan_curve_attr_select(struct asus_wmi *asus,
3216 struct device_attribute *attr)
3218 int index = to_sensor_dev_attr(attr)->index;
3220 return &asus->custom_fan_curves[index];
3223 /* Determine which fan the attribute is for if SENSOR_ATTR_2 */
3224 static struct fan_curve_data *fan_curve_attr_2_select(struct asus_wmi *asus,
3225 struct device_attribute *attr)
3227 int nr = to_sensor_dev_attr_2(attr)->nr;
3229 return &asus->custom_fan_curves[nr & ~FAN_CURVE_PWM_MASK];
3232 static ssize_t fan_curve_show(struct device *dev,
3233 struct device_attribute *attr, char *buf)
3235 struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
3236 struct asus_wmi *asus = dev_get_drvdata(dev);
3237 struct fan_curve_data *data;
3238 int value, pwm, index;
3240 data = fan_curve_attr_2_select(asus, attr);
3241 pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
3242 index = dev_attr->index;
3245 value = data->percents[index];
3247 value = data->temps[index];
3249 return sysfs_emit(buf, "%d\n", value);
3253 * "fan_dev" is the related WMI method such as ASUS_WMI_DEVID_CPU_FAN_CURVE.
3255 static int fan_curve_write(struct asus_wmi *asus,
3256 struct fan_curve_data *data)
3258 u32 arg1 = 0, arg2 = 0, arg3 = 0, arg4 = 0;
3259 u8 *percents = data->percents;
3260 u8 *temps = data->temps;
3261 int ret, i, shift = 0;
3266 for (i = 0; i < FAN_CURVE_POINTS / 2; i++) {
3267 arg1 += (temps[i]) << shift;
3268 arg2 += (temps[i + 4]) << shift;
3269 /* Scale to percentage for device */
3270 arg3 += (100 * percents[i] / 255) << shift;
3271 arg4 += (100 * percents[i + 4] / 255) << shift;
3275 return asus_wmi_evaluate_method5(ASUS_WMI_METHODID_DEVS,
3277 arg1, arg2, arg3, arg4, &ret);
3280 static ssize_t fan_curve_store(struct device *dev,
3281 struct device_attribute *attr, const char *buf,
3284 struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
3285 struct asus_wmi *asus = dev_get_drvdata(dev);
3286 struct fan_curve_data *data;
3287 int err, pwm, index;
3290 data = fan_curve_attr_2_select(asus, attr);
3291 pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
3292 index = dev_attr->index;
3294 err = kstrtou8(buf, 10, &value);
3299 data->percents[index] = value;
3301 data->temps[index] = value;
3304 * Mark as disabled so the user has to explicitly enable to apply a
3305 * changed fan curve. This prevents potential lockups from writing out
3306 * many changes as one-write-per-change.
3308 data->enabled = false;
3313 static ssize_t fan_curve_enable_show(struct device *dev,
3314 struct device_attribute *attr, char *buf)
3316 struct asus_wmi *asus = dev_get_drvdata(dev);
3317 struct fan_curve_data *data;
3320 data = fan_curve_attr_select(asus, attr);
3325 return sysfs_emit(buf, "%d\n", out);
3328 static ssize_t fan_curve_enable_store(struct device *dev,
3329 struct device_attribute *attr,
3330 const char *buf, size_t count)
3332 struct asus_wmi *asus = dev_get_drvdata(dev);
3333 struct fan_curve_data *data;
3336 data = fan_curve_attr_select(asus, attr);
3338 err = kstrtoint(buf, 10, &value);
3344 data->enabled = true;
3347 data->enabled = false;
3350 * Auto + reset the fan curve data to defaults. Make it an explicit
3351 * option so that users don't accidentally overwrite a set fan curve.
3354 err = fan_curve_get_factory_default(asus, data->device_id);
3357 data->enabled = false;
3363 if (data->enabled) {
3364 err = fan_curve_write(asus, data);
3369 * For machines with throttle this is the only way to reset fans
3370 * to default mode of operation (does not erase curve data).
3372 if (asus->throttle_thermal_policy_available) {
3373 err = throttle_thermal_policy_write(asus);
3376 /* Similar is true for laptops with this fan */
3377 } else if (asus->fan_type == FAN_TYPE_SPEC83) {
3378 err = asus_fan_set_auto(asus);
3382 /* Safeguard against fautly ACPI tables */
3383 err = fan_curve_get_factory_default(asus, data->device_id);
3386 err = fan_curve_write(asus, data);
3395 static SENSOR_DEVICE_ATTR_RW(pwm1_enable, fan_curve_enable, FAN_CURVE_DEV_CPU);
3396 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_temp, fan_curve,
3397 FAN_CURVE_DEV_CPU, 0);
3398 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_temp, fan_curve,
3399 FAN_CURVE_DEV_CPU, 1);
3400 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_temp, fan_curve,
3401 FAN_CURVE_DEV_CPU, 2);
3402 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_temp, fan_curve,
3403 FAN_CURVE_DEV_CPU, 3);
3404 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_temp, fan_curve,
3405 FAN_CURVE_DEV_CPU, 4);
3406 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_temp, fan_curve,
3407 FAN_CURVE_DEV_CPU, 5);
3408 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_temp, fan_curve,
3409 FAN_CURVE_DEV_CPU, 6);
3410 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp, fan_curve,
3411 FAN_CURVE_DEV_CPU, 7);
3413 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_pwm, fan_curve,
3414 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 0);
3415 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_pwm, fan_curve,
3416 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 1);
3417 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_pwm, fan_curve,
3418 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 2);
3419 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_pwm, fan_curve,
3420 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 3);
3421 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_pwm, fan_curve,
3422 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 4);
3423 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_pwm, fan_curve,
3424 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 5);
3425 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_pwm, fan_curve,
3426 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 6);
3427 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_pwm, fan_curve,
3428 FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 7);
3431 static SENSOR_DEVICE_ATTR_RW(pwm2_enable, fan_curve_enable, FAN_CURVE_DEV_GPU);
3432 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_temp, fan_curve,
3433 FAN_CURVE_DEV_GPU, 0);
3434 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_temp, fan_curve,
3435 FAN_CURVE_DEV_GPU, 1);
3436 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_temp, fan_curve,
3437 FAN_CURVE_DEV_GPU, 2);
3438 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_temp, fan_curve,
3439 FAN_CURVE_DEV_GPU, 3);
3440 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_temp, fan_curve,
3441 FAN_CURVE_DEV_GPU, 4);
3442 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_temp, fan_curve,
3443 FAN_CURVE_DEV_GPU, 5);
3444 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_temp, fan_curve,
3445 FAN_CURVE_DEV_GPU, 6);
3446 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_temp, fan_curve,
3447 FAN_CURVE_DEV_GPU, 7);
3449 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_pwm, fan_curve,
3450 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 0);
3451 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_pwm, fan_curve,
3452 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 1);
3453 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_pwm, fan_curve,
3454 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 2);
3455 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_pwm, fan_curve,
3456 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 3);
3457 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_pwm, fan_curve,
3458 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 4);
3459 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_pwm, fan_curve,
3460 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 5);
3461 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm, fan_curve,
3462 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 6);
3463 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve,
3464 FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7);
3467 static SENSOR_DEVICE_ATTR_RW(pwm3_enable, fan_curve_enable, FAN_CURVE_DEV_MID);
3468 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_temp, fan_curve,
3469 FAN_CURVE_DEV_MID, 0);
3470 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_temp, fan_curve,
3471 FAN_CURVE_DEV_MID, 1);
3472 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_temp, fan_curve,
3473 FAN_CURVE_DEV_MID, 2);
3474 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_temp, fan_curve,
3475 FAN_CURVE_DEV_MID, 3);
3476 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_temp, fan_curve,
3477 FAN_CURVE_DEV_MID, 4);
3478 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_temp, fan_curve,
3479 FAN_CURVE_DEV_MID, 5);
3480 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_temp, fan_curve,
3481 FAN_CURVE_DEV_MID, 6);
3482 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_temp, fan_curve,
3483 FAN_CURVE_DEV_MID, 7);
3485 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_pwm, fan_curve,
3486 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 0);
3487 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_pwm, fan_curve,
3488 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 1);
3489 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_pwm, fan_curve,
3490 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 2);
3491 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_pwm, fan_curve,
3492 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 3);
3493 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_pwm, fan_curve,
3494 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 4);
3495 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_pwm, fan_curve,
3496 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 5);
3497 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_pwm, fan_curve,
3498 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 6);
3499 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_pwm, fan_curve,
3500 FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 7);
3502 static struct attribute *asus_fan_curve_attr[] = {
3504 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
3505 &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
3506 &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
3507 &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
3508 &sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
3509 &sensor_dev_attr_pwm1_auto_point5_temp.dev_attr.attr,
3510 &sensor_dev_attr_pwm1_auto_point6_temp.dev_attr.attr,
3511 &sensor_dev_attr_pwm1_auto_point7_temp.dev_attr.attr,
3512 &sensor_dev_attr_pwm1_auto_point8_temp.dev_attr.attr,
3513 &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
3514 &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
3515 &sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
3516 &sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
3517 &sensor_dev_attr_pwm1_auto_point5_pwm.dev_attr.attr,
3518 &sensor_dev_attr_pwm1_auto_point6_pwm.dev_attr.attr,
3519 &sensor_dev_attr_pwm1_auto_point7_pwm.dev_attr.attr,
3520 &sensor_dev_attr_pwm1_auto_point8_pwm.dev_attr.attr,
3522 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
3523 &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
3524 &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
3525 &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
3526 &sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
3527 &sensor_dev_attr_pwm2_auto_point5_temp.dev_attr.attr,
3528 &sensor_dev_attr_pwm2_auto_point6_temp.dev_attr.attr,
3529 &sensor_dev_attr_pwm2_auto_point7_temp.dev_attr.attr,
3530 &sensor_dev_attr_pwm2_auto_point8_temp.dev_attr.attr,
3531 &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
3532 &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
3533 &sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
3534 &sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
3535 &sensor_dev_attr_pwm2_auto_point5_pwm.dev_attr.attr,
3536 &sensor_dev_attr_pwm2_auto_point6_pwm.dev_attr.attr,
3537 &sensor_dev_attr_pwm2_auto_point7_pwm.dev_attr.attr,
3538 &sensor_dev_attr_pwm2_auto_point8_pwm.dev_attr.attr,
3540 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
3541 &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
3542 &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
3543 &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
3544 &sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
3545 &sensor_dev_attr_pwm3_auto_point5_temp.dev_attr.attr,
3546 &sensor_dev_attr_pwm3_auto_point6_temp.dev_attr.attr,
3547 &sensor_dev_attr_pwm3_auto_point7_temp.dev_attr.attr,
3548 &sensor_dev_attr_pwm3_auto_point8_temp.dev_attr.attr,
3549 &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
3550 &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
3551 &sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
3552 &sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
3553 &sensor_dev_attr_pwm3_auto_point5_pwm.dev_attr.attr,
3554 &sensor_dev_attr_pwm3_auto_point6_pwm.dev_attr.attr,
3555 &sensor_dev_attr_pwm3_auto_point7_pwm.dev_attr.attr,
3556 &sensor_dev_attr_pwm3_auto_point8_pwm.dev_attr.attr,
3560 static umode_t asus_fan_curve_is_visible(struct kobject *kobj,
3561 struct attribute *attr, int idx)
3563 struct device *dev = kobj_to_dev(kobj);
3564 struct asus_wmi *asus = dev_get_drvdata(dev->parent);
3567 * Check the char instead of casting attr as there are two attr types
3568 * involved here (attr1 and attr2)
3570 if (asus->cpu_fan_curve_available && attr->name[3] == '1')
3573 if (asus->gpu_fan_curve_available && attr->name[3] == '2')
3576 if (asus->mid_fan_curve_available && attr->name[3] == '3')
3582 static const struct attribute_group asus_fan_curve_attr_group = {
3583 .is_visible = asus_fan_curve_is_visible,
3584 .attrs = asus_fan_curve_attr,
3586 __ATTRIBUTE_GROUPS(asus_fan_curve_attr);
3589 * Must be initialised after throttle_thermal_policy_check_present() as
3590 * we check the status of throttle_thermal_policy_available during init.
3592 static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
3594 struct device *dev = &asus->platform_device->dev;
3595 struct device *hwmon;
3598 err = fan_curve_check_present(asus, &asus->cpu_fan_curve_available,
3599 ASUS_WMI_DEVID_CPU_FAN_CURVE);
3603 err = fan_curve_check_present(asus, &asus->gpu_fan_curve_available,
3604 ASUS_WMI_DEVID_GPU_FAN_CURVE);
3608 err = fan_curve_check_present(asus, &asus->mid_fan_curve_available,
3609 ASUS_WMI_DEVID_MID_FAN_CURVE);
3613 if (!asus->cpu_fan_curve_available
3614 && !asus->gpu_fan_curve_available
3615 && !asus->mid_fan_curve_available)
3618 hwmon = devm_hwmon_device_register_with_groups(
3619 dev, "asus_custom_fan_curve", asus, asus_fan_curve_attr_groups);
3621 if (IS_ERR(hwmon)) {
3623 "Could not register asus_custom_fan_curve device\n");
3624 return PTR_ERR(hwmon);
3630 /* Throttle thermal policy ****************************************************/
3632 static int throttle_thermal_policy_check_present(struct asus_wmi *asus)
3637 asus->throttle_thermal_policy_available = false;
3639 err = asus_wmi_get_devstate(asus,
3640 ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
3648 if (result & ASUS_WMI_DSTS_PRESENCE_BIT)
3649 asus->throttle_thermal_policy_available = true;
3654 static int throttle_thermal_policy_write(struct asus_wmi *asus)
3660 value = asus->throttle_thermal_policy_mode;
3662 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
3665 sysfs_notify(&asus->platform_device->dev.kobj, NULL,
3666 "throttle_thermal_policy");
3669 pr_warn("Failed to set throttle thermal policy: %d\n", err);
3674 pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n",
3679 /* Must set to disabled if mode is toggled */
3680 if (asus->cpu_fan_curve_available)
3681 asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
3682 if (asus->gpu_fan_curve_available)
3683 asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
3684 if (asus->mid_fan_curve_available)
3685 asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
3690 static int throttle_thermal_policy_set_default(struct asus_wmi *asus)
3692 if (!asus->throttle_thermal_policy_available)
3695 asus->throttle_thermal_policy_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3696 return throttle_thermal_policy_write(asus);
3699 static int throttle_thermal_policy_switch_next(struct asus_wmi *asus)
3701 u8 new_mode = asus->throttle_thermal_policy_mode + 1;
3704 if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
3705 new_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3707 asus->throttle_thermal_policy_mode = new_mode;
3708 err = throttle_thermal_policy_write(asus);
3713 * Ensure that platform_profile updates userspace with the change to ensure
3714 * that platform_profile and throttle_thermal_policy_mode are in sync.
3716 platform_profile_notify();
3721 static ssize_t throttle_thermal_policy_show(struct device *dev,
3722 struct device_attribute *attr, char *buf)
3724 struct asus_wmi *asus = dev_get_drvdata(dev);
3725 u8 mode = asus->throttle_thermal_policy_mode;
3727 return sysfs_emit(buf, "%d\n", mode);
3730 static ssize_t throttle_thermal_policy_store(struct device *dev,
3731 struct device_attribute *attr,
3732 const char *buf, size_t count)
3734 struct asus_wmi *asus = dev_get_drvdata(dev);
3739 result = kstrtou8(buf, 10, &new_mode);
3743 if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
3746 asus->throttle_thermal_policy_mode = new_mode;
3747 err = throttle_thermal_policy_write(asus);
3752 * Ensure that platform_profile updates userspace with the change to ensure
3753 * that platform_profile and throttle_thermal_policy_mode are in sync.
3755 platform_profile_notify();
3760 // Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
3761 static DEVICE_ATTR_RW(throttle_thermal_policy);
3763 /* Platform profile ***********************************************************/
3764 static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
3765 enum platform_profile_option *profile)
3767 struct asus_wmi *asus;
3770 asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
3772 tp = asus->throttle_thermal_policy_mode;
3775 case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
3776 *profile = PLATFORM_PROFILE_BALANCED;
3778 case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
3779 *profile = PLATFORM_PROFILE_PERFORMANCE;
3781 case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
3782 *profile = PLATFORM_PROFILE_QUIET;
3791 static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,
3792 enum platform_profile_option profile)
3794 struct asus_wmi *asus;
3797 asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
3800 case PLATFORM_PROFILE_PERFORMANCE:
3801 tp = ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST;
3803 case PLATFORM_PROFILE_BALANCED:
3804 tp = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3806 case PLATFORM_PROFILE_QUIET:
3807 tp = ASUS_THROTTLE_THERMAL_POLICY_SILENT;
3813 asus->throttle_thermal_policy_mode = tp;
3814 return throttle_thermal_policy_write(asus);
3817 static int platform_profile_setup(struct asus_wmi *asus)
3819 struct device *dev = &asus->platform_device->dev;
3823 * Not an error if a component platform_profile relies on is unavailable
3824 * so early return, skipping the setup of platform_profile.
3826 if (!asus->throttle_thermal_policy_available)
3829 dev_info(dev, "Using throttle_thermal_policy for platform_profile support\n");
3831 asus->platform_profile_handler.profile_get = asus_wmi_platform_profile_get;
3832 asus->platform_profile_handler.profile_set = asus_wmi_platform_profile_set;
3834 set_bit(PLATFORM_PROFILE_QUIET, asus->platform_profile_handler.choices);
3835 set_bit(PLATFORM_PROFILE_BALANCED,
3836 asus->platform_profile_handler.choices);
3837 set_bit(PLATFORM_PROFILE_PERFORMANCE,
3838 asus->platform_profile_handler.choices);
3840 err = platform_profile_register(&asus->platform_profile_handler);
3844 asus->platform_profile_support = true;
3848 /* Backlight ******************************************************************/
3850 static int read_backlight_power(struct asus_wmi *asus)
3854 if (asus->driver->quirks->store_backlight_power)
3855 ret = !asus->driver->panel_power;
3857 ret = asus_wmi_get_devstate_simple(asus,
3858 ASUS_WMI_DEVID_BACKLIGHT);
3863 return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
3866 static int read_brightness_max(struct asus_wmi *asus)
3871 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
3875 retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
3884 static int read_brightness(struct backlight_device *bd)
3886 struct asus_wmi *asus = bl_get_data(bd);
3890 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
3894 return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
3897 static u32 get_scalar_command(struct backlight_device *bd)
3899 struct asus_wmi *asus = bl_get_data(bd);
3902 if ((asus->driver->brightness < bd->props.brightness) ||
3903 bd->props.brightness == bd->props.max_brightness)
3904 ctrl_param = 0x00008001;
3905 else if ((asus->driver->brightness > bd->props.brightness) ||
3906 bd->props.brightness == 0)
3907 ctrl_param = 0x00008000;
3909 asus->driver->brightness = bd->props.brightness;
3914 static int update_bl_status(struct backlight_device *bd)
3916 struct asus_wmi *asus = bl_get_data(bd);
3920 power = read_backlight_power(asus);
3921 if (power != -ENODEV && bd->props.power != power) {
3922 ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
3923 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
3925 if (asus->driver->quirks->store_backlight_power)
3926 asus->driver->panel_power = bd->props.power;
3928 /* When using scalar brightness, updating the brightness
3929 * will mess with the backlight power */
3930 if (asus->driver->quirks->scalar_panel_brightness)
3934 if (asus->driver->quirks->scalar_panel_brightness)
3935 ctrl_param = get_scalar_command(bd);
3937 ctrl_param = bd->props.brightness;
3939 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
3945 static const struct backlight_ops asus_wmi_bl_ops = {
3946 .get_brightness = read_brightness,
3947 .update_status = update_bl_status,
3950 static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
3952 struct backlight_device *bd = asus->backlight_device;
3953 int old = bd->props.brightness;
3956 if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
3957 new = code - NOTIFY_BRNUP_MIN + 1;
3958 else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
3959 new = code - NOTIFY_BRNDOWN_MIN;
3961 bd->props.brightness = new;
3962 backlight_update_status(bd);
3963 backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
3968 static int asus_wmi_backlight_init(struct asus_wmi *asus)
3970 struct backlight_device *bd;
3971 struct backlight_properties props;
3975 max = read_brightness_max(asus);
3979 power = read_backlight_power(asus);
3980 if (power == -ENODEV)
3981 power = FB_BLANK_UNBLANK;
3985 memset(&props, 0, sizeof(struct backlight_properties));
3986 props.type = BACKLIGHT_PLATFORM;
3987 props.max_brightness = max;
3988 bd = backlight_device_register(asus->driver->name,
3989 &asus->platform_device->dev, asus,
3990 &asus_wmi_bl_ops, &props);
3992 pr_err("Could not register backlight device\n");
3996 asus->backlight_device = bd;
3998 if (asus->driver->quirks->store_backlight_power)
3999 asus->driver->panel_power = power;
4001 bd->props.brightness = read_brightness(bd);
4002 bd->props.power = power;
4003 backlight_update_status(bd);
4005 asus->driver->brightness = bd->props.brightness;
4010 static void asus_wmi_backlight_exit(struct asus_wmi *asus)
4012 backlight_device_unregister(asus->backlight_device);
4014 asus->backlight_device = NULL;
4017 static int is_display_toggle(int code)
4019 /* display toggle keys */
4020 if ((code >= 0x61 && code <= 0x67) ||
4021 (code >= 0x8c && code <= 0x93) ||
4022 (code >= 0xa0 && code <= 0xa7) ||
4023 (code >= 0xd0 && code <= 0xd5))
4029 /* Screenpad backlight *******************************************************/
4031 static int read_screenpad_backlight_power(struct asus_wmi *asus)
4035 ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_SCREENPAD_POWER);
4039 return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
4042 static int read_screenpad_brightness(struct backlight_device *bd)
4044 struct asus_wmi *asus = bl_get_data(bd);
4048 err = read_screenpad_backlight_power(asus);
4051 /* The device brightness can only be read if powered, so return stored */
4052 if (err == FB_BLANK_POWERDOWN)
4053 return asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
4055 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &retval);
4059 return (retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK) - ASUS_SCREENPAD_BRIGHT_MIN;
4062 static int update_screenpad_bl_status(struct backlight_device *bd)
4064 struct asus_wmi *asus = bl_get_data(bd);
4068 power = read_screenpad_backlight_power(asus);
4072 if (bd->props.power != power) {
4073 if (power != FB_BLANK_UNBLANK) {
4074 /* Only brightness > 0 can power it back on */
4075 ctrl_param = asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
4076 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT,
4079 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER, 0, NULL);
4081 } else if (power == FB_BLANK_UNBLANK) {
4082 /* Only set brightness if powered on or we get invalid/unsync state */
4083 ctrl_param = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
4084 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ctrl_param, NULL);
4087 /* Ensure brightness is stored to turn back on with */
4089 asus->driver->screenpad_brightness = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
4094 static const struct backlight_ops asus_screenpad_bl_ops = {
4095 .get_brightness = read_screenpad_brightness,
4096 .update_status = update_screenpad_bl_status,
4097 .options = BL_CORE_SUSPENDRESUME,
4100 static int asus_screenpad_init(struct asus_wmi *asus)
4102 struct backlight_device *bd;
4103 struct backlight_properties props;
4107 power = read_screenpad_backlight_power(asus);
4111 if (power != FB_BLANK_POWERDOWN) {
4112 err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &brightness);
4116 /* default to an acceptable min brightness on boot if too low */
4117 if (brightness < ASUS_SCREENPAD_BRIGHT_MIN)
4118 brightness = ASUS_SCREENPAD_BRIGHT_DEFAULT;
4120 memset(&props, 0, sizeof(struct backlight_properties));
4121 props.type = BACKLIGHT_RAW; /* ensure this bd is last to be picked */
4122 props.max_brightness = ASUS_SCREENPAD_BRIGHT_MAX - ASUS_SCREENPAD_BRIGHT_MIN;
4123 bd = backlight_device_register("asus_screenpad",
4124 &asus->platform_device->dev, asus,
4125 &asus_screenpad_bl_ops, &props);
4127 pr_err("Could not register backlight device\n");
4131 asus->screenpad_backlight_device = bd;
4132 asus->driver->screenpad_brightness = brightness;
4133 bd->props.brightness = brightness - ASUS_SCREENPAD_BRIGHT_MIN;
4134 bd->props.power = power;
4135 backlight_update_status(bd);
4140 static void asus_screenpad_exit(struct asus_wmi *asus)
4142 backlight_device_unregister(asus->screenpad_backlight_device);
4144 asus->screenpad_backlight_device = NULL;
4147 /* Fn-lock ********************************************************************/
4149 static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus)
4153 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FNLOCK, &result);
4155 return (result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
4156 !(result & ASUS_WMI_FNLOCK_BIOS_DISABLED);
4159 static void asus_wmi_fnlock_update(struct asus_wmi *asus)
4161 int mode = asus->fnlock_locked;
4163 asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK, mode, NULL);
4166 /* WMI events *****************************************************************/
4168 static int asus_wmi_get_event_code(u32 value)
4170 struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
4171 union acpi_object *obj;
4175 status = wmi_get_event_data(value, &response);
4176 if (ACPI_FAILURE(status)) {
4177 pr_warn("Failed to get WMI notify code: %s\n",
4178 acpi_format_exception(status));
4182 obj = (union acpi_object *)response.pointer;
4184 if (obj && obj->type == ACPI_TYPE_INTEGER)
4185 code = (int)(obj->integer.value & WMI_EVENT_MASK);
4193 static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
4195 unsigned int key_value = 1;
4196 bool autorelease = 1;
4198 if (asus->driver->key_filter) {
4199 asus->driver->key_filter(asus->driver, &code, &key_value,
4201 if (code == ASUS_WMI_KEY_IGNORE)
4205 if (acpi_video_get_backlight_type() == acpi_backlight_vendor &&
4206 code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNDOWN_MAX) {
4207 asus_wmi_backlight_notify(asus, code);
4211 if (code == NOTIFY_KBD_BRTUP) {
4212 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
4215 if (code == NOTIFY_KBD_BRTDWN) {
4216 kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
4219 if (code == NOTIFY_KBD_BRTTOGGLE) {
4220 if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
4221 kbd_led_set_by_kbd(asus, 0);
4223 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
4227 if (code == NOTIFY_FNLOCK_TOGGLE) {
4228 asus->fnlock_locked = !asus->fnlock_locked;
4229 asus_wmi_fnlock_update(asus);
4233 if (code == asus->tablet_switch_event_code) {
4234 asus_wmi_tablet_mode_get_state(asus);
4238 if (code == NOTIFY_KBD_FBM || code == NOTIFY_KBD_TTP) {
4239 if (asus->fan_boost_mode_available)
4240 fan_boost_mode_switch_next(asus);
4241 if (asus->throttle_thermal_policy_available)
4242 throttle_thermal_policy_switch_next(asus);
4247 if (is_display_toggle(code) && asus->driver->quirks->no_display_toggle)
4250 if (!sparse_keymap_report_event(asus->inputdev, code,
4251 key_value, autorelease))
4252 pr_info("Unknown key code 0x%x\n", code);
4255 static void asus_wmi_notify(u32 value, void *context)
4257 struct asus_wmi *asus = context;
4258 int code = asus_wmi_get_event_code(value);
4261 pr_warn("Failed to get notify code: %d\n", code);
4265 asus_wmi_handle_event_code(code, asus);
4268 /* Sysfs **********************************************************************/
4270 static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
4271 const char *buf, size_t count)
4276 value = asus_wmi_get_devstate_simple(asus, devid);
4280 err = kstrtoint(buf, 0, &value);
4284 err = asus_wmi_set_devstate(devid, value, &retval);
4291 static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
4293 int value = asus_wmi_get_devstate_simple(asus, devid);
4298 return sysfs_emit(buf, "%d\n", value);
4301 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
4302 static ssize_t show_##_name(struct device *dev, \
4303 struct device_attribute *attr, \
4306 struct asus_wmi *asus = dev_get_drvdata(dev); \
4308 return show_sys_wmi(asus, _cm, buf); \
4310 static ssize_t store_##_name(struct device *dev, \
4311 struct device_attribute *attr, \
4312 const char *buf, size_t count) \
4314 struct asus_wmi *asus = dev_get_drvdata(dev); \
4316 return store_sys_wmi(asus, _cm, buf, count); \
4318 static struct device_attribute dev_attr_##_name = { \
4320 .name = __stringify(_name), \
4322 .show = show_##_name, \
4323 .store = store_##_name, \
4326 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
4327 ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
4328 ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
4329 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
4330 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable, 0644, ASUS_WMI_DEVID_ALS_ENABLE);
4332 static ssize_t cpufv_store(struct device *dev, struct device_attribute *attr,
4333 const char *buf, size_t count)
4337 rv = kstrtoint(buf, 0, &value);
4341 if (value < 0 || value > 2)
4344 rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
4351 static DEVICE_ATTR_WO(cpufv);
4353 static struct attribute *platform_attributes[] = {
4354 &dev_attr_cpufv.attr,
4355 &dev_attr_camera.attr,
4356 &dev_attr_cardr.attr,
4357 &dev_attr_touchpad.attr,
4358 &dev_attr_charge_mode.attr,
4359 &dev_attr_egpu_enable.attr,
4360 &dev_attr_egpu_connected.attr,
4361 &dev_attr_dgpu_disable.attr,
4362 &dev_attr_gpu_mux_mode.attr,
4363 &dev_attr_lid_resume.attr,
4364 &dev_attr_als_enable.attr,
4365 &dev_attr_fan_boost_mode.attr,
4366 &dev_attr_throttle_thermal_policy.attr,
4367 &dev_attr_ppt_pl2_sppt.attr,
4368 &dev_attr_ppt_pl1_spl.attr,
4369 &dev_attr_ppt_fppt.attr,
4370 &dev_attr_ppt_apu_sppt.attr,
4371 &dev_attr_ppt_platform_sppt.attr,
4372 &dev_attr_nv_dynamic_boost.attr,
4373 &dev_attr_nv_temp_target.attr,
4374 &dev_attr_mcu_powersave.attr,
4375 &dev_attr_boot_sound.attr,
4376 &dev_attr_panel_od.attr,
4377 &dev_attr_mini_led_mode.attr,
4378 &dev_attr_available_mini_led_mode.attr,
4382 static umode_t asus_sysfs_is_visible(struct kobject *kobj,
4383 struct attribute *attr, int idx)
4385 struct device *dev = kobj_to_dev(kobj);
4386 struct asus_wmi *asus = dev_get_drvdata(dev);
4390 if (attr == &dev_attr_camera.attr)
4391 devid = ASUS_WMI_DEVID_CAMERA;
4392 else if (attr == &dev_attr_cardr.attr)
4393 devid = ASUS_WMI_DEVID_CARDREADER;
4394 else if (attr == &dev_attr_touchpad.attr)
4395 devid = ASUS_WMI_DEVID_TOUCHPAD;
4396 else if (attr == &dev_attr_lid_resume.attr)
4397 devid = ASUS_WMI_DEVID_LID_RESUME;
4398 else if (attr == &dev_attr_als_enable.attr)
4399 devid = ASUS_WMI_DEVID_ALS_ENABLE;
4400 else if (attr == &dev_attr_charge_mode.attr)
4401 devid = ASUS_WMI_DEVID_CHARGE_MODE;
4402 else if (attr == &dev_attr_egpu_enable.attr)
4403 ok = asus->egpu_enable_available;
4404 else if (attr == &dev_attr_egpu_connected.attr)
4405 devid = ASUS_WMI_DEVID_EGPU_CONNECTED;
4406 else if (attr == &dev_attr_dgpu_disable.attr)
4407 ok = asus->dgpu_disable_available;
4408 else if (attr == &dev_attr_gpu_mux_mode.attr)
4409 ok = asus->gpu_mux_dev != 0;
4410 else if (attr == &dev_attr_fan_boost_mode.attr)
4411 ok = asus->fan_boost_mode_available;
4412 else if (attr == &dev_attr_throttle_thermal_policy.attr)
4413 ok = asus->throttle_thermal_policy_available;
4414 else if (attr == &dev_attr_ppt_pl2_sppt.attr)
4415 devid = ASUS_WMI_DEVID_PPT_PL2_SPPT;
4416 else if (attr == &dev_attr_ppt_pl1_spl.attr)
4417 devid = ASUS_WMI_DEVID_PPT_PL1_SPL;
4418 else if (attr == &dev_attr_ppt_fppt.attr)
4419 devid = ASUS_WMI_DEVID_PPT_FPPT;
4420 else if (attr == &dev_attr_ppt_apu_sppt.attr)
4421 devid = ASUS_WMI_DEVID_PPT_APU_SPPT;
4422 else if (attr == &dev_attr_ppt_platform_sppt.attr)
4423 devid = ASUS_WMI_DEVID_PPT_PLAT_SPPT;
4424 else if (attr == &dev_attr_nv_dynamic_boost.attr)
4425 devid = ASUS_WMI_DEVID_NV_DYN_BOOST;
4426 else if (attr == &dev_attr_nv_temp_target.attr)
4427 devid = ASUS_WMI_DEVID_NV_THERM_TARGET;
4428 else if (attr == &dev_attr_mcu_powersave.attr)
4429 devid = ASUS_WMI_DEVID_MCU_POWERSAVE;
4430 else if (attr == &dev_attr_boot_sound.attr)
4431 devid = ASUS_WMI_DEVID_BOOT_SOUND;
4432 else if (attr == &dev_attr_panel_od.attr)
4433 devid = ASUS_WMI_DEVID_PANEL_OD;
4434 else if (attr == &dev_attr_mini_led_mode.attr)
4435 ok = asus->mini_led_dev_id != 0;
4436 else if (attr == &dev_attr_available_mini_led_mode.attr)
4437 ok = asus->mini_led_dev_id != 0;
4440 ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
4442 return ok ? attr->mode : 0;
4445 static const struct attribute_group platform_attribute_group = {
4446 .is_visible = asus_sysfs_is_visible,
4447 .attrs = platform_attributes
4450 static void asus_wmi_sysfs_exit(struct platform_device *device)
4452 sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
4455 static int asus_wmi_sysfs_init(struct platform_device *device)
4457 return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
4460 /* Platform device ************************************************************/
4462 static int asus_wmi_platform_init(struct asus_wmi *asus)
4464 struct device *dev = &asus->platform_device->dev;
4468 /* INIT enable hotkeys on some models */
4469 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
4470 pr_info("Initialization: %#x\n", rv);
4472 /* We don't know yet what to do with this version... */
4473 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
4474 pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
4479 * The SFUN method probably allows the original driver to get the list
4480 * of features supported by a given model. For now, 0x0100 or 0x0800
4481 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
4482 * The significance of others is yet to be found.
4484 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
4485 pr_info("SFUN value: %#x\n", rv);
4490 * Eee PC and Notebooks seems to have different method_id for DSTS,
4491 * but it may also be related to the BIOS's SPEC.
4492 * Note, on most Eeepc, there is no way to check if a method exist
4493 * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
4494 * but once again, SPEC may probably be used for that kind of things.
4496 * Additionally at least TUF Gaming series laptops return nothing for
4497 * unknown methods, so the detection in this way is not possible.
4499 * There is strong indication that only ACPI WMI devices that have _UID
4500 * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
4502 wmi_uid = wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID);
4506 if (!strcmp(wmi_uid, ASUS_ACPI_UID_ASUSWMI)) {
4507 dev_info(dev, "Detected ASUSWMI, use DCTS\n");
4508 asus->dsts_id = ASUS_WMI_METHODID_DCTS;
4510 dev_info(dev, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid);
4511 asus->dsts_id = ASUS_WMI_METHODID_DSTS;
4514 /* CWAP allow to define the behavior of the Fn+F2 key,
4515 * this method doesn't seems to be present on Eee PCs */
4516 if (asus->driver->quirks->wapf >= 0)
4517 asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
4518 asus->driver->quirks->wapf, NULL);
4523 /* debugfs ********************************************************************/
4525 struct asus_wmi_debugfs_node {
4526 struct asus_wmi *asus;
4528 int (*show) (struct seq_file *m, void *data);
4531 static int show_dsts(struct seq_file *m, void *data)
4533 struct asus_wmi *asus = m->private;
4537 err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
4541 seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
4546 static int show_devs(struct seq_file *m, void *data)
4548 struct asus_wmi *asus = m->private;
4552 err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
4557 seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
4558 asus->debug.ctrl_param, retval);
4563 static int show_call(struct seq_file *m, void *data)
4565 struct asus_wmi *asus = m->private;
4566 struct bios_args args = {
4567 .arg0 = asus->debug.dev_id,
4568 .arg1 = asus->debug.ctrl_param,
4570 struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
4571 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
4572 union acpi_object *obj;
4575 status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
4576 0, asus->debug.method_id,
4579 if (ACPI_FAILURE(status))
4582 obj = (union acpi_object *)output.pointer;
4583 if (obj && obj->type == ACPI_TYPE_INTEGER)
4584 seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
4585 asus->debug.dev_id, asus->debug.ctrl_param,
4586 (u32) obj->integer.value);
4588 seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
4589 asus->debug.dev_id, asus->debug.ctrl_param,
4590 obj ? obj->type : -1);
4597 static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
4598 {NULL, "devs", show_devs},
4599 {NULL, "dsts", show_dsts},
4600 {NULL, "call", show_call},
4603 static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
4605 struct asus_wmi_debugfs_node *node = inode->i_private;
4607 return single_open(file, node->show, node->asus);
4610 static const struct file_operations asus_wmi_debugfs_io_ops = {
4611 .owner = THIS_MODULE,
4612 .open = asus_wmi_debugfs_open,
4614 .llseek = seq_lseek,
4615 .release = single_release,
4618 static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
4620 debugfs_remove_recursive(asus->debug.root);
4623 static void asus_wmi_debugfs_init(struct asus_wmi *asus)
4627 asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
4629 debugfs_create_x32("method_id", S_IRUGO | S_IWUSR, asus->debug.root,
4630 &asus->debug.method_id);
4632 debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR, asus->debug.root,
4633 &asus->debug.dev_id);
4635 debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR, asus->debug.root,
4636 &asus->debug.ctrl_param);
4638 for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
4639 struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
4642 debugfs_create_file(node->name, S_IFREG | S_IRUGO,
4643 asus->debug.root, node,
4644 &asus_wmi_debugfs_io_ops);
4648 /* Init / exit ****************************************************************/
4650 static int asus_wmi_add(struct platform_device *pdev)
4652 struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
4653 struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
4654 struct asus_wmi *asus;
4659 asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
4663 asus->driver = wdrv;
4664 asus->platform_device = pdev;
4665 wdrv->platform_device = pdev;
4666 platform_set_drvdata(asus->platform_device, asus);
4668 if (wdrv->detect_quirks)
4669 wdrv->detect_quirks(asus->driver);
4671 err = asus_wmi_platform_init(asus);
4675 /* ensure defaults for tunables */
4676 asus->ppt_pl2_sppt = 5;
4677 asus->ppt_pl1_spl = 5;
4678 asus->ppt_apu_sppt = 5;
4679 asus->ppt_platform_sppt = 5;
4681 asus->nv_dynamic_boost = 5;
4682 asus->nv_temp_target = 75;
4684 asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
4685 asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU);
4686 asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE);
4687 asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
4688 && dmi_match(DMI_BOARD_NAME, "RC71L");
4690 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE))
4691 asus->mini_led_dev_id = ASUS_WMI_DEVID_MINI_LED_MODE;
4692 else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE2))
4693 asus->mini_led_dev_id = ASUS_WMI_DEVID_MINI_LED_MODE2;
4695 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX))
4696 asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX;
4697 else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX_VIVO))
4698 asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX_VIVO;
4700 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE))
4701 asus->kbd_rgb_dev = ASUS_WMI_DEVID_TUF_RGB_MODE;
4702 else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE2))
4703 asus->kbd_rgb_dev = ASUS_WMI_DEVID_TUF_RGB_MODE2;
4705 err = fan_boost_mode_check_present(asus);
4707 goto fail_fan_boost_mode;
4709 err = throttle_thermal_policy_check_present(asus);
4711 goto fail_throttle_thermal_policy;
4713 throttle_thermal_policy_set_default(asus);
4715 err = platform_profile_setup(asus);
4717 goto fail_platform_profile_setup;
4719 err = asus_wmi_sysfs_init(asus->platform_device);
4723 err = asus_wmi_input_init(asus);
4727 err = asus_wmi_fan_init(asus); /* probably no problems on error */
4729 err = asus_wmi_hwmon_init(asus);
4733 err = asus_wmi_custom_fan_curve_init(asus);
4735 goto fail_custom_fan_curve;
4737 err = asus_wmi_led_init(asus);
4741 asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
4742 if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
4743 asus->driver->wlan_ctrl_by_user = 1;
4745 if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
4746 err = asus_wmi_rfkill_init(asus);
4751 if (asus->driver->quirks->wmi_force_als_set)
4754 if (asus->driver->quirks->xusb2pr)
4755 asus_wmi_set_xusb2pr(asus);
4757 if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
4758 err = asus_wmi_backlight_init(asus);
4759 if (err && err != -ENODEV)
4760 goto fail_backlight;
4761 } else if (asus->driver->quirks->wmi_backlight_set_devstate)
4762 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);
4764 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT)) {
4765 err = asus_screenpad_init(asus);
4766 if (err && err != -ENODEV)
4767 goto fail_screenpad;
4770 if (asus_wmi_has_fnlock_key(asus)) {
4771 asus->fnlock_locked = fnlock_default;
4772 asus_wmi_fnlock_update(asus);
4775 status = wmi_install_notify_handler(asus->driver->event_guid,
4776 asus_wmi_notify, asus);
4777 if (ACPI_FAILURE(status)) {
4778 pr_err("Unable to register notify handler - %d\n", status);
4780 goto fail_wmi_handler;
4783 if (asus->driver->i8042_filter) {
4784 err = i8042_install_filter(asus->driver->i8042_filter);
4786 pr_warn("Unable to install key filter - %d\n", err);
4789 asus_wmi_battery_init(asus);
4791 asus_wmi_debugfs_init(asus);
4796 asus_wmi_backlight_exit(asus);
4798 asus_wmi_rfkill_exit(asus);
4800 asus_screenpad_exit(asus);
4802 asus_wmi_led_exit(asus);
4805 asus_wmi_input_exit(asus);
4807 asus_wmi_sysfs_exit(asus->platform_device);
4809 fail_throttle_thermal_policy:
4810 fail_custom_fan_curve:
4811 fail_platform_profile_setup:
4812 if (asus->platform_profile_support)
4813 platform_profile_remove();
4814 fail_fan_boost_mode:
4820 static void asus_wmi_remove(struct platform_device *device)
4822 struct asus_wmi *asus;
4824 asus = platform_get_drvdata(device);
4825 if (asus->driver->i8042_filter)
4826 i8042_remove_filter(asus->driver->i8042_filter);
4827 wmi_remove_notify_handler(asus->driver->event_guid);
4828 asus_wmi_backlight_exit(asus);
4829 asus_screenpad_exit(asus);
4830 asus_wmi_input_exit(asus);
4831 asus_wmi_led_exit(asus);
4832 asus_wmi_rfkill_exit(asus);
4833 asus_wmi_debugfs_exit(asus);
4834 asus_wmi_sysfs_exit(asus->platform_device);
4835 asus_fan_set_auto(asus);
4836 throttle_thermal_policy_set_default(asus);
4837 asus_wmi_battery_exit(asus);
4839 if (asus->platform_profile_support)
4840 platform_profile_remove();
4845 /* Platform driver - hibernate/resume callbacks *******************************/
4847 static int asus_hotk_thaw(struct device *device)
4849 struct asus_wmi *asus = dev_get_drvdata(device);
4851 if (asus->wlan.rfkill) {
4855 * Work around bios bug - acpi _PTS turns off the wireless led
4856 * during suspend. Normally it restores it on resume, but
4857 * we should kick it ourselves in case hibernation is aborted.
4859 wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
4860 asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
4866 static int asus_hotk_resume(struct device *device)
4868 struct asus_wmi *asus = dev_get_drvdata(device);
4870 if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
4871 kbd_led_update(asus);
4873 if (asus_wmi_has_fnlock_key(asus))
4874 asus_wmi_fnlock_update(asus);
4876 asus_wmi_tablet_mode_get_state(asus);
4881 static int asus_hotk_resume_early(struct device *device)
4883 struct asus_wmi *asus = dev_get_drvdata(device);
4885 if (asus->ally_mcu_usb_switch) {
4886 /* sleep required to prevent USB0 being yanked then reappearing rapidly */
4887 if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB8)))
4888 dev_err(device, "ROG Ally MCU failed to connect USB dev\n");
4890 msleep(ASUS_USB0_PWR_EC0_CSEE_WAIT);
4895 static int asus_hotk_prepare(struct device *device)
4897 struct asus_wmi *asus = dev_get_drvdata(device);
4899 if (asus->ally_mcu_usb_switch) {
4900 /* sleep required to ensure USB0 is disabled before sleep continues */
4901 if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB7)))
4902 dev_err(device, "ROG Ally MCU failed to disconnect USB dev\n");
4904 msleep(ASUS_USB0_PWR_EC0_CSEE_WAIT);
4909 static int asus_hotk_restore(struct device *device)
4911 struct asus_wmi *asus = dev_get_drvdata(device);
4914 /* Refresh both wlan rfkill state and pci hotplug */
4915 if (asus->wlan.rfkill)
4916 asus_rfkill_hotplug(asus);
4918 if (asus->bluetooth.rfkill) {
4919 bl = !asus_wmi_get_devstate_simple(asus,
4920 ASUS_WMI_DEVID_BLUETOOTH);
4921 rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
4923 if (asus->wimax.rfkill) {
4924 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
4925 rfkill_set_sw_state(asus->wimax.rfkill, bl);
4927 if (asus->wwan3g.rfkill) {
4928 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
4929 rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
4931 if (asus->gps.rfkill) {
4932 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
4933 rfkill_set_sw_state(asus->gps.rfkill, bl);
4935 if (asus->uwb.rfkill) {
4936 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
4937 rfkill_set_sw_state(asus->uwb.rfkill, bl);
4939 if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
4940 kbd_led_update(asus);
4942 if (asus_wmi_has_fnlock_key(asus))
4943 asus_wmi_fnlock_update(asus);
4945 asus_wmi_tablet_mode_get_state(asus);
4949 static const struct dev_pm_ops asus_pm_ops = {
4950 .thaw = asus_hotk_thaw,
4951 .restore = asus_hotk_restore,
4952 .resume = asus_hotk_resume,
4953 .resume_early = asus_hotk_resume_early,
4954 .prepare = asus_hotk_prepare,
4957 /* Registration ***************************************************************/
4959 static int asus_wmi_probe(struct platform_device *pdev)
4961 struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
4962 struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
4965 if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
4966 pr_warn("ASUS Management GUID not found\n");
4970 if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
4971 pr_warn("ASUS Event GUID not found\n");
4976 ret = wdrv->probe(pdev);
4981 return asus_wmi_add(pdev);
4986 int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
4988 struct platform_driver *platform_driver;
4989 struct platform_device *platform_device;
4994 platform_driver = &driver->platform_driver;
4995 platform_driver->remove_new = asus_wmi_remove;
4996 platform_driver->driver.owner = driver->owner;
4997 platform_driver->driver.name = driver->name;
4998 platform_driver->driver.pm = &asus_pm_ops;
5000 platform_device = platform_create_bundle(platform_driver,
5003 if (IS_ERR(platform_device))
5004 return PTR_ERR(platform_device);
5009 EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
5011 void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
5013 platform_device_unregister(driver->platform_device);
5014 platform_driver_unregister(&driver->platform_driver);
5017 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
5019 static int __init asus_wmi_init(void)
5021 pr_info("ASUS WMI generic driver loaded\n");
5025 static void __exit asus_wmi_exit(void)
5027 pr_info("ASUS WMI generic driver unloaded\n");
5030 module_init(asus_wmi_init);
5031 module_exit(asus_wmi_exit);