1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Asus PC WMI hotkey driver
5 * Copyright(C) 2010 Intel Corporation.
6 * Copyright(C) 2010-2011 Corentin Chary <corentin.chary@gmail.com>
8 * Portions based on wistron_btns.c:
9 * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
10 * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
11 * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 #include <linux/acpi.h>
17 #include <linux/backlight.h>
18 #include <linux/debugfs.h>
19 #include <linux/delay.h>
20 #include <linux/dmi.h>
21 #include <linux/hwmon.h>
22 #include <linux/hwmon-sysfs.h>
23 #include <linux/init.h>
24 #include <linux/input.h>
25 #include <linux/input/sparse-keymap.h>
26 #include <linux/kernel.h>
27 #include <linux/leds.h>
28 #include <linux/minmax.h>
29 #include <linux/module.h>
30 #include <linux/pci.h>
31 #include <linux/pci_hotplug.h>
32 #include <linux/platform_data/x86/asus-wmi.h>
33 #include <linux/platform_device.h>
34 #include <linux/platform_profile.h>
35 #include <linux/power_supply.h>
36 #include <linux/rfkill.h>
37 #include <linux/seq_file.h>
38 #include <linux/slab.h>
39 #include <linux/types.h>
40 #include <linux/units.h>
42 #include <acpi/battery.h>
43 #include <acpi/video.h>
47 MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>");
48 MODULE_AUTHOR("Yong Wang <yong.y.wang@intel.com>");
49 MODULE_DESCRIPTION("Asus Generic WMI Driver");
50 MODULE_LICENSE("GPL");
52 static bool fnlock_default
= true;
53 module_param(fnlock_default
, bool, 0444);
55 #define to_asus_wmi_driver(pdrv) \
56 (container_of((pdrv), struct asus_wmi_driver, platform_driver))
58 #define ASUS_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66"
60 #define NOTIFY_BRNUP_MIN 0x11
61 #define NOTIFY_BRNUP_MAX 0x1f
62 #define NOTIFY_BRNDOWN_MIN 0x20
63 #define NOTIFY_BRNDOWN_MAX 0x2e
64 #define NOTIFY_FNLOCK_TOGGLE 0x4e
65 #define NOTIFY_KBD_DOCK_CHANGE 0x75
66 #define NOTIFY_KBD_BRTUP 0xc4
67 #define NOTIFY_KBD_BRTDWN 0xc5
68 #define NOTIFY_KBD_BRTTOGGLE 0xc7
69 #define NOTIFY_KBD_FBM 0x99
70 #define NOTIFY_KBD_TTP 0xae
71 #define NOTIFY_LID_FLIP 0xfa
72 #define NOTIFY_LID_FLIP_ROG 0xbd
74 #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0)
76 #define ASUS_MID_FAN_DESC "mid_fan"
77 #define ASUS_GPU_FAN_DESC "gpu_fan"
78 #define ASUS_FAN_DESC "cpu_fan"
79 #define ASUS_FAN_MFUN 0x13
80 #define ASUS_FAN_SFUN_READ 0x06
81 #define ASUS_FAN_SFUN_WRITE 0x07
83 /* Based on standard hwmon pwmX_enable values */
84 #define ASUS_FAN_CTRL_FULLSPEED 0
85 #define ASUS_FAN_CTRL_MANUAL 1
86 #define ASUS_FAN_CTRL_AUTO 2
88 #define ASUS_FAN_BOOST_MODE_NORMAL 0
89 #define ASUS_FAN_BOOST_MODE_OVERBOOST 1
90 #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK 0x01
91 #define ASUS_FAN_BOOST_MODE_SILENT 2
92 #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02
93 #define ASUS_FAN_BOOST_MODES_MASK 0x03
95 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0
96 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1
97 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2
99 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO 0
100 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO 1
101 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO 2
103 #define PLATFORM_PROFILE_MAX 2
105 #define USB_INTEL_XUSB2PR 0xD0
106 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
108 #define ASUS_ACPI_UID_ASUSWMI "ASUSWMI"
110 #define WMI_EVENT_MASK 0xFFFF
112 #define FAN_CURVE_POINTS 8
113 #define FAN_CURVE_BUF_LEN 32
114 #define FAN_CURVE_DEV_CPU 0x00
115 #define FAN_CURVE_DEV_GPU 0x01
116 #define FAN_CURVE_DEV_MID 0x02
117 /* Mask to determine if setting temperature or percentage */
118 #define FAN_CURVE_PWM_MASK 0x04
120 /* Limits for tunables available on ASUS ROG laptops */
121 #define PPT_TOTAL_MIN 5
122 #define PPT_TOTAL_MAX 250
123 #define PPT_CPU_MIN 5
124 #define PPT_CPU_MAX 130
125 #define NVIDIA_BOOST_MIN 5
126 #define NVIDIA_BOOST_MAX 25
127 #define NVIDIA_TEMP_MIN 75
128 #define NVIDIA_TEMP_MAX 87
130 #define ASUS_SCREENPAD_BRIGHT_MIN 20
131 #define ASUS_SCREENPAD_BRIGHT_MAX 255
132 #define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
134 #define ASUS_MINI_LED_MODE_MASK 0x03
135 /* Standard modes for devices with only on/off */
136 #define ASUS_MINI_LED_OFF 0x00
137 #define ASUS_MINI_LED_ON 0x01
138 /* New mode on some devices, define here to clarify remapping later */
139 #define ASUS_MINI_LED_STRONG_MODE 0x02
140 /* New modes for devices with 3 mini-led mode types */
141 #define ASUS_MINI_LED_2024_WEAK 0x00
142 #define ASUS_MINI_LED_2024_STRONG 0x01
143 #define ASUS_MINI_LED_2024_OFF 0x02
145 /* Controls the power state of the USB0 hub on ROG Ally which input is on */
146 #define ASUS_USB0_PWR_EC0_CSEE "\\_SB.PCI0.SBRG.EC0.CSEE"
147 /* 300ms so far seems to produce a reliable result on AC and battery */
148 #define ASUS_USB0_PWR_EC0_CSEE_WAIT 1500
150 static const char * const ashs_ids
[] = { "ATK4001", "ATK4002", NULL
};
152 static int throttle_thermal_policy_write(struct asus_wmi
*);
154 static const struct dmi_system_id asus_ally_mcu_quirk
[] = {
157 DMI_MATCH(DMI_BOARD_NAME
, "RC71L"),
162 DMI_MATCH(DMI_BOARD_NAME
, "RC72L"),
168 static bool ashs_present(void)
171 while (ashs_ids
[i
]) {
172 if (acpi_dev_found(ashs_ids
[i
++]))
181 u32 arg2
; /* At least TUF Gaming series uses 3 dword input buffer. */
183 u32 arg4
; /* Some ROG laptops require a full 5 input args */
188 * Struct that's used for all methods called via AGFN. Naming is
189 * identically to the AML code.
192 u16 mfun
; /* probably "Multi-function" to be called */
193 u16 sfun
; /* probably "Sub-function" to be called */
194 u16 len
; /* size of the hole struct, including subfunction fields */
195 u8 stas
; /* not used by now */
196 u8 err
; /* zero on success */
199 /* struct used for calling fan read and write methods */
200 struct agfn_fan_args
{
201 struct agfn_args agfn
; /* common fields */
202 u8 fan
; /* fan number: 0: set auto mode 1: 1st fan */
203 u32 speed
; /* read: RPM/100 - write: 0-255 */
207 * <platform>/ - debugfs root directory
208 * dev_id - current dev_id
209 * ctrl_param - current ctrl_param
210 * method_id - current method_id
211 * devs - call DEVS(dev_id, ctrl_param) and print result
212 * dsts - call DSTS(dev_id) and print result
213 * call - call method_id(dev_id, ctrl_param) and print result
215 struct asus_wmi_debug
{
223 struct asus_wmi
*asus
;
224 struct rfkill
*rfkill
;
230 FAN_TYPE_AGFN
, /* deprecated on newer platforms */
231 FAN_TYPE_SPEC83
, /* starting in Spec 8.3, use CPU_FAN_CTRL */
234 struct fan_curve_data
{
237 u8 temps
[FAN_CURVE_POINTS
];
238 u8 percents
[FAN_CURVE_POINTS
];
246 struct input_dev
*inputdev
;
247 struct backlight_device
*backlight_device
;
248 struct backlight_device
*screenpad_backlight_device
;
249 struct platform_device
*platform_device
;
251 struct led_classdev wlan_led
;
253 struct led_classdev tpd_led
;
255 struct led_classdev kbd_led
;
257 struct led_classdev lightbar_led
;
259 struct led_classdev micmute_led
;
260 struct led_classdev camera_led
;
261 struct workqueue_struct
*led_workqueue
;
262 struct work_struct tpd_led_work
;
263 struct work_struct wlan_led_work
;
264 struct work_struct lightbar_led_work
;
266 struct asus_rfkill wlan
;
267 struct asus_rfkill bluetooth
;
268 struct asus_rfkill wimax
;
269 struct asus_rfkill wwan3g
;
270 struct asus_rfkill gps
;
271 struct asus_rfkill uwb
;
273 int tablet_switch_event_code
;
274 u32 tablet_switch_dev_id
;
275 bool tablet_switch_inverted
;
277 /* The ROG Ally device requires the MCU USB device be disconnected before suspend */
278 bool ally_mcu_usb_switch
;
280 enum fan_type fan_type
;
281 enum fan_type gpu_fan_type
;
282 enum fan_type mid_fan_type
;
284 int gpu_fan_pwm_mode
;
285 int mid_fan_pwm_mode
;
288 bool fan_boost_mode_available
;
289 u8 fan_boost_mode_mask
;
292 bool egpu_enable_available
;
293 bool dgpu_disable_available
;
296 /* Tunables provided by ASUS for gaming laptops */
300 u32 ppt_platform_sppt
;
302 u32 nv_dynamic_boost
;
306 bool kbd_rgb_state_available
;
308 u8 throttle_thermal_policy_mode
;
309 u32 throttle_thermal_policy_dev
;
311 bool cpu_fan_curve_available
;
312 bool gpu_fan_curve_available
;
313 bool mid_fan_curve_available
;
314 struct fan_curve_data custom_fan_curves
[3];
316 struct device
*ppdev
;
317 bool platform_profile_support
;
319 // The RSOC controls the maximum charging percentage.
320 bool battery_rsoc_available
;
322 bool panel_overdrive_available
;
325 struct hotplug_slot hotplug_slot
;
326 struct mutex hotplug_lock
;
327 struct mutex wmi_lock
;
328 struct workqueue_struct
*hotplug_workqueue
;
329 struct work_struct hotplug_work
;
333 struct asus_wmi_debug debug
;
335 struct asus_wmi_driver
*driver
;
338 /* WMI ************************************************************************/
340 static int asus_wmi_evaluate_method3(u32 method_id
,
341 u32 arg0
, u32 arg1
, u32 arg2
, u32
*retval
)
343 struct bios_args args
= {
348 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
349 struct acpi_buffer output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
351 union acpi_object
*obj
;
354 status
= wmi_evaluate_method(ASUS_WMI_MGMT_GUID
, 0, method_id
,
357 pr_debug("%s called (0x%08x) with args: 0x%08x, 0x%08x, 0x%08x\n",
358 __func__
, method_id
, arg0
, arg1
, arg2
);
359 if (ACPI_FAILURE(status
)) {
360 pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n",
361 __func__
, method_id
, arg0
, -EIO
);
365 obj
= (union acpi_object
*)output
.pointer
;
366 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
367 tmp
= (u32
) obj
->integer
.value
;
369 pr_debug("Result: 0x%08x\n", tmp
);
375 if (tmp
== ASUS_WMI_UNSUPPORTED_METHOD
) {
376 pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n",
377 __func__
, method_id
, arg0
, -ENODEV
);
384 int asus_wmi_evaluate_method(u32 method_id
, u32 arg0
, u32 arg1
, u32
*retval
)
386 return asus_wmi_evaluate_method3(method_id
, arg0
, arg1
, 0, retval
);
388 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method
);
390 static int asus_wmi_evaluate_method5(u32 method_id
,
391 u32 arg0
, u32 arg1
, u32 arg2
, u32 arg3
, u32 arg4
, u32
*retval
)
393 struct bios_args args
= {
400 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
401 struct acpi_buffer output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
403 union acpi_object
*obj
;
406 status
= wmi_evaluate_method(ASUS_WMI_MGMT_GUID
, 0, method_id
,
409 pr_debug("%s called (0x%08x) with args: 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
410 __func__
, method_id
, arg0
, arg1
, arg2
, arg3
, arg4
);
411 if (ACPI_FAILURE(status
)) {
412 pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n",
413 __func__
, method_id
, arg0
, -EIO
);
417 obj
= (union acpi_object
*)output
.pointer
;
418 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
419 tmp
= (u32
) obj
->integer
.value
;
421 pr_debug("Result: %x\n", tmp
);
427 if (tmp
== ASUS_WMI_UNSUPPORTED_METHOD
) {
428 pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n",
429 __func__
, method_id
, arg0
, -ENODEV
);
437 * Returns as an error if the method output is not a buffer. Typically this
438 * means that the method called is unsupported.
440 static int asus_wmi_evaluate_method_buf(u32 method_id
,
441 u32 arg0
, u32 arg1
, u8
*ret_buffer
, size_t size
)
443 struct bios_args args
= {
448 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
449 struct acpi_buffer output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
451 union acpi_object
*obj
;
454 status
= wmi_evaluate_method(ASUS_WMI_MGMT_GUID
, 0, method_id
,
457 pr_debug("%s called (0x%08x) with args: 0x%08x, 0x%08x\n",
458 __func__
, method_id
, arg0
, arg1
);
459 if (ACPI_FAILURE(status
)) {
460 pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n",
461 __func__
, method_id
, arg0
, -EIO
);
465 obj
= (union acpi_object
*)output
.pointer
;
468 case ACPI_TYPE_BUFFER
:
469 if (obj
->buffer
.length
> size
) {
473 if (obj
->buffer
.length
== 0) {
478 memcpy(ret_buffer
, obj
->buffer
.pointer
, obj
->buffer
.length
);
480 case ACPI_TYPE_INTEGER
:
481 err
= (u32
)obj
->integer
.value
;
483 if (err
== ASUS_WMI_UNSUPPORTED_METHOD
)
486 * At least one method returns a 0 with no buffer if no arg
487 * is provided, such as ASUS_WMI_DEVID_CPU_FAN_CURVE
500 pr_debug("%s, (0x%08x), arg 0x%08x failed: %d\n",
501 __func__
, method_id
, arg0
, err
);
508 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args
)
510 struct acpi_buffer input
;
516 * Copy to dma capable address otherwise memory corruption occurs as
517 * bios has to be able to access it.
519 input
.pointer
= kmemdup(args
.pointer
, args
.length
, GFP_DMA
| GFP_KERNEL
);
520 input
.length
= args
.length
;
523 phys_addr
= virt_to_phys(input
.pointer
);
525 status
= asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN
,
526 phys_addr
, 0, &retval
);
528 memcpy(args
.pointer
, input
.pointer
, args
.length
);
530 kfree(input
.pointer
);
537 static int asus_wmi_get_devstate(struct asus_wmi
*asus
, u32 dev_id
, u32
*retval
)
541 err
= asus_wmi_evaluate_method(asus
->dsts_id
, dev_id
, 0, retval
);
552 static int asus_wmi_set_devstate(u32 dev_id
, u32 ctrl_param
,
555 return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS
, dev_id
,
559 /* Helper for special devices with magic return codes */
560 static int asus_wmi_get_devstate_bits(struct asus_wmi
*asus
,
561 u32 dev_id
, u32 mask
)
566 err
= asus_wmi_get_devstate(asus
, dev_id
, &retval
);
570 if (!(retval
& ASUS_WMI_DSTS_PRESENCE_BIT
))
573 if (mask
== ASUS_WMI_DSTS_STATUS_BIT
) {
574 if (retval
& ASUS_WMI_DSTS_UNKNOWN_BIT
)
578 return retval
& mask
;
581 static int asus_wmi_get_devstate_simple(struct asus_wmi
*asus
, u32 dev_id
)
583 return asus_wmi_get_devstate_bits(asus
, dev_id
,
584 ASUS_WMI_DSTS_STATUS_BIT
);
587 static bool asus_wmi_dev_is_present(struct asus_wmi
*asus
, u32 dev_id
)
590 int status
= asus_wmi_get_devstate(asus
, dev_id
, &retval
);
591 pr_debug("%s called (0x%08x), retval: 0x%08x\n", __func__
, dev_id
, retval
);
593 return status
== 0 && (retval
& ASUS_WMI_DSTS_PRESENCE_BIT
);
596 /* Input **********************************************************************/
597 static void asus_wmi_tablet_sw_report(struct asus_wmi
*asus
, bool value
)
599 input_report_switch(asus
->inputdev
, SW_TABLET_MODE
,
600 asus
->tablet_switch_inverted
? !value
: value
);
601 input_sync(asus
->inputdev
);
604 static void asus_wmi_tablet_sw_init(struct asus_wmi
*asus
, u32 dev_id
, int event_code
)
606 struct device
*dev
= &asus
->platform_device
->dev
;
609 result
= asus_wmi_get_devstate_simple(asus
, dev_id
);
611 input_set_capability(asus
->inputdev
, EV_SW
, SW_TABLET_MODE
);
612 asus_wmi_tablet_sw_report(asus
, result
);
613 asus
->tablet_switch_dev_id
= dev_id
;
614 asus
->tablet_switch_event_code
= event_code
;
615 } else if (result
== -ENODEV
) {
616 dev_err(dev
, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
618 dev_err(dev
, "Error checking for tablet-mode-switch: %d\n", result
);
622 static int asus_wmi_input_init(struct asus_wmi
*asus
)
624 struct device
*dev
= &asus
->platform_device
->dev
;
627 asus
->inputdev
= input_allocate_device();
631 asus
->inputdev
->name
= asus
->driver
->input_name
;
632 asus
->inputdev
->phys
= asus
->driver
->input_phys
;
633 asus
->inputdev
->id
.bustype
= BUS_HOST
;
634 asus
->inputdev
->dev
.parent
= dev
;
635 set_bit(EV_REP
, asus
->inputdev
->evbit
);
637 err
= sparse_keymap_setup(asus
->inputdev
, asus
->driver
->keymap
, NULL
);
641 switch (asus
->driver
->quirks
->tablet_switch_mode
) {
642 case asus_wmi_no_tablet_switch
:
644 case asus_wmi_kbd_dock_devid
:
645 asus
->tablet_switch_inverted
= true;
646 asus_wmi_tablet_sw_init(asus
, ASUS_WMI_DEVID_KBD_DOCK
, NOTIFY_KBD_DOCK_CHANGE
);
648 case asus_wmi_lid_flip_devid
:
649 asus_wmi_tablet_sw_init(asus
, ASUS_WMI_DEVID_LID_FLIP
, NOTIFY_LID_FLIP
);
651 case asus_wmi_lid_flip_rog_devid
:
652 asus_wmi_tablet_sw_init(asus
, ASUS_WMI_DEVID_LID_FLIP_ROG
, NOTIFY_LID_FLIP_ROG
);
656 err
= input_register_device(asus
->inputdev
);
663 input_free_device(asus
->inputdev
);
667 static void asus_wmi_input_exit(struct asus_wmi
*asus
)
670 input_unregister_device(asus
->inputdev
);
672 asus
->inputdev
= NULL
;
675 /* Tablet mode ****************************************************************/
677 static void asus_wmi_tablet_mode_get_state(struct asus_wmi
*asus
)
681 if (!asus
->tablet_switch_dev_id
)
684 result
= asus_wmi_get_devstate_simple(asus
, asus
->tablet_switch_dev_id
);
686 asus_wmi_tablet_sw_report(asus
, result
);
689 /* Charging mode, 1=Barrel, 2=USB ******************************************/
690 static ssize_t
charge_mode_show(struct device
*dev
,
691 struct device_attribute
*attr
, char *buf
)
693 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
696 result
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_CHARGE_MODE
, &value
);
700 return sysfs_emit(buf
, "%d\n", value
& 0xff);
703 static DEVICE_ATTR_RO(charge_mode
);
705 /* dGPU ********************************************************************/
706 static ssize_t
dgpu_disable_show(struct device
*dev
,
707 struct device_attribute
*attr
, char *buf
)
709 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
712 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_DGPU
);
716 return sysfs_emit(buf
, "%d\n", result
);
720 * A user may be required to store the value twice, typcial store first, then
721 * rescan PCI bus to activate power, then store a second time to save correctly.
722 * The reason for this is that an extra code path in the ACPI is enabled when
723 * the device and bus are powered.
725 static ssize_t
dgpu_disable_store(struct device
*dev
,
726 struct device_attribute
*attr
,
727 const char *buf
, size_t count
)
732 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
734 result
= kstrtou32(buf
, 10, &disable
);
741 if (asus
->gpu_mux_dev
) {
742 result
= asus_wmi_get_devstate_simple(asus
, asus
->gpu_mux_dev
);
744 /* An error here may signal greater failure of GPU handling */
746 if (!result
&& disable
) {
748 pr_warn("Can not disable dGPU when the MUX is in dGPU mode: %d\n", err
);
753 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU
, disable
, &result
);
755 pr_warn("Failed to set dgpu disable: %d\n", err
);
760 pr_warn("Failed to set dgpu disable (result): 0x%x\n", result
);
764 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "dgpu_disable");
768 static DEVICE_ATTR_RW(dgpu_disable
);
770 /* eGPU ********************************************************************/
771 static ssize_t
egpu_enable_show(struct device
*dev
,
772 struct device_attribute
*attr
, char *buf
)
774 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
777 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_EGPU
);
781 return sysfs_emit(buf
, "%d\n", result
);
784 /* The ACPI call to enable the eGPU also disables the internal dGPU */
785 static ssize_t
egpu_enable_store(struct device
*dev
,
786 struct device_attribute
*attr
,
787 const char *buf
, size_t count
)
792 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
794 err
= kstrtou32(buf
, 10, &enable
);
801 err
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_EGPU_CONNECTED
);
803 pr_warn("Failed to get egpu connection status: %d\n", err
);
807 if (asus
->gpu_mux_dev
) {
808 result
= asus_wmi_get_devstate_simple(asus
, asus
->gpu_mux_dev
);
810 /* An error here may signal greater failure of GPU handling */
811 pr_warn("Failed to get gpu mux status: %d\n", result
);
814 if (!result
&& enable
) {
816 pr_warn("Can not enable eGPU when the MUX is in dGPU mode: %d\n", err
);
821 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU
, enable
, &result
);
823 pr_warn("Failed to set egpu state: %d\n", err
);
828 pr_warn("Failed to set egpu state (retval): 0x%x\n", result
);
832 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "egpu_enable");
836 static DEVICE_ATTR_RW(egpu_enable
);
838 /* Is eGPU connected? *********************************************************/
839 static ssize_t
egpu_connected_show(struct device
*dev
,
840 struct device_attribute
*attr
, char *buf
)
842 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
845 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_EGPU_CONNECTED
);
849 return sysfs_emit(buf
, "%d\n", result
);
852 static DEVICE_ATTR_RO(egpu_connected
);
854 /* gpu mux switch *************************************************************/
855 static ssize_t
gpu_mux_mode_show(struct device
*dev
,
856 struct device_attribute
*attr
, char *buf
)
858 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
861 result
= asus_wmi_get_devstate_simple(asus
, asus
->gpu_mux_dev
);
865 return sysfs_emit(buf
, "%d\n", result
);
868 static ssize_t
gpu_mux_mode_store(struct device
*dev
,
869 struct device_attribute
*attr
,
870 const char *buf
, size_t count
)
872 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
876 err
= kstrtou32(buf
, 10, &optimus
);
883 if (asus
->dgpu_disable_available
) {
884 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_DGPU
);
886 /* An error here may signal greater failure of GPU handling */
888 if (result
&& !optimus
) {
890 pr_warn("Can not switch MUX to dGPU mode when dGPU is disabled: %d\n", err
);
895 if (asus
->egpu_enable_available
) {
896 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_EGPU
);
898 /* An error here may signal greater failure of GPU handling */
900 if (result
&& !optimus
) {
902 pr_warn("Can not switch MUX to dGPU mode when eGPU is enabled: %d\n", err
);
907 err
= asus_wmi_set_devstate(asus
->gpu_mux_dev
, optimus
, &result
);
909 dev_err(dev
, "Failed to set GPU MUX mode: %d\n", err
);
912 /* !1 is considered a fail by ASUS */
914 dev_warn(dev
, "Failed to set GPU MUX mode (result): 0x%x\n", result
);
918 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "gpu_mux_mode");
922 static DEVICE_ATTR_RW(gpu_mux_mode
);
924 /* TUF Laptop Keyboard RGB Modes **********************************************/
925 static ssize_t
kbd_rgb_mode_store(struct device
*dev
,
926 struct device_attribute
*attr
,
927 const char *buf
, size_t count
)
929 u32 cmd
, mode
, r
, g
, b
, speed
;
930 struct led_classdev
*led
;
931 struct asus_wmi
*asus
;
934 led
= dev_get_drvdata(dev
);
935 asus
= container_of(led
, struct asus_wmi
, kbd_led
);
937 if (sscanf(buf
, "%d %d %d %d %d %d", &cmd
, &mode
, &r
, &g
, &b
, &speed
) != 6)
940 /* B3 is set and B4 is save to BIOS */
952 /* These are the known usable modes across all TUF/ROG */
953 if (mode
>= 12 || mode
== 9)
970 err
= asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS
, asus
->kbd_rgb_dev
,
971 cmd
| (mode
<< 8) | (r
<< 16) | (g
<< 24), b
| (speed
<< 8), NULL
);
977 static DEVICE_ATTR_WO(kbd_rgb_mode
);
979 static DEVICE_STRING_ATTR_RO(kbd_rgb_mode_index
, 0444,
980 "cmd mode red green blue speed");
982 static struct attribute
*kbd_rgb_mode_attrs
[] = {
983 &dev_attr_kbd_rgb_mode
.attr
,
984 &dev_attr_kbd_rgb_mode_index
.attr
.attr
,
988 static const struct attribute_group kbd_rgb_mode_group
= {
989 .attrs
= kbd_rgb_mode_attrs
,
992 /* TUF Laptop Keyboard RGB State **********************************************/
993 static ssize_t
kbd_rgb_state_store(struct device
*dev
,
994 struct device_attribute
*attr
,
995 const char *buf
, size_t count
)
997 u32 flags
, cmd
, boot
, awake
, sleep
, keyboard
;
1000 if (sscanf(buf
, "%d %d %d %d %d", &cmd
, &boot
, &awake
, &sleep
, &keyboard
) != 5)
1016 /* 0xbd is the required default arg0 for the method. Nothing happens otherwise */
1017 err
= asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS
,
1018 ASUS_WMI_DEVID_TUF_RGB_STATE
, 0xbd | cmd
<< 8 | (flags
<< 16), 0, NULL
);
1024 static DEVICE_ATTR_WO(kbd_rgb_state
);
1026 static DEVICE_STRING_ATTR_RO(kbd_rgb_state_index
, 0444,
1027 "cmd boot awake sleep keyboard");
1029 static struct attribute
*kbd_rgb_state_attrs
[] = {
1030 &dev_attr_kbd_rgb_state
.attr
,
1031 &dev_attr_kbd_rgb_state_index
.attr
.attr
,
1035 static const struct attribute_group kbd_rgb_state_group
= {
1036 .attrs
= kbd_rgb_state_attrs
,
1039 static const struct attribute_group
*kbd_rgb_mode_groups
[] = {
1045 /* Tunable: PPT: Intel=PL1, AMD=SPPT *****************************************/
1046 static ssize_t
ppt_pl2_sppt_store(struct device
*dev
,
1047 struct device_attribute
*attr
,
1048 const char *buf
, size_t count
)
1050 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1054 result
= kstrtou32(buf
, 10, &value
);
1058 if (value
< PPT_TOTAL_MIN
|| value
> PPT_TOTAL_MAX
)
1061 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL2_SPPT
, value
, &result
);
1063 pr_warn("Failed to set ppt_pl2_sppt: %d\n", err
);
1068 pr_warn("Failed to set ppt_pl2_sppt (result): 0x%x\n", result
);
1072 asus
->ppt_pl2_sppt
= value
;
1073 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "ppt_pl2_sppt");
1078 static ssize_t
ppt_pl2_sppt_show(struct device
*dev
,
1079 struct device_attribute
*attr
,
1082 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1084 return sysfs_emit(buf
, "%u\n", asus
->ppt_pl2_sppt
);
1086 static DEVICE_ATTR_RW(ppt_pl2_sppt
);
1088 /* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/
1089 static ssize_t
ppt_pl1_spl_store(struct device
*dev
,
1090 struct device_attribute
*attr
,
1091 const char *buf
, size_t count
)
1093 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1097 result
= kstrtou32(buf
, 10, &value
);
1101 if (value
< PPT_TOTAL_MIN
|| value
> PPT_TOTAL_MAX
)
1104 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL1_SPL
, value
, &result
);
1106 pr_warn("Failed to set ppt_pl1_spl: %d\n", err
);
1111 pr_warn("Failed to set ppt_pl1_spl (result): 0x%x\n", result
);
1115 asus
->ppt_pl1_spl
= value
;
1116 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "ppt_pl1_spl");
1120 static ssize_t
ppt_pl1_spl_show(struct device
*dev
,
1121 struct device_attribute
*attr
,
1124 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1126 return sysfs_emit(buf
, "%u\n", asus
->ppt_pl1_spl
);
1128 static DEVICE_ATTR_RW(ppt_pl1_spl
);
1130 /* Tunable: PPT APU FPPT ******************************************************/
1131 static ssize_t
ppt_fppt_store(struct device
*dev
,
1132 struct device_attribute
*attr
,
1133 const char *buf
, size_t count
)
1135 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1139 result
= kstrtou32(buf
, 10, &value
);
1143 if (value
< PPT_TOTAL_MIN
|| value
> PPT_TOTAL_MAX
)
1146 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_FPPT
, value
, &result
);
1148 pr_warn("Failed to set ppt_fppt: %d\n", err
);
1153 pr_warn("Failed to set ppt_fppt (result): 0x%x\n", result
);
1157 asus
->ppt_fppt
= value
;
1158 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "ppt_fpu_sppt");
1163 static ssize_t
ppt_fppt_show(struct device
*dev
,
1164 struct device_attribute
*attr
,
1167 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1169 return sysfs_emit(buf
, "%u\n", asus
->ppt_fppt
);
1171 static DEVICE_ATTR_RW(ppt_fppt
);
1173 /* Tunable: PPT APU SPPT *****************************************************/
1174 static ssize_t
ppt_apu_sppt_store(struct device
*dev
,
1175 struct device_attribute
*attr
,
1176 const char *buf
, size_t count
)
1178 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1182 result
= kstrtou32(buf
, 10, &value
);
1186 if (value
< PPT_CPU_MIN
|| value
> PPT_CPU_MAX
)
1189 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_APU_SPPT
, value
, &result
);
1191 pr_warn("Failed to set ppt_apu_sppt: %d\n", err
);
1196 pr_warn("Failed to set ppt_apu_sppt (result): 0x%x\n", result
);
1200 asus
->ppt_apu_sppt
= value
;
1201 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "ppt_apu_sppt");
1206 static ssize_t
ppt_apu_sppt_show(struct device
*dev
,
1207 struct device_attribute
*attr
,
1210 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1212 return sysfs_emit(buf
, "%u\n", asus
->ppt_apu_sppt
);
1214 static DEVICE_ATTR_RW(ppt_apu_sppt
);
1216 /* Tunable: PPT platform SPPT ************************************************/
1217 static ssize_t
ppt_platform_sppt_store(struct device
*dev
,
1218 struct device_attribute
*attr
,
1219 const char *buf
, size_t count
)
1221 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1225 result
= kstrtou32(buf
, 10, &value
);
1229 if (value
< PPT_CPU_MIN
|| value
> PPT_CPU_MAX
)
1232 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PLAT_SPPT
, value
, &result
);
1234 pr_warn("Failed to set ppt_platform_sppt: %d\n", err
);
1239 pr_warn("Failed to set ppt_platform_sppt (result): 0x%x\n", result
);
1243 asus
->ppt_platform_sppt
= value
;
1244 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "ppt_platform_sppt");
1249 static ssize_t
ppt_platform_sppt_show(struct device
*dev
,
1250 struct device_attribute
*attr
,
1253 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1255 return sysfs_emit(buf
, "%u\n", asus
->ppt_platform_sppt
);
1257 static DEVICE_ATTR_RW(ppt_platform_sppt
);
1259 /* Tunable: NVIDIA dynamic boost *********************************************/
1260 static ssize_t
nv_dynamic_boost_store(struct device
*dev
,
1261 struct device_attribute
*attr
,
1262 const char *buf
, size_t count
)
1264 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1268 result
= kstrtou32(buf
, 10, &value
);
1272 if (value
< NVIDIA_BOOST_MIN
|| value
> NVIDIA_BOOST_MAX
)
1275 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_DYN_BOOST
, value
, &result
);
1277 pr_warn("Failed to set nv_dynamic_boost: %d\n", err
);
1282 pr_warn("Failed to set nv_dynamic_boost (result): 0x%x\n", result
);
1286 asus
->nv_dynamic_boost
= value
;
1287 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "nv_dynamic_boost");
1292 static ssize_t
nv_dynamic_boost_show(struct device
*dev
,
1293 struct device_attribute
*attr
,
1296 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1298 return sysfs_emit(buf
, "%u\n", asus
->nv_dynamic_boost
);
1300 static DEVICE_ATTR_RW(nv_dynamic_boost
);
1302 /* Tunable: NVIDIA temperature target ****************************************/
1303 static ssize_t
nv_temp_target_store(struct device
*dev
,
1304 struct device_attribute
*attr
,
1305 const char *buf
, size_t count
)
1307 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1311 result
= kstrtou32(buf
, 10, &value
);
1315 if (value
< NVIDIA_TEMP_MIN
|| value
> NVIDIA_TEMP_MAX
)
1318 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_THERM_TARGET
, value
, &result
);
1320 pr_warn("Failed to set nv_temp_target: %d\n", err
);
1325 pr_warn("Failed to set nv_temp_target (result): 0x%x\n", result
);
1329 asus
->nv_temp_target
= value
;
1330 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "nv_temp_target");
1335 static ssize_t
nv_temp_target_show(struct device
*dev
,
1336 struct device_attribute
*attr
,
1339 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1341 return sysfs_emit(buf
, "%u\n", asus
->nv_temp_target
);
1343 static DEVICE_ATTR_RW(nv_temp_target
);
1345 /* Ally MCU Powersave ********************************************************/
1346 static ssize_t
mcu_powersave_show(struct device
*dev
,
1347 struct device_attribute
*attr
, char *buf
)
1349 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1352 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_MCU_POWERSAVE
);
1356 return sysfs_emit(buf
, "%d\n", result
);
1359 static ssize_t
mcu_powersave_store(struct device
*dev
,
1360 struct device_attribute
*attr
,
1361 const char *buf
, size_t count
)
1366 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1368 result
= kstrtou32(buf
, 10, &enable
);
1375 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_MCU_POWERSAVE
, enable
, &result
);
1377 pr_warn("Failed to set MCU powersave: %d\n", err
);
1382 pr_warn("Failed to set MCU powersave (result): 0x%x\n", result
);
1386 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "mcu_powersave");
1390 static DEVICE_ATTR_RW(mcu_powersave
);
1392 /* Battery ********************************************************************/
1394 /* The battery maximum charging percentage */
1395 static int charge_end_threshold
;
1397 static ssize_t
charge_control_end_threshold_store(struct device
*dev
,
1398 struct device_attribute
*attr
,
1399 const char *buf
, size_t count
)
1403 ret
= kstrtouint(buf
, 10, &value
);
1407 if (value
< 0 || value
> 100)
1410 ret
= asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC
, value
, &rv
);
1417 /* There isn't any method in the DSDT to read the threshold, so we
1418 * save the threshold.
1420 charge_end_threshold
= value
;
1424 static ssize_t
charge_control_end_threshold_show(struct device
*device
,
1425 struct device_attribute
*attr
,
1428 return sysfs_emit(buf
, "%d\n", charge_end_threshold
);
1431 static DEVICE_ATTR_RW(charge_control_end_threshold
);
1433 static int asus_wmi_battery_add(struct power_supply
*battery
, struct acpi_battery_hook
*hook
)
1435 /* The WMI method does not provide a way to specific a battery, so we
1436 * just assume it is the first battery.
1437 * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
1438 * battery is named BATT.
1440 if (strcmp(battery
->desc
->name
, "BAT0") != 0 &&
1441 strcmp(battery
->desc
->name
, "BAT1") != 0 &&
1442 strcmp(battery
->desc
->name
, "BATC") != 0 &&
1443 strcmp(battery
->desc
->name
, "BATT") != 0)
1446 if (device_create_file(&battery
->dev
,
1447 &dev_attr_charge_control_end_threshold
))
1450 /* The charge threshold is only reset when the system is power cycled,
1451 * and we can't get the current threshold so let set it to 100% when
1452 * a battery is added.
1454 asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC
, 100, NULL
);
1455 charge_end_threshold
= 100;
1460 static int asus_wmi_battery_remove(struct power_supply
*battery
, struct acpi_battery_hook
*hook
)
1462 device_remove_file(&battery
->dev
,
1463 &dev_attr_charge_control_end_threshold
);
1467 static struct acpi_battery_hook battery_hook
= {
1468 .add_battery
= asus_wmi_battery_add
,
1469 .remove_battery
= asus_wmi_battery_remove
,
1470 .name
= "ASUS Battery Extension",
1473 static void asus_wmi_battery_init(struct asus_wmi
*asus
)
1475 asus
->battery_rsoc_available
= false;
1476 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_RSOC
)) {
1477 asus
->battery_rsoc_available
= true;
1478 battery_hook_register(&battery_hook
);
1482 static void asus_wmi_battery_exit(struct asus_wmi
*asus
)
1484 if (asus
->battery_rsoc_available
)
1485 battery_hook_unregister(&battery_hook
);
1488 /* LEDs ***********************************************************************/
1491 * These functions actually update the LED's, and are called from a
1492 * workqueue. By doing this as separate work rather than when the LED
1493 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
1494 * potentially bad time, such as a timer interrupt.
1496 static void tpd_led_update(struct work_struct
*work
)
1499 struct asus_wmi
*asus
;
1501 asus
= container_of(work
, struct asus_wmi
, tpd_led_work
);
1503 ctrl_param
= asus
->tpd_led_wk
;
1504 asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED
, ctrl_param
, NULL
);
1507 static void tpd_led_set(struct led_classdev
*led_cdev
,
1508 enum led_brightness value
)
1510 struct asus_wmi
*asus
;
1512 asus
= container_of(led_cdev
, struct asus_wmi
, tpd_led
);
1514 asus
->tpd_led_wk
= !!value
;
1515 queue_work(asus
->led_workqueue
, &asus
->tpd_led_work
);
1518 static int read_tpd_led_state(struct asus_wmi
*asus
)
1520 return asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_TOUCHPAD_LED
);
1523 static enum led_brightness
tpd_led_get(struct led_classdev
*led_cdev
)
1525 struct asus_wmi
*asus
;
1527 asus
= container_of(led_cdev
, struct asus_wmi
, tpd_led
);
1529 return read_tpd_led_state(asus
);
1532 static void kbd_led_update(struct asus_wmi
*asus
)
1536 ctrl_param
= 0x80 | (asus
->kbd_led_wk
& 0x7F);
1537 asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT
, ctrl_param
, NULL
);
1540 static int kbd_led_read(struct asus_wmi
*asus
, int *level
, int *env
)
1546 * bit 7: light on/off
1547 * bit 8-10: environment (0: dark, 1: normal, 2: light)
1548 * bit 17: status unknown
1550 retval
= asus_wmi_get_devstate_bits(asus
, ASUS_WMI_DEVID_KBD_BACKLIGHT
,
1553 /* Unknown status is considered as off */
1554 if (retval
== 0x8000)
1561 *level
= retval
& 0x7F;
1563 *env
= (retval
>> 8) & 0x7F;
1567 static void do_kbd_led_set(struct led_classdev
*led_cdev
, int value
)
1569 struct asus_wmi
*asus
;
1572 asus
= container_of(led_cdev
, struct asus_wmi
, kbd_led
);
1573 max_level
= asus
->kbd_led
.max_brightness
;
1575 asus
->kbd_led_wk
= clamp_val(value
, 0, max_level
);
1576 kbd_led_update(asus
);
1579 static void kbd_led_set(struct led_classdev
*led_cdev
,
1580 enum led_brightness value
)
1582 /* Prevent disabling keyboard backlight on module unregister */
1583 if (led_cdev
->flags
& LED_UNREGISTERING
)
1586 do_kbd_led_set(led_cdev
, value
);
1589 static void kbd_led_set_by_kbd(struct asus_wmi
*asus
, enum led_brightness value
)
1591 struct led_classdev
*led_cdev
= &asus
->kbd_led
;
1593 do_kbd_led_set(led_cdev
, value
);
1594 led_classdev_notify_brightness_hw_changed(led_cdev
, asus
->kbd_led_wk
);
1597 static enum led_brightness
kbd_led_get(struct led_classdev
*led_cdev
)
1599 struct asus_wmi
*asus
;
1602 asus
= container_of(led_cdev
, struct asus_wmi
, kbd_led
);
1604 retval
= kbd_led_read(asus
, &value
, NULL
);
1611 static int wlan_led_unknown_state(struct asus_wmi
*asus
)
1615 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_WIRELESS_LED
, &result
);
1617 return result
& ASUS_WMI_DSTS_UNKNOWN_BIT
;
1620 static void wlan_led_update(struct work_struct
*work
)
1623 struct asus_wmi
*asus
;
1625 asus
= container_of(work
, struct asus_wmi
, wlan_led_work
);
1627 ctrl_param
= asus
->wlan_led_wk
;
1628 asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED
, ctrl_param
, NULL
);
1631 static void wlan_led_set(struct led_classdev
*led_cdev
,
1632 enum led_brightness value
)
1634 struct asus_wmi
*asus
;
1636 asus
= container_of(led_cdev
, struct asus_wmi
, wlan_led
);
1638 asus
->wlan_led_wk
= !!value
;
1639 queue_work(asus
->led_workqueue
, &asus
->wlan_led_work
);
1642 static enum led_brightness
wlan_led_get(struct led_classdev
*led_cdev
)
1644 struct asus_wmi
*asus
;
1647 asus
= container_of(led_cdev
, struct asus_wmi
, wlan_led
);
1648 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_WIRELESS_LED
, &result
);
1650 return result
& ASUS_WMI_DSTS_BRIGHTNESS_MASK
;
1653 static void lightbar_led_update(struct work_struct
*work
)
1655 struct asus_wmi
*asus
;
1658 asus
= container_of(work
, struct asus_wmi
, lightbar_led_work
);
1660 ctrl_param
= asus
->lightbar_led_wk
;
1661 asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR
, ctrl_param
, NULL
);
1664 static void lightbar_led_set(struct led_classdev
*led_cdev
,
1665 enum led_brightness value
)
1667 struct asus_wmi
*asus
;
1669 asus
= container_of(led_cdev
, struct asus_wmi
, lightbar_led
);
1671 asus
->lightbar_led_wk
= !!value
;
1672 queue_work(asus
->led_workqueue
, &asus
->lightbar_led_work
);
1675 static enum led_brightness
lightbar_led_get(struct led_classdev
*led_cdev
)
1677 struct asus_wmi
*asus
;
1680 asus
= container_of(led_cdev
, struct asus_wmi
, lightbar_led
);
1681 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_LIGHTBAR
, &result
);
1683 return result
& ASUS_WMI_DSTS_LIGHTBAR_MASK
;
1686 static int micmute_led_set(struct led_classdev
*led_cdev
,
1687 enum led_brightness brightness
)
1689 int state
= brightness
!= LED_OFF
;
1692 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_MICMUTE_LED
, state
, NULL
);
1693 return err
< 0 ? err
: 0;
1696 static enum led_brightness
camera_led_get(struct led_classdev
*led_cdev
)
1698 struct asus_wmi
*asus
;
1701 asus
= container_of(led_cdev
, struct asus_wmi
, camera_led
);
1702 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_CAMERA_LED
, &result
);
1704 return result
& ASUS_WMI_DSTS_BRIGHTNESS_MASK
;
1707 static int camera_led_set(struct led_classdev
*led_cdev
,
1708 enum led_brightness brightness
)
1710 int state
= brightness
!= LED_OFF
;
1713 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_CAMERA_LED
, state
, NULL
);
1714 return err
< 0 ? err
: 0;
1717 static void asus_wmi_led_exit(struct asus_wmi
*asus
)
1719 led_classdev_unregister(&asus
->kbd_led
);
1720 led_classdev_unregister(&asus
->tpd_led
);
1721 led_classdev_unregister(&asus
->wlan_led
);
1722 led_classdev_unregister(&asus
->lightbar_led
);
1723 led_classdev_unregister(&asus
->micmute_led
);
1724 led_classdev_unregister(&asus
->camera_led
);
1726 if (asus
->led_workqueue
)
1727 destroy_workqueue(asus
->led_workqueue
);
1730 static int asus_wmi_led_init(struct asus_wmi
*asus
)
1732 int rv
= 0, num_rgb_groups
= 0, led_val
;
1734 if (asus
->kbd_rgb_dev
)
1735 kbd_rgb_mode_groups
[num_rgb_groups
++] = &kbd_rgb_mode_group
;
1736 if (asus
->kbd_rgb_state_available
)
1737 kbd_rgb_mode_groups
[num_rgb_groups
++] = &kbd_rgb_state_group
;
1739 asus
->led_workqueue
= create_singlethread_workqueue("led_workqueue");
1740 if (!asus
->led_workqueue
)
1743 if (read_tpd_led_state(asus
) >= 0) {
1744 INIT_WORK(&asus
->tpd_led_work
, tpd_led_update
);
1746 asus
->tpd_led
.name
= "asus::touchpad";
1747 asus
->tpd_led
.brightness_set
= tpd_led_set
;
1748 asus
->tpd_led
.brightness_get
= tpd_led_get
;
1749 asus
->tpd_led
.max_brightness
= 1;
1751 rv
= led_classdev_register(&asus
->platform_device
->dev
,
1757 if (!kbd_led_read(asus
, &led_val
, NULL
) && !dmi_check_system(asus_use_hid_led_dmi_ids
)) {
1758 pr_info("using asus-wmi for asus::kbd_backlight\n");
1759 asus
->kbd_led_wk
= led_val
;
1760 asus
->kbd_led
.name
= "asus::kbd_backlight";
1761 asus
->kbd_led
.flags
= LED_BRIGHT_HW_CHANGED
;
1762 asus
->kbd_led
.brightness_set
= kbd_led_set
;
1763 asus
->kbd_led
.brightness_get
= kbd_led_get
;
1764 asus
->kbd_led
.max_brightness
= 3;
1766 if (num_rgb_groups
!= 0)
1767 asus
->kbd_led
.groups
= kbd_rgb_mode_groups
;
1769 rv
= led_classdev_register(&asus
->platform_device
->dev
,
1775 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_WIRELESS_LED
)
1776 && (asus
->driver
->quirks
->wapf
> 0)) {
1777 INIT_WORK(&asus
->wlan_led_work
, wlan_led_update
);
1779 asus
->wlan_led
.name
= "asus::wlan";
1780 asus
->wlan_led
.brightness_set
= wlan_led_set
;
1781 if (!wlan_led_unknown_state(asus
))
1782 asus
->wlan_led
.brightness_get
= wlan_led_get
;
1783 asus
->wlan_led
.flags
= LED_CORE_SUSPENDRESUME
;
1784 asus
->wlan_led
.max_brightness
= 1;
1785 asus
->wlan_led
.default_trigger
= "asus-wlan";
1787 rv
= led_classdev_register(&asus
->platform_device
->dev
,
1793 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_LIGHTBAR
)) {
1794 INIT_WORK(&asus
->lightbar_led_work
, lightbar_led_update
);
1796 asus
->lightbar_led
.name
= "asus::lightbar";
1797 asus
->lightbar_led
.brightness_set
= lightbar_led_set
;
1798 asus
->lightbar_led
.brightness_get
= lightbar_led_get
;
1799 asus
->lightbar_led
.max_brightness
= 1;
1801 rv
= led_classdev_register(&asus
->platform_device
->dev
,
1802 &asus
->lightbar_led
);
1805 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_MICMUTE_LED
)) {
1806 asus
->micmute_led
.name
= "platform::micmute";
1807 asus
->micmute_led
.max_brightness
= 1;
1808 asus
->micmute_led
.brightness_set_blocking
= micmute_led_set
;
1809 asus
->micmute_led
.default_trigger
= "audio-micmute";
1811 rv
= led_classdev_register(&asus
->platform_device
->dev
,
1812 &asus
->micmute_led
);
1817 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_CAMERA_LED
)) {
1818 asus
->camera_led
.name
= "asus::camera";
1819 asus
->camera_led
.max_brightness
= 1;
1820 asus
->camera_led
.brightness_get
= camera_led_get
;
1821 asus
->camera_led
.brightness_set_blocking
= camera_led_set
;
1823 rv
= led_classdev_register(&asus
->platform_device
->dev
,
1829 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_OOBE
)) {
1831 * Disable OOBE state, so that e.g. the keyboard backlight
1834 rv
= asus_wmi_set_devstate(ASUS_WMI_DEVID_OOBE
, 1, NULL
);
1841 asus_wmi_led_exit(asus
);
1846 /* RF *************************************************************************/
1849 * PCI hotplug (for wlan rfkill)
1851 static bool asus_wlan_rfkill_blocked(struct asus_wmi
*asus
)
1853 int result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WLAN
);
1860 static void asus_rfkill_hotplug(struct asus_wmi
*asus
)
1862 struct pci_dev
*dev
;
1863 struct pci_bus
*bus
;
1868 mutex_lock(&asus
->wmi_lock
);
1869 blocked
= asus_wlan_rfkill_blocked(asus
);
1870 mutex_unlock(&asus
->wmi_lock
);
1872 mutex_lock(&asus
->hotplug_lock
);
1873 pci_lock_rescan_remove();
1875 if (asus
->wlan
.rfkill
)
1876 rfkill_set_sw_state(asus
->wlan
.rfkill
, blocked
);
1878 if (asus
->hotplug_slot
.ops
) {
1879 bus
= pci_find_bus(0, 1);
1881 pr_warn("Unable to find PCI bus 1?\n");
1885 if (pci_bus_read_config_dword(bus
, 0, PCI_VENDOR_ID
, &l
)) {
1886 pr_err("Unable to read PCI config space?\n");
1889 absent
= (l
== 0xffffffff);
1891 if (blocked
!= absent
) {
1892 pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
1893 blocked
? "blocked" : "unblocked",
1894 absent
? "absent" : "present");
1895 pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
1900 dev
= pci_get_slot(bus
, 0);
1902 /* Device already present */
1906 dev
= pci_scan_single_device(bus
, 0);
1908 pci_bus_assign_resources(bus
);
1909 pci_bus_add_device(dev
);
1912 dev
= pci_get_slot(bus
, 0);
1914 pci_stop_and_remove_bus_device(dev
);
1921 pci_unlock_rescan_remove();
1922 mutex_unlock(&asus
->hotplug_lock
);
1925 static void asus_rfkill_notify(acpi_handle handle
, u32 event
, void *data
)
1927 struct asus_wmi
*asus
= data
;
1929 if (event
!= ACPI_NOTIFY_BUS_CHECK
)
1933 * We can't call directly asus_rfkill_hotplug because most
1934 * of the time WMBC is still being executed and not reetrant.
1935 * There is currently no way to tell ACPICA that we want this
1936 * method to be serialized, we schedule a asus_rfkill_hotplug
1937 * call later, in a safer context.
1939 queue_work(asus
->hotplug_workqueue
, &asus
->hotplug_work
);
1942 static int asus_register_rfkill_notifier(struct asus_wmi
*asus
, char *node
)
1947 status
= acpi_get_handle(NULL
, node
, &handle
);
1948 if (ACPI_FAILURE(status
))
1951 status
= acpi_install_notify_handler(handle
, ACPI_SYSTEM_NOTIFY
,
1952 asus_rfkill_notify
, asus
);
1953 if (ACPI_FAILURE(status
))
1954 pr_warn("Failed to register notify on %s\n", node
);
1959 static void asus_unregister_rfkill_notifier(struct asus_wmi
*asus
, char *node
)
1961 acpi_status status
= AE_OK
;
1964 status
= acpi_get_handle(NULL
, node
, &handle
);
1965 if (ACPI_FAILURE(status
))
1968 status
= acpi_remove_notify_handler(handle
, ACPI_SYSTEM_NOTIFY
,
1969 asus_rfkill_notify
);
1970 if (ACPI_FAILURE(status
))
1971 pr_err("Error removing rfkill notify handler %s\n", node
);
1974 static int asus_get_adapter_status(struct hotplug_slot
*hotplug_slot
,
1977 struct asus_wmi
*asus
= container_of(hotplug_slot
,
1978 struct asus_wmi
, hotplug_slot
);
1979 int result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WLAN
);
1988 static const struct hotplug_slot_ops asus_hotplug_slot_ops
= {
1989 .get_adapter_status
= asus_get_adapter_status
,
1990 .get_power_status
= asus_get_adapter_status
,
1993 static void asus_hotplug_work(struct work_struct
*work
)
1995 struct asus_wmi
*asus
;
1997 asus
= container_of(work
, struct asus_wmi
, hotplug_work
);
1998 asus_rfkill_hotplug(asus
);
2001 static int asus_setup_pci_hotplug(struct asus_wmi
*asus
)
2004 struct pci_bus
*bus
= pci_find_bus(0, 1);
2007 pr_err("Unable to find wifi PCI bus\n");
2011 asus
->hotplug_workqueue
=
2012 create_singlethread_workqueue("hotplug_workqueue");
2013 if (!asus
->hotplug_workqueue
)
2014 goto error_workqueue
;
2016 INIT_WORK(&asus
->hotplug_work
, asus_hotplug_work
);
2018 asus
->hotplug_slot
.ops
= &asus_hotplug_slot_ops
;
2020 ret
= pci_hp_register(&asus
->hotplug_slot
, bus
, 0, "asus-wifi");
2022 pr_err("Unable to register hotplug slot - %d\n", ret
);
2023 goto error_register
;
2029 asus
->hotplug_slot
.ops
= NULL
;
2030 destroy_workqueue(asus
->hotplug_workqueue
);
2038 static int asus_rfkill_set(void *data
, bool blocked
)
2040 struct asus_rfkill
*priv
= data
;
2041 u32 ctrl_param
= !blocked
;
2042 u32 dev_id
= priv
->dev_id
;
2045 * If the user bit is set, BIOS can't set and record the wlan status,
2046 * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
2047 * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
2048 * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
2049 * while setting the wlan status through WMI.
2050 * This is also the behavior that windows app will do.
2052 if ((dev_id
== ASUS_WMI_DEVID_WLAN
) &&
2053 priv
->asus
->driver
->wlan_ctrl_by_user
)
2054 dev_id
= ASUS_WMI_DEVID_WLAN_LED
;
2056 return asus_wmi_set_devstate(dev_id
, ctrl_param
, NULL
);
2059 static void asus_rfkill_query(struct rfkill
*rfkill
, void *data
)
2061 struct asus_rfkill
*priv
= data
;
2064 result
= asus_wmi_get_devstate_simple(priv
->asus
, priv
->dev_id
);
2069 rfkill_set_sw_state(priv
->rfkill
, !result
);
2072 static int asus_rfkill_wlan_set(void *data
, bool blocked
)
2074 struct asus_rfkill
*priv
= data
;
2075 struct asus_wmi
*asus
= priv
->asus
;
2079 * This handler is enabled only if hotplug is enabled.
2080 * In this case, the asus_wmi_set_devstate() will
2081 * trigger a wmi notification and we need to wait
2082 * this call to finish before being able to call
2085 mutex_lock(&asus
->wmi_lock
);
2086 ret
= asus_rfkill_set(data
, blocked
);
2087 mutex_unlock(&asus
->wmi_lock
);
2091 static const struct rfkill_ops asus_rfkill_wlan_ops
= {
2092 .set_block
= asus_rfkill_wlan_set
,
2093 .query
= asus_rfkill_query
,
2096 static const struct rfkill_ops asus_rfkill_ops
= {
2097 .set_block
= asus_rfkill_set
,
2098 .query
= asus_rfkill_query
,
2101 static int asus_new_rfkill(struct asus_wmi
*asus
,
2102 struct asus_rfkill
*arfkill
,
2103 const char *name
, enum rfkill_type type
, int dev_id
)
2105 int result
= asus_wmi_get_devstate_simple(asus
, dev_id
);
2106 struct rfkill
**rfkill
= &arfkill
->rfkill
;
2111 arfkill
->dev_id
= dev_id
;
2112 arfkill
->asus
= asus
;
2114 if (dev_id
== ASUS_WMI_DEVID_WLAN
&&
2115 asus
->driver
->quirks
->hotplug_wireless
)
2116 *rfkill
= rfkill_alloc(name
, &asus
->platform_device
->dev
, type
,
2117 &asus_rfkill_wlan_ops
, arfkill
);
2119 *rfkill
= rfkill_alloc(name
, &asus
->platform_device
->dev
, type
,
2120 &asus_rfkill_ops
, arfkill
);
2125 if ((dev_id
== ASUS_WMI_DEVID_WLAN
) &&
2126 (asus
->driver
->quirks
->wapf
> 0))
2127 rfkill_set_led_trigger_name(*rfkill
, "asus-wlan");
2129 rfkill_init_sw_state(*rfkill
, !result
);
2130 result
= rfkill_register(*rfkill
);
2132 rfkill_destroy(*rfkill
);
2139 static void asus_wmi_rfkill_exit(struct asus_wmi
*asus
)
2141 if (asus
->driver
->wlan_ctrl_by_user
&& ashs_present())
2144 asus_unregister_rfkill_notifier(asus
, "\\_SB.PCI0.P0P5");
2145 asus_unregister_rfkill_notifier(asus
, "\\_SB.PCI0.P0P6");
2146 asus_unregister_rfkill_notifier(asus
, "\\_SB.PCI0.P0P7");
2147 if (asus
->wlan
.rfkill
) {
2148 rfkill_unregister(asus
->wlan
.rfkill
);
2149 rfkill_destroy(asus
->wlan
.rfkill
);
2150 asus
->wlan
.rfkill
= NULL
;
2153 * Refresh pci hotplug in case the rfkill state was changed after
2154 * asus_unregister_rfkill_notifier()
2156 asus_rfkill_hotplug(asus
);
2157 if (asus
->hotplug_slot
.ops
)
2158 pci_hp_deregister(&asus
->hotplug_slot
);
2159 if (asus
->hotplug_workqueue
)
2160 destroy_workqueue(asus
->hotplug_workqueue
);
2162 if (asus
->bluetooth
.rfkill
) {
2163 rfkill_unregister(asus
->bluetooth
.rfkill
);
2164 rfkill_destroy(asus
->bluetooth
.rfkill
);
2165 asus
->bluetooth
.rfkill
= NULL
;
2167 if (asus
->wimax
.rfkill
) {
2168 rfkill_unregister(asus
->wimax
.rfkill
);
2169 rfkill_destroy(asus
->wimax
.rfkill
);
2170 asus
->wimax
.rfkill
= NULL
;
2172 if (asus
->wwan3g
.rfkill
) {
2173 rfkill_unregister(asus
->wwan3g
.rfkill
);
2174 rfkill_destroy(asus
->wwan3g
.rfkill
);
2175 asus
->wwan3g
.rfkill
= NULL
;
2177 if (asus
->gps
.rfkill
) {
2178 rfkill_unregister(asus
->gps
.rfkill
);
2179 rfkill_destroy(asus
->gps
.rfkill
);
2180 asus
->gps
.rfkill
= NULL
;
2182 if (asus
->uwb
.rfkill
) {
2183 rfkill_unregister(asus
->uwb
.rfkill
);
2184 rfkill_destroy(asus
->uwb
.rfkill
);
2185 asus
->uwb
.rfkill
= NULL
;
2189 static int asus_wmi_rfkill_init(struct asus_wmi
*asus
)
2193 mutex_init(&asus
->hotplug_lock
);
2194 mutex_init(&asus
->wmi_lock
);
2196 result
= asus_new_rfkill(asus
, &asus
->wlan
, "asus-wlan",
2197 RFKILL_TYPE_WLAN
, ASUS_WMI_DEVID_WLAN
);
2199 if (result
&& result
!= -ENODEV
)
2202 result
= asus_new_rfkill(asus
, &asus
->bluetooth
,
2203 "asus-bluetooth", RFKILL_TYPE_BLUETOOTH
,
2204 ASUS_WMI_DEVID_BLUETOOTH
);
2206 if (result
&& result
!= -ENODEV
)
2209 result
= asus_new_rfkill(asus
, &asus
->wimax
, "asus-wimax",
2210 RFKILL_TYPE_WIMAX
, ASUS_WMI_DEVID_WIMAX
);
2212 if (result
&& result
!= -ENODEV
)
2215 result
= asus_new_rfkill(asus
, &asus
->wwan3g
, "asus-wwan3g",
2216 RFKILL_TYPE_WWAN
, ASUS_WMI_DEVID_WWAN3G
);
2218 if (result
&& result
!= -ENODEV
)
2221 result
= asus_new_rfkill(asus
, &asus
->gps
, "asus-gps",
2222 RFKILL_TYPE_GPS
, ASUS_WMI_DEVID_GPS
);
2224 if (result
&& result
!= -ENODEV
)
2227 result
= asus_new_rfkill(asus
, &asus
->uwb
, "asus-uwb",
2228 RFKILL_TYPE_UWB
, ASUS_WMI_DEVID_UWB
);
2230 if (result
&& result
!= -ENODEV
)
2233 if (!asus
->driver
->quirks
->hotplug_wireless
)
2236 result
= asus_setup_pci_hotplug(asus
);
2238 * If we get -EBUSY then something else is handling the PCI hotplug -
2239 * don't fail in this case
2241 if (result
== -EBUSY
)
2244 asus_register_rfkill_notifier(asus
, "\\_SB.PCI0.P0P5");
2245 asus_register_rfkill_notifier(asus
, "\\_SB.PCI0.P0P6");
2246 asus_register_rfkill_notifier(asus
, "\\_SB.PCI0.P0P7");
2248 * Refresh pci hotplug in case the rfkill state was changed during
2251 asus_rfkill_hotplug(asus
);
2254 if (result
&& result
!= -ENODEV
)
2255 asus_wmi_rfkill_exit(asus
);
2257 if (result
== -ENODEV
)
2263 /* Panel Overdrive ************************************************************/
2264 static ssize_t
panel_od_show(struct device
*dev
,
2265 struct device_attribute
*attr
, char *buf
)
2267 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2270 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_PANEL_OD
);
2274 return sysfs_emit(buf
, "%d\n", result
);
2277 static ssize_t
panel_od_store(struct device
*dev
,
2278 struct device_attribute
*attr
,
2279 const char *buf
, size_t count
)
2284 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2286 result
= kstrtou32(buf
, 10, &overdrive
);
2293 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_PANEL_OD
, overdrive
, &result
);
2296 pr_warn("Failed to set panel overdrive: %d\n", err
);
2301 pr_warn("Failed to set panel overdrive (result): 0x%x\n", result
);
2305 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "panel_od");
2309 static DEVICE_ATTR_RW(panel_od
);
2311 /* Bootup sound ***************************************************************/
2313 static ssize_t
boot_sound_show(struct device
*dev
,
2314 struct device_attribute
*attr
, char *buf
)
2316 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2319 result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_BOOT_SOUND
);
2323 return sysfs_emit(buf
, "%d\n", result
);
2326 static ssize_t
boot_sound_store(struct device
*dev
,
2327 struct device_attribute
*attr
,
2328 const char *buf
, size_t count
)
2333 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2335 result
= kstrtou32(buf
, 10, &snd
);
2342 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BOOT_SOUND
, snd
, &result
);
2344 pr_warn("Failed to set boot sound: %d\n", err
);
2349 pr_warn("Failed to set panel boot sound (result): 0x%x\n", result
);
2353 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "boot_sound");
2357 static DEVICE_ATTR_RW(boot_sound
);
2359 /* Mini-LED mode **************************************************************/
2360 static ssize_t
mini_led_mode_show(struct device
*dev
,
2361 struct device_attribute
*attr
, char *buf
)
2363 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2367 err
= asus_wmi_get_devstate(asus
, asus
->mini_led_dev_id
, &value
);
2370 value
= value
& ASUS_MINI_LED_MODE_MASK
;
2373 * Remap the mode values to match previous generation mini-led. The last gen
2374 * WMI 0 == off, while on this version WMI 2 ==off (flipped).
2376 if (asus
->mini_led_dev_id
== ASUS_WMI_DEVID_MINI_LED_MODE2
) {
2378 case ASUS_MINI_LED_2024_WEAK
:
2379 value
= ASUS_MINI_LED_ON
;
2381 case ASUS_MINI_LED_2024_STRONG
:
2382 value
= ASUS_MINI_LED_STRONG_MODE
;
2384 case ASUS_MINI_LED_2024_OFF
:
2385 value
= ASUS_MINI_LED_OFF
;
2390 return sysfs_emit(buf
, "%d\n", value
);
2393 static ssize_t
mini_led_mode_store(struct device
*dev
,
2394 struct device_attribute
*attr
,
2395 const char *buf
, size_t count
)
2400 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2402 result
= kstrtou32(buf
, 10, &mode
);
2406 if (asus
->mini_led_dev_id
== ASUS_WMI_DEVID_MINI_LED_MODE
&&
2407 mode
> ASUS_MINI_LED_ON
)
2409 if (asus
->mini_led_dev_id
== ASUS_WMI_DEVID_MINI_LED_MODE2
&&
2410 mode
> ASUS_MINI_LED_STRONG_MODE
)
2414 * Remap the mode values so expected behaviour is the same as the last
2415 * generation of mini-LED with 0 == off, 1 == on.
2417 if (asus
->mini_led_dev_id
== ASUS_WMI_DEVID_MINI_LED_MODE2
) {
2419 case ASUS_MINI_LED_OFF
:
2420 mode
= ASUS_MINI_LED_2024_OFF
;
2422 case ASUS_MINI_LED_ON
:
2423 mode
= ASUS_MINI_LED_2024_WEAK
;
2425 case ASUS_MINI_LED_STRONG_MODE
:
2426 mode
= ASUS_MINI_LED_2024_STRONG
;
2431 err
= asus_wmi_set_devstate(asus
->mini_led_dev_id
, mode
, &result
);
2433 pr_warn("Failed to set mini-LED: %d\n", err
);
2438 pr_warn("Failed to set mini-LED mode (result): 0x%x\n", result
);
2442 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
, "mini_led_mode");
2446 static DEVICE_ATTR_RW(mini_led_mode
);
2448 static ssize_t
available_mini_led_mode_show(struct device
*dev
,
2449 struct device_attribute
*attr
, char *buf
)
2451 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2453 switch (asus
->mini_led_dev_id
) {
2454 case ASUS_WMI_DEVID_MINI_LED_MODE
:
2455 return sysfs_emit(buf
, "0 1\n");
2456 case ASUS_WMI_DEVID_MINI_LED_MODE2
:
2457 return sysfs_emit(buf
, "0 1 2\n");
2460 return sysfs_emit(buf
, "0\n");
2463 static DEVICE_ATTR_RO(available_mini_led_mode
);
2465 /* Quirks *********************************************************************/
2467 static void asus_wmi_set_xusb2pr(struct asus_wmi
*asus
)
2469 struct pci_dev
*xhci_pdev
;
2470 u32 orig_ports_available
;
2471 u32 ports_available
= asus
->driver
->quirks
->xusb2pr
;
2473 xhci_pdev
= pci_get_device(PCI_VENDOR_ID_INTEL
,
2474 PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI
,
2480 pci_read_config_dword(xhci_pdev
, USB_INTEL_XUSB2PR
,
2481 &orig_ports_available
);
2483 pci_write_config_dword(xhci_pdev
, USB_INTEL_XUSB2PR
,
2484 cpu_to_le32(ports_available
));
2486 pci_dev_put(xhci_pdev
);
2488 pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
2489 orig_ports_available
, ports_available
);
2493 * Some devices dont support or have borcken get_als method
2494 * but still support set method.
2496 static void asus_wmi_set_als(void)
2498 asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE
, 1, NULL
);
2501 /* Hwmon device ***************************************************************/
2503 static int asus_agfn_fan_speed_read(struct asus_wmi
*asus
, int fan
,
2506 struct agfn_fan_args args
= {
2507 .agfn
.len
= sizeof(args
),
2508 .agfn
.mfun
= ASUS_FAN_MFUN
,
2509 .agfn
.sfun
= ASUS_FAN_SFUN_READ
,
2513 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
2519 status
= asus_wmi_evaluate_method_agfn(input
);
2521 if (status
|| args
.agfn
.err
)
2525 *speed
= args
.speed
;
2530 static int asus_agfn_fan_speed_write(struct asus_wmi
*asus
, int fan
,
2533 struct agfn_fan_args args
= {
2534 .agfn
.len
= sizeof(args
),
2535 .agfn
.mfun
= ASUS_FAN_MFUN
,
2536 .agfn
.sfun
= ASUS_FAN_SFUN_WRITE
,
2538 .speed
= speed
? *speed
: 0,
2540 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
2543 /* 1: for setting 1st fan's speed 0: setting auto mode */
2544 if (fan
!= 1 && fan
!= 0)
2547 status
= asus_wmi_evaluate_method_agfn(input
);
2549 if (status
|| args
.agfn
.err
)
2552 if (speed
&& fan
== 1)
2553 asus
->agfn_pwm
= *speed
;
2559 * Check if we can read the speed of one fan. If true we assume we can also
2562 static bool asus_wmi_has_agfn_fan(struct asus_wmi
*asus
)
2568 status
= asus_agfn_fan_speed_read(asus
, 1, &speed
);
2572 status
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FAN_CTRL
, &value
);
2577 * We need to find a better way, probably using sfun,
2579 * Currently we disable it if:
2580 * - ASUS_WMI_UNSUPPORTED_METHOD is returned
2581 * - reverved bits are non-zero
2582 * - sfun and presence bit are not set
2584 return !(value
== ASUS_WMI_UNSUPPORTED_METHOD
|| value
& 0xFFF80000
2585 || (!asus
->sfun
&& !(value
& ASUS_WMI_DSTS_PRESENCE_BIT
)));
2588 static int asus_fan_set_auto(struct asus_wmi
*asus
)
2593 switch (asus
->fan_type
) {
2594 case FAN_TYPE_SPEC83
:
2595 status
= asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL
,
2605 status
= asus_agfn_fan_speed_write(asus
, 0, NULL
);
2615 * Modern models like the G713 also have GPU fan control (this is not AGFN)
2617 if (asus
->gpu_fan_type
== FAN_TYPE_SPEC83
) {
2618 status
= asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL
,
2630 static ssize_t
pwm1_show(struct device
*dev
,
2631 struct device_attribute
*attr
,
2634 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2638 /* If we already set a value then just return it */
2639 if (asus
->agfn_pwm
>= 0)
2640 return sysfs_emit(buf
, "%d\n", asus
->agfn_pwm
);
2643 * If we haven't set already set a value through the AGFN interface,
2644 * we read a current value through the (now-deprecated) FAN_CTRL device.
2646 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FAN_CTRL
, &value
);
2652 if (value
== 1) /* Low Speed */
2654 else if (value
== 2)
2656 else if (value
== 3)
2659 pr_err("Unknown fan speed %#x\n", value
);
2663 return sysfs_emit(buf
, "%d\n", value
);
2666 static ssize_t
pwm1_store(struct device
*dev
,
2667 struct device_attribute
*attr
,
2668 const char *buf
, size_t count
) {
2669 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2674 ret
= kstrtouint(buf
, 10, &value
);
2678 value
= clamp(value
, 0, 255);
2680 state
= asus_agfn_fan_speed_write(asus
, 1, &value
);
2682 pr_warn("Setting fan speed failed: %d\n", state
);
2684 asus
->fan_pwm_mode
= ASUS_FAN_CTRL_MANUAL
;
2689 static ssize_t
fan1_input_show(struct device
*dev
,
2690 struct device_attribute
*attr
,
2693 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2697 switch (asus
->fan_type
) {
2698 case FAN_TYPE_SPEC83
:
2699 ret
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_CPU_FAN_CTRL
,
2708 /* no speed readable on manual mode */
2709 if (asus
->fan_pwm_mode
== ASUS_FAN_CTRL_MANUAL
)
2712 ret
= asus_agfn_fan_speed_read(asus
, 1, &value
);
2714 pr_warn("reading fan speed failed: %d\n", ret
);
2723 return sysfs_emit(buf
, "%d\n", value
< 0 ? -1 : value
* 100);
2726 static ssize_t
pwm1_enable_show(struct device
*dev
,
2727 struct device_attribute
*attr
,
2730 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2733 * Just read back the cached pwm mode.
2735 * For the CPU_FAN device, the spec indicates that we should be
2736 * able to read the device status and consult bit 19 to see if we
2737 * are in Full On or Automatic mode. However, this does not work
2738 * in practice on X532FL at least (the bit is always 0) and there's
2739 * also nothing in the DSDT to indicate that this behaviour exists.
2741 return sysfs_emit(buf
, "%d\n", asus
->fan_pwm_mode
);
2744 static ssize_t
pwm1_enable_store(struct device
*dev
,
2745 struct device_attribute
*attr
,
2746 const char *buf
, size_t count
)
2748 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2755 ret
= kstrtouint(buf
, 10, &state
);
2759 if (asus
->fan_type
== FAN_TYPE_SPEC83
) {
2760 switch (state
) { /* standard documented hwmon values */
2761 case ASUS_FAN_CTRL_FULLSPEED
:
2764 case ASUS_FAN_CTRL_AUTO
:
2771 ret
= asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL
,
2778 } else if (asus
->fan_type
== FAN_TYPE_AGFN
) {
2780 case ASUS_FAN_CTRL_MANUAL
:
2783 case ASUS_FAN_CTRL_AUTO
:
2784 status
= asus_fan_set_auto(asus
);
2794 asus
->fan_pwm_mode
= state
;
2796 /* Must set to disabled if mode is toggled */
2797 if (asus
->cpu_fan_curve_available
)
2798 asus
->custom_fan_curves
[FAN_CURVE_DEV_CPU
].enabled
= false;
2799 if (asus
->gpu_fan_curve_available
)
2800 asus
->custom_fan_curves
[FAN_CURVE_DEV_GPU
].enabled
= false;
2801 if (asus
->mid_fan_curve_available
)
2802 asus
->custom_fan_curves
[FAN_CURVE_DEV_MID
].enabled
= false;
2807 static ssize_t
asus_hwmon_temp1(struct device
*dev
,
2808 struct device_attribute
*attr
,
2811 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2815 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_THERMAL_CTRL
, &value
);
2819 return sysfs_emit(buf
, "%ld\n",
2820 deci_kelvin_to_millicelsius(value
& 0xFFFF));
2823 /* GPU fan on modern ROG laptops */
2824 static ssize_t
fan2_input_show(struct device
*dev
,
2825 struct device_attribute
*attr
,
2828 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2832 ret
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_GPU_FAN_CTRL
, &value
);
2838 return sysfs_emit(buf
, "%d\n", value
* 100);
2841 /* Middle/Center fan on modern ROG laptops */
2842 static ssize_t
fan3_input_show(struct device
*dev
,
2843 struct device_attribute
*attr
,
2846 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2850 ret
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_MID_FAN_CTRL
, &value
);
2856 return sysfs_emit(buf
, "%d\n", value
* 100);
2859 static ssize_t
pwm2_enable_show(struct device
*dev
,
2860 struct device_attribute
*attr
,
2863 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2865 return sysfs_emit(buf
, "%d\n", asus
->gpu_fan_pwm_mode
);
2868 static ssize_t
pwm2_enable_store(struct device
*dev
,
2869 struct device_attribute
*attr
,
2870 const char *buf
, size_t count
)
2872 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2878 ret
= kstrtouint(buf
, 10, &state
);
2882 switch (state
) { /* standard documented hwmon values */
2883 case ASUS_FAN_CTRL_FULLSPEED
:
2886 case ASUS_FAN_CTRL_AUTO
:
2893 ret
= asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL
,
2901 asus
->gpu_fan_pwm_mode
= state
;
2905 static ssize_t
pwm3_enable_show(struct device
*dev
,
2906 struct device_attribute
*attr
,
2909 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2911 return sysfs_emit(buf
, "%d\n", asus
->mid_fan_pwm_mode
);
2914 static ssize_t
pwm3_enable_store(struct device
*dev
,
2915 struct device_attribute
*attr
,
2916 const char *buf
, size_t count
)
2918 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2924 ret
= kstrtouint(buf
, 10, &state
);
2928 switch (state
) { /* standard documented hwmon values */
2929 case ASUS_FAN_CTRL_FULLSPEED
:
2932 case ASUS_FAN_CTRL_AUTO
:
2939 ret
= asus_wmi_set_devstate(ASUS_WMI_DEVID_MID_FAN_CTRL
,
2947 asus
->mid_fan_pwm_mode
= state
;
2952 static DEVICE_ATTR_RW(pwm1
);
2953 static DEVICE_ATTR_RW(pwm1_enable
);
2954 static DEVICE_ATTR_RO(fan1_input
);
2955 static DEVICE_STRING_ATTR_RO(fan1_label
, 0444, ASUS_FAN_DESC
);
2957 /* Fan2 - GPU fan */
2958 static DEVICE_ATTR_RW(pwm2_enable
);
2959 static DEVICE_ATTR_RO(fan2_input
);
2960 static DEVICE_STRING_ATTR_RO(fan2_label
, 0444, ASUS_GPU_FAN_DESC
);
2961 /* Fan3 - Middle/center fan */
2962 static DEVICE_ATTR_RW(pwm3_enable
);
2963 static DEVICE_ATTR_RO(fan3_input
);
2964 static DEVICE_STRING_ATTR_RO(fan3_label
, 0444, ASUS_MID_FAN_DESC
);
2967 static DEVICE_ATTR(temp1_input
, S_IRUGO
, asus_hwmon_temp1
, NULL
);
2969 static struct attribute
*hwmon_attributes
[] = {
2970 &dev_attr_pwm1
.attr
,
2971 &dev_attr_pwm1_enable
.attr
,
2972 &dev_attr_pwm2_enable
.attr
,
2973 &dev_attr_pwm3_enable
.attr
,
2974 &dev_attr_fan1_input
.attr
,
2975 &dev_attr_fan1_label
.attr
.attr
,
2976 &dev_attr_fan2_input
.attr
,
2977 &dev_attr_fan2_label
.attr
.attr
,
2978 &dev_attr_fan3_input
.attr
,
2979 &dev_attr_fan3_label
.attr
.attr
,
2981 &dev_attr_temp1_input
.attr
,
2985 static umode_t
asus_hwmon_sysfs_is_visible(struct kobject
*kobj
,
2986 struct attribute
*attr
, int idx
)
2988 struct device
*dev
= kobj_to_dev(kobj
);
2989 struct asus_wmi
*asus
= dev_get_drvdata(dev
->parent
);
2990 u32 value
= ASUS_WMI_UNSUPPORTED_METHOD
;
2992 if (attr
== &dev_attr_pwm1
.attr
) {
2993 if (asus
->fan_type
!= FAN_TYPE_AGFN
)
2995 } else if (attr
== &dev_attr_fan1_input
.attr
2996 || attr
== &dev_attr_fan1_label
.attr
.attr
2997 || attr
== &dev_attr_pwm1_enable
.attr
) {
2998 if (asus
->fan_type
== FAN_TYPE_NONE
)
3000 } else if (attr
== &dev_attr_fan2_input
.attr
3001 || attr
== &dev_attr_fan2_label
.attr
.attr
3002 || attr
== &dev_attr_pwm2_enable
.attr
) {
3003 if (asus
->gpu_fan_type
== FAN_TYPE_NONE
)
3005 } else if (attr
== &dev_attr_fan3_input
.attr
3006 || attr
== &dev_attr_fan3_label
.attr
.attr
3007 || attr
== &dev_attr_pwm3_enable
.attr
) {
3008 if (asus
->mid_fan_type
== FAN_TYPE_NONE
)
3010 } else if (attr
== &dev_attr_temp1_input
.attr
) {
3011 int err
= asus_wmi_get_devstate(asus
,
3012 ASUS_WMI_DEVID_THERMAL_CTRL
,
3016 return 0; /* can't return negative here */
3019 * If the temperature value in deci-Kelvin is near the absolute
3020 * zero temperature, something is clearly wrong
3022 if (value
== 0 || value
== 1)
3029 static const struct attribute_group hwmon_attribute_group
= {
3030 .is_visible
= asus_hwmon_sysfs_is_visible
,
3031 .attrs
= hwmon_attributes
3033 __ATTRIBUTE_GROUPS(hwmon_attribute
);
3035 static int asus_wmi_hwmon_init(struct asus_wmi
*asus
)
3037 struct device
*dev
= &asus
->platform_device
->dev
;
3038 struct device
*hwmon
;
3040 hwmon
= devm_hwmon_device_register_with_groups(dev
, "asus", asus
,
3041 hwmon_attribute_groups
);
3043 if (IS_ERR(hwmon
)) {
3044 pr_err("Could not register asus hwmon device\n");
3045 return PTR_ERR(hwmon
);
3050 static int asus_wmi_fan_init(struct asus_wmi
*asus
)
3052 asus
->gpu_fan_type
= FAN_TYPE_NONE
;
3053 asus
->mid_fan_type
= FAN_TYPE_NONE
;
3054 asus
->fan_type
= FAN_TYPE_NONE
;
3055 asus
->agfn_pwm
= -1;
3057 if (asus
->driver
->quirks
->wmi_ignore_fan
)
3058 asus
->fan_type
= FAN_TYPE_NONE
;
3059 else if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_CPU_FAN_CTRL
))
3060 asus
->fan_type
= FAN_TYPE_SPEC83
;
3061 else if (asus_wmi_has_agfn_fan(asus
))
3062 asus
->fan_type
= FAN_TYPE_AGFN
;
3064 /* Modern models like G713 also have GPU fan control */
3065 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_GPU_FAN_CTRL
))
3066 asus
->gpu_fan_type
= FAN_TYPE_SPEC83
;
3068 /* Some models also have a center/middle fan */
3069 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_MID_FAN_CTRL
))
3070 asus
->mid_fan_type
= FAN_TYPE_SPEC83
;
3072 if (asus
->fan_type
== FAN_TYPE_NONE
)
3075 asus_fan_set_auto(asus
);
3076 asus
->fan_pwm_mode
= ASUS_FAN_CTRL_AUTO
;
3080 /* Fan mode *******************************************************************/
3082 static int fan_boost_mode_check_present(struct asus_wmi
*asus
)
3087 asus
->fan_boost_mode_available
= false;
3089 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FAN_BOOST_MODE
,
3098 if ((result
& ASUS_WMI_DSTS_PRESENCE_BIT
) &&
3099 (result
& ASUS_FAN_BOOST_MODES_MASK
)) {
3100 asus
->fan_boost_mode_available
= true;
3101 asus
->fan_boost_mode_mask
= result
& ASUS_FAN_BOOST_MODES_MASK
;
3107 static int fan_boost_mode_write(struct asus_wmi
*asus
)
3113 value
= asus
->fan_boost_mode
;
3115 pr_info("Set fan boost mode: %u\n", value
);
3116 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE
, value
,
3119 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
,
3123 pr_warn("Failed to set fan boost mode: %d\n", err
);
3128 pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
3136 static int fan_boost_mode_switch_next(struct asus_wmi
*asus
)
3138 u8 mask
= asus
->fan_boost_mode_mask
;
3140 if (asus
->fan_boost_mode
== ASUS_FAN_BOOST_MODE_NORMAL
) {
3141 if (mask
& ASUS_FAN_BOOST_MODE_OVERBOOST_MASK
)
3142 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_OVERBOOST
;
3143 else if (mask
& ASUS_FAN_BOOST_MODE_SILENT_MASK
)
3144 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_SILENT
;
3145 } else if (asus
->fan_boost_mode
== ASUS_FAN_BOOST_MODE_OVERBOOST
) {
3146 if (mask
& ASUS_FAN_BOOST_MODE_SILENT_MASK
)
3147 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_SILENT
;
3149 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_NORMAL
;
3151 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_NORMAL
;
3154 return fan_boost_mode_write(asus
);
3157 static ssize_t
fan_boost_mode_show(struct device
*dev
,
3158 struct device_attribute
*attr
, char *buf
)
3160 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3162 return sysfs_emit(buf
, "%d\n", asus
->fan_boost_mode
);
3165 static ssize_t
fan_boost_mode_store(struct device
*dev
,
3166 struct device_attribute
*attr
,
3167 const char *buf
, size_t count
)
3169 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3170 u8 mask
= asus
->fan_boost_mode_mask
;
3174 result
= kstrtou8(buf
, 10, &new_mode
);
3176 pr_warn("Trying to store invalid value\n");
3180 if (new_mode
== ASUS_FAN_BOOST_MODE_OVERBOOST
) {
3181 if (!(mask
& ASUS_FAN_BOOST_MODE_OVERBOOST_MASK
))
3183 } else if (new_mode
== ASUS_FAN_BOOST_MODE_SILENT
) {
3184 if (!(mask
& ASUS_FAN_BOOST_MODE_SILENT_MASK
))
3186 } else if (new_mode
!= ASUS_FAN_BOOST_MODE_NORMAL
) {
3190 asus
->fan_boost_mode
= new_mode
;
3191 fan_boost_mode_write(asus
);
3196 // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
3197 static DEVICE_ATTR_RW(fan_boost_mode
);
3199 /* Custom fan curves **********************************************************/
3201 static void fan_curve_copy_from_buf(struct fan_curve_data
*data
, u8
*buf
)
3205 for (i
= 0; i
< FAN_CURVE_POINTS
; i
++) {
3206 data
->temps
[i
] = buf
[i
];
3209 for (i
= 0; i
< FAN_CURVE_POINTS
; i
++) {
3211 255 * buf
[i
+ FAN_CURVE_POINTS
] / 100;
3215 static int fan_curve_get_factory_default(struct asus_wmi
*asus
, u32 fan_dev
)
3217 struct fan_curve_data
*curves
;
3218 u8 buf
[FAN_CURVE_BUF_LEN
];
3222 if (asus
->throttle_thermal_policy_dev
)
3223 mode
= asus
->throttle_thermal_policy_mode
;
3224 /* DEVID_<C/G>PU_FAN_CURVE is switched for OVERBOOST vs SILENT */
3230 err
= asus_wmi_evaluate_method_buf(asus
->dsts_id
, fan_dev
, mode
, buf
,
3233 pr_warn("%s (0x%08x) failed: %d\n", __func__
, fan_dev
, err
);
3237 fan_idx
= FAN_CURVE_DEV_CPU
;
3238 if (fan_dev
== ASUS_WMI_DEVID_GPU_FAN_CURVE
)
3239 fan_idx
= FAN_CURVE_DEV_GPU
;
3241 if (fan_dev
== ASUS_WMI_DEVID_MID_FAN_CURVE
)
3242 fan_idx
= FAN_CURVE_DEV_MID
;
3244 curves
= &asus
->custom_fan_curves
[fan_idx
];
3245 curves
->device_id
= fan_dev
;
3247 fan_curve_copy_from_buf(curves
, buf
);
3251 /* Check if capability exists, and populate defaults */
3252 static int fan_curve_check_present(struct asus_wmi
*asus
, bool *available
,
3259 if (asus
->fan_type
== FAN_TYPE_NONE
)
3262 err
= fan_curve_get_factory_default(asus
, fan_dev
);
3271 /* Determine which fan the attribute is for if SENSOR_ATTR */
3272 static struct fan_curve_data
*fan_curve_attr_select(struct asus_wmi
*asus
,
3273 struct device_attribute
*attr
)
3275 int index
= to_sensor_dev_attr(attr
)->index
;
3277 return &asus
->custom_fan_curves
[index
];
3280 /* Determine which fan the attribute is for if SENSOR_ATTR_2 */
3281 static struct fan_curve_data
*fan_curve_attr_2_select(struct asus_wmi
*asus
,
3282 struct device_attribute
*attr
)
3284 int nr
= to_sensor_dev_attr_2(attr
)->nr
;
3286 return &asus
->custom_fan_curves
[nr
& ~FAN_CURVE_PWM_MASK
];
3289 static ssize_t
fan_curve_show(struct device
*dev
,
3290 struct device_attribute
*attr
, char *buf
)
3292 struct sensor_device_attribute_2
*dev_attr
= to_sensor_dev_attr_2(attr
);
3293 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3294 struct fan_curve_data
*data
;
3295 int value
, pwm
, index
;
3297 data
= fan_curve_attr_2_select(asus
, attr
);
3298 pwm
= dev_attr
->nr
& FAN_CURVE_PWM_MASK
;
3299 index
= dev_attr
->index
;
3302 value
= data
->percents
[index
];
3304 value
= data
->temps
[index
];
3306 return sysfs_emit(buf
, "%d\n", value
);
3310 * "fan_dev" is the related WMI method such as ASUS_WMI_DEVID_CPU_FAN_CURVE.
3312 static int fan_curve_write(struct asus_wmi
*asus
,
3313 struct fan_curve_data
*data
)
3315 u32 arg1
= 0, arg2
= 0, arg3
= 0, arg4
= 0;
3316 u8
*percents
= data
->percents
;
3317 u8
*temps
= data
->temps
;
3318 int ret
, i
, shift
= 0;
3323 for (i
= 0; i
< FAN_CURVE_POINTS
/ 2; i
++) {
3324 arg1
+= (temps
[i
]) << shift
;
3325 arg2
+= (temps
[i
+ 4]) << shift
;
3326 /* Scale to percentage for device */
3327 arg3
+= (100 * percents
[i
] / 255) << shift
;
3328 arg4
+= (100 * percents
[i
+ 4] / 255) << shift
;
3332 return asus_wmi_evaluate_method5(ASUS_WMI_METHODID_DEVS
,
3334 arg1
, arg2
, arg3
, arg4
, &ret
);
3337 static ssize_t
fan_curve_store(struct device
*dev
,
3338 struct device_attribute
*attr
, const char *buf
,
3341 struct sensor_device_attribute_2
*dev_attr
= to_sensor_dev_attr_2(attr
);
3342 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3343 struct fan_curve_data
*data
;
3344 int err
, pwm
, index
;
3347 data
= fan_curve_attr_2_select(asus
, attr
);
3348 pwm
= dev_attr
->nr
& FAN_CURVE_PWM_MASK
;
3349 index
= dev_attr
->index
;
3351 err
= kstrtou8(buf
, 10, &value
);
3356 data
->percents
[index
] = value
;
3358 data
->temps
[index
] = value
;
3361 * Mark as disabled so the user has to explicitly enable to apply a
3362 * changed fan curve. This prevents potential lockups from writing out
3363 * many changes as one-write-per-change.
3365 data
->enabled
= false;
3370 static ssize_t
fan_curve_enable_show(struct device
*dev
,
3371 struct device_attribute
*attr
, char *buf
)
3373 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3374 struct fan_curve_data
*data
;
3377 data
= fan_curve_attr_select(asus
, attr
);
3382 return sysfs_emit(buf
, "%d\n", out
);
3385 static ssize_t
fan_curve_enable_store(struct device
*dev
,
3386 struct device_attribute
*attr
,
3387 const char *buf
, size_t count
)
3389 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3390 struct fan_curve_data
*data
;
3393 data
= fan_curve_attr_select(asus
, attr
);
3395 err
= kstrtoint(buf
, 10, &value
);
3401 data
->enabled
= true;
3404 data
->enabled
= false;
3407 * Auto + reset the fan curve data to defaults. Make it an explicit
3408 * option so that users don't accidentally overwrite a set fan curve.
3411 err
= fan_curve_get_factory_default(asus
, data
->device_id
);
3414 data
->enabled
= false;
3420 if (data
->enabled
) {
3421 err
= fan_curve_write(asus
, data
);
3426 * For machines with throttle this is the only way to reset fans
3427 * to default mode of operation (does not erase curve data).
3429 if (asus
->throttle_thermal_policy_dev
) {
3430 err
= throttle_thermal_policy_write(asus
);
3433 /* Similar is true for laptops with this fan */
3434 } else if (asus
->fan_type
== FAN_TYPE_SPEC83
) {
3435 err
= asus_fan_set_auto(asus
);
3439 /* Safeguard against fautly ACPI tables */
3440 err
= fan_curve_get_factory_default(asus
, data
->device_id
);
3443 err
= fan_curve_write(asus
, data
);
3452 static SENSOR_DEVICE_ATTR_RW(pwm1_enable
, fan_curve_enable
, FAN_CURVE_DEV_CPU
);
3453 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_temp
, fan_curve
,
3454 FAN_CURVE_DEV_CPU
, 0);
3455 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_temp
, fan_curve
,
3456 FAN_CURVE_DEV_CPU
, 1);
3457 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_temp
, fan_curve
,
3458 FAN_CURVE_DEV_CPU
, 2);
3459 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_temp
, fan_curve
,
3460 FAN_CURVE_DEV_CPU
, 3);
3461 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_temp
, fan_curve
,
3462 FAN_CURVE_DEV_CPU
, 4);
3463 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_temp
, fan_curve
,
3464 FAN_CURVE_DEV_CPU
, 5);
3465 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_temp
, fan_curve
,
3466 FAN_CURVE_DEV_CPU
, 6);
3467 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp
, fan_curve
,
3468 FAN_CURVE_DEV_CPU
, 7);
3470 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_pwm
, fan_curve
,
3471 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 0);
3472 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_pwm
, fan_curve
,
3473 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 1);
3474 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_pwm
, fan_curve
,
3475 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 2);
3476 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_pwm
, fan_curve
,
3477 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 3);
3478 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_pwm
, fan_curve
,
3479 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 4);
3480 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_pwm
, fan_curve
,
3481 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 5);
3482 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_pwm
, fan_curve
,
3483 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 6);
3484 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_pwm
, fan_curve
,
3485 FAN_CURVE_DEV_CPU
| FAN_CURVE_PWM_MASK
, 7);
3488 static SENSOR_DEVICE_ATTR_RW(pwm2_enable
, fan_curve_enable
, FAN_CURVE_DEV_GPU
);
3489 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_temp
, fan_curve
,
3490 FAN_CURVE_DEV_GPU
, 0);
3491 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_temp
, fan_curve
,
3492 FAN_CURVE_DEV_GPU
, 1);
3493 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_temp
, fan_curve
,
3494 FAN_CURVE_DEV_GPU
, 2);
3495 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_temp
, fan_curve
,
3496 FAN_CURVE_DEV_GPU
, 3);
3497 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_temp
, fan_curve
,
3498 FAN_CURVE_DEV_GPU
, 4);
3499 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_temp
, fan_curve
,
3500 FAN_CURVE_DEV_GPU
, 5);
3501 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_temp
, fan_curve
,
3502 FAN_CURVE_DEV_GPU
, 6);
3503 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_temp
, fan_curve
,
3504 FAN_CURVE_DEV_GPU
, 7);
3506 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_pwm
, fan_curve
,
3507 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 0);
3508 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_pwm
, fan_curve
,
3509 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 1);
3510 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_pwm
, fan_curve
,
3511 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 2);
3512 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_pwm
, fan_curve
,
3513 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 3);
3514 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_pwm
, fan_curve
,
3515 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 4);
3516 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_pwm
, fan_curve
,
3517 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 5);
3518 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm
, fan_curve
,
3519 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 6);
3520 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm
, fan_curve
,
3521 FAN_CURVE_DEV_GPU
| FAN_CURVE_PWM_MASK
, 7);
3524 static SENSOR_DEVICE_ATTR_RW(pwm3_enable
, fan_curve_enable
, FAN_CURVE_DEV_MID
);
3525 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_temp
, fan_curve
,
3526 FAN_CURVE_DEV_MID
, 0);
3527 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_temp
, fan_curve
,
3528 FAN_CURVE_DEV_MID
, 1);
3529 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_temp
, fan_curve
,
3530 FAN_CURVE_DEV_MID
, 2);
3531 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_temp
, fan_curve
,
3532 FAN_CURVE_DEV_MID
, 3);
3533 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_temp
, fan_curve
,
3534 FAN_CURVE_DEV_MID
, 4);
3535 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_temp
, fan_curve
,
3536 FAN_CURVE_DEV_MID
, 5);
3537 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_temp
, fan_curve
,
3538 FAN_CURVE_DEV_MID
, 6);
3539 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_temp
, fan_curve
,
3540 FAN_CURVE_DEV_MID
, 7);
3542 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_pwm
, fan_curve
,
3543 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 0);
3544 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_pwm
, fan_curve
,
3545 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 1);
3546 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_pwm
, fan_curve
,
3547 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 2);
3548 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_pwm
, fan_curve
,
3549 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 3);
3550 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_pwm
, fan_curve
,
3551 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 4);
3552 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_pwm
, fan_curve
,
3553 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 5);
3554 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_pwm
, fan_curve
,
3555 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 6);
3556 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_pwm
, fan_curve
,
3557 FAN_CURVE_DEV_MID
| FAN_CURVE_PWM_MASK
, 7);
3559 static struct attribute
*asus_fan_curve_attr
[] = {
3561 &sensor_dev_attr_pwm1_enable
.dev_attr
.attr
,
3562 &sensor_dev_attr_pwm1_auto_point1_temp
.dev_attr
.attr
,
3563 &sensor_dev_attr_pwm1_auto_point2_temp
.dev_attr
.attr
,
3564 &sensor_dev_attr_pwm1_auto_point3_temp
.dev_attr
.attr
,
3565 &sensor_dev_attr_pwm1_auto_point4_temp
.dev_attr
.attr
,
3566 &sensor_dev_attr_pwm1_auto_point5_temp
.dev_attr
.attr
,
3567 &sensor_dev_attr_pwm1_auto_point6_temp
.dev_attr
.attr
,
3568 &sensor_dev_attr_pwm1_auto_point7_temp
.dev_attr
.attr
,
3569 &sensor_dev_attr_pwm1_auto_point8_temp
.dev_attr
.attr
,
3570 &sensor_dev_attr_pwm1_auto_point1_pwm
.dev_attr
.attr
,
3571 &sensor_dev_attr_pwm1_auto_point2_pwm
.dev_attr
.attr
,
3572 &sensor_dev_attr_pwm1_auto_point3_pwm
.dev_attr
.attr
,
3573 &sensor_dev_attr_pwm1_auto_point4_pwm
.dev_attr
.attr
,
3574 &sensor_dev_attr_pwm1_auto_point5_pwm
.dev_attr
.attr
,
3575 &sensor_dev_attr_pwm1_auto_point6_pwm
.dev_attr
.attr
,
3576 &sensor_dev_attr_pwm1_auto_point7_pwm
.dev_attr
.attr
,
3577 &sensor_dev_attr_pwm1_auto_point8_pwm
.dev_attr
.attr
,
3579 &sensor_dev_attr_pwm2_enable
.dev_attr
.attr
,
3580 &sensor_dev_attr_pwm2_auto_point1_temp
.dev_attr
.attr
,
3581 &sensor_dev_attr_pwm2_auto_point2_temp
.dev_attr
.attr
,
3582 &sensor_dev_attr_pwm2_auto_point3_temp
.dev_attr
.attr
,
3583 &sensor_dev_attr_pwm2_auto_point4_temp
.dev_attr
.attr
,
3584 &sensor_dev_attr_pwm2_auto_point5_temp
.dev_attr
.attr
,
3585 &sensor_dev_attr_pwm2_auto_point6_temp
.dev_attr
.attr
,
3586 &sensor_dev_attr_pwm2_auto_point7_temp
.dev_attr
.attr
,
3587 &sensor_dev_attr_pwm2_auto_point8_temp
.dev_attr
.attr
,
3588 &sensor_dev_attr_pwm2_auto_point1_pwm
.dev_attr
.attr
,
3589 &sensor_dev_attr_pwm2_auto_point2_pwm
.dev_attr
.attr
,
3590 &sensor_dev_attr_pwm2_auto_point3_pwm
.dev_attr
.attr
,
3591 &sensor_dev_attr_pwm2_auto_point4_pwm
.dev_attr
.attr
,
3592 &sensor_dev_attr_pwm2_auto_point5_pwm
.dev_attr
.attr
,
3593 &sensor_dev_attr_pwm2_auto_point6_pwm
.dev_attr
.attr
,
3594 &sensor_dev_attr_pwm2_auto_point7_pwm
.dev_attr
.attr
,
3595 &sensor_dev_attr_pwm2_auto_point8_pwm
.dev_attr
.attr
,
3597 &sensor_dev_attr_pwm3_enable
.dev_attr
.attr
,
3598 &sensor_dev_attr_pwm3_auto_point1_temp
.dev_attr
.attr
,
3599 &sensor_dev_attr_pwm3_auto_point2_temp
.dev_attr
.attr
,
3600 &sensor_dev_attr_pwm3_auto_point3_temp
.dev_attr
.attr
,
3601 &sensor_dev_attr_pwm3_auto_point4_temp
.dev_attr
.attr
,
3602 &sensor_dev_attr_pwm3_auto_point5_temp
.dev_attr
.attr
,
3603 &sensor_dev_attr_pwm3_auto_point6_temp
.dev_attr
.attr
,
3604 &sensor_dev_attr_pwm3_auto_point7_temp
.dev_attr
.attr
,
3605 &sensor_dev_attr_pwm3_auto_point8_temp
.dev_attr
.attr
,
3606 &sensor_dev_attr_pwm3_auto_point1_pwm
.dev_attr
.attr
,
3607 &sensor_dev_attr_pwm3_auto_point2_pwm
.dev_attr
.attr
,
3608 &sensor_dev_attr_pwm3_auto_point3_pwm
.dev_attr
.attr
,
3609 &sensor_dev_attr_pwm3_auto_point4_pwm
.dev_attr
.attr
,
3610 &sensor_dev_attr_pwm3_auto_point5_pwm
.dev_attr
.attr
,
3611 &sensor_dev_attr_pwm3_auto_point6_pwm
.dev_attr
.attr
,
3612 &sensor_dev_attr_pwm3_auto_point7_pwm
.dev_attr
.attr
,
3613 &sensor_dev_attr_pwm3_auto_point8_pwm
.dev_attr
.attr
,
3617 static umode_t
asus_fan_curve_is_visible(struct kobject
*kobj
,
3618 struct attribute
*attr
, int idx
)
3620 struct device
*dev
= kobj_to_dev(kobj
);
3621 struct asus_wmi
*asus
= dev_get_drvdata(dev
->parent
);
3624 * Check the char instead of casting attr as there are two attr types
3625 * involved here (attr1 and attr2)
3627 if (asus
->cpu_fan_curve_available
&& attr
->name
[3] == '1')
3630 if (asus
->gpu_fan_curve_available
&& attr
->name
[3] == '2')
3633 if (asus
->mid_fan_curve_available
&& attr
->name
[3] == '3')
3639 static const struct attribute_group asus_fan_curve_attr_group
= {
3640 .is_visible
= asus_fan_curve_is_visible
,
3641 .attrs
= asus_fan_curve_attr
,
3643 __ATTRIBUTE_GROUPS(asus_fan_curve_attr
);
3646 * Must be initialised after throttle_thermal_policy_dev is set as
3647 * we check the status of throttle_thermal_policy_dev during init.
3649 static int asus_wmi_custom_fan_curve_init(struct asus_wmi
*asus
)
3651 struct device
*dev
= &asus
->platform_device
->dev
;
3652 struct device
*hwmon
;
3655 err
= fan_curve_check_present(asus
, &asus
->cpu_fan_curve_available
,
3656 ASUS_WMI_DEVID_CPU_FAN_CURVE
);
3658 pr_debug("%s, checked 0x%08x, failed: %d\n",
3659 __func__
, ASUS_WMI_DEVID_CPU_FAN_CURVE
, err
);
3663 err
= fan_curve_check_present(asus
, &asus
->gpu_fan_curve_available
,
3664 ASUS_WMI_DEVID_GPU_FAN_CURVE
);
3666 pr_debug("%s, checked 0x%08x, failed: %d\n",
3667 __func__
, ASUS_WMI_DEVID_GPU_FAN_CURVE
, err
);
3671 err
= fan_curve_check_present(asus
, &asus
->mid_fan_curve_available
,
3672 ASUS_WMI_DEVID_MID_FAN_CURVE
);
3674 pr_debug("%s, checked 0x%08x, failed: %d\n",
3675 __func__
, ASUS_WMI_DEVID_MID_FAN_CURVE
, err
);
3679 if (!asus
->cpu_fan_curve_available
3680 && !asus
->gpu_fan_curve_available
3681 && !asus
->mid_fan_curve_available
)
3684 hwmon
= devm_hwmon_device_register_with_groups(
3685 dev
, "asus_custom_fan_curve", asus
, asus_fan_curve_attr_groups
);
3687 if (IS_ERR(hwmon
)) {
3689 "Could not register asus_custom_fan_curve device\n");
3690 return PTR_ERR(hwmon
);
3696 /* Throttle thermal policy ****************************************************/
3697 static int throttle_thermal_policy_write(struct asus_wmi
*asus
)
3702 if (asus
->throttle_thermal_policy_dev
== ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO
) {
3703 switch (asus
->throttle_thermal_policy_mode
) {
3704 case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT
:
3705 value
= ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO
;
3707 case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST
:
3708 value
= ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO
;
3710 case ASUS_THROTTLE_THERMAL_POLICY_SILENT
:
3711 value
= ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO
;
3717 value
= asus
->throttle_thermal_policy_mode
;
3720 /* Some machines do not return an error code as a result, so we ignore it */
3721 err
= asus_wmi_set_devstate(asus
->throttle_thermal_policy_dev
, value
, NULL
);
3723 sysfs_notify(&asus
->platform_device
->dev
.kobj
, NULL
,
3724 "throttle_thermal_policy");
3727 pr_warn("Failed to set throttle thermal policy: %d\n", err
);
3731 /* Must set to disabled if mode is toggled */
3732 if (asus
->cpu_fan_curve_available
)
3733 asus
->custom_fan_curves
[FAN_CURVE_DEV_CPU
].enabled
= false;
3734 if (asus
->gpu_fan_curve_available
)
3735 asus
->custom_fan_curves
[FAN_CURVE_DEV_GPU
].enabled
= false;
3736 if (asus
->mid_fan_curve_available
)
3737 asus
->custom_fan_curves
[FAN_CURVE_DEV_MID
].enabled
= false;
3742 static int throttle_thermal_policy_set_default(struct asus_wmi
*asus
)
3744 if (!asus
->throttle_thermal_policy_dev
)
3747 asus
->throttle_thermal_policy_mode
= ASUS_THROTTLE_THERMAL_POLICY_DEFAULT
;
3748 return throttle_thermal_policy_write(asus
);
3751 static ssize_t
throttle_thermal_policy_show(struct device
*dev
,
3752 struct device_attribute
*attr
, char *buf
)
3754 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3755 u8 mode
= asus
->throttle_thermal_policy_mode
;
3757 return sysfs_emit(buf
, "%d\n", mode
);
3760 static ssize_t
throttle_thermal_policy_store(struct device
*dev
,
3761 struct device_attribute
*attr
,
3762 const char *buf
, size_t count
)
3764 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
3769 result
= kstrtou8(buf
, 10, &new_mode
);
3773 if (new_mode
> PLATFORM_PROFILE_MAX
)
3776 asus
->throttle_thermal_policy_mode
= new_mode
;
3777 err
= throttle_thermal_policy_write(asus
);
3782 * Ensure that platform_profile updates userspace with the change to ensure
3783 * that platform_profile and throttle_thermal_policy_mode are in sync.
3785 platform_profile_notify(asus
->ppdev
);
3791 * Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
3793 static DEVICE_ATTR_RW(throttle_thermal_policy
);
3795 /* Platform profile ***********************************************************/
3796 static int asus_wmi_platform_profile_get(struct device
*dev
,
3797 enum platform_profile_option
*profile
)
3799 struct asus_wmi
*asus
;
3802 asus
= dev_get_drvdata(dev
);
3803 tp
= asus
->throttle_thermal_policy_mode
;
3806 case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT
:
3807 *profile
= PLATFORM_PROFILE_BALANCED
;
3809 case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST
:
3810 *profile
= PLATFORM_PROFILE_PERFORMANCE
;
3812 case ASUS_THROTTLE_THERMAL_POLICY_SILENT
:
3813 *profile
= PLATFORM_PROFILE_QUIET
;
3822 static int asus_wmi_platform_profile_set(struct device
*dev
,
3823 enum platform_profile_option profile
)
3825 struct asus_wmi
*asus
;
3828 asus
= dev_get_drvdata(dev
);
3831 case PLATFORM_PROFILE_PERFORMANCE
:
3832 tp
= ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST
;
3834 case PLATFORM_PROFILE_BALANCED
:
3835 tp
= ASUS_THROTTLE_THERMAL_POLICY_DEFAULT
;
3837 case PLATFORM_PROFILE_QUIET
:
3838 tp
= ASUS_THROTTLE_THERMAL_POLICY_SILENT
;
3844 asus
->throttle_thermal_policy_mode
= tp
;
3845 return throttle_thermal_policy_write(asus
);
3848 static int asus_wmi_platform_profile_probe(void *drvdata
, unsigned long *choices
)
3850 set_bit(PLATFORM_PROFILE_QUIET
, choices
);
3851 set_bit(PLATFORM_PROFILE_BALANCED
, choices
);
3852 set_bit(PLATFORM_PROFILE_PERFORMANCE
, choices
);
3857 static const struct platform_profile_ops asus_wmi_platform_profile_ops
= {
3858 .probe
= asus_wmi_platform_profile_probe
,
3859 .profile_get
= asus_wmi_platform_profile_get
,
3860 .profile_set
= asus_wmi_platform_profile_set
,
3863 static int platform_profile_setup(struct asus_wmi
*asus
)
3865 struct device
*dev
= &asus
->platform_device
->dev
;
3869 * Not an error if a component platform_profile relies on is unavailable
3870 * so early return, skipping the setup of platform_profile.
3872 if (!asus
->throttle_thermal_policy_dev
)
3876 * We need to set the default thermal profile during probe or otherwise
3877 * the system will often remain in silent mode, causing low performance.
3879 err
= throttle_thermal_policy_set_default(asus
);
3881 pr_warn("Failed to set default thermal profile\n");
3885 dev_info(dev
, "Using throttle_thermal_policy for platform_profile support\n");
3887 asus
->ppdev
= devm_platform_profile_register(dev
, "asus-wmi", asus
,
3888 &asus_wmi_platform_profile_ops
);
3889 if (IS_ERR(asus
->ppdev
)) {
3890 dev_err(dev
, "Failed to register a platform_profile class device\n");
3891 return PTR_ERR(asus
->ppdev
);
3894 asus
->platform_profile_support
= true;
3898 /* Backlight ******************************************************************/
3900 static int read_backlight_power(struct asus_wmi
*asus
)
3904 if (asus
->driver
->quirks
->store_backlight_power
)
3905 ret
= !asus
->driver
->panel_power
;
3907 ret
= asus_wmi_get_devstate_simple(asus
,
3908 ASUS_WMI_DEVID_BACKLIGHT
);
3913 return ret
? BACKLIGHT_POWER_ON
: BACKLIGHT_POWER_OFF
;
3916 static int read_brightness_max(struct asus_wmi
*asus
)
3921 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_BRIGHTNESS
, &retval
);
3925 retval
= retval
& ASUS_WMI_DSTS_MAX_BRIGTH_MASK
;
3934 static int read_brightness(struct backlight_device
*bd
)
3936 struct asus_wmi
*asus
= bl_get_data(bd
);
3940 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_BRIGHTNESS
, &retval
);
3944 return retval
& ASUS_WMI_DSTS_BRIGHTNESS_MASK
;
3947 static u32
get_scalar_command(struct backlight_device
*bd
)
3949 struct asus_wmi
*asus
= bl_get_data(bd
);
3952 if ((asus
->driver
->brightness
< bd
->props
.brightness
) ||
3953 bd
->props
.brightness
== bd
->props
.max_brightness
)
3954 ctrl_param
= 0x00008001;
3955 else if ((asus
->driver
->brightness
> bd
->props
.brightness
) ||
3956 bd
->props
.brightness
== 0)
3957 ctrl_param
= 0x00008000;
3959 asus
->driver
->brightness
= bd
->props
.brightness
;
3964 static int update_bl_status(struct backlight_device
*bd
)
3966 struct asus_wmi
*asus
= bl_get_data(bd
);
3970 power
= read_backlight_power(asus
);
3971 if (power
!= -ENODEV
&& bd
->props
.power
!= power
) {
3972 ctrl_param
= !!(bd
->props
.power
== BACKLIGHT_POWER_ON
);
3973 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT
,
3975 if (asus
->driver
->quirks
->store_backlight_power
)
3976 asus
->driver
->panel_power
= bd
->props
.power
;
3978 /* When using scalar brightness, updating the brightness
3979 * will mess with the backlight power */
3980 if (asus
->driver
->quirks
->scalar_panel_brightness
)
3984 if (asus
->driver
->quirks
->scalar_panel_brightness
)
3985 ctrl_param
= get_scalar_command(bd
);
3987 ctrl_param
= bd
->props
.brightness
;
3989 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS
,
3995 static const struct backlight_ops asus_wmi_bl_ops
= {
3996 .get_brightness
= read_brightness
,
3997 .update_status
= update_bl_status
,
4000 static int asus_wmi_backlight_notify(struct asus_wmi
*asus
, int code
)
4002 struct backlight_device
*bd
= asus
->backlight_device
;
4003 int old
= bd
->props
.brightness
;
4006 if (code
>= NOTIFY_BRNUP_MIN
&& code
<= NOTIFY_BRNUP_MAX
)
4007 new = code
- NOTIFY_BRNUP_MIN
+ 1;
4008 else if (code
>= NOTIFY_BRNDOWN_MIN
&& code
<= NOTIFY_BRNDOWN_MAX
)
4009 new = code
- NOTIFY_BRNDOWN_MIN
;
4011 bd
->props
.brightness
= new;
4012 backlight_update_status(bd
);
4013 backlight_force_update(bd
, BACKLIGHT_UPDATE_HOTKEY
);
4018 static int asus_wmi_backlight_init(struct asus_wmi
*asus
)
4020 struct backlight_device
*bd
;
4021 struct backlight_properties props
;
4025 max
= read_brightness_max(asus
);
4029 power
= read_backlight_power(asus
);
4030 if (power
== -ENODEV
)
4031 power
= BACKLIGHT_POWER_ON
;
4035 memset(&props
, 0, sizeof(struct backlight_properties
));
4036 props
.type
= BACKLIGHT_PLATFORM
;
4037 props
.max_brightness
= max
;
4038 bd
= backlight_device_register(asus
->driver
->name
,
4039 &asus
->platform_device
->dev
, asus
,
4040 &asus_wmi_bl_ops
, &props
);
4042 pr_err("Could not register backlight device\n");
4046 asus
->backlight_device
= bd
;
4048 if (asus
->driver
->quirks
->store_backlight_power
)
4049 asus
->driver
->panel_power
= power
;
4051 bd
->props
.brightness
= read_brightness(bd
);
4052 bd
->props
.power
= power
;
4053 backlight_update_status(bd
);
4055 asus
->driver
->brightness
= bd
->props
.brightness
;
4060 static void asus_wmi_backlight_exit(struct asus_wmi
*asus
)
4062 backlight_device_unregister(asus
->backlight_device
);
4064 asus
->backlight_device
= NULL
;
4067 static int is_display_toggle(int code
)
4069 /* display toggle keys */
4070 if ((code
>= 0x61 && code
<= 0x67) ||
4071 (code
>= 0x8c && code
<= 0x93) ||
4072 (code
>= 0xa0 && code
<= 0xa7) ||
4073 (code
>= 0xd0 && code
<= 0xd5))
4079 /* Screenpad backlight *******************************************************/
4081 static int read_screenpad_backlight_power(struct asus_wmi
*asus
)
4085 ret
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_SCREENPAD_POWER
);
4089 return ret
? BACKLIGHT_POWER_ON
: BACKLIGHT_POWER_OFF
;
4092 static int read_screenpad_brightness(struct backlight_device
*bd
)
4094 struct asus_wmi
*asus
= bl_get_data(bd
);
4098 err
= read_screenpad_backlight_power(asus
);
4101 /* The device brightness can only be read if powered, so return stored */
4102 if (err
== BACKLIGHT_POWER_OFF
)
4103 return asus
->driver
->screenpad_brightness
- ASUS_SCREENPAD_BRIGHT_MIN
;
4105 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_SCREENPAD_LIGHT
, &retval
);
4109 return (retval
& ASUS_WMI_DSTS_BRIGHTNESS_MASK
) - ASUS_SCREENPAD_BRIGHT_MIN
;
4112 static int update_screenpad_bl_status(struct backlight_device
*bd
)
4114 struct asus_wmi
*asus
= bl_get_data(bd
);
4118 power
= read_screenpad_backlight_power(asus
);
4122 if (bd
->props
.power
!= power
) {
4123 if (power
!= BACKLIGHT_POWER_ON
) {
4124 /* Only brightness > 0 can power it back on */
4125 ctrl_param
= asus
->driver
->screenpad_brightness
- ASUS_SCREENPAD_BRIGHT_MIN
;
4126 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT
,
4129 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER
, 0, NULL
);
4131 } else if (power
== BACKLIGHT_POWER_ON
) {
4132 /* Only set brightness if powered on or we get invalid/unsync state */
4133 ctrl_param
= bd
->props
.brightness
+ ASUS_SCREENPAD_BRIGHT_MIN
;
4134 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT
, ctrl_param
, NULL
);
4137 /* Ensure brightness is stored to turn back on with */
4139 asus
->driver
->screenpad_brightness
= bd
->props
.brightness
+ ASUS_SCREENPAD_BRIGHT_MIN
;
4144 static const struct backlight_ops asus_screenpad_bl_ops
= {
4145 .get_brightness
= read_screenpad_brightness
,
4146 .update_status
= update_screenpad_bl_status
,
4147 .options
= BL_CORE_SUSPENDRESUME
,
4150 static int asus_screenpad_init(struct asus_wmi
*asus
)
4152 struct backlight_device
*bd
;
4153 struct backlight_properties props
;
4157 power
= read_screenpad_backlight_power(asus
);
4161 if (power
!= BACKLIGHT_POWER_OFF
) {
4162 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_SCREENPAD_LIGHT
, &brightness
);
4166 /* default to an acceptable min brightness on boot if too low */
4167 if (brightness
< ASUS_SCREENPAD_BRIGHT_MIN
)
4168 brightness
= ASUS_SCREENPAD_BRIGHT_DEFAULT
;
4170 memset(&props
, 0, sizeof(struct backlight_properties
));
4171 props
.type
= BACKLIGHT_RAW
; /* ensure this bd is last to be picked */
4172 props
.max_brightness
= ASUS_SCREENPAD_BRIGHT_MAX
- ASUS_SCREENPAD_BRIGHT_MIN
;
4173 bd
= backlight_device_register("asus_screenpad",
4174 &asus
->platform_device
->dev
, asus
,
4175 &asus_screenpad_bl_ops
, &props
);
4177 pr_err("Could not register backlight device\n");
4181 asus
->screenpad_backlight_device
= bd
;
4182 asus
->driver
->screenpad_brightness
= brightness
;
4183 bd
->props
.brightness
= brightness
- ASUS_SCREENPAD_BRIGHT_MIN
;
4184 bd
->props
.power
= power
;
4185 backlight_update_status(bd
);
4190 static void asus_screenpad_exit(struct asus_wmi
*asus
)
4192 backlight_device_unregister(asus
->screenpad_backlight_device
);
4194 asus
->screenpad_backlight_device
= NULL
;
4197 /* Fn-lock ********************************************************************/
4199 static bool asus_wmi_has_fnlock_key(struct asus_wmi
*asus
)
4203 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FNLOCK
, &result
);
4205 return (result
& ASUS_WMI_DSTS_PRESENCE_BIT
) &&
4206 !(result
& ASUS_WMI_FNLOCK_BIOS_DISABLED
);
4209 static void asus_wmi_fnlock_update(struct asus_wmi
*asus
)
4211 int mode
= asus
->fnlock_locked
;
4213 asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK
, mode
, NULL
);
4216 /* WMI events *****************************************************************/
4218 static int asus_wmi_get_event_code(union acpi_object
*obj
)
4222 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
4223 code
= (int)(obj
->integer
.value
& WMI_EVENT_MASK
);
4230 static void asus_wmi_handle_event_code(int code
, struct asus_wmi
*asus
)
4232 unsigned int key_value
= 1;
4233 bool autorelease
= 1;
4235 if (asus
->driver
->key_filter
) {
4236 asus
->driver
->key_filter(asus
->driver
, &code
, &key_value
,
4238 if (code
== ASUS_WMI_KEY_IGNORE
)
4242 if (acpi_video_get_backlight_type() == acpi_backlight_vendor
&&
4243 code
>= NOTIFY_BRNUP_MIN
&& code
<= NOTIFY_BRNDOWN_MAX
) {
4244 asus_wmi_backlight_notify(asus
, code
);
4248 if (code
== NOTIFY_KBD_BRTUP
) {
4249 kbd_led_set_by_kbd(asus
, asus
->kbd_led_wk
+ 1);
4252 if (code
== NOTIFY_KBD_BRTDWN
) {
4253 kbd_led_set_by_kbd(asus
, asus
->kbd_led_wk
- 1);
4256 if (code
== NOTIFY_KBD_BRTTOGGLE
) {
4257 if (asus
->kbd_led_wk
== asus
->kbd_led
.max_brightness
)
4258 kbd_led_set_by_kbd(asus
, 0);
4260 kbd_led_set_by_kbd(asus
, asus
->kbd_led_wk
+ 1);
4264 if (code
== NOTIFY_FNLOCK_TOGGLE
) {
4265 asus
->fnlock_locked
= !asus
->fnlock_locked
;
4266 asus_wmi_fnlock_update(asus
);
4270 if (code
== asus
->tablet_switch_event_code
) {
4271 asus_wmi_tablet_mode_get_state(asus
);
4275 if (code
== NOTIFY_KBD_FBM
|| code
== NOTIFY_KBD_TTP
) {
4276 if (asus
->fan_boost_mode_available
)
4277 fan_boost_mode_switch_next(asus
);
4278 if (asus
->throttle_thermal_policy_dev
)
4279 platform_profile_cycle();
4284 if (is_display_toggle(code
) && asus
->driver
->quirks
->no_display_toggle
)
4287 if (!sparse_keymap_report_event(asus
->inputdev
, code
,
4288 key_value
, autorelease
))
4289 pr_info("Unknown key code 0x%x\n", code
);
4292 static void asus_wmi_notify(union acpi_object
*obj
, void *context
)
4294 struct asus_wmi
*asus
= context
;
4295 int code
= asus_wmi_get_event_code(obj
);
4298 pr_warn("Failed to get notify code: %d\n", code
);
4302 asus_wmi_handle_event_code(code
, asus
);
4305 /* Sysfs **********************************************************************/
4307 static ssize_t
store_sys_wmi(struct asus_wmi
*asus
, int devid
,
4308 const char *buf
, size_t count
)
4313 value
= asus_wmi_get_devstate_simple(asus
, devid
);
4317 err
= kstrtoint(buf
, 0, &value
);
4321 err
= asus_wmi_set_devstate(devid
, value
, &retval
);
4328 static ssize_t
show_sys_wmi(struct asus_wmi
*asus
, int devid
, char *buf
)
4330 int value
= asus_wmi_get_devstate_simple(asus
, devid
);
4335 return sysfs_emit(buf
, "%d\n", value
);
4338 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
4339 static ssize_t show_##_name(struct device *dev, \
4340 struct device_attribute *attr, \
4343 struct asus_wmi *asus = dev_get_drvdata(dev); \
4345 return show_sys_wmi(asus, _cm, buf); \
4347 static ssize_t store_##_name(struct device *dev, \
4348 struct device_attribute *attr, \
4349 const char *buf, size_t count) \
4351 struct asus_wmi *asus = dev_get_drvdata(dev); \
4353 return store_sys_wmi(asus, _cm, buf, count); \
4355 static struct device_attribute dev_attr_##_name = { \
4357 .name = __stringify(_name), \
4359 .show = show_##_name, \
4360 .store = store_##_name, \
4363 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad
, 0644, ASUS_WMI_DEVID_TOUCHPAD
);
4364 ASUS_WMI_CREATE_DEVICE_ATTR(camera
, 0644, ASUS_WMI_DEVID_CAMERA
);
4365 ASUS_WMI_CREATE_DEVICE_ATTR(cardr
, 0644, ASUS_WMI_DEVID_CARDREADER
);
4366 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume
, 0644, ASUS_WMI_DEVID_LID_RESUME
);
4367 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable
, 0644, ASUS_WMI_DEVID_ALS_ENABLE
);
4369 static ssize_t
cpufv_store(struct device
*dev
, struct device_attribute
*attr
,
4370 const char *buf
, size_t count
)
4374 rv
= kstrtoint(buf
, 0, &value
);
4378 if (value
< 0 || value
> 2)
4381 rv
= asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS
, value
, 0, NULL
);
4388 static DEVICE_ATTR_WO(cpufv
);
4390 static struct attribute
*platform_attributes
[] = {
4391 &dev_attr_cpufv
.attr
,
4392 &dev_attr_camera
.attr
,
4393 &dev_attr_cardr
.attr
,
4394 &dev_attr_touchpad
.attr
,
4395 &dev_attr_charge_mode
.attr
,
4396 &dev_attr_egpu_enable
.attr
,
4397 &dev_attr_egpu_connected
.attr
,
4398 &dev_attr_dgpu_disable
.attr
,
4399 &dev_attr_gpu_mux_mode
.attr
,
4400 &dev_attr_lid_resume
.attr
,
4401 &dev_attr_als_enable
.attr
,
4402 &dev_attr_fan_boost_mode
.attr
,
4403 &dev_attr_throttle_thermal_policy
.attr
,
4404 &dev_attr_ppt_pl2_sppt
.attr
,
4405 &dev_attr_ppt_pl1_spl
.attr
,
4406 &dev_attr_ppt_fppt
.attr
,
4407 &dev_attr_ppt_apu_sppt
.attr
,
4408 &dev_attr_ppt_platform_sppt
.attr
,
4409 &dev_attr_nv_dynamic_boost
.attr
,
4410 &dev_attr_nv_temp_target
.attr
,
4411 &dev_attr_mcu_powersave
.attr
,
4412 &dev_attr_boot_sound
.attr
,
4413 &dev_attr_panel_od
.attr
,
4414 &dev_attr_mini_led_mode
.attr
,
4415 &dev_attr_available_mini_led_mode
.attr
,
4419 static umode_t
asus_sysfs_is_visible(struct kobject
*kobj
,
4420 struct attribute
*attr
, int idx
)
4422 struct device
*dev
= kobj_to_dev(kobj
);
4423 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
4427 if (attr
== &dev_attr_camera
.attr
)
4428 devid
= ASUS_WMI_DEVID_CAMERA
;
4429 else if (attr
== &dev_attr_cardr
.attr
)
4430 devid
= ASUS_WMI_DEVID_CARDREADER
;
4431 else if (attr
== &dev_attr_touchpad
.attr
)
4432 devid
= ASUS_WMI_DEVID_TOUCHPAD
;
4433 else if (attr
== &dev_attr_lid_resume
.attr
)
4434 devid
= ASUS_WMI_DEVID_LID_RESUME
;
4435 else if (attr
== &dev_attr_als_enable
.attr
)
4436 devid
= ASUS_WMI_DEVID_ALS_ENABLE
;
4437 else if (attr
== &dev_attr_charge_mode
.attr
)
4438 devid
= ASUS_WMI_DEVID_CHARGE_MODE
;
4439 else if (attr
== &dev_attr_egpu_enable
.attr
)
4440 ok
= asus
->egpu_enable_available
;
4441 else if (attr
== &dev_attr_egpu_connected
.attr
)
4442 devid
= ASUS_WMI_DEVID_EGPU_CONNECTED
;
4443 else if (attr
== &dev_attr_dgpu_disable
.attr
)
4444 ok
= asus
->dgpu_disable_available
;
4445 else if (attr
== &dev_attr_gpu_mux_mode
.attr
)
4446 ok
= asus
->gpu_mux_dev
!= 0;
4447 else if (attr
== &dev_attr_fan_boost_mode
.attr
)
4448 ok
= asus
->fan_boost_mode_available
;
4449 else if (attr
== &dev_attr_throttle_thermal_policy
.attr
)
4450 ok
= asus
->throttle_thermal_policy_dev
!= 0;
4451 else if (attr
== &dev_attr_ppt_pl2_sppt
.attr
)
4452 devid
= ASUS_WMI_DEVID_PPT_PL2_SPPT
;
4453 else if (attr
== &dev_attr_ppt_pl1_spl
.attr
)
4454 devid
= ASUS_WMI_DEVID_PPT_PL1_SPL
;
4455 else if (attr
== &dev_attr_ppt_fppt
.attr
)
4456 devid
= ASUS_WMI_DEVID_PPT_FPPT
;
4457 else if (attr
== &dev_attr_ppt_apu_sppt
.attr
)
4458 devid
= ASUS_WMI_DEVID_PPT_APU_SPPT
;
4459 else if (attr
== &dev_attr_ppt_platform_sppt
.attr
)
4460 devid
= ASUS_WMI_DEVID_PPT_PLAT_SPPT
;
4461 else if (attr
== &dev_attr_nv_dynamic_boost
.attr
)
4462 devid
= ASUS_WMI_DEVID_NV_DYN_BOOST
;
4463 else if (attr
== &dev_attr_nv_temp_target
.attr
)
4464 devid
= ASUS_WMI_DEVID_NV_THERM_TARGET
;
4465 else if (attr
== &dev_attr_mcu_powersave
.attr
)
4466 devid
= ASUS_WMI_DEVID_MCU_POWERSAVE
;
4467 else if (attr
== &dev_attr_boot_sound
.attr
)
4468 devid
= ASUS_WMI_DEVID_BOOT_SOUND
;
4469 else if (attr
== &dev_attr_panel_od
.attr
)
4470 devid
= ASUS_WMI_DEVID_PANEL_OD
;
4471 else if (attr
== &dev_attr_mini_led_mode
.attr
)
4472 ok
= asus
->mini_led_dev_id
!= 0;
4473 else if (attr
== &dev_attr_available_mini_led_mode
.attr
)
4474 ok
= asus
->mini_led_dev_id
!= 0;
4477 ok
= !(asus_wmi_get_devstate_simple(asus
, devid
) < 0);
4478 pr_debug("%s called 0x%08x, ok: %x\n", __func__
, devid
, ok
);
4481 return ok
? attr
->mode
: 0;
4484 static const struct attribute_group platform_attribute_group
= {
4485 .is_visible
= asus_sysfs_is_visible
,
4486 .attrs
= platform_attributes
4489 static void asus_wmi_sysfs_exit(struct platform_device
*device
)
4491 sysfs_remove_group(&device
->dev
.kobj
, &platform_attribute_group
);
4494 static int asus_wmi_sysfs_init(struct platform_device
*device
)
4496 return sysfs_create_group(&device
->dev
.kobj
, &platform_attribute_group
);
4499 /* Platform device ************************************************************/
4501 static int asus_wmi_platform_init(struct asus_wmi
*asus
)
4503 struct device
*dev
= &asus
->platform_device
->dev
;
4507 /* INIT enable hotkeys on some models */
4508 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT
, 0, 0, &rv
))
4509 pr_info("Initialization: %#x\n", rv
);
4511 /* We don't know yet what to do with this version... */
4512 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC
, 0, 0x9, &rv
)) {
4513 pr_info("BIOS WMI version: %d.%d\n", rv
>> 16, rv
& 0xFF);
4518 * The SFUN method probably allows the original driver to get the list
4519 * of features supported by a given model. For now, 0x0100 or 0x0800
4520 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
4521 * The significance of others is yet to be found.
4523 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN
, 0, 0, &rv
)) {
4524 pr_info("SFUN value: %#x\n", rv
);
4529 * Eee PC and Notebooks seems to have different method_id for DSTS,
4530 * but it may also be related to the BIOS's SPEC.
4531 * Note, on most Eeepc, there is no way to check if a method exist
4532 * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
4533 * but once again, SPEC may probably be used for that kind of things.
4535 * Additionally at least TUF Gaming series laptops return nothing for
4536 * unknown methods, so the detection in this way is not possible.
4538 * There is strong indication that only ACPI WMI devices that have _UID
4539 * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
4541 wmi_uid
= wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID
);
4545 if (!strcmp(wmi_uid
, ASUS_ACPI_UID_ASUSWMI
)) {
4546 dev_info(dev
, "Detected ASUSWMI, use DCTS\n");
4547 asus
->dsts_id
= ASUS_WMI_METHODID_DCTS
;
4549 dev_info(dev
, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid
);
4550 asus
->dsts_id
= ASUS_WMI_METHODID_DSTS
;
4553 /* CWAP allow to define the behavior of the Fn+F2 key,
4554 * this method doesn't seems to be present on Eee PCs */
4555 if (asus
->driver
->quirks
->wapf
>= 0)
4556 asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP
,
4557 asus
->driver
->quirks
->wapf
, NULL
);
4562 /* debugfs ********************************************************************/
4564 struct asus_wmi_debugfs_node
{
4565 struct asus_wmi
*asus
;
4567 int (*show
) (struct seq_file
*m
, void *data
);
4570 static int show_dsts(struct seq_file
*m
, void *data
)
4572 struct asus_wmi
*asus
= m
->private;
4576 err
= asus_wmi_get_devstate(asus
, asus
->debug
.dev_id
, &retval
);
4580 seq_printf(m
, "DSTS(%#x) = %#x\n", asus
->debug
.dev_id
, retval
);
4585 static int show_devs(struct seq_file
*m
, void *data
)
4587 struct asus_wmi
*asus
= m
->private;
4591 err
= asus_wmi_set_devstate(asus
->debug
.dev_id
, asus
->debug
.ctrl_param
,
4596 seq_printf(m
, "DEVS(%#x, %#x) = %#x\n", asus
->debug
.dev_id
,
4597 asus
->debug
.ctrl_param
, retval
);
4602 static int show_call(struct seq_file
*m
, void *data
)
4604 struct asus_wmi
*asus
= m
->private;
4605 struct bios_args args
= {
4606 .arg0
= asus
->debug
.dev_id
,
4607 .arg1
= asus
->debug
.ctrl_param
,
4609 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
4610 struct acpi_buffer output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
4611 union acpi_object
*obj
;
4614 status
= wmi_evaluate_method(ASUS_WMI_MGMT_GUID
,
4615 0, asus
->debug
.method_id
,
4618 if (ACPI_FAILURE(status
))
4621 obj
= (union acpi_object
*)output
.pointer
;
4622 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
4623 seq_printf(m
, "%#x(%#x, %#x) = %#x\n", asus
->debug
.method_id
,
4624 asus
->debug
.dev_id
, asus
->debug
.ctrl_param
,
4625 (u32
) obj
->integer
.value
);
4627 seq_printf(m
, "%#x(%#x, %#x) = t:%d\n", asus
->debug
.method_id
,
4628 asus
->debug
.dev_id
, asus
->debug
.ctrl_param
,
4629 obj
? obj
->type
: -1);
4636 static struct asus_wmi_debugfs_node asus_wmi_debug_files
[] = {
4637 {NULL
, "devs", show_devs
},
4638 {NULL
, "dsts", show_dsts
},
4639 {NULL
, "call", show_call
},
4642 static int asus_wmi_debugfs_open(struct inode
*inode
, struct file
*file
)
4644 struct asus_wmi_debugfs_node
*node
= inode
->i_private
;
4646 return single_open(file
, node
->show
, node
->asus
);
4649 static const struct file_operations asus_wmi_debugfs_io_ops
= {
4650 .owner
= THIS_MODULE
,
4651 .open
= asus_wmi_debugfs_open
,
4653 .llseek
= seq_lseek
,
4654 .release
= single_release
,
4657 static void asus_wmi_debugfs_exit(struct asus_wmi
*asus
)
4659 debugfs_remove_recursive(asus
->debug
.root
);
4662 static void asus_wmi_debugfs_init(struct asus_wmi
*asus
)
4666 asus
->debug
.root
= debugfs_create_dir(asus
->driver
->name
, NULL
);
4668 debugfs_create_x32("method_id", S_IRUGO
| S_IWUSR
, asus
->debug
.root
,
4669 &asus
->debug
.method_id
);
4671 debugfs_create_x32("dev_id", S_IRUGO
| S_IWUSR
, asus
->debug
.root
,
4672 &asus
->debug
.dev_id
);
4674 debugfs_create_x32("ctrl_param", S_IRUGO
| S_IWUSR
, asus
->debug
.root
,
4675 &asus
->debug
.ctrl_param
);
4677 for (i
= 0; i
< ARRAY_SIZE(asus_wmi_debug_files
); i
++) {
4678 struct asus_wmi_debugfs_node
*node
= &asus_wmi_debug_files
[i
];
4681 debugfs_create_file(node
->name
, S_IFREG
| S_IRUGO
,
4682 asus
->debug
.root
, node
,
4683 &asus_wmi_debugfs_io_ops
);
4687 /* Init / exit ****************************************************************/
4689 static int asus_wmi_add(struct platform_device
*pdev
)
4691 struct platform_driver
*pdrv
= to_platform_driver(pdev
->dev
.driver
);
4692 struct asus_wmi_driver
*wdrv
= to_asus_wmi_driver(pdrv
);
4693 struct asus_wmi
*asus
;
4698 asus
= kzalloc(sizeof(struct asus_wmi
), GFP_KERNEL
);
4702 asus
->driver
= wdrv
;
4703 asus
->platform_device
= pdev
;
4704 wdrv
->platform_device
= pdev
;
4705 platform_set_drvdata(asus
->platform_device
, asus
);
4707 if (wdrv
->detect_quirks
)
4708 wdrv
->detect_quirks(asus
->driver
);
4710 err
= asus_wmi_platform_init(asus
);
4714 /* ensure defaults for tunables */
4715 asus
->ppt_pl2_sppt
= 5;
4716 asus
->ppt_pl1_spl
= 5;
4717 asus
->ppt_apu_sppt
= 5;
4718 asus
->ppt_platform_sppt
= 5;
4720 asus
->nv_dynamic_boost
= 5;
4721 asus
->nv_temp_target
= 75;
4723 asus
->egpu_enable_available
= asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_EGPU
);
4724 asus
->dgpu_disable_available
= asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_DGPU
);
4725 asus
->kbd_rgb_state_available
= asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_TUF_RGB_STATE
);
4726 asus
->ally_mcu_usb_switch
= acpi_has_method(NULL
, ASUS_USB0_PWR_EC0_CSEE
)
4727 && dmi_check_system(asus_ally_mcu_quirk
);
4729 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_MINI_LED_MODE
))
4730 asus
->mini_led_dev_id
= ASUS_WMI_DEVID_MINI_LED_MODE
;
4731 else if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_MINI_LED_MODE2
))
4732 asus
->mini_led_dev_id
= ASUS_WMI_DEVID_MINI_LED_MODE2
;
4734 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_GPU_MUX
))
4735 asus
->gpu_mux_dev
= ASUS_WMI_DEVID_GPU_MUX
;
4736 else if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_GPU_MUX_VIVO
))
4737 asus
->gpu_mux_dev
= ASUS_WMI_DEVID_GPU_MUX_VIVO
;
4739 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_TUF_RGB_MODE
))
4740 asus
->kbd_rgb_dev
= ASUS_WMI_DEVID_TUF_RGB_MODE
;
4741 else if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_TUF_RGB_MODE2
))
4742 asus
->kbd_rgb_dev
= ASUS_WMI_DEVID_TUF_RGB_MODE2
;
4744 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY
))
4745 asus
->throttle_thermal_policy_dev
= ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY
;
4746 else if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO
))
4747 asus
->throttle_thermal_policy_dev
= ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO
;
4749 err
= fan_boost_mode_check_present(asus
);
4751 goto fail_fan_boost_mode
;
4753 err
= platform_profile_setup(asus
);
4755 goto fail_platform_profile_setup
;
4757 err
= asus_wmi_sysfs_init(asus
->platform_device
);
4761 err
= asus_wmi_input_init(asus
);
4765 err
= asus_wmi_fan_init(asus
); /* probably no problems on error */
4767 err
= asus_wmi_hwmon_init(asus
);
4771 err
= asus_wmi_custom_fan_curve_init(asus
);
4773 goto fail_custom_fan_curve
;
4775 err
= asus_wmi_led_init(asus
);
4779 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_WLAN
, &result
);
4780 if (result
& (ASUS_WMI_DSTS_PRESENCE_BIT
| ASUS_WMI_DSTS_USER_BIT
))
4781 asus
->driver
->wlan_ctrl_by_user
= 1;
4783 if (!(asus
->driver
->wlan_ctrl_by_user
&& ashs_present())) {
4784 err
= asus_wmi_rfkill_init(asus
);
4789 if (asus
->driver
->quirks
->wmi_force_als_set
)
4792 if (asus
->driver
->quirks
->xusb2pr
)
4793 asus_wmi_set_xusb2pr(asus
);
4795 if (acpi_video_get_backlight_type() == acpi_backlight_vendor
) {
4796 err
= asus_wmi_backlight_init(asus
);
4797 if (err
&& err
!= -ENODEV
)
4798 goto fail_backlight
;
4799 } else if (asus
->driver
->quirks
->wmi_backlight_set_devstate
)
4800 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT
, 2, NULL
);
4802 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_SCREENPAD_LIGHT
)) {
4803 err
= asus_screenpad_init(asus
);
4804 if (err
&& err
!= -ENODEV
)
4805 goto fail_screenpad
;
4808 if (asus_wmi_has_fnlock_key(asus
)) {
4809 asus
->fnlock_locked
= fnlock_default
;
4810 asus_wmi_fnlock_update(asus
);
4813 status
= wmi_install_notify_handler(asus
->driver
->event_guid
,
4814 asus_wmi_notify
, asus
);
4815 if (ACPI_FAILURE(status
)) {
4816 pr_err("Unable to register notify handler - %d\n", status
);
4818 goto fail_wmi_handler
;
4821 if (asus
->driver
->i8042_filter
) {
4822 err
= i8042_install_filter(asus
->driver
->i8042_filter
, NULL
);
4824 pr_warn("Unable to install key filter - %d\n", err
);
4827 asus_wmi_battery_init(asus
);
4829 asus_wmi_debugfs_init(asus
);
4834 asus_wmi_backlight_exit(asus
);
4836 asus_wmi_rfkill_exit(asus
);
4838 asus_screenpad_exit(asus
);
4840 asus_wmi_led_exit(asus
);
4843 asus_wmi_input_exit(asus
);
4845 asus_wmi_sysfs_exit(asus
->platform_device
);
4847 fail_custom_fan_curve
:
4848 fail_platform_profile_setup
:
4849 fail_fan_boost_mode
:
4855 static void asus_wmi_remove(struct platform_device
*device
)
4857 struct asus_wmi
*asus
;
4859 asus
= platform_get_drvdata(device
);
4860 if (asus
->driver
->i8042_filter
)
4861 i8042_remove_filter(asus
->driver
->i8042_filter
);
4862 wmi_remove_notify_handler(asus
->driver
->event_guid
);
4863 asus_wmi_backlight_exit(asus
);
4864 asus_screenpad_exit(asus
);
4865 asus_wmi_input_exit(asus
);
4866 asus_wmi_led_exit(asus
);
4867 asus_wmi_rfkill_exit(asus
);
4868 asus_wmi_debugfs_exit(asus
);
4869 asus_wmi_sysfs_exit(asus
->platform_device
);
4870 asus_fan_set_auto(asus
);
4871 throttle_thermal_policy_set_default(asus
);
4872 asus_wmi_battery_exit(asus
);
4877 /* Platform driver - hibernate/resume callbacks *******************************/
4879 static int asus_hotk_thaw(struct device
*device
)
4881 struct asus_wmi
*asus
= dev_get_drvdata(device
);
4883 if (asus
->wlan
.rfkill
) {
4887 * Work around bios bug - acpi _PTS turns off the wireless led
4888 * during suspend. Normally it restores it on resume, but
4889 * we should kick it ourselves in case hibernation is aborted.
4891 wlan
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WLAN
);
4892 asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN
, wlan
, NULL
);
4898 static int asus_hotk_resume(struct device
*device
)
4900 struct asus_wmi
*asus
= dev_get_drvdata(device
);
4902 if (!IS_ERR_OR_NULL(asus
->kbd_led
.dev
))
4903 kbd_led_update(asus
);
4905 if (asus_wmi_has_fnlock_key(asus
))
4906 asus_wmi_fnlock_update(asus
);
4908 asus_wmi_tablet_mode_get_state(asus
);
4913 static int asus_hotk_resume_early(struct device
*device
)
4915 struct asus_wmi
*asus
= dev_get_drvdata(device
);
4917 if (asus
->ally_mcu_usb_switch
) {
4918 /* sleep required to prevent USB0 being yanked then reappearing rapidly */
4919 if (ACPI_FAILURE(acpi_execute_simple_method(NULL
, ASUS_USB0_PWR_EC0_CSEE
, 0xB8)))
4920 dev_err(device
, "ROG Ally MCU failed to connect USB dev\n");
4922 msleep(ASUS_USB0_PWR_EC0_CSEE_WAIT
);
4927 static int asus_hotk_prepare(struct device
*device
)
4929 struct asus_wmi
*asus
= dev_get_drvdata(device
);
4931 if (asus
->ally_mcu_usb_switch
) {
4932 /* sleep required to ensure USB0 is disabled before sleep continues */
4933 if (ACPI_FAILURE(acpi_execute_simple_method(NULL
, ASUS_USB0_PWR_EC0_CSEE
, 0xB7)))
4934 dev_err(device
, "ROG Ally MCU failed to disconnect USB dev\n");
4936 msleep(ASUS_USB0_PWR_EC0_CSEE_WAIT
);
4941 static int asus_hotk_restore(struct device
*device
)
4943 struct asus_wmi
*asus
= dev_get_drvdata(device
);
4946 /* Refresh both wlan rfkill state and pci hotplug */
4947 if (asus
->wlan
.rfkill
)
4948 asus_rfkill_hotplug(asus
);
4950 if (asus
->bluetooth
.rfkill
) {
4951 bl
= !asus_wmi_get_devstate_simple(asus
,
4952 ASUS_WMI_DEVID_BLUETOOTH
);
4953 rfkill_set_sw_state(asus
->bluetooth
.rfkill
, bl
);
4955 if (asus
->wimax
.rfkill
) {
4956 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WIMAX
);
4957 rfkill_set_sw_state(asus
->wimax
.rfkill
, bl
);
4959 if (asus
->wwan3g
.rfkill
) {
4960 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WWAN3G
);
4961 rfkill_set_sw_state(asus
->wwan3g
.rfkill
, bl
);
4963 if (asus
->gps
.rfkill
) {
4964 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_GPS
);
4965 rfkill_set_sw_state(asus
->gps
.rfkill
, bl
);
4967 if (asus
->uwb
.rfkill
) {
4968 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_UWB
);
4969 rfkill_set_sw_state(asus
->uwb
.rfkill
, bl
);
4971 if (!IS_ERR_OR_NULL(asus
->kbd_led
.dev
))
4972 kbd_led_update(asus
);
4974 if (asus_wmi_has_fnlock_key(asus
))
4975 asus_wmi_fnlock_update(asus
);
4977 asus_wmi_tablet_mode_get_state(asus
);
4981 static const struct dev_pm_ops asus_pm_ops
= {
4982 .thaw
= asus_hotk_thaw
,
4983 .restore
= asus_hotk_restore
,
4984 .resume
= asus_hotk_resume
,
4985 .resume_early
= asus_hotk_resume_early
,
4986 .prepare
= asus_hotk_prepare
,
4989 /* Registration ***************************************************************/
4991 static int asus_wmi_probe(struct platform_device
*pdev
)
4993 struct platform_driver
*pdrv
= to_platform_driver(pdev
->dev
.driver
);
4994 struct asus_wmi_driver
*wdrv
= to_asus_wmi_driver(pdrv
);
4997 if (!wmi_has_guid(ASUS_WMI_MGMT_GUID
)) {
4998 pr_warn("ASUS Management GUID not found\n");
5002 if (wdrv
->event_guid
&& !wmi_has_guid(wdrv
->event_guid
)) {
5003 pr_warn("ASUS Event GUID not found\n");
5008 ret
= wdrv
->probe(pdev
);
5013 return asus_wmi_add(pdev
);
5018 int __init_or_module
asus_wmi_register_driver(struct asus_wmi_driver
*driver
)
5020 struct platform_driver
*platform_driver
;
5021 struct platform_device
*platform_device
;
5026 platform_driver
= &driver
->platform_driver
;
5027 platform_driver
->remove
= asus_wmi_remove
;
5028 platform_driver
->driver
.owner
= driver
->owner
;
5029 platform_driver
->driver
.name
= driver
->name
;
5030 platform_driver
->driver
.pm
= &asus_pm_ops
;
5032 platform_device
= platform_create_bundle(platform_driver
,
5035 if (IS_ERR(platform_device
))
5036 return PTR_ERR(platform_device
);
5041 EXPORT_SYMBOL_GPL(asus_wmi_register_driver
);
5043 void asus_wmi_unregister_driver(struct asus_wmi_driver
*driver
)
5045 platform_device_unregister(driver
->platform_device
);
5046 platform_driver_unregister(&driver
->platform_driver
);
5049 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver
);
5051 static int __init
asus_wmi_init(void)
5053 pr_info("ASUS WMI generic driver loaded\n");
5057 static void __exit
asus_wmi_exit(void)
5059 pr_info("ASUS WMI generic driver unloaded\n");
5062 module_init(asus_wmi_init
);
5063 module_exit(asus_wmi_exit
);