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/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/types.h>
20 #include <linux/slab.h>
21 #include <linux/input.h>
22 #include <linux/input/sparse-keymap.h>
24 #include <linux/backlight.h>
25 #include <linux/leds.h>
26 #include <linux/rfkill.h>
27 #include <linux/pci.h>
28 #include <linux/pci_hotplug.h>
29 #include <linux/power_supply.h>
30 #include <linux/hwmon.h>
31 #include <linux/hwmon-sysfs.h>
32 #include <linux/debugfs.h>
33 #include <linux/seq_file.h>
34 #include <linux/platform_data/x86/asus-wmi.h>
35 #include <linux/platform_device.h>
36 #include <linux/acpi.h>
37 #include <linux/dmi.h>
38 #include <linux/units.h>
40 #include <acpi/battery.h>
41 #include <acpi/video.h>
45 MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>, "
46 "Yong Wang <yong.y.wang@intel.com>");
47 MODULE_DESCRIPTION("Asus Generic WMI Driver");
48 MODULE_LICENSE("GPL");
50 #define to_asus_wmi_driver(pdrv) \
51 (container_of((pdrv), struct asus_wmi_driver, platform_driver))
53 #define ASUS_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66"
55 #define NOTIFY_BRNUP_MIN 0x11
56 #define NOTIFY_BRNUP_MAX 0x1f
57 #define NOTIFY_BRNDOWN_MIN 0x20
58 #define NOTIFY_BRNDOWN_MAX 0x2e
59 #define NOTIFY_FNLOCK_TOGGLE 0x4e
60 #define NOTIFY_KBD_BRTUP 0xc4
61 #define NOTIFY_KBD_BRTDWN 0xc5
62 #define NOTIFY_KBD_BRTTOGGLE 0xc7
63 #define NOTIFY_KBD_FBM 0x99
64 #define NOTIFY_KBD_TTP 0xae
66 #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0)
68 #define ASUS_FAN_DESC "cpu_fan"
69 #define ASUS_FAN_MFUN 0x13
70 #define ASUS_FAN_SFUN_READ 0x06
71 #define ASUS_FAN_SFUN_WRITE 0x07
73 /* Based on standard hwmon pwmX_enable values */
74 #define ASUS_FAN_CTRL_FULLSPEED 0
75 #define ASUS_FAN_CTRL_MANUAL 1
76 #define ASUS_FAN_CTRL_AUTO 2
78 #define ASUS_FAN_BOOST_MODE_NORMAL 0
79 #define ASUS_FAN_BOOST_MODE_OVERBOOST 1
80 #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK 0x01
81 #define ASUS_FAN_BOOST_MODE_SILENT 2
82 #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02
83 #define ASUS_FAN_BOOST_MODES_MASK 0x03
85 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0
86 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1
87 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2
89 #define USB_INTEL_XUSB2PR 0xD0
90 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
92 #define ASUS_ACPI_UID_ASUSWMI "ASUSWMI"
93 #define ASUS_ACPI_UID_ATK "ATK"
95 #define WMI_EVENT_QUEUE_SIZE 0x10
96 #define WMI_EVENT_QUEUE_END 0x1
97 #define WMI_EVENT_MASK 0xFFFF
98 /* The WMI hotkey event value is always the same. */
99 #define WMI_EVENT_VALUE_ATK 0xFF
101 #define WMI_EVENT_MASK 0xFFFF
103 static const char * const ashs_ids
[] = { "ATK4001", "ATK4002", NULL
};
105 static bool ashs_present(void)
108 while (ashs_ids
[i
]) {
109 if (acpi_dev_found(ashs_ids
[i
++]))
118 u32 arg2
; /* At least TUF Gaming series uses 3 dword input buffer. */
124 * Struct that's used for all methods called via AGFN. Naming is
125 * identically to the AML code.
128 u16 mfun
; /* probably "Multi-function" to be called */
129 u16 sfun
; /* probably "Sub-function" to be called */
130 u16 len
; /* size of the hole struct, including subfunction fields */
131 u8 stas
; /* not used by now */
132 u8 err
; /* zero on success */
135 /* struct used for calling fan read and write methods */
136 struct agfn_fan_args
{
137 struct agfn_args agfn
; /* common fields */
138 u8 fan
; /* fan number: 0: set auto mode 1: 1st fan */
139 u32 speed
; /* read: RPM/100 - write: 0-255 */
143 * <platform>/ - debugfs root directory
144 * dev_id - current dev_id
145 * ctrl_param - current ctrl_param
146 * method_id - current method_id
147 * devs - call DEVS(dev_id, ctrl_param) and print result
148 * dsts - call DSTS(dev_id) and print result
149 * call - call method_id(dev_id, ctrl_param) and print result
151 struct asus_wmi_debug
{
159 struct asus_wmi
*asus
;
160 struct rfkill
*rfkill
;
166 FAN_TYPE_AGFN
, /* deprecated on newer platforms */
167 FAN_TYPE_SPEC83
, /* starting in Spec 8.3, use CPU_FAN_CTRL */
174 bool wmi_event_queue
;
176 struct input_dev
*inputdev
;
177 struct backlight_device
*backlight_device
;
178 struct platform_device
*platform_device
;
180 struct led_classdev wlan_led
;
182 struct led_classdev tpd_led
;
184 struct led_classdev kbd_led
;
186 struct led_classdev lightbar_led
;
188 struct workqueue_struct
*led_workqueue
;
189 struct work_struct tpd_led_work
;
190 struct work_struct wlan_led_work
;
191 struct work_struct lightbar_led_work
;
193 struct asus_rfkill wlan
;
194 struct asus_rfkill bluetooth
;
195 struct asus_rfkill wimax
;
196 struct asus_rfkill wwan3g
;
197 struct asus_rfkill gps
;
198 struct asus_rfkill uwb
;
200 enum fan_type fan_type
;
204 bool fan_boost_mode_available
;
205 u8 fan_boost_mode_mask
;
208 bool throttle_thermal_policy_available
;
209 u8 throttle_thermal_policy_mode
;
211 // The RSOC controls the maximum charging percentage.
212 bool battery_rsoc_available
;
214 struct hotplug_slot hotplug_slot
;
215 struct mutex hotplug_lock
;
216 struct mutex wmi_lock
;
217 struct workqueue_struct
*hotplug_workqueue
;
218 struct work_struct hotplug_work
;
222 struct asus_wmi_debug debug
;
224 struct asus_wmi_driver
*driver
;
227 /* Input **********************************************************************/
229 static int asus_wmi_input_init(struct asus_wmi
*asus
)
233 asus
->inputdev
= input_allocate_device();
237 asus
->inputdev
->name
= asus
->driver
->input_name
;
238 asus
->inputdev
->phys
= asus
->driver
->input_phys
;
239 asus
->inputdev
->id
.bustype
= BUS_HOST
;
240 asus
->inputdev
->dev
.parent
= &asus
->platform_device
->dev
;
241 set_bit(EV_REP
, asus
->inputdev
->evbit
);
243 err
= sparse_keymap_setup(asus
->inputdev
, asus
->driver
->keymap
, NULL
);
247 err
= input_register_device(asus
->inputdev
);
254 input_free_device(asus
->inputdev
);
258 static void asus_wmi_input_exit(struct asus_wmi
*asus
)
261 input_unregister_device(asus
->inputdev
);
263 asus
->inputdev
= NULL
;
266 /* WMI ************************************************************************/
268 static int asus_wmi_evaluate_method3(u32 method_id
,
269 u32 arg0
, u32 arg1
, u32 arg2
, u32
*retval
)
271 struct bios_args args
= {
276 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
277 struct acpi_buffer output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
279 union acpi_object
*obj
;
282 status
= wmi_evaluate_method(ASUS_WMI_MGMT_GUID
, 0, method_id
,
285 if (ACPI_FAILURE(status
))
288 obj
= (union acpi_object
*)output
.pointer
;
289 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
290 tmp
= (u32
) obj
->integer
.value
;
297 if (tmp
== ASUS_WMI_UNSUPPORTED_METHOD
)
303 int asus_wmi_evaluate_method(u32 method_id
, u32 arg0
, u32 arg1
, u32
*retval
)
305 return asus_wmi_evaluate_method3(method_id
, arg0
, arg1
, 0, retval
);
307 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method
);
309 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args
)
311 struct acpi_buffer input
;
317 * Copy to dma capable address otherwise memory corruption occurs as
318 * bios has to be able to access it.
320 input
.pointer
= kmemdup(args
.pointer
, args
.length
, GFP_DMA
| GFP_KERNEL
);
321 input
.length
= args
.length
;
324 phys_addr
= virt_to_phys(input
.pointer
);
326 status
= asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN
,
327 phys_addr
, 0, &retval
);
329 memcpy(args
.pointer
, input
.pointer
, args
.length
);
331 kfree(input
.pointer
);
338 static int asus_wmi_get_devstate(struct asus_wmi
*asus
, u32 dev_id
, u32
*retval
)
340 return asus_wmi_evaluate_method(asus
->dsts_id
, dev_id
, 0, retval
);
343 static int asus_wmi_set_devstate(u32 dev_id
, u32 ctrl_param
,
346 return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS
, dev_id
,
350 /* Helper for special devices with magic return codes */
351 static int asus_wmi_get_devstate_bits(struct asus_wmi
*asus
,
352 u32 dev_id
, u32 mask
)
357 err
= asus_wmi_get_devstate(asus
, dev_id
, &retval
);
361 if (!(retval
& ASUS_WMI_DSTS_PRESENCE_BIT
))
364 if (mask
== ASUS_WMI_DSTS_STATUS_BIT
) {
365 if (retval
& ASUS_WMI_DSTS_UNKNOWN_BIT
)
369 return retval
& mask
;
372 static int asus_wmi_get_devstate_simple(struct asus_wmi
*asus
, u32 dev_id
)
374 return asus_wmi_get_devstate_bits(asus
, dev_id
,
375 ASUS_WMI_DSTS_STATUS_BIT
);
378 static bool asus_wmi_dev_is_present(struct asus_wmi
*asus
, u32 dev_id
)
381 int status
= asus_wmi_get_devstate(asus
, dev_id
, &retval
);
383 return status
== 0 && (retval
& ASUS_WMI_DSTS_PRESENCE_BIT
);
386 /* Battery ********************************************************************/
388 /* The battery maximum charging percentage */
389 static int charge_end_threshold
;
391 static ssize_t
charge_control_end_threshold_store(struct device
*dev
,
392 struct device_attribute
*attr
,
393 const char *buf
, size_t count
)
397 ret
= kstrtouint(buf
, 10, &value
);
401 if (value
< 0 || value
> 100)
404 ret
= asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC
, value
, &rv
);
411 /* There isn't any method in the DSDT to read the threshold, so we
412 * save the threshold.
414 charge_end_threshold
= value
;
418 static ssize_t
charge_control_end_threshold_show(struct device
*device
,
419 struct device_attribute
*attr
,
422 return sprintf(buf
, "%d\n", charge_end_threshold
);
425 static DEVICE_ATTR_RW(charge_control_end_threshold
);
427 static int asus_wmi_battery_add(struct power_supply
*battery
)
429 /* The WMI method does not provide a way to specific a battery, so we
430 * just assume it is the first battery.
431 * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
432 * battery is named BATT.
434 if (strcmp(battery
->desc
->name
, "BAT0") != 0 &&
435 strcmp(battery
->desc
->name
, "BATT") != 0)
438 if (device_create_file(&battery
->dev
,
439 &dev_attr_charge_control_end_threshold
))
442 /* The charge threshold is only reset when the system is power cycled,
443 * and we can't get the current threshold so let set it to 100% when
444 * a battery is added.
446 asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC
, 100, NULL
);
447 charge_end_threshold
= 100;
452 static int asus_wmi_battery_remove(struct power_supply
*battery
)
454 device_remove_file(&battery
->dev
,
455 &dev_attr_charge_control_end_threshold
);
459 static struct acpi_battery_hook battery_hook
= {
460 .add_battery
= asus_wmi_battery_add
,
461 .remove_battery
= asus_wmi_battery_remove
,
462 .name
= "ASUS Battery Extension",
465 static void asus_wmi_battery_init(struct asus_wmi
*asus
)
467 asus
->battery_rsoc_available
= false;
468 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_RSOC
)) {
469 asus
->battery_rsoc_available
= true;
470 battery_hook_register(&battery_hook
);
474 static void asus_wmi_battery_exit(struct asus_wmi
*asus
)
476 if (asus
->battery_rsoc_available
)
477 battery_hook_unregister(&battery_hook
);
480 /* LEDs ***********************************************************************/
483 * These functions actually update the LED's, and are called from a
484 * workqueue. By doing this as separate work rather than when the LED
485 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
486 * potentially bad time, such as a timer interrupt.
488 static void tpd_led_update(struct work_struct
*work
)
491 struct asus_wmi
*asus
;
493 asus
= container_of(work
, struct asus_wmi
, tpd_led_work
);
495 ctrl_param
= asus
->tpd_led_wk
;
496 asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED
, ctrl_param
, NULL
);
499 static void tpd_led_set(struct led_classdev
*led_cdev
,
500 enum led_brightness value
)
502 struct asus_wmi
*asus
;
504 asus
= container_of(led_cdev
, struct asus_wmi
, tpd_led
);
506 asus
->tpd_led_wk
= !!value
;
507 queue_work(asus
->led_workqueue
, &asus
->tpd_led_work
);
510 static int read_tpd_led_state(struct asus_wmi
*asus
)
512 return asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_TOUCHPAD_LED
);
515 static enum led_brightness
tpd_led_get(struct led_classdev
*led_cdev
)
517 struct asus_wmi
*asus
;
519 asus
= container_of(led_cdev
, struct asus_wmi
, tpd_led
);
521 return read_tpd_led_state(asus
);
524 static void kbd_led_update(struct asus_wmi
*asus
)
528 ctrl_param
= 0x80 | (asus
->kbd_led_wk
& 0x7F);
529 asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT
, ctrl_param
, NULL
);
532 static int kbd_led_read(struct asus_wmi
*asus
, int *level
, int *env
)
538 * bit 7: light on/off
539 * bit 8-10: environment (0: dark, 1: normal, 2: light)
540 * bit 17: status unknown
542 retval
= asus_wmi_get_devstate_bits(asus
, ASUS_WMI_DEVID_KBD_BACKLIGHT
,
545 /* Unknown status is considered as off */
546 if (retval
== 0x8000)
553 *level
= retval
& 0x7F;
555 *env
= (retval
>> 8) & 0x7F;
559 static void do_kbd_led_set(struct led_classdev
*led_cdev
, int value
)
561 struct asus_wmi
*asus
;
564 asus
= container_of(led_cdev
, struct asus_wmi
, kbd_led
);
565 max_level
= asus
->kbd_led
.max_brightness
;
567 asus
->kbd_led_wk
= clamp_val(value
, 0, max_level
);
568 kbd_led_update(asus
);
571 static void kbd_led_set(struct led_classdev
*led_cdev
,
572 enum led_brightness value
)
574 /* Prevent disabling keyboard backlight on module unregister */
575 if (led_cdev
->flags
& LED_UNREGISTERING
)
578 do_kbd_led_set(led_cdev
, value
);
581 static void kbd_led_set_by_kbd(struct asus_wmi
*asus
, enum led_brightness value
)
583 struct led_classdev
*led_cdev
= &asus
->kbd_led
;
585 do_kbd_led_set(led_cdev
, value
);
586 led_classdev_notify_brightness_hw_changed(led_cdev
, asus
->kbd_led_wk
);
589 static enum led_brightness
kbd_led_get(struct led_classdev
*led_cdev
)
591 struct asus_wmi
*asus
;
594 asus
= container_of(led_cdev
, struct asus_wmi
, kbd_led
);
596 retval
= kbd_led_read(asus
, &value
, NULL
);
603 static int wlan_led_unknown_state(struct asus_wmi
*asus
)
607 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_WIRELESS_LED
, &result
);
609 return result
& ASUS_WMI_DSTS_UNKNOWN_BIT
;
612 static void wlan_led_update(struct work_struct
*work
)
615 struct asus_wmi
*asus
;
617 asus
= container_of(work
, struct asus_wmi
, wlan_led_work
);
619 ctrl_param
= asus
->wlan_led_wk
;
620 asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED
, ctrl_param
, NULL
);
623 static void wlan_led_set(struct led_classdev
*led_cdev
,
624 enum led_brightness value
)
626 struct asus_wmi
*asus
;
628 asus
= container_of(led_cdev
, struct asus_wmi
, wlan_led
);
630 asus
->wlan_led_wk
= !!value
;
631 queue_work(asus
->led_workqueue
, &asus
->wlan_led_work
);
634 static enum led_brightness
wlan_led_get(struct led_classdev
*led_cdev
)
636 struct asus_wmi
*asus
;
639 asus
= container_of(led_cdev
, struct asus_wmi
, wlan_led
);
640 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_WIRELESS_LED
, &result
);
642 return result
& ASUS_WMI_DSTS_BRIGHTNESS_MASK
;
645 static void lightbar_led_update(struct work_struct
*work
)
647 struct asus_wmi
*asus
;
650 asus
= container_of(work
, struct asus_wmi
, lightbar_led_work
);
652 ctrl_param
= asus
->lightbar_led_wk
;
653 asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR
, ctrl_param
, NULL
);
656 static void lightbar_led_set(struct led_classdev
*led_cdev
,
657 enum led_brightness value
)
659 struct asus_wmi
*asus
;
661 asus
= container_of(led_cdev
, struct asus_wmi
, lightbar_led
);
663 asus
->lightbar_led_wk
= !!value
;
664 queue_work(asus
->led_workqueue
, &asus
->lightbar_led_work
);
667 static enum led_brightness
lightbar_led_get(struct led_classdev
*led_cdev
)
669 struct asus_wmi
*asus
;
672 asus
= container_of(led_cdev
, struct asus_wmi
, lightbar_led
);
673 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_LIGHTBAR
, &result
);
675 return result
& ASUS_WMI_DSTS_LIGHTBAR_MASK
;
678 static void asus_wmi_led_exit(struct asus_wmi
*asus
)
680 if (!IS_ERR_OR_NULL(asus
->kbd_led
.dev
))
681 led_classdev_unregister(&asus
->kbd_led
);
682 if (!IS_ERR_OR_NULL(asus
->tpd_led
.dev
))
683 led_classdev_unregister(&asus
->tpd_led
);
684 if (!IS_ERR_OR_NULL(asus
->wlan_led
.dev
))
685 led_classdev_unregister(&asus
->wlan_led
);
686 if (!IS_ERR_OR_NULL(asus
->lightbar_led
.dev
))
687 led_classdev_unregister(&asus
->lightbar_led
);
688 if (asus
->led_workqueue
)
689 destroy_workqueue(asus
->led_workqueue
);
692 static int asus_wmi_led_init(struct asus_wmi
*asus
)
696 asus
->led_workqueue
= create_singlethread_workqueue("led_workqueue");
697 if (!asus
->led_workqueue
)
700 if (read_tpd_led_state(asus
) >= 0) {
701 INIT_WORK(&asus
->tpd_led_work
, tpd_led_update
);
703 asus
->tpd_led
.name
= "asus::touchpad";
704 asus
->tpd_led
.brightness_set
= tpd_led_set
;
705 asus
->tpd_led
.brightness_get
= tpd_led_get
;
706 asus
->tpd_led
.max_brightness
= 1;
708 rv
= led_classdev_register(&asus
->platform_device
->dev
,
714 if (!kbd_led_read(asus
, &led_val
, NULL
)) {
715 asus
->kbd_led_wk
= led_val
;
716 asus
->kbd_led
.name
= "asus::kbd_backlight";
717 asus
->kbd_led
.flags
= LED_BRIGHT_HW_CHANGED
;
718 asus
->kbd_led
.brightness_set
= kbd_led_set
;
719 asus
->kbd_led
.brightness_get
= kbd_led_get
;
720 asus
->kbd_led
.max_brightness
= 3;
722 rv
= led_classdev_register(&asus
->platform_device
->dev
,
728 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_WIRELESS_LED
)
729 && (asus
->driver
->quirks
->wapf
> 0)) {
730 INIT_WORK(&asus
->wlan_led_work
, wlan_led_update
);
732 asus
->wlan_led
.name
= "asus::wlan";
733 asus
->wlan_led
.brightness_set
= wlan_led_set
;
734 if (!wlan_led_unknown_state(asus
))
735 asus
->wlan_led
.brightness_get
= wlan_led_get
;
736 asus
->wlan_led
.flags
= LED_CORE_SUSPENDRESUME
;
737 asus
->wlan_led
.max_brightness
= 1;
738 asus
->wlan_led
.default_trigger
= "asus-wlan";
740 rv
= led_classdev_register(&asus
->platform_device
->dev
,
746 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_LIGHTBAR
)) {
747 INIT_WORK(&asus
->lightbar_led_work
, lightbar_led_update
);
749 asus
->lightbar_led
.name
= "asus::lightbar";
750 asus
->lightbar_led
.brightness_set
= lightbar_led_set
;
751 asus
->lightbar_led
.brightness_get
= lightbar_led_get
;
752 asus
->lightbar_led
.max_brightness
= 1;
754 rv
= led_classdev_register(&asus
->platform_device
->dev
,
755 &asus
->lightbar_led
);
760 asus_wmi_led_exit(asus
);
765 /* RF *************************************************************************/
768 * PCI hotplug (for wlan rfkill)
770 static bool asus_wlan_rfkill_blocked(struct asus_wmi
*asus
)
772 int result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WLAN
);
779 static void asus_rfkill_hotplug(struct asus_wmi
*asus
)
787 mutex_lock(&asus
->wmi_lock
);
788 blocked
= asus_wlan_rfkill_blocked(asus
);
789 mutex_unlock(&asus
->wmi_lock
);
791 mutex_lock(&asus
->hotplug_lock
);
792 pci_lock_rescan_remove();
794 if (asus
->wlan
.rfkill
)
795 rfkill_set_sw_state(asus
->wlan
.rfkill
, blocked
);
797 if (asus
->hotplug_slot
.ops
) {
798 bus
= pci_find_bus(0, 1);
800 pr_warn("Unable to find PCI bus 1?\n");
804 if (pci_bus_read_config_dword(bus
, 0, PCI_VENDOR_ID
, &l
)) {
805 pr_err("Unable to read PCI config space?\n");
808 absent
= (l
== 0xffffffff);
810 if (blocked
!= absent
) {
811 pr_warn("BIOS says wireless lan is %s, "
812 "but the pci device is %s\n",
813 blocked
? "blocked" : "unblocked",
814 absent
? "absent" : "present");
815 pr_warn("skipped wireless hotplug as probably "
816 "inappropriate for this model\n");
821 dev
= pci_get_slot(bus
, 0);
823 /* Device already present */
827 dev
= pci_scan_single_device(bus
, 0);
829 pci_bus_assign_resources(bus
);
830 pci_bus_add_device(dev
);
833 dev
= pci_get_slot(bus
, 0);
835 pci_stop_and_remove_bus_device(dev
);
842 pci_unlock_rescan_remove();
843 mutex_unlock(&asus
->hotplug_lock
);
846 static void asus_rfkill_notify(acpi_handle handle
, u32 event
, void *data
)
848 struct asus_wmi
*asus
= data
;
850 if (event
!= ACPI_NOTIFY_BUS_CHECK
)
854 * We can't call directly asus_rfkill_hotplug because most
855 * of the time WMBC is still being executed and not reetrant.
856 * There is currently no way to tell ACPICA that we want this
857 * method to be serialized, we schedule a asus_rfkill_hotplug
858 * call later, in a safer context.
860 queue_work(asus
->hotplug_workqueue
, &asus
->hotplug_work
);
863 static int asus_register_rfkill_notifier(struct asus_wmi
*asus
, char *node
)
868 status
= acpi_get_handle(NULL
, node
, &handle
);
869 if (ACPI_FAILURE(status
))
872 status
= acpi_install_notify_handler(handle
, ACPI_SYSTEM_NOTIFY
,
873 asus_rfkill_notify
, asus
);
874 if (ACPI_FAILURE(status
))
875 pr_warn("Failed to register notify on %s\n", node
);
880 static void asus_unregister_rfkill_notifier(struct asus_wmi
*asus
, char *node
)
882 acpi_status status
= AE_OK
;
885 status
= acpi_get_handle(NULL
, node
, &handle
);
886 if (ACPI_FAILURE(status
))
889 status
= acpi_remove_notify_handler(handle
, ACPI_SYSTEM_NOTIFY
,
891 if (ACPI_FAILURE(status
))
892 pr_err("Error removing rfkill notify handler %s\n", node
);
895 static int asus_get_adapter_status(struct hotplug_slot
*hotplug_slot
,
898 struct asus_wmi
*asus
= container_of(hotplug_slot
,
899 struct asus_wmi
, hotplug_slot
);
900 int result
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WLAN
);
909 static const struct hotplug_slot_ops asus_hotplug_slot_ops
= {
910 .get_adapter_status
= asus_get_adapter_status
,
911 .get_power_status
= asus_get_adapter_status
,
914 static void asus_hotplug_work(struct work_struct
*work
)
916 struct asus_wmi
*asus
;
918 asus
= container_of(work
, struct asus_wmi
, hotplug_work
);
919 asus_rfkill_hotplug(asus
);
922 static int asus_setup_pci_hotplug(struct asus_wmi
*asus
)
925 struct pci_bus
*bus
= pci_find_bus(0, 1);
928 pr_err("Unable to find wifi PCI bus\n");
932 asus
->hotplug_workqueue
=
933 create_singlethread_workqueue("hotplug_workqueue");
934 if (!asus
->hotplug_workqueue
)
935 goto error_workqueue
;
937 INIT_WORK(&asus
->hotplug_work
, asus_hotplug_work
);
939 asus
->hotplug_slot
.ops
= &asus_hotplug_slot_ops
;
941 ret
= pci_hp_register(&asus
->hotplug_slot
, bus
, 0, "asus-wifi");
943 pr_err("Unable to register hotplug slot - %d\n", ret
);
950 asus
->hotplug_slot
.ops
= NULL
;
951 destroy_workqueue(asus
->hotplug_workqueue
);
959 static int asus_rfkill_set(void *data
, bool blocked
)
961 struct asus_rfkill
*priv
= data
;
962 u32 ctrl_param
= !blocked
;
963 u32 dev_id
= priv
->dev_id
;
966 * If the user bit is set, BIOS can't set and record the wlan status,
967 * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
968 * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
969 * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
970 * while setting the wlan status through WMI.
971 * This is also the behavior that windows app will do.
973 if ((dev_id
== ASUS_WMI_DEVID_WLAN
) &&
974 priv
->asus
->driver
->wlan_ctrl_by_user
)
975 dev_id
= ASUS_WMI_DEVID_WLAN_LED
;
977 return asus_wmi_set_devstate(dev_id
, ctrl_param
, NULL
);
980 static void asus_rfkill_query(struct rfkill
*rfkill
, void *data
)
982 struct asus_rfkill
*priv
= data
;
985 result
= asus_wmi_get_devstate_simple(priv
->asus
, priv
->dev_id
);
990 rfkill_set_sw_state(priv
->rfkill
, !result
);
993 static int asus_rfkill_wlan_set(void *data
, bool blocked
)
995 struct asus_rfkill
*priv
= data
;
996 struct asus_wmi
*asus
= priv
->asus
;
1000 * This handler is enabled only if hotplug is enabled.
1001 * In this case, the asus_wmi_set_devstate() will
1002 * trigger a wmi notification and we need to wait
1003 * this call to finish before being able to call
1006 mutex_lock(&asus
->wmi_lock
);
1007 ret
= asus_rfkill_set(data
, blocked
);
1008 mutex_unlock(&asus
->wmi_lock
);
1012 static const struct rfkill_ops asus_rfkill_wlan_ops
= {
1013 .set_block
= asus_rfkill_wlan_set
,
1014 .query
= asus_rfkill_query
,
1017 static const struct rfkill_ops asus_rfkill_ops
= {
1018 .set_block
= asus_rfkill_set
,
1019 .query
= asus_rfkill_query
,
1022 static int asus_new_rfkill(struct asus_wmi
*asus
,
1023 struct asus_rfkill
*arfkill
,
1024 const char *name
, enum rfkill_type type
, int dev_id
)
1026 int result
= asus_wmi_get_devstate_simple(asus
, dev_id
);
1027 struct rfkill
**rfkill
= &arfkill
->rfkill
;
1032 arfkill
->dev_id
= dev_id
;
1033 arfkill
->asus
= asus
;
1035 if (dev_id
== ASUS_WMI_DEVID_WLAN
&&
1036 asus
->driver
->quirks
->hotplug_wireless
)
1037 *rfkill
= rfkill_alloc(name
, &asus
->platform_device
->dev
, type
,
1038 &asus_rfkill_wlan_ops
, arfkill
);
1040 *rfkill
= rfkill_alloc(name
, &asus
->platform_device
->dev
, type
,
1041 &asus_rfkill_ops
, arfkill
);
1046 if ((dev_id
== ASUS_WMI_DEVID_WLAN
) &&
1047 (asus
->driver
->quirks
->wapf
> 0))
1048 rfkill_set_led_trigger_name(*rfkill
, "asus-wlan");
1050 rfkill_init_sw_state(*rfkill
, !result
);
1051 result
= rfkill_register(*rfkill
);
1053 rfkill_destroy(*rfkill
);
1060 static void asus_wmi_rfkill_exit(struct asus_wmi
*asus
)
1062 if (asus
->driver
->wlan_ctrl_by_user
&& ashs_present())
1065 asus_unregister_rfkill_notifier(asus
, "\\_SB.PCI0.P0P5");
1066 asus_unregister_rfkill_notifier(asus
, "\\_SB.PCI0.P0P6");
1067 asus_unregister_rfkill_notifier(asus
, "\\_SB.PCI0.P0P7");
1068 if (asus
->wlan
.rfkill
) {
1069 rfkill_unregister(asus
->wlan
.rfkill
);
1070 rfkill_destroy(asus
->wlan
.rfkill
);
1071 asus
->wlan
.rfkill
= NULL
;
1074 * Refresh pci hotplug in case the rfkill state was changed after
1075 * asus_unregister_rfkill_notifier()
1077 asus_rfkill_hotplug(asus
);
1078 if (asus
->hotplug_slot
.ops
)
1079 pci_hp_deregister(&asus
->hotplug_slot
);
1080 if (asus
->hotplug_workqueue
)
1081 destroy_workqueue(asus
->hotplug_workqueue
);
1083 if (asus
->bluetooth
.rfkill
) {
1084 rfkill_unregister(asus
->bluetooth
.rfkill
);
1085 rfkill_destroy(asus
->bluetooth
.rfkill
);
1086 asus
->bluetooth
.rfkill
= NULL
;
1088 if (asus
->wimax
.rfkill
) {
1089 rfkill_unregister(asus
->wimax
.rfkill
);
1090 rfkill_destroy(asus
->wimax
.rfkill
);
1091 asus
->wimax
.rfkill
= NULL
;
1093 if (asus
->wwan3g
.rfkill
) {
1094 rfkill_unregister(asus
->wwan3g
.rfkill
);
1095 rfkill_destroy(asus
->wwan3g
.rfkill
);
1096 asus
->wwan3g
.rfkill
= NULL
;
1098 if (asus
->gps
.rfkill
) {
1099 rfkill_unregister(asus
->gps
.rfkill
);
1100 rfkill_destroy(asus
->gps
.rfkill
);
1101 asus
->gps
.rfkill
= NULL
;
1103 if (asus
->uwb
.rfkill
) {
1104 rfkill_unregister(asus
->uwb
.rfkill
);
1105 rfkill_destroy(asus
->uwb
.rfkill
);
1106 asus
->uwb
.rfkill
= NULL
;
1110 static int asus_wmi_rfkill_init(struct asus_wmi
*asus
)
1114 mutex_init(&asus
->hotplug_lock
);
1115 mutex_init(&asus
->wmi_lock
);
1117 result
= asus_new_rfkill(asus
, &asus
->wlan
, "asus-wlan",
1118 RFKILL_TYPE_WLAN
, ASUS_WMI_DEVID_WLAN
);
1120 if (result
&& result
!= -ENODEV
)
1123 result
= asus_new_rfkill(asus
, &asus
->bluetooth
,
1124 "asus-bluetooth", RFKILL_TYPE_BLUETOOTH
,
1125 ASUS_WMI_DEVID_BLUETOOTH
);
1127 if (result
&& result
!= -ENODEV
)
1130 result
= asus_new_rfkill(asus
, &asus
->wimax
, "asus-wimax",
1131 RFKILL_TYPE_WIMAX
, ASUS_WMI_DEVID_WIMAX
);
1133 if (result
&& result
!= -ENODEV
)
1136 result
= asus_new_rfkill(asus
, &asus
->wwan3g
, "asus-wwan3g",
1137 RFKILL_TYPE_WWAN
, ASUS_WMI_DEVID_WWAN3G
);
1139 if (result
&& result
!= -ENODEV
)
1142 result
= asus_new_rfkill(asus
, &asus
->gps
, "asus-gps",
1143 RFKILL_TYPE_GPS
, ASUS_WMI_DEVID_GPS
);
1145 if (result
&& result
!= -ENODEV
)
1148 result
= asus_new_rfkill(asus
, &asus
->uwb
, "asus-uwb",
1149 RFKILL_TYPE_UWB
, ASUS_WMI_DEVID_UWB
);
1151 if (result
&& result
!= -ENODEV
)
1154 if (!asus
->driver
->quirks
->hotplug_wireless
)
1157 result
= asus_setup_pci_hotplug(asus
);
1159 * If we get -EBUSY then something else is handling the PCI hotplug -
1160 * don't fail in this case
1162 if (result
== -EBUSY
)
1165 asus_register_rfkill_notifier(asus
, "\\_SB.PCI0.P0P5");
1166 asus_register_rfkill_notifier(asus
, "\\_SB.PCI0.P0P6");
1167 asus_register_rfkill_notifier(asus
, "\\_SB.PCI0.P0P7");
1169 * Refresh pci hotplug in case the rfkill state was changed during
1172 asus_rfkill_hotplug(asus
);
1175 if (result
&& result
!= -ENODEV
)
1176 asus_wmi_rfkill_exit(asus
);
1178 if (result
== -ENODEV
)
1184 /* Quirks *********************************************************************/
1186 static void asus_wmi_set_xusb2pr(struct asus_wmi
*asus
)
1188 struct pci_dev
*xhci_pdev
;
1189 u32 orig_ports_available
;
1190 u32 ports_available
= asus
->driver
->quirks
->xusb2pr
;
1192 xhci_pdev
= pci_get_device(PCI_VENDOR_ID_INTEL
,
1193 PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI
,
1199 pci_read_config_dword(xhci_pdev
, USB_INTEL_XUSB2PR
,
1200 &orig_ports_available
);
1202 pci_write_config_dword(xhci_pdev
, USB_INTEL_XUSB2PR
,
1203 cpu_to_le32(ports_available
));
1205 pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
1206 orig_ports_available
, ports_available
);
1210 * Some devices dont support or have borcken get_als method
1211 * but still support set method.
1213 static void asus_wmi_set_als(void)
1215 asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE
, 1, NULL
);
1218 /* Hwmon device ***************************************************************/
1220 static int asus_agfn_fan_speed_read(struct asus_wmi
*asus
, int fan
,
1223 struct agfn_fan_args args
= {
1224 .agfn
.len
= sizeof(args
),
1225 .agfn
.mfun
= ASUS_FAN_MFUN
,
1226 .agfn
.sfun
= ASUS_FAN_SFUN_READ
,
1230 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
1236 status
= asus_wmi_evaluate_method_agfn(input
);
1238 if (status
|| args
.agfn
.err
)
1242 *speed
= args
.speed
;
1247 static int asus_agfn_fan_speed_write(struct asus_wmi
*asus
, int fan
,
1250 struct agfn_fan_args args
= {
1251 .agfn
.len
= sizeof(args
),
1252 .agfn
.mfun
= ASUS_FAN_MFUN
,
1253 .agfn
.sfun
= ASUS_FAN_SFUN_WRITE
,
1255 .speed
= speed
? *speed
: 0,
1257 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
1260 /* 1: for setting 1st fan's speed 0: setting auto mode */
1261 if (fan
!= 1 && fan
!= 0)
1264 status
= asus_wmi_evaluate_method_agfn(input
);
1266 if (status
|| args
.agfn
.err
)
1269 if (speed
&& fan
== 1)
1270 asus
->agfn_pwm
= *speed
;
1276 * Check if we can read the speed of one fan. If true we assume we can also
1279 static bool asus_wmi_has_agfn_fan(struct asus_wmi
*asus
)
1285 status
= asus_agfn_fan_speed_read(asus
, 1, &speed
);
1289 status
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FAN_CTRL
, &value
);
1294 * We need to find a better way, probably using sfun,
1296 * Currently we disable it if:
1297 * - ASUS_WMI_UNSUPPORTED_METHOD is returned
1298 * - reverved bits are non-zero
1299 * - sfun and presence bit are not set
1301 return !(value
== ASUS_WMI_UNSUPPORTED_METHOD
|| value
& 0xFFF80000
1302 || (!asus
->sfun
&& !(value
& ASUS_WMI_DSTS_PRESENCE_BIT
)));
1305 static int asus_fan_set_auto(struct asus_wmi
*asus
)
1310 switch (asus
->fan_type
) {
1311 case FAN_TYPE_SPEC83
:
1312 status
= asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL
,
1322 status
= asus_agfn_fan_speed_write(asus
, 0, NULL
);
1335 static ssize_t
pwm1_show(struct device
*dev
,
1336 struct device_attribute
*attr
,
1339 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1343 /* If we already set a value then just return it */
1344 if (asus
->agfn_pwm
>= 0)
1345 return sprintf(buf
, "%d\n", asus
->agfn_pwm
);
1348 * If we haven't set already set a value through the AGFN interface,
1349 * we read a current value through the (now-deprecated) FAN_CTRL device.
1351 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FAN_CTRL
, &value
);
1357 if (value
== 1) /* Low Speed */
1359 else if (value
== 2)
1361 else if (value
== 3)
1364 pr_err("Unknown fan speed %#x\n", value
);
1368 return sprintf(buf
, "%d\n", value
);
1371 static ssize_t
pwm1_store(struct device
*dev
,
1372 struct device_attribute
*attr
,
1373 const char *buf
, size_t count
) {
1374 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1379 ret
= kstrtouint(buf
, 10, &value
);
1383 value
= clamp(value
, 0, 255);
1385 state
= asus_agfn_fan_speed_write(asus
, 1, &value
);
1387 pr_warn("Setting fan speed failed: %d\n", state
);
1389 asus
->fan_pwm_mode
= ASUS_FAN_CTRL_MANUAL
;
1394 static ssize_t
fan1_input_show(struct device
*dev
,
1395 struct device_attribute
*attr
,
1398 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1402 switch (asus
->fan_type
) {
1403 case FAN_TYPE_SPEC83
:
1404 ret
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_CPU_FAN_CTRL
,
1413 /* no speed readable on manual mode */
1414 if (asus
->fan_pwm_mode
== ASUS_FAN_CTRL_MANUAL
)
1417 ret
= asus_agfn_fan_speed_read(asus
, 1, &value
);
1419 pr_warn("reading fan speed failed: %d\n", ret
);
1428 return sprintf(buf
, "%d\n", value
< 0 ? -1 : value
*100);
1431 static ssize_t
pwm1_enable_show(struct device
*dev
,
1432 struct device_attribute
*attr
,
1435 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1438 * Just read back the cached pwm mode.
1440 * For the CPU_FAN device, the spec indicates that we should be
1441 * able to read the device status and consult bit 19 to see if we
1442 * are in Full On or Automatic mode. However, this does not work
1443 * in practice on X532FL at least (the bit is always 0) and there's
1444 * also nothing in the DSDT to indicate that this behaviour exists.
1446 return sprintf(buf
, "%d\n", asus
->fan_pwm_mode
);
1449 static ssize_t
pwm1_enable_store(struct device
*dev
,
1450 struct device_attribute
*attr
,
1451 const char *buf
, size_t count
)
1453 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1460 ret
= kstrtouint(buf
, 10, &state
);
1464 if (asus
->fan_type
== FAN_TYPE_SPEC83
) {
1465 switch (state
) { /* standard documented hwmon values */
1466 case ASUS_FAN_CTRL_FULLSPEED
:
1469 case ASUS_FAN_CTRL_AUTO
:
1476 ret
= asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL
,
1483 } else if (asus
->fan_type
== FAN_TYPE_AGFN
) {
1485 case ASUS_FAN_CTRL_MANUAL
:
1488 case ASUS_FAN_CTRL_AUTO
:
1489 status
= asus_fan_set_auto(asus
);
1499 asus
->fan_pwm_mode
= state
;
1503 static ssize_t
fan1_label_show(struct device
*dev
,
1504 struct device_attribute
*attr
,
1507 return sprintf(buf
, "%s\n", ASUS_FAN_DESC
);
1510 static ssize_t
asus_hwmon_temp1(struct device
*dev
,
1511 struct device_attribute
*attr
,
1514 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1518 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_THERMAL_CTRL
, &value
);
1522 return sprintf(buf
, "%ld\n",
1523 deci_kelvin_to_millicelsius(value
& 0xFFFF));
1527 static DEVICE_ATTR_RW(pwm1
);
1528 static DEVICE_ATTR_RW(pwm1_enable
);
1529 static DEVICE_ATTR_RO(fan1_input
);
1530 static DEVICE_ATTR_RO(fan1_label
);
1533 static DEVICE_ATTR(temp1_input
, S_IRUGO
, asus_hwmon_temp1
, NULL
);
1535 static struct attribute
*hwmon_attributes
[] = {
1536 &dev_attr_pwm1
.attr
,
1537 &dev_attr_pwm1_enable
.attr
,
1538 &dev_attr_fan1_input
.attr
,
1539 &dev_attr_fan1_label
.attr
,
1541 &dev_attr_temp1_input
.attr
,
1545 static umode_t
asus_hwmon_sysfs_is_visible(struct kobject
*kobj
,
1546 struct attribute
*attr
, int idx
)
1548 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
1549 struct asus_wmi
*asus
= dev_get_drvdata(dev
->parent
);
1550 u32 value
= ASUS_WMI_UNSUPPORTED_METHOD
;
1552 if (attr
== &dev_attr_pwm1
.attr
) {
1553 if (asus
->fan_type
!= FAN_TYPE_AGFN
)
1555 } else if (attr
== &dev_attr_fan1_input
.attr
1556 || attr
== &dev_attr_fan1_label
.attr
1557 || attr
== &dev_attr_pwm1_enable
.attr
) {
1558 if (asus
->fan_type
== FAN_TYPE_NONE
)
1560 } else if (attr
== &dev_attr_temp1_input
.attr
) {
1561 int err
= asus_wmi_get_devstate(asus
,
1562 ASUS_WMI_DEVID_THERMAL_CTRL
,
1566 return 0; /* can't return negative here */
1569 * If the temperature value in deci-Kelvin is near the absolute
1570 * zero temperature, something is clearly wrong
1572 if (value
== 0 || value
== 1)
1579 static const struct attribute_group hwmon_attribute_group
= {
1580 .is_visible
= asus_hwmon_sysfs_is_visible
,
1581 .attrs
= hwmon_attributes
1583 __ATTRIBUTE_GROUPS(hwmon_attribute
);
1585 static int asus_wmi_hwmon_init(struct asus_wmi
*asus
)
1587 struct device
*dev
= &asus
->platform_device
->dev
;
1588 struct device
*hwmon
;
1590 hwmon
= devm_hwmon_device_register_with_groups(dev
, "asus", asus
,
1591 hwmon_attribute_groups
);
1593 if (IS_ERR(hwmon
)) {
1594 pr_err("Could not register asus hwmon device\n");
1595 return PTR_ERR(hwmon
);
1600 static int asus_wmi_fan_init(struct asus_wmi
*asus
)
1602 asus
->fan_type
= FAN_TYPE_NONE
;
1603 asus
->agfn_pwm
= -1;
1605 if (asus_wmi_dev_is_present(asus
, ASUS_WMI_DEVID_CPU_FAN_CTRL
))
1606 asus
->fan_type
= FAN_TYPE_SPEC83
;
1607 else if (asus_wmi_has_agfn_fan(asus
))
1608 asus
->fan_type
= FAN_TYPE_AGFN
;
1610 if (asus
->fan_type
== FAN_TYPE_NONE
)
1613 asus_fan_set_auto(asus
);
1614 asus
->fan_pwm_mode
= ASUS_FAN_CTRL_AUTO
;
1618 /* Fan mode *******************************************************************/
1620 static int fan_boost_mode_check_present(struct asus_wmi
*asus
)
1625 asus
->fan_boost_mode_available
= false;
1627 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FAN_BOOST_MODE
,
1636 if ((result
& ASUS_WMI_DSTS_PRESENCE_BIT
) &&
1637 (result
& ASUS_FAN_BOOST_MODES_MASK
)) {
1638 asus
->fan_boost_mode_available
= true;
1639 asus
->fan_boost_mode_mask
= result
& ASUS_FAN_BOOST_MODES_MASK
;
1645 static int fan_boost_mode_write(struct asus_wmi
*asus
)
1651 value
= asus
->fan_boost_mode
;
1653 pr_info("Set fan boost mode: %u\n", value
);
1654 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE
, value
,
1657 pr_warn("Failed to set fan boost mode: %d\n", err
);
1662 pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
1670 static int fan_boost_mode_switch_next(struct asus_wmi
*asus
)
1672 u8 mask
= asus
->fan_boost_mode_mask
;
1674 if (asus
->fan_boost_mode
== ASUS_FAN_BOOST_MODE_NORMAL
) {
1675 if (mask
& ASUS_FAN_BOOST_MODE_OVERBOOST_MASK
)
1676 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_OVERBOOST
;
1677 else if (mask
& ASUS_FAN_BOOST_MODE_SILENT_MASK
)
1678 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_SILENT
;
1679 } else if (asus
->fan_boost_mode
== ASUS_FAN_BOOST_MODE_OVERBOOST
) {
1680 if (mask
& ASUS_FAN_BOOST_MODE_SILENT_MASK
)
1681 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_SILENT
;
1683 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_NORMAL
;
1685 asus
->fan_boost_mode
= ASUS_FAN_BOOST_MODE_NORMAL
;
1688 return fan_boost_mode_write(asus
);
1691 static ssize_t
fan_boost_mode_show(struct device
*dev
,
1692 struct device_attribute
*attr
, char *buf
)
1694 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1696 return scnprintf(buf
, PAGE_SIZE
, "%d\n", asus
->fan_boost_mode
);
1699 static ssize_t
fan_boost_mode_store(struct device
*dev
,
1700 struct device_attribute
*attr
,
1701 const char *buf
, size_t count
)
1705 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1706 u8 mask
= asus
->fan_boost_mode_mask
;
1708 result
= kstrtou8(buf
, 10, &new_mode
);
1710 pr_warn("Trying to store invalid value\n");
1714 if (new_mode
== ASUS_FAN_BOOST_MODE_OVERBOOST
) {
1715 if (!(mask
& ASUS_FAN_BOOST_MODE_OVERBOOST_MASK
))
1717 } else if (new_mode
== ASUS_FAN_BOOST_MODE_SILENT
) {
1718 if (!(mask
& ASUS_FAN_BOOST_MODE_SILENT_MASK
))
1720 } else if (new_mode
!= ASUS_FAN_BOOST_MODE_NORMAL
) {
1724 asus
->fan_boost_mode
= new_mode
;
1725 fan_boost_mode_write(asus
);
1730 // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
1731 static DEVICE_ATTR_RW(fan_boost_mode
);
1733 /* Throttle thermal policy ****************************************************/
1735 static int throttle_thermal_policy_check_present(struct asus_wmi
*asus
)
1740 asus
->throttle_thermal_policy_available
= false;
1742 err
= asus_wmi_get_devstate(asus
,
1743 ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY
,
1751 if (result
& ASUS_WMI_DSTS_PRESENCE_BIT
)
1752 asus
->throttle_thermal_policy_available
= true;
1757 static int throttle_thermal_policy_write(struct asus_wmi
*asus
)
1763 value
= asus
->throttle_thermal_policy_mode
;
1765 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY
,
1768 pr_warn("Failed to set throttle thermal policy: %d\n", err
);
1773 pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n",
1781 static int throttle_thermal_policy_set_default(struct asus_wmi
*asus
)
1783 if (!asus
->throttle_thermal_policy_available
)
1786 asus
->throttle_thermal_policy_mode
= ASUS_THROTTLE_THERMAL_POLICY_DEFAULT
;
1787 return throttle_thermal_policy_write(asus
);
1790 static int throttle_thermal_policy_switch_next(struct asus_wmi
*asus
)
1792 u8 new_mode
= asus
->throttle_thermal_policy_mode
+ 1;
1794 if (new_mode
> ASUS_THROTTLE_THERMAL_POLICY_SILENT
)
1795 new_mode
= ASUS_THROTTLE_THERMAL_POLICY_DEFAULT
;
1797 asus
->throttle_thermal_policy_mode
= new_mode
;
1798 return throttle_thermal_policy_write(asus
);
1801 static ssize_t
throttle_thermal_policy_show(struct device
*dev
,
1802 struct device_attribute
*attr
, char *buf
)
1804 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1805 u8 mode
= asus
->throttle_thermal_policy_mode
;
1807 return scnprintf(buf
, PAGE_SIZE
, "%d\n", mode
);
1810 static ssize_t
throttle_thermal_policy_store(struct device
*dev
,
1811 struct device_attribute
*attr
,
1812 const char *buf
, size_t count
)
1816 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
1818 result
= kstrtou8(buf
, 10, &new_mode
);
1822 if (new_mode
> ASUS_THROTTLE_THERMAL_POLICY_SILENT
)
1825 asus
->throttle_thermal_policy_mode
= new_mode
;
1826 throttle_thermal_policy_write(asus
);
1831 // Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
1832 static DEVICE_ATTR_RW(throttle_thermal_policy
);
1834 /* Backlight ******************************************************************/
1836 static int read_backlight_power(struct asus_wmi
*asus
)
1840 if (asus
->driver
->quirks
->store_backlight_power
)
1841 ret
= !asus
->driver
->panel_power
;
1843 ret
= asus_wmi_get_devstate_simple(asus
,
1844 ASUS_WMI_DEVID_BACKLIGHT
);
1849 return ret
? FB_BLANK_UNBLANK
: FB_BLANK_POWERDOWN
;
1852 static int read_brightness_max(struct asus_wmi
*asus
)
1857 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_BRIGHTNESS
, &retval
);
1861 retval
= retval
& ASUS_WMI_DSTS_MAX_BRIGTH_MASK
;
1870 static int read_brightness(struct backlight_device
*bd
)
1872 struct asus_wmi
*asus
= bl_get_data(bd
);
1876 err
= asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_BRIGHTNESS
, &retval
);
1880 return retval
& ASUS_WMI_DSTS_BRIGHTNESS_MASK
;
1883 static u32
get_scalar_command(struct backlight_device
*bd
)
1885 struct asus_wmi
*asus
= bl_get_data(bd
);
1888 if ((asus
->driver
->brightness
< bd
->props
.brightness
) ||
1889 bd
->props
.brightness
== bd
->props
.max_brightness
)
1890 ctrl_param
= 0x00008001;
1891 else if ((asus
->driver
->brightness
> bd
->props
.brightness
) ||
1892 bd
->props
.brightness
== 0)
1893 ctrl_param
= 0x00008000;
1895 asus
->driver
->brightness
= bd
->props
.brightness
;
1900 static int update_bl_status(struct backlight_device
*bd
)
1902 struct asus_wmi
*asus
= bl_get_data(bd
);
1906 power
= read_backlight_power(asus
);
1907 if (power
!= -ENODEV
&& bd
->props
.power
!= power
) {
1908 ctrl_param
= !!(bd
->props
.power
== FB_BLANK_UNBLANK
);
1909 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT
,
1911 if (asus
->driver
->quirks
->store_backlight_power
)
1912 asus
->driver
->panel_power
= bd
->props
.power
;
1914 /* When using scalar brightness, updating the brightness
1915 * will mess with the backlight power */
1916 if (asus
->driver
->quirks
->scalar_panel_brightness
)
1920 if (asus
->driver
->quirks
->scalar_panel_brightness
)
1921 ctrl_param
= get_scalar_command(bd
);
1923 ctrl_param
= bd
->props
.brightness
;
1925 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS
,
1931 static const struct backlight_ops asus_wmi_bl_ops
= {
1932 .get_brightness
= read_brightness
,
1933 .update_status
= update_bl_status
,
1936 static int asus_wmi_backlight_notify(struct asus_wmi
*asus
, int code
)
1938 struct backlight_device
*bd
= asus
->backlight_device
;
1939 int old
= bd
->props
.brightness
;
1942 if (code
>= NOTIFY_BRNUP_MIN
&& code
<= NOTIFY_BRNUP_MAX
)
1943 new = code
- NOTIFY_BRNUP_MIN
+ 1;
1944 else if (code
>= NOTIFY_BRNDOWN_MIN
&& code
<= NOTIFY_BRNDOWN_MAX
)
1945 new = code
- NOTIFY_BRNDOWN_MIN
;
1947 bd
->props
.brightness
= new;
1948 backlight_update_status(bd
);
1949 backlight_force_update(bd
, BACKLIGHT_UPDATE_HOTKEY
);
1954 static int asus_wmi_backlight_init(struct asus_wmi
*asus
)
1956 struct backlight_device
*bd
;
1957 struct backlight_properties props
;
1961 max
= read_brightness_max(asus
);
1965 power
= read_backlight_power(asus
);
1966 if (power
== -ENODEV
)
1967 power
= FB_BLANK_UNBLANK
;
1971 memset(&props
, 0, sizeof(struct backlight_properties
));
1972 props
.type
= BACKLIGHT_PLATFORM
;
1973 props
.max_brightness
= max
;
1974 bd
= backlight_device_register(asus
->driver
->name
,
1975 &asus
->platform_device
->dev
, asus
,
1976 &asus_wmi_bl_ops
, &props
);
1978 pr_err("Could not register backlight device\n");
1982 asus
->backlight_device
= bd
;
1984 if (asus
->driver
->quirks
->store_backlight_power
)
1985 asus
->driver
->panel_power
= power
;
1987 bd
->props
.brightness
= read_brightness(bd
);
1988 bd
->props
.power
= power
;
1989 backlight_update_status(bd
);
1991 asus
->driver
->brightness
= bd
->props
.brightness
;
1996 static void asus_wmi_backlight_exit(struct asus_wmi
*asus
)
1998 backlight_device_unregister(asus
->backlight_device
);
2000 asus
->backlight_device
= NULL
;
2003 static int is_display_toggle(int code
)
2005 /* display toggle keys */
2006 if ((code
>= 0x61 && code
<= 0x67) ||
2007 (code
>= 0x8c && code
<= 0x93) ||
2008 (code
>= 0xa0 && code
<= 0xa7) ||
2009 (code
>= 0xd0 && code
<= 0xd5))
2015 /* Fn-lock ********************************************************************/
2017 static bool asus_wmi_has_fnlock_key(struct asus_wmi
*asus
)
2021 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_FNLOCK
, &result
);
2023 return (result
& ASUS_WMI_DSTS_PRESENCE_BIT
) &&
2024 !(result
& ASUS_WMI_FNLOCK_BIOS_DISABLED
);
2027 static void asus_wmi_fnlock_update(struct asus_wmi
*asus
)
2029 int mode
= asus
->fnlock_locked
;
2031 asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK
, mode
, NULL
);
2034 /* WMI events *****************************************************************/
2036 static int asus_wmi_get_event_code(u32 value
)
2038 struct acpi_buffer response
= { ACPI_ALLOCATE_BUFFER
, NULL
};
2039 union acpi_object
*obj
;
2043 status
= wmi_get_event_data(value
, &response
);
2044 if (ACPI_FAILURE(status
)) {
2045 pr_warn("Failed to get WMI notify code: %s\n",
2046 acpi_format_exception(status
));
2050 obj
= (union acpi_object
*)response
.pointer
;
2052 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
2053 code
= (int)(obj
->integer
.value
& WMI_EVENT_MASK
);
2061 static void asus_wmi_handle_event_code(int code
, struct asus_wmi
*asus
)
2064 unsigned int key_value
= 1;
2065 bool autorelease
= 1;
2069 if (asus
->driver
->key_filter
) {
2070 asus
->driver
->key_filter(asus
->driver
, &code
, &key_value
,
2072 if (code
== ASUS_WMI_KEY_IGNORE
)
2076 if (code
>= NOTIFY_BRNUP_MIN
&& code
<= NOTIFY_BRNUP_MAX
)
2077 code
= ASUS_WMI_BRN_UP
;
2078 else if (code
>= NOTIFY_BRNDOWN_MIN
&& code
<= NOTIFY_BRNDOWN_MAX
)
2079 code
= ASUS_WMI_BRN_DOWN
;
2081 if (code
== ASUS_WMI_BRN_DOWN
|| code
== ASUS_WMI_BRN_UP
) {
2082 if (acpi_video_get_backlight_type() == acpi_backlight_vendor
) {
2083 asus_wmi_backlight_notify(asus
, orig_code
);
2088 if (code
== NOTIFY_KBD_BRTUP
) {
2089 kbd_led_set_by_kbd(asus
, asus
->kbd_led_wk
+ 1);
2092 if (code
== NOTIFY_KBD_BRTDWN
) {
2093 kbd_led_set_by_kbd(asus
, asus
->kbd_led_wk
- 1);
2096 if (code
== NOTIFY_KBD_BRTTOGGLE
) {
2097 if (asus
->kbd_led_wk
== asus
->kbd_led
.max_brightness
)
2098 kbd_led_set_by_kbd(asus
, 0);
2100 kbd_led_set_by_kbd(asus
, asus
->kbd_led_wk
+ 1);
2104 if (code
== NOTIFY_FNLOCK_TOGGLE
) {
2105 asus
->fnlock_locked
= !asus
->fnlock_locked
;
2106 asus_wmi_fnlock_update(asus
);
2110 if (asus
->fan_boost_mode_available
&& code
== NOTIFY_KBD_FBM
) {
2111 fan_boost_mode_switch_next(asus
);
2115 if (asus
->throttle_thermal_policy_available
&& code
== NOTIFY_KBD_TTP
) {
2116 throttle_thermal_policy_switch_next(asus
);
2120 if (is_display_toggle(code
) && asus
->driver
->quirks
->no_display_toggle
)
2123 if (!sparse_keymap_report_event(asus
->inputdev
, code
,
2124 key_value
, autorelease
))
2125 pr_info("Unknown key %x pressed\n", code
);
2128 static void asus_wmi_notify(u32 value
, void *context
)
2130 struct asus_wmi
*asus
= context
;
2134 for (i
= 0; i
< WMI_EVENT_QUEUE_SIZE
+ 1; i
++) {
2135 code
= asus_wmi_get_event_code(value
);
2137 pr_warn("Failed to get notify code: %d\n", code
);
2141 if (code
== WMI_EVENT_QUEUE_END
|| code
== WMI_EVENT_MASK
)
2144 asus_wmi_handle_event_code(code
, asus
);
2147 * Double check that queue is present:
2148 * ATK (with queue) uses 0xff, ASUSWMI (without) 0xd2.
2150 if (!asus
->wmi_event_queue
|| value
!= WMI_EVENT_VALUE_ATK
)
2154 pr_warn("Failed to process event queue, last code: 0x%x\n", code
);
2157 static int asus_wmi_notify_queue_flush(struct asus_wmi
*asus
)
2162 for (i
= 0; i
< WMI_EVENT_QUEUE_SIZE
+ 1; i
++) {
2163 code
= asus_wmi_get_event_code(WMI_EVENT_VALUE_ATK
);
2165 pr_warn("Failed to get event during flush: %d\n", code
);
2169 if (code
== WMI_EVENT_QUEUE_END
|| code
== WMI_EVENT_MASK
)
2173 pr_warn("Failed to flush event queue\n");
2177 /* Sysfs **********************************************************************/
2179 static ssize_t
store_sys_wmi(struct asus_wmi
*asus
, int devid
,
2180 const char *buf
, size_t count
)
2185 value
= asus_wmi_get_devstate_simple(asus
, devid
);
2189 err
= kstrtoint(buf
, 0, &value
);
2193 err
= asus_wmi_set_devstate(devid
, value
, &retval
);
2200 static ssize_t
show_sys_wmi(struct asus_wmi
*asus
, int devid
, char *buf
)
2202 int value
= asus_wmi_get_devstate_simple(asus
, devid
);
2207 return sprintf(buf
, "%d\n", value
);
2210 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
2211 static ssize_t show_##_name(struct device *dev, \
2212 struct device_attribute *attr, \
2215 struct asus_wmi *asus = dev_get_drvdata(dev); \
2217 return show_sys_wmi(asus, _cm, buf); \
2219 static ssize_t store_##_name(struct device *dev, \
2220 struct device_attribute *attr, \
2221 const char *buf, size_t count) \
2223 struct asus_wmi *asus = dev_get_drvdata(dev); \
2225 return store_sys_wmi(asus, _cm, buf, count); \
2227 static struct device_attribute dev_attr_##_name = { \
2229 .name = __stringify(_name), \
2231 .show = show_##_name, \
2232 .store = store_##_name, \
2235 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad
, 0644, ASUS_WMI_DEVID_TOUCHPAD
);
2236 ASUS_WMI_CREATE_DEVICE_ATTR(camera
, 0644, ASUS_WMI_DEVID_CAMERA
);
2237 ASUS_WMI_CREATE_DEVICE_ATTR(cardr
, 0644, ASUS_WMI_DEVID_CARDREADER
);
2238 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume
, 0644, ASUS_WMI_DEVID_LID_RESUME
);
2239 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable
, 0644, ASUS_WMI_DEVID_ALS_ENABLE
);
2241 static ssize_t
cpufv_store(struct device
*dev
, struct device_attribute
*attr
,
2242 const char *buf
, size_t count
)
2246 rv
= kstrtoint(buf
, 0, &value
);
2250 if (value
< 0 || value
> 2)
2253 rv
= asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS
, value
, 0, NULL
);
2260 static DEVICE_ATTR_WO(cpufv
);
2262 static struct attribute
*platform_attributes
[] = {
2263 &dev_attr_cpufv
.attr
,
2264 &dev_attr_camera
.attr
,
2265 &dev_attr_cardr
.attr
,
2266 &dev_attr_touchpad
.attr
,
2267 &dev_attr_lid_resume
.attr
,
2268 &dev_attr_als_enable
.attr
,
2269 &dev_attr_fan_boost_mode
.attr
,
2270 &dev_attr_throttle_thermal_policy
.attr
,
2274 static umode_t
asus_sysfs_is_visible(struct kobject
*kobj
,
2275 struct attribute
*attr
, int idx
)
2277 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
2278 struct asus_wmi
*asus
= dev_get_drvdata(dev
);
2282 if (attr
== &dev_attr_camera
.attr
)
2283 devid
= ASUS_WMI_DEVID_CAMERA
;
2284 else if (attr
== &dev_attr_cardr
.attr
)
2285 devid
= ASUS_WMI_DEVID_CARDREADER
;
2286 else if (attr
== &dev_attr_touchpad
.attr
)
2287 devid
= ASUS_WMI_DEVID_TOUCHPAD
;
2288 else if (attr
== &dev_attr_lid_resume
.attr
)
2289 devid
= ASUS_WMI_DEVID_LID_RESUME
;
2290 else if (attr
== &dev_attr_als_enable
.attr
)
2291 devid
= ASUS_WMI_DEVID_ALS_ENABLE
;
2292 else if (attr
== &dev_attr_fan_boost_mode
.attr
)
2293 ok
= asus
->fan_boost_mode_available
;
2294 else if (attr
== &dev_attr_throttle_thermal_policy
.attr
)
2295 ok
= asus
->throttle_thermal_policy_available
;
2298 ok
= !(asus_wmi_get_devstate_simple(asus
, devid
) < 0);
2300 return ok
? attr
->mode
: 0;
2303 static const struct attribute_group platform_attribute_group
= {
2304 .is_visible
= asus_sysfs_is_visible
,
2305 .attrs
= platform_attributes
2308 static void asus_wmi_sysfs_exit(struct platform_device
*device
)
2310 sysfs_remove_group(&device
->dev
.kobj
, &platform_attribute_group
);
2313 static int asus_wmi_sysfs_init(struct platform_device
*device
)
2315 return sysfs_create_group(&device
->dev
.kobj
, &platform_attribute_group
);
2318 /* Platform device ************************************************************/
2320 static int asus_wmi_platform_init(struct asus_wmi
*asus
)
2322 struct device
*dev
= &asus
->platform_device
->dev
;
2326 /* INIT enable hotkeys on some models */
2327 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT
, 0, 0, &rv
))
2328 pr_info("Initialization: %#x\n", rv
);
2330 /* We don't know yet what to do with this version... */
2331 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC
, 0, 0x9, &rv
)) {
2332 pr_info("BIOS WMI version: %d.%d\n", rv
>> 16, rv
& 0xFF);
2337 * The SFUN method probably allows the original driver to get the list
2338 * of features supported by a given model. For now, 0x0100 or 0x0800
2339 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
2340 * The significance of others is yet to be found.
2342 if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN
, 0, 0, &rv
)) {
2343 pr_info("SFUN value: %#x\n", rv
);
2348 * Eee PC and Notebooks seems to have different method_id for DSTS,
2349 * but it may also be related to the BIOS's SPEC.
2350 * Note, on most Eeepc, there is no way to check if a method exist
2351 * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
2352 * but once again, SPEC may probably be used for that kind of things.
2354 * Additionally at least TUF Gaming series laptops return nothing for
2355 * unknown methods, so the detection in this way is not possible.
2357 * There is strong indication that only ACPI WMI devices that have _UID
2358 * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
2360 wmi_uid
= wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID
);
2364 if (!strcmp(wmi_uid
, ASUS_ACPI_UID_ASUSWMI
)) {
2365 dev_info(dev
, "Detected ASUSWMI, use DCTS\n");
2366 asus
->dsts_id
= ASUS_WMI_METHODID_DCTS
;
2368 dev_info(dev
, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid
);
2369 asus
->dsts_id
= ASUS_WMI_METHODID_DSTS
;
2373 * Some devices can have multiple event codes stored in a queue before
2374 * the module load if it was unloaded intermittently after calling
2375 * the INIT method (enables event handling). The WMI notify handler is
2376 * expected to retrieve all event codes until a retrieved code equals
2377 * queue end marker (One or Ones). Old codes are flushed from the queue
2378 * upon module load. Not enabling this when it should be has minimal
2379 * visible impact so fall back if anything goes wrong.
2381 wmi_uid
= wmi_get_acpi_device_uid(asus
->driver
->event_guid
);
2382 if (wmi_uid
&& !strcmp(wmi_uid
, ASUS_ACPI_UID_ATK
)) {
2383 dev_info(dev
, "Detected ATK, enable event queue\n");
2385 if (!asus_wmi_notify_queue_flush(asus
))
2386 asus
->wmi_event_queue
= true;
2389 /* CWAP allow to define the behavior of the Fn+F2 key,
2390 * this method doesn't seems to be present on Eee PCs */
2391 if (asus
->driver
->quirks
->wapf
>= 0)
2392 asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP
,
2393 asus
->driver
->quirks
->wapf
, NULL
);
2398 /* debugfs ********************************************************************/
2400 struct asus_wmi_debugfs_node
{
2401 struct asus_wmi
*asus
;
2403 int (*show
) (struct seq_file
*m
, void *data
);
2406 static int show_dsts(struct seq_file
*m
, void *data
)
2408 struct asus_wmi
*asus
= m
->private;
2412 err
= asus_wmi_get_devstate(asus
, asus
->debug
.dev_id
, &retval
);
2416 seq_printf(m
, "DSTS(%#x) = %#x\n", asus
->debug
.dev_id
, retval
);
2421 static int show_devs(struct seq_file
*m
, void *data
)
2423 struct asus_wmi
*asus
= m
->private;
2427 err
= asus_wmi_set_devstate(asus
->debug
.dev_id
, asus
->debug
.ctrl_param
,
2432 seq_printf(m
, "DEVS(%#x, %#x) = %#x\n", asus
->debug
.dev_id
,
2433 asus
->debug
.ctrl_param
, retval
);
2438 static int show_call(struct seq_file
*m
, void *data
)
2440 struct asus_wmi
*asus
= m
->private;
2441 struct bios_args args
= {
2442 .arg0
= asus
->debug
.dev_id
,
2443 .arg1
= asus
->debug
.ctrl_param
,
2445 struct acpi_buffer input
= { (acpi_size
) sizeof(args
), &args
};
2446 struct acpi_buffer output
= { ACPI_ALLOCATE_BUFFER
, NULL
};
2447 union acpi_object
*obj
;
2450 status
= wmi_evaluate_method(ASUS_WMI_MGMT_GUID
,
2451 0, asus
->debug
.method_id
,
2454 if (ACPI_FAILURE(status
))
2457 obj
= (union acpi_object
*)output
.pointer
;
2458 if (obj
&& obj
->type
== ACPI_TYPE_INTEGER
)
2459 seq_printf(m
, "%#x(%#x, %#x) = %#x\n", asus
->debug
.method_id
,
2460 asus
->debug
.dev_id
, asus
->debug
.ctrl_param
,
2461 (u32
) obj
->integer
.value
);
2463 seq_printf(m
, "%#x(%#x, %#x) = t:%d\n", asus
->debug
.method_id
,
2464 asus
->debug
.dev_id
, asus
->debug
.ctrl_param
,
2465 obj
? obj
->type
: -1);
2472 static struct asus_wmi_debugfs_node asus_wmi_debug_files
[] = {
2473 {NULL
, "devs", show_devs
},
2474 {NULL
, "dsts", show_dsts
},
2475 {NULL
, "call", show_call
},
2478 static int asus_wmi_debugfs_open(struct inode
*inode
, struct file
*file
)
2480 struct asus_wmi_debugfs_node
*node
= inode
->i_private
;
2482 return single_open(file
, node
->show
, node
->asus
);
2485 static const struct file_operations asus_wmi_debugfs_io_ops
= {
2486 .owner
= THIS_MODULE
,
2487 .open
= asus_wmi_debugfs_open
,
2489 .llseek
= seq_lseek
,
2490 .release
= single_release
,
2493 static void asus_wmi_debugfs_exit(struct asus_wmi
*asus
)
2495 debugfs_remove_recursive(asus
->debug
.root
);
2498 static void asus_wmi_debugfs_init(struct asus_wmi
*asus
)
2502 asus
->debug
.root
= debugfs_create_dir(asus
->driver
->name
, NULL
);
2504 debugfs_create_x32("method_id", S_IRUGO
| S_IWUSR
, asus
->debug
.root
,
2505 &asus
->debug
.method_id
);
2507 debugfs_create_x32("dev_id", S_IRUGO
| S_IWUSR
, asus
->debug
.root
,
2508 &asus
->debug
.dev_id
);
2510 debugfs_create_x32("ctrl_param", S_IRUGO
| S_IWUSR
, asus
->debug
.root
,
2511 &asus
->debug
.ctrl_param
);
2513 for (i
= 0; i
< ARRAY_SIZE(asus_wmi_debug_files
); i
++) {
2514 struct asus_wmi_debugfs_node
*node
= &asus_wmi_debug_files
[i
];
2517 debugfs_create_file(node
->name
, S_IFREG
| S_IRUGO
,
2518 asus
->debug
.root
, node
,
2519 &asus_wmi_debugfs_io_ops
);
2523 /* Init / exit ****************************************************************/
2525 static int asus_wmi_add(struct platform_device
*pdev
)
2527 struct platform_driver
*pdrv
= to_platform_driver(pdev
->dev
.driver
);
2528 struct asus_wmi_driver
*wdrv
= to_asus_wmi_driver(pdrv
);
2529 struct asus_wmi
*asus
;
2530 const char *chassis_type
;
2535 asus
= kzalloc(sizeof(struct asus_wmi
), GFP_KERNEL
);
2539 asus
->driver
= wdrv
;
2540 asus
->platform_device
= pdev
;
2541 wdrv
->platform_device
= pdev
;
2542 platform_set_drvdata(asus
->platform_device
, asus
);
2544 if (wdrv
->detect_quirks
)
2545 wdrv
->detect_quirks(asus
->driver
);
2547 err
= asus_wmi_platform_init(asus
);
2551 err
= fan_boost_mode_check_present(asus
);
2553 goto fail_fan_boost_mode
;
2555 err
= throttle_thermal_policy_check_present(asus
);
2557 goto fail_throttle_thermal_policy
;
2559 throttle_thermal_policy_set_default(asus
);
2561 err
= asus_wmi_sysfs_init(asus
->platform_device
);
2565 err
= asus_wmi_input_init(asus
);
2569 err
= asus_wmi_fan_init(asus
); /* probably no problems on error */
2571 err
= asus_wmi_hwmon_init(asus
);
2575 err
= asus_wmi_led_init(asus
);
2579 asus_wmi_get_devstate(asus
, ASUS_WMI_DEVID_WLAN
, &result
);
2580 if (result
& (ASUS_WMI_DSTS_PRESENCE_BIT
| ASUS_WMI_DSTS_USER_BIT
))
2581 asus
->driver
->wlan_ctrl_by_user
= 1;
2583 if (!(asus
->driver
->wlan_ctrl_by_user
&& ashs_present())) {
2584 err
= asus_wmi_rfkill_init(asus
);
2589 if (asus
->driver
->quirks
->wmi_force_als_set
)
2592 /* Some Asus desktop boards export an acpi-video backlight interface,
2593 stop this from showing up */
2594 chassis_type
= dmi_get_system_info(DMI_CHASSIS_TYPE
);
2595 if (chassis_type
&& !strcmp(chassis_type
, "3"))
2596 acpi_video_set_dmi_backlight_type(acpi_backlight_vendor
);
2598 if (asus
->driver
->quirks
->wmi_backlight_power
)
2599 acpi_video_set_dmi_backlight_type(acpi_backlight_vendor
);
2601 if (asus
->driver
->quirks
->wmi_backlight_native
)
2602 acpi_video_set_dmi_backlight_type(acpi_backlight_native
);
2604 if (asus
->driver
->quirks
->xusb2pr
)
2605 asus_wmi_set_xusb2pr(asus
);
2607 if (acpi_video_get_backlight_type() == acpi_backlight_vendor
) {
2608 err
= asus_wmi_backlight_init(asus
);
2609 if (err
&& err
!= -ENODEV
)
2610 goto fail_backlight
;
2611 } else if (asus
->driver
->quirks
->wmi_backlight_set_devstate
)
2612 err
= asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT
, 2, NULL
);
2614 if (asus_wmi_has_fnlock_key(asus
)) {
2615 asus
->fnlock_locked
= true;
2616 asus_wmi_fnlock_update(asus
);
2619 status
= wmi_install_notify_handler(asus
->driver
->event_guid
,
2620 asus_wmi_notify
, asus
);
2621 if (ACPI_FAILURE(status
)) {
2622 pr_err("Unable to register notify handler - %d\n", status
);
2624 goto fail_wmi_handler
;
2627 asus_wmi_battery_init(asus
);
2629 asus_wmi_debugfs_init(asus
);
2634 asus_wmi_backlight_exit(asus
);
2636 asus_wmi_rfkill_exit(asus
);
2638 asus_wmi_led_exit(asus
);
2641 asus_wmi_input_exit(asus
);
2643 asus_wmi_sysfs_exit(asus
->platform_device
);
2645 fail_throttle_thermal_policy
:
2646 fail_fan_boost_mode
:
2652 static int asus_wmi_remove(struct platform_device
*device
)
2654 struct asus_wmi
*asus
;
2656 asus
= platform_get_drvdata(device
);
2657 wmi_remove_notify_handler(asus
->driver
->event_guid
);
2658 asus_wmi_backlight_exit(asus
);
2659 asus_wmi_input_exit(asus
);
2660 asus_wmi_led_exit(asus
);
2661 asus_wmi_rfkill_exit(asus
);
2662 asus_wmi_debugfs_exit(asus
);
2663 asus_wmi_sysfs_exit(asus
->platform_device
);
2664 asus_fan_set_auto(asus
);
2665 asus_wmi_battery_exit(asus
);
2671 /* Platform driver - hibernate/resume callbacks *******************************/
2673 static int asus_hotk_thaw(struct device
*device
)
2675 struct asus_wmi
*asus
= dev_get_drvdata(device
);
2677 if (asus
->wlan
.rfkill
) {
2681 * Work around bios bug - acpi _PTS turns off the wireless led
2682 * during suspend. Normally it restores it on resume, but
2683 * we should kick it ourselves in case hibernation is aborted.
2685 wlan
= asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WLAN
);
2686 asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN
, wlan
, NULL
);
2692 static int asus_hotk_resume(struct device
*device
)
2694 struct asus_wmi
*asus
= dev_get_drvdata(device
);
2696 if (!IS_ERR_OR_NULL(asus
->kbd_led
.dev
))
2697 kbd_led_update(asus
);
2699 if (asus_wmi_has_fnlock_key(asus
))
2700 asus_wmi_fnlock_update(asus
);
2704 static int asus_hotk_restore(struct device
*device
)
2706 struct asus_wmi
*asus
= dev_get_drvdata(device
);
2709 /* Refresh both wlan rfkill state and pci hotplug */
2710 if (asus
->wlan
.rfkill
)
2711 asus_rfkill_hotplug(asus
);
2713 if (asus
->bluetooth
.rfkill
) {
2714 bl
= !asus_wmi_get_devstate_simple(asus
,
2715 ASUS_WMI_DEVID_BLUETOOTH
);
2716 rfkill_set_sw_state(asus
->bluetooth
.rfkill
, bl
);
2718 if (asus
->wimax
.rfkill
) {
2719 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WIMAX
);
2720 rfkill_set_sw_state(asus
->wimax
.rfkill
, bl
);
2722 if (asus
->wwan3g
.rfkill
) {
2723 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_WWAN3G
);
2724 rfkill_set_sw_state(asus
->wwan3g
.rfkill
, bl
);
2726 if (asus
->gps
.rfkill
) {
2727 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_GPS
);
2728 rfkill_set_sw_state(asus
->gps
.rfkill
, bl
);
2730 if (asus
->uwb
.rfkill
) {
2731 bl
= !asus_wmi_get_devstate_simple(asus
, ASUS_WMI_DEVID_UWB
);
2732 rfkill_set_sw_state(asus
->uwb
.rfkill
, bl
);
2734 if (!IS_ERR_OR_NULL(asus
->kbd_led
.dev
))
2735 kbd_led_update(asus
);
2737 if (asus_wmi_has_fnlock_key(asus
))
2738 asus_wmi_fnlock_update(asus
);
2742 static const struct dev_pm_ops asus_pm_ops
= {
2743 .thaw
= asus_hotk_thaw
,
2744 .restore
= asus_hotk_restore
,
2745 .resume
= asus_hotk_resume
,
2748 /* Registration ***************************************************************/
2750 static int asus_wmi_probe(struct platform_device
*pdev
)
2752 struct platform_driver
*pdrv
= to_platform_driver(pdev
->dev
.driver
);
2753 struct asus_wmi_driver
*wdrv
= to_asus_wmi_driver(pdrv
);
2756 if (!wmi_has_guid(ASUS_WMI_MGMT_GUID
)) {
2757 pr_warn("ASUS Management GUID not found\n");
2761 if (wdrv
->event_guid
&& !wmi_has_guid(wdrv
->event_guid
)) {
2762 pr_warn("ASUS Event GUID not found\n");
2767 ret
= wdrv
->probe(pdev
);
2772 return asus_wmi_add(pdev
);
2777 int __init_or_module
asus_wmi_register_driver(struct asus_wmi_driver
*driver
)
2779 struct platform_driver
*platform_driver
;
2780 struct platform_device
*platform_device
;
2785 platform_driver
= &driver
->platform_driver
;
2786 platform_driver
->remove
= asus_wmi_remove
;
2787 platform_driver
->driver
.owner
= driver
->owner
;
2788 platform_driver
->driver
.name
= driver
->name
;
2789 platform_driver
->driver
.pm
= &asus_pm_ops
;
2791 platform_device
= platform_create_bundle(platform_driver
,
2794 if (IS_ERR(platform_device
))
2795 return PTR_ERR(platform_device
);
2800 EXPORT_SYMBOL_GPL(asus_wmi_register_driver
);
2802 void asus_wmi_unregister_driver(struct asus_wmi_driver
*driver
)
2804 platform_device_unregister(driver
->platform_device
);
2805 platform_driver_unregister(&driver
->platform_driver
);
2808 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver
);
2810 static int __init
asus_wmi_init(void)
2812 pr_info("ASUS WMI generic driver loaded\n");
2816 static void __exit
asus_wmi_exit(void)
2818 pr_info("ASUS WMI generic driver unloaded\n");
2821 module_init(asus_wmi_init
);
2822 module_exit(asus_wmi_exit
);