xref: /linux/drivers/platform/x86/asus-wmi.c (revision da51bbcdbace8f43adf6066934c3926b656376e5)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Asus PC WMI hotkey driver
4  *
5  * Copyright(C) 2010 Intel Corporation.
6  * Copyright(C) 2010-2011 Corentin Chary <corentin.chary@gmail.com>
7  *
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>
12  */
13 
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 
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/fb.h>
22 #include <linux/hwmon.h>
23 #include <linux/hwmon-sysfs.h>
24 #include <linux/init.h>
25 #include <linux/input.h>
26 #include <linux/input/sparse-keymap.h>
27 #include <linux/kernel.h>
28 #include <linux/leds.h>
29 #include <linux/minmax.h>
30 #include <linux/module.h>
31 #include <linux/pci.h>
32 #include <linux/pci_hotplug.h>
33 #include <linux/platform_data/x86/asus-wmi.h>
34 #include <linux/platform_device.h>
35 #include <linux/platform_profile.h>
36 #include <linux/power_supply.h>
37 #include <linux/rfkill.h>
38 #include <linux/seq_file.h>
39 #include <linux/slab.h>
40 #include <linux/types.h>
41 #include <linux/units.h>
42 
43 #include <acpi/battery.h>
44 #include <acpi/video.h>
45 
46 #include "asus-wmi.h"
47 
48 MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>");
49 MODULE_AUTHOR("Yong Wang <yong.y.wang@intel.com>");
50 MODULE_DESCRIPTION("Asus Generic WMI Driver");
51 MODULE_LICENSE("GPL");
52 
53 static bool fnlock_default = true;
54 module_param(fnlock_default, bool, 0444);
55 
56 #define to_asus_wmi_driver(pdrv)					\
57 	(container_of((pdrv), struct asus_wmi_driver, platform_driver))
58 
59 #define ASUS_WMI_MGMT_GUID	"97845ED0-4E6D-11DE-8A39-0800200C9A66"
60 
61 #define NOTIFY_BRNUP_MIN		0x11
62 #define NOTIFY_BRNUP_MAX		0x1f
63 #define NOTIFY_BRNDOWN_MIN		0x20
64 #define NOTIFY_BRNDOWN_MAX		0x2e
65 #define NOTIFY_FNLOCK_TOGGLE		0x4e
66 #define NOTIFY_KBD_DOCK_CHANGE		0x75
67 #define NOTIFY_KBD_BRTUP		0xc4
68 #define NOTIFY_KBD_BRTDWN		0xc5
69 #define NOTIFY_KBD_BRTTOGGLE		0xc7
70 #define NOTIFY_KBD_FBM			0x99
71 #define NOTIFY_KBD_TTP			0xae
72 #define NOTIFY_LID_FLIP			0xfa
73 #define NOTIFY_LID_FLIP_ROG		0xbd
74 
75 #define ASUS_WMI_FNLOCK_BIOS_DISABLED	BIT(0)
76 
77 #define ASUS_MID_FAN_DESC		"mid_fan"
78 #define ASUS_GPU_FAN_DESC		"gpu_fan"
79 #define ASUS_FAN_DESC			"cpu_fan"
80 #define ASUS_FAN_MFUN			0x13
81 #define ASUS_FAN_SFUN_READ		0x06
82 #define ASUS_FAN_SFUN_WRITE		0x07
83 
84 /* Based on standard hwmon pwmX_enable values */
85 #define ASUS_FAN_CTRL_FULLSPEED		0
86 #define ASUS_FAN_CTRL_MANUAL		1
87 #define ASUS_FAN_CTRL_AUTO		2
88 
89 #define ASUS_FAN_BOOST_MODE_NORMAL		0
90 #define ASUS_FAN_BOOST_MODE_OVERBOOST		1
91 #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK	0x01
92 #define ASUS_FAN_BOOST_MODE_SILENT		2
93 #define ASUS_FAN_BOOST_MODE_SILENT_MASK		0x02
94 #define ASUS_FAN_BOOST_MODES_MASK		0x03
95 
96 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT	0
97 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST	1
98 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT	2
99 
100 #define USB_INTEL_XUSB2PR		0xD0
101 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI	0x9c31
102 
103 #define ASUS_ACPI_UID_ASUSWMI		"ASUSWMI"
104 
105 #define WMI_EVENT_MASK			0xFFFF
106 
107 #define FAN_CURVE_POINTS		8
108 #define FAN_CURVE_BUF_LEN		32
109 #define FAN_CURVE_DEV_CPU		0x00
110 #define FAN_CURVE_DEV_GPU		0x01
111 #define FAN_CURVE_DEV_MID		0x02
112 /* Mask to determine if setting temperature or percentage */
113 #define FAN_CURVE_PWM_MASK		0x04
114 
115 /* Limits for tunables available on ASUS ROG laptops */
116 #define PPT_TOTAL_MIN		5
117 #define PPT_TOTAL_MAX		250
118 #define PPT_CPU_MIN			5
119 #define PPT_CPU_MAX			130
120 #define NVIDIA_BOOST_MIN	5
121 #define NVIDIA_BOOST_MAX	25
122 #define NVIDIA_TEMP_MIN		75
123 #define NVIDIA_TEMP_MAX		87
124 
125 #define ASUS_SCREENPAD_BRIGHT_MIN 20
126 #define ASUS_SCREENPAD_BRIGHT_MAX 255
127 #define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
128 
129 /* Controls the power state of the USB0 hub on ROG Ally which input is on */
130 #define ASUS_USB0_PWR_EC0_CSEE "\\_SB.PCI0.SBRG.EC0.CSEE"
131 /* 300ms so far seems to produce a reliable result on AC and battery */
132 #define ASUS_USB0_PWR_EC0_CSEE_WAIT 300
133 
134 static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
135 
136 static int throttle_thermal_policy_write(struct asus_wmi *);
137 
138 static bool ashs_present(void)
139 {
140 	int i = 0;
141 	while (ashs_ids[i]) {
142 		if (acpi_dev_found(ashs_ids[i++]))
143 			return true;
144 	}
145 	return false;
146 }
147 
148 struct bios_args {
149 	u32 arg0;
150 	u32 arg1;
151 	u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */
152 	u32 arg3;
153 	u32 arg4; /* Some ROG laptops require a full 5 input args */
154 	u32 arg5;
155 } __packed;
156 
157 /*
158  * Struct that's used for all methods called via AGFN. Naming is
159  * identically to the AML code.
160  */
161 struct agfn_args {
162 	u16 mfun; /* probably "Multi-function" to be called */
163 	u16 sfun; /* probably "Sub-function" to be called */
164 	u16 len;  /* size of the hole struct, including subfunction fields */
165 	u8 stas;  /* not used by now */
166 	u8 err;   /* zero on success */
167 } __packed;
168 
169 /* struct used for calling fan read and write methods */
170 struct agfn_fan_args {
171 	struct agfn_args agfn;	/* common fields */
172 	u8 fan;			/* fan number: 0: set auto mode 1: 1st fan */
173 	u32 speed;		/* read: RPM/100 - write: 0-255 */
174 } __packed;
175 
176 /*
177  * <platform>/    - debugfs root directory
178  *   dev_id      - current dev_id
179  *   ctrl_param  - current ctrl_param
180  *   method_id   - current method_id
181  *   devs        - call DEVS(dev_id, ctrl_param) and print result
182  *   dsts        - call DSTS(dev_id)  and print result
183  *   call        - call method_id(dev_id, ctrl_param) and print result
184  */
185 struct asus_wmi_debug {
186 	struct dentry *root;
187 	u32 method_id;
188 	u32 dev_id;
189 	u32 ctrl_param;
190 };
191 
192 struct asus_rfkill {
193 	struct asus_wmi *asus;
194 	struct rfkill *rfkill;
195 	u32 dev_id;
196 };
197 
198 enum fan_type {
199 	FAN_TYPE_NONE = 0,
200 	FAN_TYPE_AGFN,		/* deprecated on newer platforms */
201 	FAN_TYPE_SPEC83,	/* starting in Spec 8.3, use CPU_FAN_CTRL */
202 };
203 
204 struct fan_curve_data {
205 	bool enabled;
206 	u32 device_id;
207 	u8 temps[FAN_CURVE_POINTS];
208 	u8 percents[FAN_CURVE_POINTS];
209 };
210 
211 struct asus_wmi {
212 	int dsts_id;
213 	int spec;
214 	int sfun;
215 
216 	struct input_dev *inputdev;
217 	struct backlight_device *backlight_device;
218 	struct backlight_device *screenpad_backlight_device;
219 	struct platform_device *platform_device;
220 
221 	struct led_classdev wlan_led;
222 	int wlan_led_wk;
223 	struct led_classdev tpd_led;
224 	int tpd_led_wk;
225 	struct led_classdev kbd_led;
226 	int kbd_led_wk;
227 	struct led_classdev lightbar_led;
228 	int lightbar_led_wk;
229 	struct led_classdev micmute_led;
230 	struct workqueue_struct *led_workqueue;
231 	struct work_struct tpd_led_work;
232 	struct work_struct wlan_led_work;
233 	struct work_struct lightbar_led_work;
234 
235 	struct asus_rfkill wlan;
236 	struct asus_rfkill bluetooth;
237 	struct asus_rfkill wimax;
238 	struct asus_rfkill wwan3g;
239 	struct asus_rfkill gps;
240 	struct asus_rfkill uwb;
241 
242 	int tablet_switch_event_code;
243 	u32 tablet_switch_dev_id;
244 	bool tablet_switch_inverted;
245 
246 	enum fan_type fan_type;
247 	enum fan_type gpu_fan_type;
248 	enum fan_type mid_fan_type;
249 	int fan_pwm_mode;
250 	int gpu_fan_pwm_mode;
251 	int mid_fan_pwm_mode;
252 	int agfn_pwm;
253 
254 	bool fan_boost_mode_available;
255 	u8 fan_boost_mode_mask;
256 	u8 fan_boost_mode;
257 
258 	bool charge_mode_available;
259 	bool egpu_enable_available;
260 	bool egpu_connect_available;
261 	bool dgpu_disable_available;
262 	bool gpu_mux_mode_available;
263 
264 	/* Tunables provided by ASUS for gaming laptops */
265 	bool ppt_pl2_sppt_available;
266 	bool ppt_pl1_spl_available;
267 	bool ppt_apu_sppt_available;
268 	bool ppt_plat_sppt_available;
269 	bool ppt_fppt_available;
270 	bool nv_dyn_boost_available;
271 	bool nv_temp_tgt_available;
272 
273 	bool kbd_rgb_mode_available;
274 	bool kbd_rgb_state_available;
275 
276 	bool throttle_thermal_policy_available;
277 	u8 throttle_thermal_policy_mode;
278 
279 	bool cpu_fan_curve_available;
280 	bool gpu_fan_curve_available;
281 	bool mid_fan_curve_available;
282 	struct fan_curve_data custom_fan_curves[3];
283 
284 	struct platform_profile_handler platform_profile_handler;
285 	bool platform_profile_support;
286 
287 	// The RSOC controls the maximum charging percentage.
288 	bool battery_rsoc_available;
289 
290 	bool panel_overdrive_available;
291 	bool mini_led_mode_available;
292 
293 	struct hotplug_slot hotplug_slot;
294 	struct mutex hotplug_lock;
295 	struct mutex wmi_lock;
296 	struct workqueue_struct *hotplug_workqueue;
297 	struct work_struct hotplug_work;
298 
299 	bool fnlock_locked;
300 
301 	/* The ROG Ally device requires the MCU USB device be disconnected before suspend */
302 	bool ally_mcu_usb_switch;
303 
304 	struct asus_wmi_debug debug;
305 
306 	struct asus_wmi_driver *driver;
307 };
308 
309 /* WMI ************************************************************************/
310 
311 static int asus_wmi_evaluate_method3(u32 method_id,
312 		u32 arg0, u32 arg1, u32 arg2, u32 *retval)
313 {
314 	struct bios_args args = {
315 		.arg0 = arg0,
316 		.arg1 = arg1,
317 		.arg2 = arg2,
318 	};
319 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
320 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
321 	acpi_status status;
322 	union acpi_object *obj;
323 	u32 tmp = 0;
324 
325 	status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
326 				     &input, &output);
327 
328 	if (ACPI_FAILURE(status))
329 		return -EIO;
330 
331 	obj = (union acpi_object *)output.pointer;
332 	if (obj && obj->type == ACPI_TYPE_INTEGER)
333 		tmp = (u32) obj->integer.value;
334 
335 	if (retval)
336 		*retval = tmp;
337 
338 	kfree(obj);
339 
340 	if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
341 		return -ENODEV;
342 
343 	return 0;
344 }
345 
346 int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
347 {
348 	return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval);
349 }
350 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
351 
352 static int asus_wmi_evaluate_method5(u32 method_id,
353 		u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *retval)
354 {
355 	struct bios_args args = {
356 		.arg0 = arg0,
357 		.arg1 = arg1,
358 		.arg2 = arg2,
359 		.arg3 = arg3,
360 		.arg4 = arg4,
361 	};
362 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
363 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
364 	acpi_status status;
365 	union acpi_object *obj;
366 	u32 tmp = 0;
367 
368 	status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
369 				     &input, &output);
370 
371 	if (ACPI_FAILURE(status))
372 		return -EIO;
373 
374 	obj = (union acpi_object *)output.pointer;
375 	if (obj && obj->type == ACPI_TYPE_INTEGER)
376 		tmp = (u32) obj->integer.value;
377 
378 	if (retval)
379 		*retval = tmp;
380 
381 	kfree(obj);
382 
383 	if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
384 		return -ENODEV;
385 
386 	return 0;
387 }
388 
389 /*
390  * Returns as an error if the method output is not a buffer. Typically this
391  * means that the method called is unsupported.
392  */
393 static int asus_wmi_evaluate_method_buf(u32 method_id,
394 		u32 arg0, u32 arg1, u8 *ret_buffer, size_t size)
395 {
396 	struct bios_args args = {
397 		.arg0 = arg0,
398 		.arg1 = arg1,
399 		.arg2 = 0,
400 	};
401 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
402 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
403 	acpi_status status;
404 	union acpi_object *obj;
405 	int err = 0;
406 
407 	status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
408 				     &input, &output);
409 
410 	if (ACPI_FAILURE(status))
411 		return -EIO;
412 
413 	obj = (union acpi_object *)output.pointer;
414 
415 	switch (obj->type) {
416 	case ACPI_TYPE_BUFFER:
417 		if (obj->buffer.length > size) {
418 			err = -ENOSPC;
419 			break;
420 		}
421 		if (obj->buffer.length == 0) {
422 			err = -ENODATA;
423 			break;
424 		}
425 
426 		memcpy(ret_buffer, obj->buffer.pointer, obj->buffer.length);
427 		break;
428 	case ACPI_TYPE_INTEGER:
429 		err = (u32)obj->integer.value;
430 
431 		if (err == ASUS_WMI_UNSUPPORTED_METHOD)
432 			err = -ENODEV;
433 		/*
434 		 * At least one method returns a 0 with no buffer if no arg
435 		 * is provided, such as ASUS_WMI_DEVID_CPU_FAN_CURVE
436 		 */
437 		if (err == 0)
438 			err = -ENODATA;
439 		break;
440 	default:
441 		err = -ENODATA;
442 		break;
443 	}
444 
445 	kfree(obj);
446 
447 	if (err)
448 		return err;
449 
450 	return 0;
451 }
452 
453 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
454 {
455 	struct acpi_buffer input;
456 	u64 phys_addr;
457 	u32 retval;
458 	u32 status;
459 
460 	/*
461 	 * Copy to dma capable address otherwise memory corruption occurs as
462 	 * bios has to be able to access it.
463 	 */
464 	input.pointer = kmemdup(args.pointer, args.length, GFP_DMA | GFP_KERNEL);
465 	input.length = args.length;
466 	if (!input.pointer)
467 		return -ENOMEM;
468 	phys_addr = virt_to_phys(input.pointer);
469 
470 	status = asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN,
471 					phys_addr, 0, &retval);
472 	if (!status)
473 		memcpy(args.pointer, input.pointer, args.length);
474 
475 	kfree(input.pointer);
476 	if (status)
477 		return -ENXIO;
478 
479 	return retval;
480 }
481 
482 static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
483 {
484 	int err;
485 
486 	err = asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
487 
488 	if (err)
489 		return err;
490 
491 	if (*retval == ~0)
492 		return -ENODEV;
493 
494 	return 0;
495 }
496 
497 static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
498 				 u32 *retval)
499 {
500 	return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
501 					ctrl_param, retval);
502 }
503 
504 /* Helper for special devices with magic return codes */
505 static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
506 				      u32 dev_id, u32 mask)
507 {
508 	u32 retval = 0;
509 	int err;
510 
511 	err = asus_wmi_get_devstate(asus, dev_id, &retval);
512 	if (err < 0)
513 		return err;
514 
515 	if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
516 		return -ENODEV;
517 
518 	if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
519 		if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
520 			return -ENODEV;
521 	}
522 
523 	return retval & mask;
524 }
525 
526 static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
527 {
528 	return asus_wmi_get_devstate_bits(asus, dev_id,
529 					  ASUS_WMI_DSTS_STATUS_BIT);
530 }
531 
532 static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
533 {
534 	u32 retval;
535 	int status = asus_wmi_get_devstate(asus, dev_id, &retval);
536 
537 	return status == 0 && (retval & ASUS_WMI_DSTS_PRESENCE_BIT);
538 }
539 
540 /* Input **********************************************************************/
541 static void asus_wmi_tablet_sw_report(struct asus_wmi *asus, bool value)
542 {
543 	input_report_switch(asus->inputdev, SW_TABLET_MODE,
544 			    asus->tablet_switch_inverted ? !value : value);
545 	input_sync(asus->inputdev);
546 }
547 
548 static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code)
549 {
550 	struct device *dev = &asus->platform_device->dev;
551 	int result;
552 
553 	result = asus_wmi_get_devstate_simple(asus, dev_id);
554 	if (result >= 0) {
555 		input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
556 		asus_wmi_tablet_sw_report(asus, result);
557 		asus->tablet_switch_dev_id = dev_id;
558 		asus->tablet_switch_event_code = event_code;
559 	} else if (result == -ENODEV) {
560 		dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
561 	} else {
562 		dev_err(dev, "Error checking for tablet-mode-switch: %d\n", result);
563 	}
564 }
565 
566 static int asus_wmi_input_init(struct asus_wmi *asus)
567 {
568 	struct device *dev = &asus->platform_device->dev;
569 	int err;
570 
571 	asus->inputdev = input_allocate_device();
572 	if (!asus->inputdev)
573 		return -ENOMEM;
574 
575 	asus->inputdev->name = asus->driver->input_name;
576 	asus->inputdev->phys = asus->driver->input_phys;
577 	asus->inputdev->id.bustype = BUS_HOST;
578 	asus->inputdev->dev.parent = dev;
579 	set_bit(EV_REP, asus->inputdev->evbit);
580 
581 	err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
582 	if (err)
583 		goto err_free_dev;
584 
585 	switch (asus->driver->quirks->tablet_switch_mode) {
586 	case asus_wmi_no_tablet_switch:
587 		break;
588 	case asus_wmi_kbd_dock_devid:
589 		asus->tablet_switch_inverted = true;
590 		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE);
591 		break;
592 	case asus_wmi_lid_flip_devid:
593 		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP, NOTIFY_LID_FLIP);
594 		break;
595 	case asus_wmi_lid_flip_rog_devid:
596 		asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP_ROG, NOTIFY_LID_FLIP_ROG);
597 		break;
598 	}
599 
600 	err = input_register_device(asus->inputdev);
601 	if (err)
602 		goto err_free_dev;
603 
604 	return 0;
605 
606 err_free_dev:
607 	input_free_device(asus->inputdev);
608 	return err;
609 }
610 
611 static void asus_wmi_input_exit(struct asus_wmi *asus)
612 {
613 	if (asus->inputdev)
614 		input_unregister_device(asus->inputdev);
615 
616 	asus->inputdev = NULL;
617 }
618 
619 /* Tablet mode ****************************************************************/
620 
621 static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus)
622 {
623 	int result;
624 
625 	if (!asus->tablet_switch_dev_id)
626 		return;
627 
628 	result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id);
629 	if (result >= 0)
630 		asus_wmi_tablet_sw_report(asus, result);
631 }
632 
633 /* Charging mode, 1=Barrel, 2=USB ******************************************/
634 static ssize_t charge_mode_show(struct device *dev,
635 				   struct device_attribute *attr, char *buf)
636 {
637 	struct asus_wmi *asus = dev_get_drvdata(dev);
638 	int result, value;
639 
640 	result = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CHARGE_MODE, &value);
641 	if (result < 0)
642 		return result;
643 
644 	return sysfs_emit(buf, "%d\n", value & 0xff);
645 }
646 
647 static DEVICE_ATTR_RO(charge_mode);
648 
649 /* dGPU ********************************************************************/
650 static ssize_t dgpu_disable_show(struct device *dev,
651 				   struct device_attribute *attr, char *buf)
652 {
653 	struct asus_wmi *asus = dev_get_drvdata(dev);
654 	int result;
655 
656 	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
657 	if (result < 0)
658 		return result;
659 
660 	return sysfs_emit(buf, "%d\n", result);
661 }
662 
663 /*
664  * A user may be required to store the value twice, typcial store first, then
665  * rescan PCI bus to activate power, then store a second time to save correctly.
666  * The reason for this is that an extra code path in the ACPI is enabled when
667  * the device and bus are powered.
668  */
669 static ssize_t dgpu_disable_store(struct device *dev,
670 				    struct device_attribute *attr,
671 				    const char *buf, size_t count)
672 {
673 	int result, err;
674 	u32 disable;
675 
676 	struct asus_wmi *asus = dev_get_drvdata(dev);
677 
678 	result = kstrtou32(buf, 10, &disable);
679 	if (result)
680 		return result;
681 
682 	if (disable > 1)
683 		return -EINVAL;
684 
685 	if (asus->gpu_mux_mode_available) {
686 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
687 		if (result < 0)
688 			/* An error here may signal greater failure of GPU handling */
689 			return result;
690 		if (!result && disable) {
691 			err = -ENODEV;
692 			pr_warn("Can not disable dGPU when the MUX is in dGPU mode: %d\n", err);
693 			return err;
694 		}
695 	}
696 
697 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU, disable, &result);
698 	if (err) {
699 		pr_warn("Failed to set dgpu disable: %d\n", err);
700 		return err;
701 	}
702 
703 	if (result > 1) {
704 		pr_warn("Failed to set dgpu disable (result): 0x%x\n", result);
705 		return -EIO;
706 	}
707 
708 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "dgpu_disable");
709 
710 	return count;
711 }
712 static DEVICE_ATTR_RW(dgpu_disable);
713 
714 /* eGPU ********************************************************************/
715 static ssize_t egpu_enable_show(struct device *dev,
716 				   struct device_attribute *attr, char *buf)
717 {
718 	struct asus_wmi *asus = dev_get_drvdata(dev);
719 	int result;
720 
721 	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
722 	if (result < 0)
723 		return result;
724 
725 	return sysfs_emit(buf, "%d\n", result);
726 }
727 
728 /* The ACPI call to enable the eGPU also disables the internal dGPU */
729 static ssize_t egpu_enable_store(struct device *dev,
730 				    struct device_attribute *attr,
731 				    const char *buf, size_t count)
732 {
733 	int result, err;
734 	u32 enable;
735 
736 	struct asus_wmi *asus = dev_get_drvdata(dev);
737 
738 	err = kstrtou32(buf, 10, &enable);
739 	if (err)
740 		return err;
741 
742 	if (enable > 1)
743 		return -EINVAL;
744 
745 	err = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
746 	if (err < 0) {
747 		pr_warn("Failed to get egpu connection status: %d\n", err);
748 		return err;
749 	}
750 
751 	if (asus->gpu_mux_mode_available) {
752 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
753 		if (result < 0) {
754 			/* An error here may signal greater failure of GPU handling */
755 			pr_warn("Failed to get gpu mux status: %d\n", result);
756 			return result;
757 		}
758 		if (!result && enable) {
759 			err = -ENODEV;
760 			pr_warn("Can not enable eGPU when the MUX is in dGPU mode: %d\n", err);
761 			return err;
762 		}
763 	}
764 
765 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU, enable, &result);
766 	if (err) {
767 		pr_warn("Failed to set egpu state: %d\n", err);
768 		return err;
769 	}
770 
771 	if (result > 1) {
772 		pr_warn("Failed to set egpu state (retval): 0x%x\n", result);
773 		return -EIO;
774 	}
775 
776 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "egpu_enable");
777 
778 	return count;
779 }
780 static DEVICE_ATTR_RW(egpu_enable);
781 
782 /* Is eGPU connected? *********************************************************/
783 static ssize_t egpu_connected_show(struct device *dev,
784 				   struct device_attribute *attr, char *buf)
785 {
786 	struct asus_wmi *asus = dev_get_drvdata(dev);
787 	int result;
788 
789 	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
790 	if (result < 0)
791 		return result;
792 
793 	return sysfs_emit(buf, "%d\n", result);
794 }
795 
796 static DEVICE_ATTR_RO(egpu_connected);
797 
798 /* gpu mux switch *************************************************************/
799 static ssize_t gpu_mux_mode_show(struct device *dev,
800 				 struct device_attribute *attr, char *buf)
801 {
802 	struct asus_wmi *asus = dev_get_drvdata(dev);
803 	int result;
804 
805 	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
806 	if (result < 0)
807 		return result;
808 
809 	return sysfs_emit(buf, "%d\n", result);
810 }
811 
812 static ssize_t gpu_mux_mode_store(struct device *dev,
813 				  struct device_attribute *attr,
814 				  const char *buf, size_t count)
815 {
816 	struct asus_wmi *asus = dev_get_drvdata(dev);
817 	int result, err;
818 	u32 optimus;
819 
820 	err = kstrtou32(buf, 10, &optimus);
821 	if (err)
822 		return err;
823 
824 	if (optimus > 1)
825 		return -EINVAL;
826 
827 	if (asus->dgpu_disable_available) {
828 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
829 		if (result < 0)
830 			/* An error here may signal greater failure of GPU handling */
831 			return result;
832 		if (result && !optimus) {
833 			err = -ENODEV;
834 			pr_warn("Can not switch MUX to dGPU mode when dGPU is disabled: %d\n", err);
835 			return err;
836 		}
837 	}
838 
839 	if (asus->egpu_enable_available) {
840 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
841 		if (result < 0)
842 			/* An error here may signal greater failure of GPU handling */
843 			return result;
844 		if (result && !optimus) {
845 			err = -ENODEV;
846 			pr_warn("Can not switch MUX to dGPU mode when eGPU is enabled: %d\n", err);
847 			return err;
848 		}
849 	}
850 
851 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_MUX, optimus, &result);
852 	if (err) {
853 		dev_err(dev, "Failed to set GPU MUX mode: %d\n", err);
854 		return err;
855 	}
856 	/* !1 is considered a fail by ASUS */
857 	if (result != 1) {
858 		dev_warn(dev, "Failed to set GPU MUX mode (result): 0x%x\n", result);
859 		return -EIO;
860 	}
861 
862 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "gpu_mux_mode");
863 
864 	return count;
865 }
866 static DEVICE_ATTR_RW(gpu_mux_mode);
867 
868 /* TUF Laptop Keyboard RGB Modes **********************************************/
869 static ssize_t kbd_rgb_mode_store(struct device *dev,
870 				 struct device_attribute *attr,
871 				 const char *buf, size_t count)
872 {
873 	u32 cmd, mode, r, g, b, speed;
874 	int err;
875 
876 	if (sscanf(buf, "%d %d %d %d %d %d", &cmd, &mode, &r, &g, &b, &speed) != 6)
877 		return -EINVAL;
878 
879 	/* B3 is set and B4 is save to BIOS */
880 	switch (cmd) {
881 	case 0:
882 		cmd = 0xb3;
883 		break;
884 	case 1:
885 		cmd = 0xb4;
886 		break;
887 	default:
888 		return -EINVAL;
889 	}
890 
891 	/* These are the known usable modes across all TUF/ROG */
892 	if (mode >= 12 || mode == 9)
893 		mode = 10;
894 
895 	switch (speed) {
896 	case 0:
897 		speed = 0xe1;
898 		break;
899 	case 1:
900 		speed = 0xeb;
901 		break;
902 	case 2:
903 		speed = 0xf5;
904 		break;
905 	default:
906 		speed = 0xeb;
907 	}
908 
909 	err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, ASUS_WMI_DEVID_TUF_RGB_MODE,
910 			cmd | (mode << 8) | (r << 16) | (g << 24), b | (speed << 8), NULL);
911 	if (err)
912 		return err;
913 
914 	return count;
915 }
916 static DEVICE_ATTR_WO(kbd_rgb_mode);
917 
918 static ssize_t kbd_rgb_mode_index_show(struct device *device,
919 						 struct device_attribute *attr,
920 						 char *buf)
921 {
922 	return sysfs_emit(buf, "%s\n", "cmd mode red green blue speed");
923 }
924 static DEVICE_ATTR_RO(kbd_rgb_mode_index);
925 
926 static struct attribute *kbd_rgb_mode_attrs[] = {
927 	&dev_attr_kbd_rgb_mode.attr,
928 	&dev_attr_kbd_rgb_mode_index.attr,
929 	NULL,
930 };
931 
932 static const struct attribute_group kbd_rgb_mode_group = {
933 	.attrs = kbd_rgb_mode_attrs,
934 };
935 
936 /* TUF Laptop Keyboard RGB State **********************************************/
937 static ssize_t kbd_rgb_state_store(struct device *dev,
938 				 struct device_attribute *attr,
939 				 const char *buf, size_t count)
940 {
941 	u32 flags, cmd, boot, awake, sleep, keyboard;
942 	int err;
943 
944 	if (sscanf(buf, "%d %d %d %d %d", &cmd, &boot, &awake, &sleep, &keyboard) != 5)
945 		return -EINVAL;
946 
947 	if (cmd)
948 		cmd = BIT(2);
949 
950 	flags = 0;
951 	if (boot)
952 		flags |= BIT(1);
953 	if (awake)
954 		flags |= BIT(3);
955 	if (sleep)
956 		flags |= BIT(5);
957 	if (keyboard)
958 		flags |= BIT(7);
959 
960 	/* 0xbd is the required default arg0 for the method. Nothing happens otherwise */
961 	err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS,
962 			ASUS_WMI_DEVID_TUF_RGB_STATE, 0xbd | cmd << 8 | (flags << 16), 0, NULL);
963 	if (err)
964 		return err;
965 
966 	return count;
967 }
968 static DEVICE_ATTR_WO(kbd_rgb_state);
969 
970 static ssize_t kbd_rgb_state_index_show(struct device *device,
971 						 struct device_attribute *attr,
972 						 char *buf)
973 {
974 	return sysfs_emit(buf, "%s\n", "cmd boot awake sleep keyboard");
975 }
976 static DEVICE_ATTR_RO(kbd_rgb_state_index);
977 
978 static struct attribute *kbd_rgb_state_attrs[] = {
979 	&dev_attr_kbd_rgb_state.attr,
980 	&dev_attr_kbd_rgb_state_index.attr,
981 	NULL,
982 };
983 
984 static const struct attribute_group kbd_rgb_state_group = {
985 	.attrs = kbd_rgb_state_attrs,
986 };
987 
988 static const struct attribute_group *kbd_rgb_mode_groups[] = {
989 	NULL,
990 	NULL,
991 	NULL,
992 };
993 
994 /* Tunable: PPT: Intel=PL1, AMD=SPPT *****************************************/
995 static ssize_t ppt_pl2_sppt_store(struct device *dev,
996 				    struct device_attribute *attr,
997 				    const char *buf, size_t count)
998 {
999 	int result, err;
1000 	u32 value;
1001 
1002 	struct asus_wmi *asus = dev_get_drvdata(dev);
1003 
1004 	result = kstrtou32(buf, 10, &value);
1005 	if (result)
1006 		return result;
1007 
1008 	if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1009 		return -EINVAL;
1010 
1011 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL2_SPPT, value, &result);
1012 	if (err) {
1013 		pr_warn("Failed to set ppt_pl2_sppt: %d\n", err);
1014 		return err;
1015 	}
1016 
1017 	if (result > 1) {
1018 		pr_warn("Failed to set ppt_pl2_sppt (result): 0x%x\n", result);
1019 		return -EIO;
1020 	}
1021 
1022 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl2_sppt");
1023 
1024 	return count;
1025 }
1026 static DEVICE_ATTR_WO(ppt_pl2_sppt);
1027 
1028 /* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/
1029 static ssize_t ppt_pl1_spl_store(struct device *dev,
1030 				    struct device_attribute *attr,
1031 				    const char *buf, size_t count)
1032 {
1033 	int result, err;
1034 	u32 value;
1035 
1036 	struct asus_wmi *asus = dev_get_drvdata(dev);
1037 
1038 	result = kstrtou32(buf, 10, &value);
1039 	if (result)
1040 		return result;
1041 
1042 	if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1043 		return -EINVAL;
1044 
1045 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PL1_SPL, value, &result);
1046 	if (err) {
1047 		pr_warn("Failed to set ppt_pl1_spl: %d\n", err);
1048 		return err;
1049 	}
1050 
1051 	if (result > 1) {
1052 		pr_warn("Failed to set ppt_pl1_spl (result): 0x%x\n", result);
1053 		return -EIO;
1054 	}
1055 
1056 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl1_spl");
1057 
1058 	return count;
1059 }
1060 static DEVICE_ATTR_WO(ppt_pl1_spl);
1061 
1062 /* Tunable: PPT APU FPPT ******************************************************/
1063 static ssize_t ppt_fppt_store(struct device *dev,
1064 				    struct device_attribute *attr,
1065 				    const char *buf, size_t count)
1066 {
1067 	int result, err;
1068 	u32 value;
1069 
1070 	struct asus_wmi *asus = dev_get_drvdata(dev);
1071 
1072 	result = kstrtou32(buf, 10, &value);
1073 	if (result)
1074 		return result;
1075 
1076 	if (value < PPT_TOTAL_MIN || value > PPT_TOTAL_MAX)
1077 		return -EINVAL;
1078 
1079 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_FPPT, value, &result);
1080 	if (err) {
1081 		pr_warn("Failed to set ppt_fppt: %d\n", err);
1082 		return err;
1083 	}
1084 
1085 	if (result > 1) {
1086 		pr_warn("Failed to set ppt_fppt (result): 0x%x\n", result);
1087 		return -EIO;
1088 	}
1089 
1090 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_fpu_sppt");
1091 
1092 	return count;
1093 }
1094 static DEVICE_ATTR_WO(ppt_fppt);
1095 
1096 /* Tunable: PPT APU SPPT *****************************************************/
1097 static ssize_t ppt_apu_sppt_store(struct device *dev,
1098 				    struct device_attribute *attr,
1099 				    const char *buf, size_t count)
1100 {
1101 	int result, err;
1102 	u32 value;
1103 
1104 	struct asus_wmi *asus = dev_get_drvdata(dev);
1105 
1106 	result = kstrtou32(buf, 10, &value);
1107 	if (result)
1108 		return result;
1109 
1110 	if (value < PPT_CPU_MIN || value > PPT_CPU_MAX)
1111 		return -EINVAL;
1112 
1113 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_APU_SPPT, value, &result);
1114 	if (err) {
1115 		pr_warn("Failed to set ppt_apu_sppt: %d\n", err);
1116 		return err;
1117 	}
1118 
1119 	if (result > 1) {
1120 		pr_warn("Failed to set ppt_apu_sppt (result): 0x%x\n", result);
1121 		return -EIO;
1122 	}
1123 
1124 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_apu_sppt");
1125 
1126 	return count;
1127 }
1128 static DEVICE_ATTR_WO(ppt_apu_sppt);
1129 
1130 /* Tunable: PPT platform SPPT ************************************************/
1131 static ssize_t ppt_platform_sppt_store(struct device *dev,
1132 				    struct device_attribute *attr,
1133 				    const char *buf, size_t count)
1134 {
1135 	int result, err;
1136 	u32 value;
1137 
1138 	struct asus_wmi *asus = dev_get_drvdata(dev);
1139 
1140 	result = kstrtou32(buf, 10, &value);
1141 	if (result)
1142 		return result;
1143 
1144 	if (value < PPT_CPU_MIN || value > PPT_CPU_MAX)
1145 		return -EINVAL;
1146 
1147 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PPT_PLAT_SPPT, value, &result);
1148 	if (err) {
1149 		pr_warn("Failed to set ppt_platform_sppt: %d\n", err);
1150 		return err;
1151 	}
1152 
1153 	if (result > 1) {
1154 		pr_warn("Failed to set ppt_platform_sppt (result): 0x%x\n", result);
1155 		return -EIO;
1156 	}
1157 
1158 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_platform_sppt");
1159 
1160 	return count;
1161 }
1162 static DEVICE_ATTR_WO(ppt_platform_sppt);
1163 
1164 /* Tunable: NVIDIA dynamic boost *********************************************/
1165 static ssize_t nv_dynamic_boost_store(struct device *dev,
1166 				    struct device_attribute *attr,
1167 				    const char *buf, size_t count)
1168 {
1169 	int result, err;
1170 	u32 value;
1171 
1172 	struct asus_wmi *asus = dev_get_drvdata(dev);
1173 
1174 	result = kstrtou32(buf, 10, &value);
1175 	if (result)
1176 		return result;
1177 
1178 	if (value < NVIDIA_BOOST_MIN || value > NVIDIA_BOOST_MAX)
1179 		return -EINVAL;
1180 
1181 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_DYN_BOOST, value, &result);
1182 	if (err) {
1183 		pr_warn("Failed to set nv_dynamic_boost: %d\n", err);
1184 		return err;
1185 	}
1186 
1187 	if (result > 1) {
1188 		pr_warn("Failed to set nv_dynamic_boost (result): 0x%x\n", result);
1189 		return -EIO;
1190 	}
1191 
1192 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_dynamic_boost");
1193 
1194 	return count;
1195 }
1196 static DEVICE_ATTR_WO(nv_dynamic_boost);
1197 
1198 /* Tunable: NVIDIA temperature target ****************************************/
1199 static ssize_t nv_temp_target_store(struct device *dev,
1200 				    struct device_attribute *attr,
1201 				    const char *buf, size_t count)
1202 {
1203 	int result, err;
1204 	u32 value;
1205 
1206 	struct asus_wmi *asus = dev_get_drvdata(dev);
1207 
1208 	result = kstrtou32(buf, 10, &value);
1209 	if (result)
1210 		return result;
1211 
1212 	if (value < NVIDIA_TEMP_MIN || value > NVIDIA_TEMP_MAX)
1213 		return -EINVAL;
1214 
1215 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_NV_THERM_TARGET, value, &result);
1216 	if (err) {
1217 		pr_warn("Failed to set nv_temp_target: %d\n", err);
1218 		return err;
1219 	}
1220 
1221 	if (result > 1) {
1222 		pr_warn("Failed to set nv_temp_target (result): 0x%x\n", result);
1223 		return -EIO;
1224 	}
1225 
1226 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_temp_target");
1227 
1228 	return count;
1229 }
1230 static DEVICE_ATTR_WO(nv_temp_target);
1231 
1232 /* Battery ********************************************************************/
1233 
1234 /* The battery maximum charging percentage */
1235 static int charge_end_threshold;
1236 
1237 static ssize_t charge_control_end_threshold_store(struct device *dev,
1238 						  struct device_attribute *attr,
1239 						  const char *buf, size_t count)
1240 {
1241 	int value, ret, rv;
1242 
1243 	ret = kstrtouint(buf, 10, &value);
1244 	if (ret)
1245 		return ret;
1246 
1247 	if (value < 0 || value > 100)
1248 		return -EINVAL;
1249 
1250 	ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, value, &rv);
1251 	if (ret)
1252 		return ret;
1253 
1254 	if (rv != 1)
1255 		return -EIO;
1256 
1257 	/* There isn't any method in the DSDT to read the threshold, so we
1258 	 * save the threshold.
1259 	 */
1260 	charge_end_threshold = value;
1261 	return count;
1262 }
1263 
1264 static ssize_t charge_control_end_threshold_show(struct device *device,
1265 						 struct device_attribute *attr,
1266 						 char *buf)
1267 {
1268 	return sysfs_emit(buf, "%d\n", charge_end_threshold);
1269 }
1270 
1271 static DEVICE_ATTR_RW(charge_control_end_threshold);
1272 
1273 static int asus_wmi_battery_add(struct power_supply *battery, struct acpi_battery_hook *hook)
1274 {
1275 	/* The WMI method does not provide a way to specific a battery, so we
1276 	 * just assume it is the first battery.
1277 	 * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
1278 	 * battery is named BATT.
1279 	 */
1280 	if (strcmp(battery->desc->name, "BAT0") != 0 &&
1281 	    strcmp(battery->desc->name, "BAT1") != 0 &&
1282 	    strcmp(battery->desc->name, "BATC") != 0 &&
1283 	    strcmp(battery->desc->name, "BATT") != 0)
1284 		return -ENODEV;
1285 
1286 	if (device_create_file(&battery->dev,
1287 	    &dev_attr_charge_control_end_threshold))
1288 		return -ENODEV;
1289 
1290 	/* The charge threshold is only reset when the system is power cycled,
1291 	 * and we can't get the current threshold so let set it to 100% when
1292 	 * a battery is added.
1293 	 */
1294 	asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, 100, NULL);
1295 	charge_end_threshold = 100;
1296 
1297 	return 0;
1298 }
1299 
1300 static int asus_wmi_battery_remove(struct power_supply *battery, struct acpi_battery_hook *hook)
1301 {
1302 	device_remove_file(&battery->dev,
1303 			   &dev_attr_charge_control_end_threshold);
1304 	return 0;
1305 }
1306 
1307 static struct acpi_battery_hook battery_hook = {
1308 	.add_battery = asus_wmi_battery_add,
1309 	.remove_battery = asus_wmi_battery_remove,
1310 	.name = "ASUS Battery Extension",
1311 };
1312 
1313 static void asus_wmi_battery_init(struct asus_wmi *asus)
1314 {
1315 	asus->battery_rsoc_available = false;
1316 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_RSOC)) {
1317 		asus->battery_rsoc_available = true;
1318 		battery_hook_register(&battery_hook);
1319 	}
1320 }
1321 
1322 static void asus_wmi_battery_exit(struct asus_wmi *asus)
1323 {
1324 	if (asus->battery_rsoc_available)
1325 		battery_hook_unregister(&battery_hook);
1326 }
1327 
1328 /* LEDs ***********************************************************************/
1329 
1330 /*
1331  * These functions actually update the LED's, and are called from a
1332  * workqueue. By doing this as separate work rather than when the LED
1333  * subsystem asks, we avoid messing with the Asus ACPI stuff during a
1334  * potentially bad time, such as a timer interrupt.
1335  */
1336 static void tpd_led_update(struct work_struct *work)
1337 {
1338 	int ctrl_param;
1339 	struct asus_wmi *asus;
1340 
1341 	asus = container_of(work, struct asus_wmi, tpd_led_work);
1342 
1343 	ctrl_param = asus->tpd_led_wk;
1344 	asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
1345 }
1346 
1347 static void tpd_led_set(struct led_classdev *led_cdev,
1348 			enum led_brightness value)
1349 {
1350 	struct asus_wmi *asus;
1351 
1352 	asus = container_of(led_cdev, struct asus_wmi, tpd_led);
1353 
1354 	asus->tpd_led_wk = !!value;
1355 	queue_work(asus->led_workqueue, &asus->tpd_led_work);
1356 }
1357 
1358 static int read_tpd_led_state(struct asus_wmi *asus)
1359 {
1360 	return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
1361 }
1362 
1363 static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
1364 {
1365 	struct asus_wmi *asus;
1366 
1367 	asus = container_of(led_cdev, struct asus_wmi, tpd_led);
1368 
1369 	return read_tpd_led_state(asus);
1370 }
1371 
1372 static void kbd_led_update(struct asus_wmi *asus)
1373 {
1374 	int ctrl_param = 0;
1375 
1376 	ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
1377 	asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
1378 }
1379 
1380 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
1381 {
1382 	int retval;
1383 
1384 	/*
1385 	 * bits 0-2: level
1386 	 * bit 7: light on/off
1387 	 * bit 8-10: environment (0: dark, 1: normal, 2: light)
1388 	 * bit 17: status unknown
1389 	 */
1390 	retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
1391 					    0xFFFF);
1392 
1393 	/* Unknown status is considered as off */
1394 	if (retval == 0x8000)
1395 		retval = 0;
1396 
1397 	if (retval < 0)
1398 		return retval;
1399 
1400 	if (level)
1401 		*level = retval & 0x7F;
1402 	if (env)
1403 		*env = (retval >> 8) & 0x7F;
1404 	return 0;
1405 }
1406 
1407 static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
1408 {
1409 	struct asus_wmi *asus;
1410 	int max_level;
1411 
1412 	asus = container_of(led_cdev, struct asus_wmi, kbd_led);
1413 	max_level = asus->kbd_led.max_brightness;
1414 
1415 	asus->kbd_led_wk = clamp_val(value, 0, max_level);
1416 	kbd_led_update(asus);
1417 }
1418 
1419 static void kbd_led_set(struct led_classdev *led_cdev,
1420 			enum led_brightness value)
1421 {
1422 	/* Prevent disabling keyboard backlight on module unregister */
1423 	if (led_cdev->flags & LED_UNREGISTERING)
1424 		return;
1425 
1426 	do_kbd_led_set(led_cdev, value);
1427 }
1428 
1429 static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
1430 {
1431 	struct led_classdev *led_cdev = &asus->kbd_led;
1432 
1433 	do_kbd_led_set(led_cdev, value);
1434 	led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
1435 }
1436 
1437 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
1438 {
1439 	struct asus_wmi *asus;
1440 	int retval, value;
1441 
1442 	asus = container_of(led_cdev, struct asus_wmi, kbd_led);
1443 
1444 	retval = kbd_led_read(asus, &value, NULL);
1445 	if (retval < 0)
1446 		return retval;
1447 
1448 	return value;
1449 }
1450 
1451 static int wlan_led_unknown_state(struct asus_wmi *asus)
1452 {
1453 	u32 result;
1454 
1455 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
1456 
1457 	return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
1458 }
1459 
1460 static void wlan_led_update(struct work_struct *work)
1461 {
1462 	int ctrl_param;
1463 	struct asus_wmi *asus;
1464 
1465 	asus = container_of(work, struct asus_wmi, wlan_led_work);
1466 
1467 	ctrl_param = asus->wlan_led_wk;
1468 	asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
1469 }
1470 
1471 static void wlan_led_set(struct led_classdev *led_cdev,
1472 			 enum led_brightness value)
1473 {
1474 	struct asus_wmi *asus;
1475 
1476 	asus = container_of(led_cdev, struct asus_wmi, wlan_led);
1477 
1478 	asus->wlan_led_wk = !!value;
1479 	queue_work(asus->led_workqueue, &asus->wlan_led_work);
1480 }
1481 
1482 static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
1483 {
1484 	struct asus_wmi *asus;
1485 	u32 result;
1486 
1487 	asus = container_of(led_cdev, struct asus_wmi, wlan_led);
1488 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
1489 
1490 	return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1491 }
1492 
1493 static void lightbar_led_update(struct work_struct *work)
1494 {
1495 	struct asus_wmi *asus;
1496 	int ctrl_param;
1497 
1498 	asus = container_of(work, struct asus_wmi, lightbar_led_work);
1499 
1500 	ctrl_param = asus->lightbar_led_wk;
1501 	asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR, ctrl_param, NULL);
1502 }
1503 
1504 static void lightbar_led_set(struct led_classdev *led_cdev,
1505 			     enum led_brightness value)
1506 {
1507 	struct asus_wmi *asus;
1508 
1509 	asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
1510 
1511 	asus->lightbar_led_wk = !!value;
1512 	queue_work(asus->led_workqueue, &asus->lightbar_led_work);
1513 }
1514 
1515 static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev)
1516 {
1517 	struct asus_wmi *asus;
1518 	u32 result;
1519 
1520 	asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
1521 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
1522 
1523 	return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
1524 }
1525 
1526 static int micmute_led_set(struct led_classdev *led_cdev,
1527 			   enum led_brightness brightness)
1528 {
1529 	int state = brightness != LED_OFF;
1530 	int err;
1531 
1532 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MICMUTE_LED, state, NULL);
1533 	return err < 0 ? err : 0;
1534 }
1535 
1536 static void asus_wmi_led_exit(struct asus_wmi *asus)
1537 {
1538 	led_classdev_unregister(&asus->kbd_led);
1539 	led_classdev_unregister(&asus->tpd_led);
1540 	led_classdev_unregister(&asus->wlan_led);
1541 	led_classdev_unregister(&asus->lightbar_led);
1542 	led_classdev_unregister(&asus->micmute_led);
1543 
1544 	if (asus->led_workqueue)
1545 		destroy_workqueue(asus->led_workqueue);
1546 }
1547 
1548 static int asus_wmi_led_init(struct asus_wmi *asus)
1549 {
1550 	int rv = 0, num_rgb_groups = 0, led_val;
1551 
1552 	if (asus->kbd_rgb_mode_available)
1553 		kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_mode_group;
1554 	if (asus->kbd_rgb_state_available)
1555 		kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_state_group;
1556 
1557 	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
1558 	if (!asus->led_workqueue)
1559 		return -ENOMEM;
1560 
1561 	if (read_tpd_led_state(asus) >= 0) {
1562 		INIT_WORK(&asus->tpd_led_work, tpd_led_update);
1563 
1564 		asus->tpd_led.name = "asus::touchpad";
1565 		asus->tpd_led.brightness_set = tpd_led_set;
1566 		asus->tpd_led.brightness_get = tpd_led_get;
1567 		asus->tpd_led.max_brightness = 1;
1568 
1569 		rv = led_classdev_register(&asus->platform_device->dev,
1570 					   &asus->tpd_led);
1571 		if (rv)
1572 			goto error;
1573 	}
1574 
1575 	if (!kbd_led_read(asus, &led_val, NULL)) {
1576 		asus->kbd_led_wk = led_val;
1577 		asus->kbd_led.name = "asus::kbd_backlight";
1578 		asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
1579 		asus->kbd_led.brightness_set = kbd_led_set;
1580 		asus->kbd_led.brightness_get = kbd_led_get;
1581 		asus->kbd_led.max_brightness = 3;
1582 
1583 		if (num_rgb_groups != 0)
1584 			asus->kbd_led.groups = kbd_rgb_mode_groups;
1585 
1586 		rv = led_classdev_register(&asus->platform_device->dev,
1587 					   &asus->kbd_led);
1588 		if (rv)
1589 			goto error;
1590 	}
1591 
1592 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED)
1593 			&& (asus->driver->quirks->wapf > 0)) {
1594 		INIT_WORK(&asus->wlan_led_work, wlan_led_update);
1595 
1596 		asus->wlan_led.name = "asus::wlan";
1597 		asus->wlan_led.brightness_set = wlan_led_set;
1598 		if (!wlan_led_unknown_state(asus))
1599 			asus->wlan_led.brightness_get = wlan_led_get;
1600 		asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
1601 		asus->wlan_led.max_brightness = 1;
1602 		asus->wlan_led.default_trigger = "asus-wlan";
1603 
1604 		rv = led_classdev_register(&asus->platform_device->dev,
1605 					   &asus->wlan_led);
1606 		if (rv)
1607 			goto error;
1608 	}
1609 
1610 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_LIGHTBAR)) {
1611 		INIT_WORK(&asus->lightbar_led_work, lightbar_led_update);
1612 
1613 		asus->lightbar_led.name = "asus::lightbar";
1614 		asus->lightbar_led.brightness_set = lightbar_led_set;
1615 		asus->lightbar_led.brightness_get = lightbar_led_get;
1616 		asus->lightbar_led.max_brightness = 1;
1617 
1618 		rv = led_classdev_register(&asus->platform_device->dev,
1619 					   &asus->lightbar_led);
1620 	}
1621 
1622 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MICMUTE_LED)) {
1623 		asus->micmute_led.name = "platform::micmute";
1624 		asus->micmute_led.max_brightness = 1;
1625 		asus->micmute_led.brightness_set_blocking = micmute_led_set;
1626 		asus->micmute_led.default_trigger = "audio-micmute";
1627 
1628 		rv = led_classdev_register(&asus->platform_device->dev,
1629 						&asus->micmute_led);
1630 		if (rv)
1631 			goto error;
1632 	}
1633 
1634 error:
1635 	if (rv)
1636 		asus_wmi_led_exit(asus);
1637 
1638 	return rv;
1639 }
1640 
1641 /* RF *************************************************************************/
1642 
1643 /*
1644  * PCI hotplug (for wlan rfkill)
1645  */
1646 static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
1647 {
1648 	int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1649 
1650 	if (result < 0)
1651 		return false;
1652 	return !result;
1653 }
1654 
1655 static void asus_rfkill_hotplug(struct asus_wmi *asus)
1656 {
1657 	struct pci_dev *dev;
1658 	struct pci_bus *bus;
1659 	bool blocked;
1660 	bool absent;
1661 	u32 l;
1662 
1663 	mutex_lock(&asus->wmi_lock);
1664 	blocked = asus_wlan_rfkill_blocked(asus);
1665 	mutex_unlock(&asus->wmi_lock);
1666 
1667 	mutex_lock(&asus->hotplug_lock);
1668 	pci_lock_rescan_remove();
1669 
1670 	if (asus->wlan.rfkill)
1671 		rfkill_set_sw_state(asus->wlan.rfkill, blocked);
1672 
1673 	if (asus->hotplug_slot.ops) {
1674 		bus = pci_find_bus(0, 1);
1675 		if (!bus) {
1676 			pr_warn("Unable to find PCI bus 1?\n");
1677 			goto out_unlock;
1678 		}
1679 
1680 		if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
1681 			pr_err("Unable to read PCI config space?\n");
1682 			goto out_unlock;
1683 		}
1684 		absent = (l == 0xffffffff);
1685 
1686 		if (blocked != absent) {
1687 			pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
1688 				blocked ? "blocked" : "unblocked",
1689 				absent ? "absent" : "present");
1690 			pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
1691 			goto out_unlock;
1692 		}
1693 
1694 		if (!blocked) {
1695 			dev = pci_get_slot(bus, 0);
1696 			if (dev) {
1697 				/* Device already present */
1698 				pci_dev_put(dev);
1699 				goto out_unlock;
1700 			}
1701 			dev = pci_scan_single_device(bus, 0);
1702 			if (dev) {
1703 				pci_bus_assign_resources(bus);
1704 				pci_bus_add_device(dev);
1705 			}
1706 		} else {
1707 			dev = pci_get_slot(bus, 0);
1708 			if (dev) {
1709 				pci_stop_and_remove_bus_device(dev);
1710 				pci_dev_put(dev);
1711 			}
1712 		}
1713 	}
1714 
1715 out_unlock:
1716 	pci_unlock_rescan_remove();
1717 	mutex_unlock(&asus->hotplug_lock);
1718 }
1719 
1720 static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
1721 {
1722 	struct asus_wmi *asus = data;
1723 
1724 	if (event != ACPI_NOTIFY_BUS_CHECK)
1725 		return;
1726 
1727 	/*
1728 	 * We can't call directly asus_rfkill_hotplug because most
1729 	 * of the time WMBC is still being executed and not reetrant.
1730 	 * There is currently no way to tell ACPICA that  we want this
1731 	 * method to be serialized, we schedule a asus_rfkill_hotplug
1732 	 * call later, in a safer context.
1733 	 */
1734 	queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
1735 }
1736 
1737 static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
1738 {
1739 	acpi_status status;
1740 	acpi_handle handle;
1741 
1742 	status = acpi_get_handle(NULL, node, &handle);
1743 	if (ACPI_FAILURE(status))
1744 		return -ENODEV;
1745 
1746 	status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1747 					     asus_rfkill_notify, asus);
1748 	if (ACPI_FAILURE(status))
1749 		pr_warn("Failed to register notify on %s\n", node);
1750 
1751 	return 0;
1752 }
1753 
1754 static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
1755 {
1756 	acpi_status status = AE_OK;
1757 	acpi_handle handle;
1758 
1759 	status = acpi_get_handle(NULL, node, &handle);
1760 	if (ACPI_FAILURE(status))
1761 		return;
1762 
1763 	status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
1764 					    asus_rfkill_notify);
1765 	if (ACPI_FAILURE(status))
1766 		pr_err("Error removing rfkill notify handler %s\n", node);
1767 }
1768 
1769 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
1770 				   u8 *value)
1771 {
1772 	struct asus_wmi *asus = container_of(hotplug_slot,
1773 					     struct asus_wmi, hotplug_slot);
1774 	int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1775 
1776 	if (result < 0)
1777 		return result;
1778 
1779 	*value = !!result;
1780 	return 0;
1781 }
1782 
1783 static const struct hotplug_slot_ops asus_hotplug_slot_ops = {
1784 	.get_adapter_status = asus_get_adapter_status,
1785 	.get_power_status = asus_get_adapter_status,
1786 };
1787 
1788 static void asus_hotplug_work(struct work_struct *work)
1789 {
1790 	struct asus_wmi *asus;
1791 
1792 	asus = container_of(work, struct asus_wmi, hotplug_work);
1793 	asus_rfkill_hotplug(asus);
1794 }
1795 
1796 static int asus_setup_pci_hotplug(struct asus_wmi *asus)
1797 {
1798 	int ret = -ENOMEM;
1799 	struct pci_bus *bus = pci_find_bus(0, 1);
1800 
1801 	if (!bus) {
1802 		pr_err("Unable to find wifi PCI bus\n");
1803 		return -ENODEV;
1804 	}
1805 
1806 	asus->hotplug_workqueue =
1807 	    create_singlethread_workqueue("hotplug_workqueue");
1808 	if (!asus->hotplug_workqueue)
1809 		goto error_workqueue;
1810 
1811 	INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
1812 
1813 	asus->hotplug_slot.ops = &asus_hotplug_slot_ops;
1814 
1815 	ret = pci_hp_register(&asus->hotplug_slot, bus, 0, "asus-wifi");
1816 	if (ret) {
1817 		pr_err("Unable to register hotplug slot - %d\n", ret);
1818 		goto error_register;
1819 	}
1820 
1821 	return 0;
1822 
1823 error_register:
1824 	asus->hotplug_slot.ops = NULL;
1825 	destroy_workqueue(asus->hotplug_workqueue);
1826 error_workqueue:
1827 	return ret;
1828 }
1829 
1830 /*
1831  * Rfkill devices
1832  */
1833 static int asus_rfkill_set(void *data, bool blocked)
1834 {
1835 	struct asus_rfkill *priv = data;
1836 	u32 ctrl_param = !blocked;
1837 	u32 dev_id = priv->dev_id;
1838 
1839 	/*
1840 	 * If the user bit is set, BIOS can't set and record the wlan status,
1841 	 * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
1842 	 * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
1843 	 * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
1844 	 * while setting the wlan status through WMI.
1845 	 * This is also the behavior that windows app will do.
1846 	 */
1847 	if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1848 	     priv->asus->driver->wlan_ctrl_by_user)
1849 		dev_id = ASUS_WMI_DEVID_WLAN_LED;
1850 
1851 	return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
1852 }
1853 
1854 static void asus_rfkill_query(struct rfkill *rfkill, void *data)
1855 {
1856 	struct asus_rfkill *priv = data;
1857 	int result;
1858 
1859 	result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
1860 
1861 	if (result < 0)
1862 		return;
1863 
1864 	rfkill_set_sw_state(priv->rfkill, !result);
1865 }
1866 
1867 static int asus_rfkill_wlan_set(void *data, bool blocked)
1868 {
1869 	struct asus_rfkill *priv = data;
1870 	struct asus_wmi *asus = priv->asus;
1871 	int ret;
1872 
1873 	/*
1874 	 * This handler is enabled only if hotplug is enabled.
1875 	 * In this case, the asus_wmi_set_devstate() will
1876 	 * trigger a wmi notification and we need to wait
1877 	 * this call to finish before being able to call
1878 	 * any wmi method
1879 	 */
1880 	mutex_lock(&asus->wmi_lock);
1881 	ret = asus_rfkill_set(data, blocked);
1882 	mutex_unlock(&asus->wmi_lock);
1883 	return ret;
1884 }
1885 
1886 static const struct rfkill_ops asus_rfkill_wlan_ops = {
1887 	.set_block = asus_rfkill_wlan_set,
1888 	.query = asus_rfkill_query,
1889 };
1890 
1891 static const struct rfkill_ops asus_rfkill_ops = {
1892 	.set_block = asus_rfkill_set,
1893 	.query = asus_rfkill_query,
1894 };
1895 
1896 static int asus_new_rfkill(struct asus_wmi *asus,
1897 			   struct asus_rfkill *arfkill,
1898 			   const char *name, enum rfkill_type type, int dev_id)
1899 {
1900 	int result = asus_wmi_get_devstate_simple(asus, dev_id);
1901 	struct rfkill **rfkill = &arfkill->rfkill;
1902 
1903 	if (result < 0)
1904 		return result;
1905 
1906 	arfkill->dev_id = dev_id;
1907 	arfkill->asus = asus;
1908 
1909 	if (dev_id == ASUS_WMI_DEVID_WLAN &&
1910 	    asus->driver->quirks->hotplug_wireless)
1911 		*rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
1912 				       &asus_rfkill_wlan_ops, arfkill);
1913 	else
1914 		*rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
1915 				       &asus_rfkill_ops, arfkill);
1916 
1917 	if (!*rfkill)
1918 		return -EINVAL;
1919 
1920 	if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1921 			(asus->driver->quirks->wapf > 0))
1922 		rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
1923 
1924 	rfkill_init_sw_state(*rfkill, !result);
1925 	result = rfkill_register(*rfkill);
1926 	if (result) {
1927 		rfkill_destroy(*rfkill);
1928 		*rfkill = NULL;
1929 		return result;
1930 	}
1931 	return 0;
1932 }
1933 
1934 static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
1935 {
1936 	if (asus->driver->wlan_ctrl_by_user && ashs_present())
1937 		return;
1938 
1939 	asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
1940 	asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
1941 	asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
1942 	if (asus->wlan.rfkill) {
1943 		rfkill_unregister(asus->wlan.rfkill);
1944 		rfkill_destroy(asus->wlan.rfkill);
1945 		asus->wlan.rfkill = NULL;
1946 	}
1947 	/*
1948 	 * Refresh pci hotplug in case the rfkill state was changed after
1949 	 * asus_unregister_rfkill_notifier()
1950 	 */
1951 	asus_rfkill_hotplug(asus);
1952 	if (asus->hotplug_slot.ops)
1953 		pci_hp_deregister(&asus->hotplug_slot);
1954 	if (asus->hotplug_workqueue)
1955 		destroy_workqueue(asus->hotplug_workqueue);
1956 
1957 	if (asus->bluetooth.rfkill) {
1958 		rfkill_unregister(asus->bluetooth.rfkill);
1959 		rfkill_destroy(asus->bluetooth.rfkill);
1960 		asus->bluetooth.rfkill = NULL;
1961 	}
1962 	if (asus->wimax.rfkill) {
1963 		rfkill_unregister(asus->wimax.rfkill);
1964 		rfkill_destroy(asus->wimax.rfkill);
1965 		asus->wimax.rfkill = NULL;
1966 	}
1967 	if (asus->wwan3g.rfkill) {
1968 		rfkill_unregister(asus->wwan3g.rfkill);
1969 		rfkill_destroy(asus->wwan3g.rfkill);
1970 		asus->wwan3g.rfkill = NULL;
1971 	}
1972 	if (asus->gps.rfkill) {
1973 		rfkill_unregister(asus->gps.rfkill);
1974 		rfkill_destroy(asus->gps.rfkill);
1975 		asus->gps.rfkill = NULL;
1976 	}
1977 	if (asus->uwb.rfkill) {
1978 		rfkill_unregister(asus->uwb.rfkill);
1979 		rfkill_destroy(asus->uwb.rfkill);
1980 		asus->uwb.rfkill = NULL;
1981 	}
1982 }
1983 
1984 static int asus_wmi_rfkill_init(struct asus_wmi *asus)
1985 {
1986 	int result = 0;
1987 
1988 	mutex_init(&asus->hotplug_lock);
1989 	mutex_init(&asus->wmi_lock);
1990 
1991 	result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
1992 				 RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
1993 
1994 	if (result && result != -ENODEV)
1995 		goto exit;
1996 
1997 	result = asus_new_rfkill(asus, &asus->bluetooth,
1998 				 "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
1999 				 ASUS_WMI_DEVID_BLUETOOTH);
2000 
2001 	if (result && result != -ENODEV)
2002 		goto exit;
2003 
2004 	result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
2005 				 RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
2006 
2007 	if (result && result != -ENODEV)
2008 		goto exit;
2009 
2010 	result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
2011 				 RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
2012 
2013 	if (result && result != -ENODEV)
2014 		goto exit;
2015 
2016 	result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
2017 				 RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
2018 
2019 	if (result && result != -ENODEV)
2020 		goto exit;
2021 
2022 	result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
2023 				 RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
2024 
2025 	if (result && result != -ENODEV)
2026 		goto exit;
2027 
2028 	if (!asus->driver->quirks->hotplug_wireless)
2029 		goto exit;
2030 
2031 	result = asus_setup_pci_hotplug(asus);
2032 	/*
2033 	 * If we get -EBUSY then something else is handling the PCI hotplug -
2034 	 * don't fail in this case
2035 	 */
2036 	if (result == -EBUSY)
2037 		result = 0;
2038 
2039 	asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
2040 	asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
2041 	asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
2042 	/*
2043 	 * Refresh pci hotplug in case the rfkill state was changed during
2044 	 * setup.
2045 	 */
2046 	asus_rfkill_hotplug(asus);
2047 
2048 exit:
2049 	if (result && result != -ENODEV)
2050 		asus_wmi_rfkill_exit(asus);
2051 
2052 	if (result == -ENODEV)
2053 		result = 0;
2054 
2055 	return result;
2056 }
2057 
2058 /* Panel Overdrive ************************************************************/
2059 static ssize_t panel_od_show(struct device *dev,
2060 				   struct device_attribute *attr, char *buf)
2061 {
2062 	struct asus_wmi *asus = dev_get_drvdata(dev);
2063 	int result;
2064 
2065 	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_PANEL_OD);
2066 	if (result < 0)
2067 		return result;
2068 
2069 	return sysfs_emit(buf, "%d\n", result);
2070 }
2071 
2072 static ssize_t panel_od_store(struct device *dev,
2073 				    struct device_attribute *attr,
2074 				    const char *buf, size_t count)
2075 {
2076 	int result, err;
2077 	u32 overdrive;
2078 
2079 	struct asus_wmi *asus = dev_get_drvdata(dev);
2080 
2081 	result = kstrtou32(buf, 10, &overdrive);
2082 	if (result)
2083 		return result;
2084 
2085 	if (overdrive > 1)
2086 		return -EINVAL;
2087 
2088 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PANEL_OD, overdrive, &result);
2089 
2090 	if (err) {
2091 		pr_warn("Failed to set panel overdrive: %d\n", err);
2092 		return err;
2093 	}
2094 
2095 	if (result > 1) {
2096 		pr_warn("Failed to set panel overdrive (result): 0x%x\n", result);
2097 		return -EIO;
2098 	}
2099 
2100 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "panel_od");
2101 
2102 	return count;
2103 }
2104 static DEVICE_ATTR_RW(panel_od);
2105 
2106 /* Mini-LED mode **************************************************************/
2107 static ssize_t mini_led_mode_show(struct device *dev,
2108 				   struct device_attribute *attr, char *buf)
2109 {
2110 	struct asus_wmi *asus = dev_get_drvdata(dev);
2111 	int result;
2112 
2113 	result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
2114 	if (result < 0)
2115 		return result;
2116 
2117 	return sysfs_emit(buf, "%d\n", result);
2118 }
2119 
2120 static ssize_t mini_led_mode_store(struct device *dev,
2121 				    struct device_attribute *attr,
2122 				    const char *buf, size_t count)
2123 {
2124 	int result, err;
2125 	u32 mode;
2126 
2127 	struct asus_wmi *asus = dev_get_drvdata(dev);
2128 
2129 	result = kstrtou32(buf, 10, &mode);
2130 	if (result)
2131 		return result;
2132 
2133 	if (mode > 1)
2134 		return -EINVAL;
2135 
2136 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MINI_LED_MODE, mode, &result);
2137 
2138 	if (err) {
2139 		pr_warn("Failed to set mini-LED: %d\n", err);
2140 		return err;
2141 	}
2142 
2143 	if (result > 1) {
2144 		pr_warn("Failed to set mini-LED mode (result): 0x%x\n", result);
2145 		return -EIO;
2146 	}
2147 
2148 	sysfs_notify(&asus->platform_device->dev.kobj, NULL, "mini_led_mode");
2149 
2150 	return count;
2151 }
2152 static DEVICE_ATTR_RW(mini_led_mode);
2153 
2154 /* Quirks *********************************************************************/
2155 
2156 static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
2157 {
2158 	struct pci_dev *xhci_pdev;
2159 	u32 orig_ports_available;
2160 	u32 ports_available = asus->driver->quirks->xusb2pr;
2161 
2162 	xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
2163 			PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI,
2164 			NULL);
2165 
2166 	if (!xhci_pdev)
2167 		return;
2168 
2169 	pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
2170 				&orig_ports_available);
2171 
2172 	pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
2173 				cpu_to_le32(ports_available));
2174 
2175 	pci_dev_put(xhci_pdev);
2176 
2177 	pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
2178 			orig_ports_available, ports_available);
2179 }
2180 
2181 /*
2182  * Some devices dont support or have borcken get_als method
2183  * but still support set method.
2184  */
2185 static void asus_wmi_set_als(void)
2186 {
2187 	asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE, 1, NULL);
2188 }
2189 
2190 /* Hwmon device ***************************************************************/
2191 
2192 static int asus_agfn_fan_speed_read(struct asus_wmi *asus, int fan,
2193 					  int *speed)
2194 {
2195 	struct agfn_fan_args args = {
2196 		.agfn.len = sizeof(args),
2197 		.agfn.mfun = ASUS_FAN_MFUN,
2198 		.agfn.sfun = ASUS_FAN_SFUN_READ,
2199 		.fan = fan,
2200 		.speed = 0,
2201 	};
2202 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2203 	int status;
2204 
2205 	if (fan != 1)
2206 		return -EINVAL;
2207 
2208 	status = asus_wmi_evaluate_method_agfn(input);
2209 
2210 	if (status || args.agfn.err)
2211 		return -ENXIO;
2212 
2213 	if (speed)
2214 		*speed = args.speed;
2215 
2216 	return 0;
2217 }
2218 
2219 static int asus_agfn_fan_speed_write(struct asus_wmi *asus, int fan,
2220 				     int *speed)
2221 {
2222 	struct agfn_fan_args args = {
2223 		.agfn.len = sizeof(args),
2224 		.agfn.mfun = ASUS_FAN_MFUN,
2225 		.agfn.sfun = ASUS_FAN_SFUN_WRITE,
2226 		.fan = fan,
2227 		.speed = speed ?  *speed : 0,
2228 	};
2229 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2230 	int status;
2231 
2232 	/* 1: for setting 1st fan's speed 0: setting auto mode */
2233 	if (fan != 1 && fan != 0)
2234 		return -EINVAL;
2235 
2236 	status = asus_wmi_evaluate_method_agfn(input);
2237 
2238 	if (status || args.agfn.err)
2239 		return -ENXIO;
2240 
2241 	if (speed && fan == 1)
2242 		asus->agfn_pwm = *speed;
2243 
2244 	return 0;
2245 }
2246 
2247 /*
2248  * Check if we can read the speed of one fan. If true we assume we can also
2249  * control it.
2250  */
2251 static bool asus_wmi_has_agfn_fan(struct asus_wmi *asus)
2252 {
2253 	int status;
2254 	int speed;
2255 	u32 value;
2256 
2257 	status = asus_agfn_fan_speed_read(asus, 1, &speed);
2258 	if (status != 0)
2259 		return false;
2260 
2261 	status = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
2262 	if (status != 0)
2263 		return false;
2264 
2265 	/*
2266 	 * We need to find a better way, probably using sfun,
2267 	 * bits or spec ...
2268 	 * Currently we disable it if:
2269 	 * - ASUS_WMI_UNSUPPORTED_METHOD is returned
2270 	 * - reverved bits are non-zero
2271 	 * - sfun and presence bit are not set
2272 	 */
2273 	return !(value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
2274 		 || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)));
2275 }
2276 
2277 static int asus_fan_set_auto(struct asus_wmi *asus)
2278 {
2279 	int status;
2280 	u32 retval;
2281 
2282 	switch (asus->fan_type) {
2283 	case FAN_TYPE_SPEC83:
2284 		status = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
2285 					       0, &retval);
2286 		if (status)
2287 			return status;
2288 
2289 		if (retval != 1)
2290 			return -EIO;
2291 		break;
2292 
2293 	case FAN_TYPE_AGFN:
2294 		status = asus_agfn_fan_speed_write(asus, 0, NULL);
2295 		if (status)
2296 			return -ENXIO;
2297 		break;
2298 
2299 	default:
2300 		return -ENXIO;
2301 	}
2302 
2303 	/*
2304 	 * Modern models like the G713 also have GPU fan control (this is not AGFN)
2305 	 */
2306 	if (asus->gpu_fan_type == FAN_TYPE_SPEC83) {
2307 		status = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
2308 					       0, &retval);
2309 		if (status)
2310 			return status;
2311 
2312 		if (retval != 1)
2313 			return -EIO;
2314 	}
2315 
2316 	return 0;
2317 }
2318 
2319 static ssize_t pwm1_show(struct device *dev,
2320 			       struct device_attribute *attr,
2321 			       char *buf)
2322 {
2323 	struct asus_wmi *asus = dev_get_drvdata(dev);
2324 	int err;
2325 	int value;
2326 
2327 	/* If we already set a value then just return it */
2328 	if (asus->agfn_pwm >= 0)
2329 		return sprintf(buf, "%d\n", asus->agfn_pwm);
2330 
2331 	/*
2332 	 * If we haven't set already set a value through the AGFN interface,
2333 	 * we read a current value through the (now-deprecated) FAN_CTRL device.
2334 	 */
2335 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
2336 	if (err < 0)
2337 		return err;
2338 
2339 	value &= 0xFF;
2340 
2341 	if (value == 1) /* Low Speed */
2342 		value = 85;
2343 	else if (value == 2)
2344 		value = 170;
2345 	else if (value == 3)
2346 		value = 255;
2347 	else if (value) {
2348 		pr_err("Unknown fan speed %#x\n", value);
2349 		value = -1;
2350 	}
2351 
2352 	return sysfs_emit(buf, "%d\n", value);
2353 }
2354 
2355 static ssize_t pwm1_store(struct device *dev,
2356 				     struct device_attribute *attr,
2357 				     const char *buf, size_t count) {
2358 	struct asus_wmi *asus = dev_get_drvdata(dev);
2359 	int value;
2360 	int state;
2361 	int ret;
2362 
2363 	ret = kstrtouint(buf, 10, &value);
2364 	if (ret)
2365 		return ret;
2366 
2367 	value = clamp(value, 0, 255);
2368 
2369 	state = asus_agfn_fan_speed_write(asus, 1, &value);
2370 	if (state)
2371 		pr_warn("Setting fan speed failed: %d\n", state);
2372 	else
2373 		asus->fan_pwm_mode = ASUS_FAN_CTRL_MANUAL;
2374 
2375 	return count;
2376 }
2377 
2378 static ssize_t fan1_input_show(struct device *dev,
2379 					struct device_attribute *attr,
2380 					char *buf)
2381 {
2382 	struct asus_wmi *asus = dev_get_drvdata(dev);
2383 	int value;
2384 	int ret;
2385 
2386 	switch (asus->fan_type) {
2387 	case FAN_TYPE_SPEC83:
2388 		ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL,
2389 					    &value);
2390 		if (ret < 0)
2391 			return ret;
2392 
2393 		value &= 0xffff;
2394 		break;
2395 
2396 	case FAN_TYPE_AGFN:
2397 		/* no speed readable on manual mode */
2398 		if (asus->fan_pwm_mode == ASUS_FAN_CTRL_MANUAL)
2399 			return -ENXIO;
2400 
2401 		ret = asus_agfn_fan_speed_read(asus, 1, &value);
2402 		if (ret) {
2403 			pr_warn("reading fan speed failed: %d\n", ret);
2404 			return -ENXIO;
2405 		}
2406 		break;
2407 
2408 	default:
2409 		return -ENXIO;
2410 	}
2411 
2412 	return sysfs_emit(buf, "%d\n", value < 0 ? -1 : value * 100);
2413 }
2414 
2415 static ssize_t pwm1_enable_show(struct device *dev,
2416 						 struct device_attribute *attr,
2417 						 char *buf)
2418 {
2419 	struct asus_wmi *asus = dev_get_drvdata(dev);
2420 
2421 	/*
2422 	 * Just read back the cached pwm mode.
2423 	 *
2424 	 * For the CPU_FAN device, the spec indicates that we should be
2425 	 * able to read the device status and consult bit 19 to see if we
2426 	 * are in Full On or Automatic mode. However, this does not work
2427 	 * in practice on X532FL at least (the bit is always 0) and there's
2428 	 * also nothing in the DSDT to indicate that this behaviour exists.
2429 	 */
2430 	return sysfs_emit(buf, "%d\n", asus->fan_pwm_mode);
2431 }
2432 
2433 static ssize_t pwm1_enable_store(struct device *dev,
2434 						  struct device_attribute *attr,
2435 						  const char *buf, size_t count)
2436 {
2437 	struct asus_wmi *asus = dev_get_drvdata(dev);
2438 	int status = 0;
2439 	int state;
2440 	int value;
2441 	int ret;
2442 	u32 retval;
2443 
2444 	ret = kstrtouint(buf, 10, &state);
2445 	if (ret)
2446 		return ret;
2447 
2448 	if (asus->fan_type == FAN_TYPE_SPEC83) {
2449 		switch (state) { /* standard documented hwmon values */
2450 		case ASUS_FAN_CTRL_FULLSPEED:
2451 			value = 1;
2452 			break;
2453 		case ASUS_FAN_CTRL_AUTO:
2454 			value = 0;
2455 			break;
2456 		default:
2457 			return -EINVAL;
2458 		}
2459 
2460 		ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
2461 					    value, &retval);
2462 		if (ret)
2463 			return ret;
2464 
2465 		if (retval != 1)
2466 			return -EIO;
2467 	} else if (asus->fan_type == FAN_TYPE_AGFN) {
2468 		switch (state) {
2469 		case ASUS_FAN_CTRL_MANUAL:
2470 			break;
2471 
2472 		case ASUS_FAN_CTRL_AUTO:
2473 			status = asus_fan_set_auto(asus);
2474 			if (status)
2475 				return status;
2476 			break;
2477 
2478 		default:
2479 			return -EINVAL;
2480 		}
2481 	}
2482 
2483 	asus->fan_pwm_mode = state;
2484 
2485 	/* Must set to disabled if mode is toggled */
2486 	if (asus->cpu_fan_curve_available)
2487 		asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
2488 	if (asus->gpu_fan_curve_available)
2489 		asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
2490 	if (asus->mid_fan_curve_available)
2491 		asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
2492 
2493 	return count;
2494 }
2495 
2496 static ssize_t fan1_label_show(struct device *dev,
2497 					  struct device_attribute *attr,
2498 					  char *buf)
2499 {
2500 	return sysfs_emit(buf, "%s\n", ASUS_FAN_DESC);
2501 }
2502 
2503 static ssize_t asus_hwmon_temp1(struct device *dev,
2504 				struct device_attribute *attr,
2505 				char *buf)
2506 {
2507 	struct asus_wmi *asus = dev_get_drvdata(dev);
2508 	u32 value;
2509 	int err;
2510 
2511 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
2512 	if (err < 0)
2513 		return err;
2514 
2515 	return sprintf(buf, "%ld\n",
2516 		       deci_kelvin_to_millicelsius(value & 0xFFFF));
2517 }
2518 
2519 /* GPU fan on modern ROG laptops */
2520 static ssize_t fan2_input_show(struct device *dev,
2521 					struct device_attribute *attr,
2522 					char *buf)
2523 {
2524 	struct asus_wmi *asus = dev_get_drvdata(dev);
2525 	int value;
2526 	int ret;
2527 
2528 	ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL, &value);
2529 	if (ret < 0)
2530 		return ret;
2531 
2532 	value &= 0xffff;
2533 
2534 	return sysfs_emit(buf, "%d\n", value * 100);
2535 }
2536 
2537 static ssize_t fan2_label_show(struct device *dev,
2538 					  struct device_attribute *attr,
2539 					  char *buf)
2540 {
2541 	return sysfs_emit(buf, "%s\n", ASUS_GPU_FAN_DESC);
2542 }
2543 
2544 /* Middle/Center fan on modern ROG laptops */
2545 static ssize_t fan3_input_show(struct device *dev,
2546 					struct device_attribute *attr,
2547 					char *buf)
2548 {
2549 	struct asus_wmi *asus = dev_get_drvdata(dev);
2550 	int value;
2551 	int ret;
2552 
2553 	ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_MID_FAN_CTRL, &value);
2554 	if (ret < 0)
2555 		return ret;
2556 
2557 	value &= 0xffff;
2558 
2559 	return sysfs_emit(buf, "%d\n", value * 100);
2560 }
2561 
2562 static ssize_t fan3_label_show(struct device *dev,
2563 					  struct device_attribute *attr,
2564 					  char *buf)
2565 {
2566 	return sysfs_emit(buf, "%s\n", ASUS_MID_FAN_DESC);
2567 }
2568 
2569 static ssize_t pwm2_enable_show(struct device *dev,
2570 				struct device_attribute *attr,
2571 				char *buf)
2572 {
2573 	struct asus_wmi *asus = dev_get_drvdata(dev);
2574 
2575 	return sysfs_emit(buf, "%d\n", asus->gpu_fan_pwm_mode);
2576 }
2577 
2578 static ssize_t pwm2_enable_store(struct device *dev,
2579 				 struct device_attribute *attr,
2580 				 const char *buf, size_t count)
2581 {
2582 	struct asus_wmi *asus = dev_get_drvdata(dev);
2583 	int state;
2584 	int value;
2585 	int ret;
2586 	u32 retval;
2587 
2588 	ret = kstrtouint(buf, 10, &state);
2589 	if (ret)
2590 		return ret;
2591 
2592 	switch (state) { /* standard documented hwmon values */
2593 	case ASUS_FAN_CTRL_FULLSPEED:
2594 		value = 1;
2595 		break;
2596 	case ASUS_FAN_CTRL_AUTO:
2597 		value = 0;
2598 		break;
2599 	default:
2600 		return -EINVAL;
2601 	}
2602 
2603 	ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
2604 				    value, &retval);
2605 	if (ret)
2606 		return ret;
2607 
2608 	if (retval != 1)
2609 		return -EIO;
2610 
2611 	asus->gpu_fan_pwm_mode = state;
2612 	return count;
2613 }
2614 
2615 static ssize_t pwm3_enable_show(struct device *dev,
2616 				struct device_attribute *attr,
2617 				char *buf)
2618 {
2619 	struct asus_wmi *asus = dev_get_drvdata(dev);
2620 
2621 	return sysfs_emit(buf, "%d\n", asus->mid_fan_pwm_mode);
2622 }
2623 
2624 static ssize_t pwm3_enable_store(struct device *dev,
2625 				 struct device_attribute *attr,
2626 				 const char *buf, size_t count)
2627 {
2628 	struct asus_wmi *asus = dev_get_drvdata(dev);
2629 	int state;
2630 	int value;
2631 	int ret;
2632 	u32 retval;
2633 
2634 	ret = kstrtouint(buf, 10, &state);
2635 	if (ret)
2636 		return ret;
2637 
2638 	switch (state) { /* standard documented hwmon values */
2639 	case ASUS_FAN_CTRL_FULLSPEED:
2640 		value = 1;
2641 		break;
2642 	case ASUS_FAN_CTRL_AUTO:
2643 		value = 0;
2644 		break;
2645 	default:
2646 		return -EINVAL;
2647 	}
2648 
2649 	ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_MID_FAN_CTRL,
2650 				    value, &retval);
2651 	if (ret)
2652 		return ret;
2653 
2654 	if (retval != 1)
2655 		return -EIO;
2656 
2657 	asus->mid_fan_pwm_mode = state;
2658 	return count;
2659 }
2660 
2661 /* Fan1 */
2662 static DEVICE_ATTR_RW(pwm1);
2663 static DEVICE_ATTR_RW(pwm1_enable);
2664 static DEVICE_ATTR_RO(fan1_input);
2665 static DEVICE_ATTR_RO(fan1_label);
2666 /* Fan2 - GPU fan */
2667 static DEVICE_ATTR_RW(pwm2_enable);
2668 static DEVICE_ATTR_RO(fan2_input);
2669 static DEVICE_ATTR_RO(fan2_label);
2670 /* Fan3 - Middle/center fan */
2671 static DEVICE_ATTR_RW(pwm3_enable);
2672 static DEVICE_ATTR_RO(fan3_input);
2673 static DEVICE_ATTR_RO(fan3_label);
2674 
2675 /* Temperature */
2676 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
2677 
2678 static struct attribute *hwmon_attributes[] = {
2679 	&dev_attr_pwm1.attr,
2680 	&dev_attr_pwm1_enable.attr,
2681 	&dev_attr_pwm2_enable.attr,
2682 	&dev_attr_pwm3_enable.attr,
2683 	&dev_attr_fan1_input.attr,
2684 	&dev_attr_fan1_label.attr,
2685 	&dev_attr_fan2_input.attr,
2686 	&dev_attr_fan2_label.attr,
2687 	&dev_attr_fan3_input.attr,
2688 	&dev_attr_fan3_label.attr,
2689 
2690 	&dev_attr_temp1_input.attr,
2691 	NULL
2692 };
2693 
2694 static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
2695 					  struct attribute *attr, int idx)
2696 {
2697 	struct device *dev = kobj_to_dev(kobj);
2698 	struct asus_wmi *asus = dev_get_drvdata(dev->parent);
2699 	u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
2700 
2701 	if (attr == &dev_attr_pwm1.attr) {
2702 		if (asus->fan_type != FAN_TYPE_AGFN)
2703 			return 0;
2704 	} else if (attr == &dev_attr_fan1_input.attr
2705 	    || attr == &dev_attr_fan1_label.attr
2706 	    || attr == &dev_attr_pwm1_enable.attr) {
2707 		if (asus->fan_type == FAN_TYPE_NONE)
2708 			return 0;
2709 	} else if (attr == &dev_attr_fan2_input.attr
2710 	    || attr == &dev_attr_fan2_label.attr
2711 	    || attr == &dev_attr_pwm2_enable.attr) {
2712 		if (asus->gpu_fan_type == FAN_TYPE_NONE)
2713 			return 0;
2714 	} else if (attr == &dev_attr_fan3_input.attr
2715 	    || attr == &dev_attr_fan3_label.attr
2716 	    || attr == &dev_attr_pwm3_enable.attr) {
2717 		if (asus->mid_fan_type == FAN_TYPE_NONE)
2718 			return 0;
2719 	} else if (attr == &dev_attr_temp1_input.attr) {
2720 		int err = asus_wmi_get_devstate(asus,
2721 						ASUS_WMI_DEVID_THERMAL_CTRL,
2722 						&value);
2723 
2724 		if (err < 0)
2725 			return 0; /* can't return negative here */
2726 
2727 		/*
2728 		 * If the temperature value in deci-Kelvin is near the absolute
2729 		 * zero temperature, something is clearly wrong
2730 		 */
2731 		if (value == 0 || value == 1)
2732 			return 0;
2733 	}
2734 
2735 	return attr->mode;
2736 }
2737 
2738 static const struct attribute_group hwmon_attribute_group = {
2739 	.is_visible = asus_hwmon_sysfs_is_visible,
2740 	.attrs = hwmon_attributes
2741 };
2742 __ATTRIBUTE_GROUPS(hwmon_attribute);
2743 
2744 static int asus_wmi_hwmon_init(struct asus_wmi *asus)
2745 {
2746 	struct device *dev = &asus->platform_device->dev;
2747 	struct device *hwmon;
2748 
2749 	hwmon = devm_hwmon_device_register_with_groups(dev, "asus", asus,
2750 			hwmon_attribute_groups);
2751 
2752 	if (IS_ERR(hwmon)) {
2753 		pr_err("Could not register asus hwmon device\n");
2754 		return PTR_ERR(hwmon);
2755 	}
2756 	return 0;
2757 }
2758 
2759 static int asus_wmi_fan_init(struct asus_wmi *asus)
2760 {
2761 	asus->gpu_fan_type = FAN_TYPE_NONE;
2762 	asus->mid_fan_type = FAN_TYPE_NONE;
2763 	asus->fan_type = FAN_TYPE_NONE;
2764 	asus->agfn_pwm = -1;
2765 
2766 	if (asus->driver->quirks->wmi_ignore_fan)
2767 		asus->fan_type = FAN_TYPE_NONE;
2768 	else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))
2769 		asus->fan_type = FAN_TYPE_SPEC83;
2770 	else if (asus_wmi_has_agfn_fan(asus))
2771 		asus->fan_type = FAN_TYPE_AGFN;
2772 
2773 	/*  Modern models like G713 also have GPU fan control */
2774 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL))
2775 		asus->gpu_fan_type = FAN_TYPE_SPEC83;
2776 
2777 	/* Some models also have a center/middle fan */
2778 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MID_FAN_CTRL))
2779 		asus->mid_fan_type = FAN_TYPE_SPEC83;
2780 
2781 	if (asus->fan_type == FAN_TYPE_NONE)
2782 		return -ENODEV;
2783 
2784 	asus_fan_set_auto(asus);
2785 	asus->fan_pwm_mode = ASUS_FAN_CTRL_AUTO;
2786 	return 0;
2787 }
2788 
2789 /* Fan mode *******************************************************************/
2790 
2791 static int fan_boost_mode_check_present(struct asus_wmi *asus)
2792 {
2793 	u32 result;
2794 	int err;
2795 
2796 	asus->fan_boost_mode_available = false;
2797 
2798 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE,
2799 				    &result);
2800 	if (err) {
2801 		if (err == -ENODEV)
2802 			return 0;
2803 		else
2804 			return err;
2805 	}
2806 
2807 	if ((result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
2808 			(result & ASUS_FAN_BOOST_MODES_MASK)) {
2809 		asus->fan_boost_mode_available = true;
2810 		asus->fan_boost_mode_mask = result & ASUS_FAN_BOOST_MODES_MASK;
2811 	}
2812 
2813 	return 0;
2814 }
2815 
2816 static int fan_boost_mode_write(struct asus_wmi *asus)
2817 {
2818 	u32 retval;
2819 	u8 value;
2820 	int err;
2821 
2822 	value = asus->fan_boost_mode;
2823 
2824 	pr_info("Set fan boost mode: %u\n", value);
2825 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value,
2826 				    &retval);
2827 
2828 	sysfs_notify(&asus->platform_device->dev.kobj, NULL,
2829 			"fan_boost_mode");
2830 
2831 	if (err) {
2832 		pr_warn("Failed to set fan boost mode: %d\n", err);
2833 		return err;
2834 	}
2835 
2836 	if (retval != 1) {
2837 		pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
2838 			retval);
2839 		return -EIO;
2840 	}
2841 
2842 	return 0;
2843 }
2844 
2845 static int fan_boost_mode_switch_next(struct asus_wmi *asus)
2846 {
2847 	u8 mask = asus->fan_boost_mode_mask;
2848 
2849 	if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_NORMAL) {
2850 		if (mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK)
2851 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST;
2852 		else if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
2853 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
2854 	} else if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
2855 		if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
2856 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
2857 		else
2858 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
2859 	} else {
2860 		asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
2861 	}
2862 
2863 	return fan_boost_mode_write(asus);
2864 }
2865 
2866 static ssize_t fan_boost_mode_show(struct device *dev,
2867 				   struct device_attribute *attr, char *buf)
2868 {
2869 	struct asus_wmi *asus = dev_get_drvdata(dev);
2870 
2871 	return sysfs_emit(buf, "%d\n", asus->fan_boost_mode);
2872 }
2873 
2874 static ssize_t fan_boost_mode_store(struct device *dev,
2875 				    struct device_attribute *attr,
2876 				    const char *buf, size_t count)
2877 {
2878 	struct asus_wmi *asus = dev_get_drvdata(dev);
2879 	u8 mask = asus->fan_boost_mode_mask;
2880 	u8 new_mode;
2881 	int result;
2882 
2883 	result = kstrtou8(buf, 10, &new_mode);
2884 	if (result < 0) {
2885 		pr_warn("Trying to store invalid value\n");
2886 		return result;
2887 	}
2888 
2889 	if (new_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
2890 		if (!(mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK))
2891 			return -EINVAL;
2892 	} else if (new_mode == ASUS_FAN_BOOST_MODE_SILENT) {
2893 		if (!(mask & ASUS_FAN_BOOST_MODE_SILENT_MASK))
2894 			return -EINVAL;
2895 	} else if (new_mode != ASUS_FAN_BOOST_MODE_NORMAL) {
2896 		return -EINVAL;
2897 	}
2898 
2899 	asus->fan_boost_mode = new_mode;
2900 	fan_boost_mode_write(asus);
2901 
2902 	return count;
2903 }
2904 
2905 // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
2906 static DEVICE_ATTR_RW(fan_boost_mode);
2907 
2908 /* Custom fan curves **********************************************************/
2909 
2910 static void fan_curve_copy_from_buf(struct fan_curve_data *data, u8 *buf)
2911 {
2912 	int i;
2913 
2914 	for (i = 0; i < FAN_CURVE_POINTS; i++) {
2915 		data->temps[i] = buf[i];
2916 	}
2917 
2918 	for (i = 0; i < FAN_CURVE_POINTS; i++) {
2919 		data->percents[i] =
2920 			255 * buf[i + FAN_CURVE_POINTS] / 100;
2921 	}
2922 }
2923 
2924 static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev)
2925 {
2926 	struct fan_curve_data *curves;
2927 	u8 buf[FAN_CURVE_BUF_LEN];
2928 	int err, fan_idx;
2929 	u8 mode = 0;
2930 
2931 	if (asus->throttle_thermal_policy_available)
2932 		mode = asus->throttle_thermal_policy_mode;
2933 	/* DEVID_<C/G>PU_FAN_CURVE is switched for OVERBOOST vs SILENT */
2934 	if (mode == 2)
2935 		mode = 1;
2936 	else if (mode == 1)
2937 		mode = 2;
2938 
2939 	err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf,
2940 					   FAN_CURVE_BUF_LEN);
2941 	if (err) {
2942 		pr_warn("%s (0x%08x) failed: %d\n", __func__, fan_dev, err);
2943 		return err;
2944 	}
2945 
2946 	fan_idx = FAN_CURVE_DEV_CPU;
2947 	if (fan_dev == ASUS_WMI_DEVID_GPU_FAN_CURVE)
2948 		fan_idx = FAN_CURVE_DEV_GPU;
2949 
2950 	if (fan_dev == ASUS_WMI_DEVID_MID_FAN_CURVE)
2951 		fan_idx = FAN_CURVE_DEV_MID;
2952 
2953 	curves = &asus->custom_fan_curves[fan_idx];
2954 	curves->device_id = fan_dev;
2955 
2956 	fan_curve_copy_from_buf(curves, buf);
2957 	return 0;
2958 }
2959 
2960 /* Check if capability exists, and populate defaults */
2961 static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
2962 				   u32 fan_dev)
2963 {
2964 	int err;
2965 
2966 	*available = false;
2967 
2968 	if (asus->fan_type == FAN_TYPE_NONE)
2969 		return 0;
2970 
2971 	err = fan_curve_get_factory_default(asus, fan_dev);
2972 	if (err) {
2973 		return 0;
2974 	}
2975 
2976 	*available = true;
2977 	return 0;
2978 }
2979 
2980 /* Determine which fan the attribute is for if SENSOR_ATTR */
2981 static struct fan_curve_data *fan_curve_attr_select(struct asus_wmi *asus,
2982 					      struct device_attribute *attr)
2983 {
2984 	int index = to_sensor_dev_attr(attr)->index;
2985 
2986 	return &asus->custom_fan_curves[index];
2987 }
2988 
2989 /* Determine which fan the attribute is for if SENSOR_ATTR_2 */
2990 static struct fan_curve_data *fan_curve_attr_2_select(struct asus_wmi *asus,
2991 					    struct device_attribute *attr)
2992 {
2993 	int nr = to_sensor_dev_attr_2(attr)->nr;
2994 
2995 	return &asus->custom_fan_curves[nr & ~FAN_CURVE_PWM_MASK];
2996 }
2997 
2998 static ssize_t fan_curve_show(struct device *dev,
2999 			      struct device_attribute *attr, char *buf)
3000 {
3001 	struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
3002 	struct asus_wmi *asus = dev_get_drvdata(dev);
3003 	struct fan_curve_data *data;
3004 	int value, pwm, index;
3005 
3006 	data = fan_curve_attr_2_select(asus, attr);
3007 	pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
3008 	index = dev_attr->index;
3009 
3010 	if (pwm)
3011 		value = data->percents[index];
3012 	else
3013 		value = data->temps[index];
3014 
3015 	return sysfs_emit(buf, "%d\n", value);
3016 }
3017 
3018 /*
3019  * "fan_dev" is the related WMI method such as ASUS_WMI_DEVID_CPU_FAN_CURVE.
3020  */
3021 static int fan_curve_write(struct asus_wmi *asus,
3022 			   struct fan_curve_data *data)
3023 {
3024 	u32 arg1 = 0, arg2 = 0, arg3 = 0, arg4 = 0;
3025 	u8 *percents = data->percents;
3026 	u8 *temps = data->temps;
3027 	int ret, i, shift = 0;
3028 
3029 	if (!data->enabled)
3030 		return 0;
3031 
3032 	for (i = 0; i < FAN_CURVE_POINTS / 2; i++) {
3033 		arg1 += (temps[i]) << shift;
3034 		arg2 += (temps[i + 4]) << shift;
3035 		/* Scale to percentage for device */
3036 		arg3 += (100 * percents[i] / 255) << shift;
3037 		arg4 += (100 * percents[i + 4] / 255) << shift;
3038 		shift += 8;
3039 	}
3040 
3041 	return asus_wmi_evaluate_method5(ASUS_WMI_METHODID_DEVS,
3042 					 data->device_id,
3043 					 arg1, arg2, arg3, arg4, &ret);
3044 }
3045 
3046 static ssize_t fan_curve_store(struct device *dev,
3047 			       struct device_attribute *attr, const char *buf,
3048 			       size_t count)
3049 {
3050 	struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
3051 	struct asus_wmi *asus = dev_get_drvdata(dev);
3052 	struct fan_curve_data *data;
3053 	int err, pwm, index;
3054 	u8 value;
3055 
3056 	data = fan_curve_attr_2_select(asus, attr);
3057 	pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
3058 	index = dev_attr->index;
3059 
3060 	err = kstrtou8(buf, 10, &value);
3061 	if (err < 0)
3062 		return err;
3063 
3064 	if (pwm)
3065 		data->percents[index] = value;
3066 	else
3067 		data->temps[index] = value;
3068 
3069 	/*
3070 	 * Mark as disabled so the user has to explicitly enable to apply a
3071 	 * changed fan curve. This prevents potential lockups from writing out
3072 	 * many changes as one-write-per-change.
3073 	 */
3074 	data->enabled = false;
3075 
3076 	return count;
3077 }
3078 
3079 static ssize_t fan_curve_enable_show(struct device *dev,
3080 				     struct device_attribute *attr, char *buf)
3081 {
3082 	struct asus_wmi *asus = dev_get_drvdata(dev);
3083 	struct fan_curve_data *data;
3084 	int out = 2;
3085 
3086 	data = fan_curve_attr_select(asus, attr);
3087 
3088 	if (data->enabled)
3089 		out = 1;
3090 
3091 	return sysfs_emit(buf, "%d\n", out);
3092 }
3093 
3094 static ssize_t fan_curve_enable_store(struct device *dev,
3095 				      struct device_attribute *attr,
3096 				      const char *buf, size_t count)
3097 {
3098 	struct asus_wmi *asus = dev_get_drvdata(dev);
3099 	struct fan_curve_data *data;
3100 	int value, err;
3101 
3102 	data = fan_curve_attr_select(asus, attr);
3103 
3104 	err = kstrtoint(buf, 10, &value);
3105 	if (err < 0)
3106 		return err;
3107 
3108 	switch (value) {
3109 	case 1:
3110 		data->enabled = true;
3111 		break;
3112 	case 2:
3113 		data->enabled = false;
3114 		break;
3115 	/*
3116 	 * Auto + reset the fan curve data to defaults. Make it an explicit
3117 	 * option so that users don't accidentally overwrite a set fan curve.
3118 	 */
3119 	case 3:
3120 		err = fan_curve_get_factory_default(asus, data->device_id);
3121 		if (err)
3122 			return err;
3123 		data->enabled = false;
3124 		break;
3125 	default:
3126 		return -EINVAL;
3127 	}
3128 
3129 	if (data->enabled) {
3130 		err = fan_curve_write(asus, data);
3131 		if (err)
3132 			return err;
3133 	} else {
3134 		/*
3135 		 * For machines with throttle this is the only way to reset fans
3136 		 * to default mode of operation (does not erase curve data).
3137 		 */
3138 		if (asus->throttle_thermal_policy_available) {
3139 			err = throttle_thermal_policy_write(asus);
3140 			if (err)
3141 				return err;
3142 		/* Similar is true for laptops with this fan */
3143 		} else if (asus->fan_type == FAN_TYPE_SPEC83) {
3144 			err = asus_fan_set_auto(asus);
3145 			if (err)
3146 				return err;
3147 		} else {
3148 			/* Safeguard against fautly ACPI tables */
3149 			err = fan_curve_get_factory_default(asus, data->device_id);
3150 			if (err)
3151 				return err;
3152 			err = fan_curve_write(asus, data);
3153 			if (err)
3154 				return err;
3155 		}
3156 	}
3157 	return count;
3158 }
3159 
3160 /* CPU */
3161 static SENSOR_DEVICE_ATTR_RW(pwm1_enable, fan_curve_enable, FAN_CURVE_DEV_CPU);
3162 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_temp, fan_curve,
3163 			       FAN_CURVE_DEV_CPU, 0);
3164 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_temp, fan_curve,
3165 			       FAN_CURVE_DEV_CPU, 1);
3166 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_temp, fan_curve,
3167 			       FAN_CURVE_DEV_CPU, 2);
3168 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_temp, fan_curve,
3169 			       FAN_CURVE_DEV_CPU, 3);
3170 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_temp, fan_curve,
3171 			       FAN_CURVE_DEV_CPU, 4);
3172 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_temp, fan_curve,
3173 			       FAN_CURVE_DEV_CPU, 5);
3174 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_temp, fan_curve,
3175 			       FAN_CURVE_DEV_CPU, 6);
3176 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp, fan_curve,
3177 			       FAN_CURVE_DEV_CPU, 7);
3178 
3179 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_pwm, fan_curve,
3180 				FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 0);
3181 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_pwm, fan_curve,
3182 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 1);
3183 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_pwm, fan_curve,
3184 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 2);
3185 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_pwm, fan_curve,
3186 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 3);
3187 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_pwm, fan_curve,
3188 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 4);
3189 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_pwm, fan_curve,
3190 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 5);
3191 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_pwm, fan_curve,
3192 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 6);
3193 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_pwm, fan_curve,
3194 			       FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 7);
3195 
3196 /* GPU */
3197 static SENSOR_DEVICE_ATTR_RW(pwm2_enable, fan_curve_enable, FAN_CURVE_DEV_GPU);
3198 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_temp, fan_curve,
3199 			       FAN_CURVE_DEV_GPU, 0);
3200 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_temp, fan_curve,
3201 			       FAN_CURVE_DEV_GPU, 1);
3202 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_temp, fan_curve,
3203 			       FAN_CURVE_DEV_GPU, 2);
3204 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_temp, fan_curve,
3205 			       FAN_CURVE_DEV_GPU, 3);
3206 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_temp, fan_curve,
3207 			       FAN_CURVE_DEV_GPU, 4);
3208 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_temp, fan_curve,
3209 			       FAN_CURVE_DEV_GPU, 5);
3210 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_temp, fan_curve,
3211 			       FAN_CURVE_DEV_GPU, 6);
3212 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_temp, fan_curve,
3213 			       FAN_CURVE_DEV_GPU, 7);
3214 
3215 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_pwm, fan_curve,
3216 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 0);
3217 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_pwm, fan_curve,
3218 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 1);
3219 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_pwm, fan_curve,
3220 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 2);
3221 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_pwm, fan_curve,
3222 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 3);
3223 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_pwm, fan_curve,
3224 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 4);
3225 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_pwm, fan_curve,
3226 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 5);
3227 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm, fan_curve,
3228 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 6);
3229 static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve,
3230 			       FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7);
3231 
3232 /* MID */
3233 static SENSOR_DEVICE_ATTR_RW(pwm3_enable, fan_curve_enable, FAN_CURVE_DEV_MID);
3234 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_temp, fan_curve,
3235 			       FAN_CURVE_DEV_MID, 0);
3236 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_temp, fan_curve,
3237 			       FAN_CURVE_DEV_MID, 1);
3238 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_temp, fan_curve,
3239 			       FAN_CURVE_DEV_MID, 2);
3240 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_temp, fan_curve,
3241 			       FAN_CURVE_DEV_MID, 3);
3242 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_temp, fan_curve,
3243 			       FAN_CURVE_DEV_MID, 4);
3244 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_temp, fan_curve,
3245 			       FAN_CURVE_DEV_MID, 5);
3246 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_temp, fan_curve,
3247 			       FAN_CURVE_DEV_MID, 6);
3248 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_temp, fan_curve,
3249 			       FAN_CURVE_DEV_MID, 7);
3250 
3251 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_pwm, fan_curve,
3252 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 0);
3253 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_pwm, fan_curve,
3254 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 1);
3255 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_pwm, fan_curve,
3256 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 2);
3257 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_pwm, fan_curve,
3258 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 3);
3259 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_pwm, fan_curve,
3260 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 4);
3261 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_pwm, fan_curve,
3262 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 5);
3263 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_pwm, fan_curve,
3264 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 6);
3265 static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_pwm, fan_curve,
3266 			       FAN_CURVE_DEV_MID | FAN_CURVE_PWM_MASK, 7);
3267 
3268 static struct attribute *asus_fan_curve_attr[] = {
3269 	/* CPU */
3270 	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
3271 	&sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
3272 	&sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
3273 	&sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
3274 	&sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
3275 	&sensor_dev_attr_pwm1_auto_point5_temp.dev_attr.attr,
3276 	&sensor_dev_attr_pwm1_auto_point6_temp.dev_attr.attr,
3277 	&sensor_dev_attr_pwm1_auto_point7_temp.dev_attr.attr,
3278 	&sensor_dev_attr_pwm1_auto_point8_temp.dev_attr.attr,
3279 	&sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
3280 	&sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
3281 	&sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
3282 	&sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
3283 	&sensor_dev_attr_pwm1_auto_point5_pwm.dev_attr.attr,
3284 	&sensor_dev_attr_pwm1_auto_point6_pwm.dev_attr.attr,
3285 	&sensor_dev_attr_pwm1_auto_point7_pwm.dev_attr.attr,
3286 	&sensor_dev_attr_pwm1_auto_point8_pwm.dev_attr.attr,
3287 	/* GPU */
3288 	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
3289 	&sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
3290 	&sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
3291 	&sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
3292 	&sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
3293 	&sensor_dev_attr_pwm2_auto_point5_temp.dev_attr.attr,
3294 	&sensor_dev_attr_pwm2_auto_point6_temp.dev_attr.attr,
3295 	&sensor_dev_attr_pwm2_auto_point7_temp.dev_attr.attr,
3296 	&sensor_dev_attr_pwm2_auto_point8_temp.dev_attr.attr,
3297 	&sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
3298 	&sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
3299 	&sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
3300 	&sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
3301 	&sensor_dev_attr_pwm2_auto_point5_pwm.dev_attr.attr,
3302 	&sensor_dev_attr_pwm2_auto_point6_pwm.dev_attr.attr,
3303 	&sensor_dev_attr_pwm2_auto_point7_pwm.dev_attr.attr,
3304 	&sensor_dev_attr_pwm2_auto_point8_pwm.dev_attr.attr,
3305 	/* MID */
3306 	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
3307 	&sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
3308 	&sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
3309 	&sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
3310 	&sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
3311 	&sensor_dev_attr_pwm3_auto_point5_temp.dev_attr.attr,
3312 	&sensor_dev_attr_pwm3_auto_point6_temp.dev_attr.attr,
3313 	&sensor_dev_attr_pwm3_auto_point7_temp.dev_attr.attr,
3314 	&sensor_dev_attr_pwm3_auto_point8_temp.dev_attr.attr,
3315 	&sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
3316 	&sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
3317 	&sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
3318 	&sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
3319 	&sensor_dev_attr_pwm3_auto_point5_pwm.dev_attr.attr,
3320 	&sensor_dev_attr_pwm3_auto_point6_pwm.dev_attr.attr,
3321 	&sensor_dev_attr_pwm3_auto_point7_pwm.dev_attr.attr,
3322 	&sensor_dev_attr_pwm3_auto_point8_pwm.dev_attr.attr,
3323 	NULL
3324 };
3325 
3326 static umode_t asus_fan_curve_is_visible(struct kobject *kobj,
3327 					 struct attribute *attr, int idx)
3328 {
3329 	struct device *dev = kobj_to_dev(kobj);
3330 	struct asus_wmi *asus = dev_get_drvdata(dev->parent);
3331 
3332 	/*
3333 	 * Check the char instead of casting attr as there are two attr types
3334 	 * involved here (attr1 and attr2)
3335 	 */
3336 	if (asus->cpu_fan_curve_available && attr->name[3] == '1')
3337 		return 0644;
3338 
3339 	if (asus->gpu_fan_curve_available && attr->name[3] == '2')
3340 		return 0644;
3341 
3342 	if (asus->mid_fan_curve_available && attr->name[3] == '3')
3343 		return 0644;
3344 
3345 	return 0;
3346 }
3347 
3348 static const struct attribute_group asus_fan_curve_attr_group = {
3349 	.is_visible = asus_fan_curve_is_visible,
3350 	.attrs = asus_fan_curve_attr,
3351 };
3352 __ATTRIBUTE_GROUPS(asus_fan_curve_attr);
3353 
3354 /*
3355  * Must be initialised after throttle_thermal_policy_check_present() as
3356  * we check the status of throttle_thermal_policy_available during init.
3357  */
3358 static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
3359 {
3360 	struct device *dev = &asus->platform_device->dev;
3361 	struct device *hwmon;
3362 	int err;
3363 
3364 	err = fan_curve_check_present(asus, &asus->cpu_fan_curve_available,
3365 				      ASUS_WMI_DEVID_CPU_FAN_CURVE);
3366 	if (err)
3367 		return err;
3368 
3369 	err = fan_curve_check_present(asus, &asus->gpu_fan_curve_available,
3370 				      ASUS_WMI_DEVID_GPU_FAN_CURVE);
3371 	if (err)
3372 		return err;
3373 
3374 	err = fan_curve_check_present(asus, &asus->mid_fan_curve_available,
3375 				      ASUS_WMI_DEVID_MID_FAN_CURVE);
3376 	if (err)
3377 		return err;
3378 
3379 	if (!asus->cpu_fan_curve_available
3380 		&& !asus->gpu_fan_curve_available
3381 		&& !asus->mid_fan_curve_available)
3382 		return 0;
3383 
3384 	hwmon = devm_hwmon_device_register_with_groups(
3385 		dev, "asus_custom_fan_curve", asus, asus_fan_curve_attr_groups);
3386 
3387 	if (IS_ERR(hwmon)) {
3388 		dev_err(dev,
3389 			"Could not register asus_custom_fan_curve device\n");
3390 		return PTR_ERR(hwmon);
3391 	}
3392 
3393 	return 0;
3394 }
3395 
3396 /* Throttle thermal policy ****************************************************/
3397 
3398 static int throttle_thermal_policy_check_present(struct asus_wmi *asus)
3399 {
3400 	u32 result;
3401 	int err;
3402 
3403 	asus->throttle_thermal_policy_available = false;
3404 
3405 	err = asus_wmi_get_devstate(asus,
3406 				    ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
3407 				    &result);
3408 	if (err) {
3409 		if (err == -ENODEV)
3410 			return 0;
3411 		return err;
3412 	}
3413 
3414 	if (result & ASUS_WMI_DSTS_PRESENCE_BIT)
3415 		asus->throttle_thermal_policy_available = true;
3416 
3417 	return 0;
3418 }
3419 
3420 static int throttle_thermal_policy_write(struct asus_wmi *asus)
3421 {
3422 	int err;
3423 	u8 value;
3424 	u32 retval;
3425 
3426 	value = asus->throttle_thermal_policy_mode;
3427 
3428 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
3429 				    value, &retval);
3430 
3431 	sysfs_notify(&asus->platform_device->dev.kobj, NULL,
3432 			"throttle_thermal_policy");
3433 
3434 	if (err) {
3435 		pr_warn("Failed to set throttle thermal policy: %d\n", err);
3436 		return err;
3437 	}
3438 
3439 	if (retval != 1) {
3440 		pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n",
3441 			retval);
3442 		return -EIO;
3443 	}
3444 
3445 	/* Must set to disabled if mode is toggled */
3446 	if (asus->cpu_fan_curve_available)
3447 		asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
3448 	if (asus->gpu_fan_curve_available)
3449 		asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
3450 	if (asus->mid_fan_curve_available)
3451 		asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
3452 
3453 	return 0;
3454 }
3455 
3456 static int throttle_thermal_policy_set_default(struct asus_wmi *asus)
3457 {
3458 	if (!asus->throttle_thermal_policy_available)
3459 		return 0;
3460 
3461 	asus->throttle_thermal_policy_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3462 	return throttle_thermal_policy_write(asus);
3463 }
3464 
3465 static int throttle_thermal_policy_switch_next(struct asus_wmi *asus)
3466 {
3467 	u8 new_mode = asus->throttle_thermal_policy_mode + 1;
3468 	int err;
3469 
3470 	if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
3471 		new_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3472 
3473 	asus->throttle_thermal_policy_mode = new_mode;
3474 	err = throttle_thermal_policy_write(asus);
3475 	if (err)
3476 		return err;
3477 
3478 	/*
3479 	 * Ensure that platform_profile updates userspace with the change to ensure
3480 	 * that platform_profile and throttle_thermal_policy_mode are in sync.
3481 	 */
3482 	platform_profile_notify();
3483 
3484 	return 0;
3485 }
3486 
3487 static ssize_t throttle_thermal_policy_show(struct device *dev,
3488 				   struct device_attribute *attr, char *buf)
3489 {
3490 	struct asus_wmi *asus = dev_get_drvdata(dev);
3491 	u8 mode = asus->throttle_thermal_policy_mode;
3492 
3493 	return sysfs_emit(buf, "%d\n", mode);
3494 }
3495 
3496 static ssize_t throttle_thermal_policy_store(struct device *dev,
3497 				    struct device_attribute *attr,
3498 				    const char *buf, size_t count)
3499 {
3500 	struct asus_wmi *asus = dev_get_drvdata(dev);
3501 	u8 new_mode;
3502 	int result;
3503 	int err;
3504 
3505 	result = kstrtou8(buf, 10, &new_mode);
3506 	if (result < 0)
3507 		return result;
3508 
3509 	if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
3510 		return -EINVAL;
3511 
3512 	asus->throttle_thermal_policy_mode = new_mode;
3513 	err = throttle_thermal_policy_write(asus);
3514 	if (err)
3515 		return err;
3516 
3517 	/*
3518 	 * Ensure that platform_profile updates userspace with the change to ensure
3519 	 * that platform_profile and throttle_thermal_policy_mode are in sync.
3520 	 */
3521 	platform_profile_notify();
3522 
3523 	return count;
3524 }
3525 
3526 // Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
3527 static DEVICE_ATTR_RW(throttle_thermal_policy);
3528 
3529 /* Platform profile ***********************************************************/
3530 static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
3531 					enum platform_profile_option *profile)
3532 {
3533 	struct asus_wmi *asus;
3534 	int tp;
3535 
3536 	asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
3537 
3538 	tp = asus->throttle_thermal_policy_mode;
3539 
3540 	switch (tp) {
3541 	case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
3542 		*profile = PLATFORM_PROFILE_BALANCED;
3543 		break;
3544 	case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
3545 		*profile = PLATFORM_PROFILE_PERFORMANCE;
3546 		break;
3547 	case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
3548 		*profile = PLATFORM_PROFILE_QUIET;
3549 		break;
3550 	default:
3551 		return -EINVAL;
3552 	}
3553 
3554 	return 0;
3555 }
3556 
3557 static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,
3558 					enum platform_profile_option profile)
3559 {
3560 	struct asus_wmi *asus;
3561 	int tp;
3562 
3563 	asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
3564 
3565 	switch (profile) {
3566 	case PLATFORM_PROFILE_PERFORMANCE:
3567 		tp = ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST;
3568 		break;
3569 	case PLATFORM_PROFILE_BALANCED:
3570 		tp = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
3571 		break;
3572 	case PLATFORM_PROFILE_QUIET:
3573 		tp = ASUS_THROTTLE_THERMAL_POLICY_SILENT;
3574 		break;
3575 	default:
3576 		return -EOPNOTSUPP;
3577 	}
3578 
3579 	asus->throttle_thermal_policy_mode = tp;
3580 	return throttle_thermal_policy_write(asus);
3581 }
3582 
3583 static int platform_profile_setup(struct asus_wmi *asus)
3584 {
3585 	struct device *dev = &asus->platform_device->dev;
3586 	int err;
3587 
3588 	/*
3589 	 * Not an error if a component platform_profile relies on is unavailable
3590 	 * so early return, skipping the setup of platform_profile.
3591 	 */
3592 	if (!asus->throttle_thermal_policy_available)
3593 		return 0;
3594 
3595 	dev_info(dev, "Using throttle_thermal_policy for platform_profile support\n");
3596 
3597 	asus->platform_profile_handler.profile_get = asus_wmi_platform_profile_get;
3598 	asus->platform_profile_handler.profile_set = asus_wmi_platform_profile_set;
3599 
3600 	set_bit(PLATFORM_PROFILE_QUIET, asus->platform_profile_handler.choices);
3601 	set_bit(PLATFORM_PROFILE_BALANCED,
3602 		asus->platform_profile_handler.choices);
3603 	set_bit(PLATFORM_PROFILE_PERFORMANCE,
3604 		asus->platform_profile_handler.choices);
3605 
3606 	err = platform_profile_register(&asus->platform_profile_handler);
3607 	if (err)
3608 		return err;
3609 
3610 	asus->platform_profile_support = true;
3611 	return 0;
3612 }
3613 
3614 /* Backlight ******************************************************************/
3615 
3616 static int read_backlight_power(struct asus_wmi *asus)
3617 {
3618 	int ret;
3619 
3620 	if (asus->driver->quirks->store_backlight_power)
3621 		ret = !asus->driver->panel_power;
3622 	else
3623 		ret = asus_wmi_get_devstate_simple(asus,
3624 						   ASUS_WMI_DEVID_BACKLIGHT);
3625 
3626 	if (ret < 0)
3627 		return ret;
3628 
3629 	return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
3630 }
3631 
3632 static int read_brightness_max(struct asus_wmi *asus)
3633 {
3634 	u32 retval;
3635 	int err;
3636 
3637 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
3638 	if (err < 0)
3639 		return err;
3640 
3641 	retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
3642 	retval >>= 8;
3643 
3644 	if (!retval)
3645 		return -ENODEV;
3646 
3647 	return retval;
3648 }
3649 
3650 static int read_brightness(struct backlight_device *bd)
3651 {
3652 	struct asus_wmi *asus = bl_get_data(bd);
3653 	u32 retval;
3654 	int err;
3655 
3656 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
3657 	if (err < 0)
3658 		return err;
3659 
3660 	return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
3661 }
3662 
3663 static u32 get_scalar_command(struct backlight_device *bd)
3664 {
3665 	struct asus_wmi *asus = bl_get_data(bd);
3666 	u32 ctrl_param = 0;
3667 
3668 	if ((asus->driver->brightness < bd->props.brightness) ||
3669 	    bd->props.brightness == bd->props.max_brightness)
3670 		ctrl_param = 0x00008001;
3671 	else if ((asus->driver->brightness > bd->props.brightness) ||
3672 		 bd->props.brightness == 0)
3673 		ctrl_param = 0x00008000;
3674 
3675 	asus->driver->brightness = bd->props.brightness;
3676 
3677 	return ctrl_param;
3678 }
3679 
3680 static int update_bl_status(struct backlight_device *bd)
3681 {
3682 	struct asus_wmi *asus = bl_get_data(bd);
3683 	u32 ctrl_param;
3684 	int power, err = 0;
3685 
3686 	power = read_backlight_power(asus);
3687 	if (power != -ENODEV && bd->props.power != power) {
3688 		ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
3689 		err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
3690 					    ctrl_param, NULL);
3691 		if (asus->driver->quirks->store_backlight_power)
3692 			asus->driver->panel_power = bd->props.power;
3693 
3694 		/* When using scalar brightness, updating the brightness
3695 		 * will mess with the backlight power */
3696 		if (asus->driver->quirks->scalar_panel_brightness)
3697 			return err;
3698 	}
3699 
3700 	if (asus->driver->quirks->scalar_panel_brightness)
3701 		ctrl_param = get_scalar_command(bd);
3702 	else
3703 		ctrl_param = bd->props.brightness;
3704 
3705 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
3706 				    ctrl_param, NULL);
3707 
3708 	return err;
3709 }
3710 
3711 static const struct backlight_ops asus_wmi_bl_ops = {
3712 	.get_brightness = read_brightness,
3713 	.update_status = update_bl_status,
3714 };
3715 
3716 static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
3717 {
3718 	struct backlight_device *bd = asus->backlight_device;
3719 	int old = bd->props.brightness;
3720 	int new = old;
3721 
3722 	if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
3723 		new = code - NOTIFY_BRNUP_MIN + 1;
3724 	else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
3725 		new = code - NOTIFY_BRNDOWN_MIN;
3726 
3727 	bd->props.brightness = new;
3728 	backlight_update_status(bd);
3729 	backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
3730 
3731 	return old;
3732 }
3733 
3734 static int asus_wmi_backlight_init(struct asus_wmi *asus)
3735 {
3736 	struct backlight_device *bd;
3737 	struct backlight_properties props;
3738 	int max;
3739 	int power;
3740 
3741 	max = read_brightness_max(asus);
3742 	if (max < 0)
3743 		return max;
3744 
3745 	power = read_backlight_power(asus);
3746 	if (power == -ENODEV)
3747 		power = FB_BLANK_UNBLANK;
3748 	else if (power < 0)
3749 		return power;
3750 
3751 	memset(&props, 0, sizeof(struct backlight_properties));
3752 	props.type = BACKLIGHT_PLATFORM;
3753 	props.max_brightness = max;
3754 	bd = backlight_device_register(asus->driver->name,
3755 				       &asus->platform_device->dev, asus,
3756 				       &asus_wmi_bl_ops, &props);
3757 	if (IS_ERR(bd)) {
3758 		pr_err("Could not register backlight device\n");
3759 		return PTR_ERR(bd);
3760 	}
3761 
3762 	asus->backlight_device = bd;
3763 
3764 	if (asus->driver->quirks->store_backlight_power)
3765 		asus->driver->panel_power = power;
3766 
3767 	bd->props.brightness = read_brightness(bd);
3768 	bd->props.power = power;
3769 	backlight_update_status(bd);
3770 
3771 	asus->driver->brightness = bd->props.brightness;
3772 
3773 	return 0;
3774 }
3775 
3776 static void asus_wmi_backlight_exit(struct asus_wmi *asus)
3777 {
3778 	backlight_device_unregister(asus->backlight_device);
3779 
3780 	asus->backlight_device = NULL;
3781 }
3782 
3783 static int is_display_toggle(int code)
3784 {
3785 	/* display toggle keys */
3786 	if ((code >= 0x61 && code <= 0x67) ||
3787 	    (code >= 0x8c && code <= 0x93) ||
3788 	    (code >= 0xa0 && code <= 0xa7) ||
3789 	    (code >= 0xd0 && code <= 0xd5))
3790 		return 1;
3791 
3792 	return 0;
3793 }
3794 
3795 /* Screenpad backlight *******************************************************/
3796 
3797 static int read_screenpad_backlight_power(struct asus_wmi *asus)
3798 {
3799 	int ret;
3800 
3801 	ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_SCREENPAD_POWER);
3802 	if (ret < 0)
3803 		return ret;
3804 	/* 1 == powered */
3805 	return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
3806 }
3807 
3808 static int read_screenpad_brightness(struct backlight_device *bd)
3809 {
3810 	struct asus_wmi *asus = bl_get_data(bd);
3811 	u32 retval;
3812 	int err;
3813 
3814 	err = read_screenpad_backlight_power(asus);
3815 	if (err < 0)
3816 		return err;
3817 	/* The device brightness can only be read if powered, so return stored */
3818 	if (err == FB_BLANK_POWERDOWN)
3819 		return asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
3820 
3821 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &retval);
3822 	if (err < 0)
3823 		return err;
3824 
3825 	return (retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK) - ASUS_SCREENPAD_BRIGHT_MIN;
3826 }
3827 
3828 static int update_screenpad_bl_status(struct backlight_device *bd)
3829 {
3830 	struct asus_wmi *asus = bl_get_data(bd);
3831 	int power, err = 0;
3832 	u32 ctrl_param;
3833 
3834 	power = read_screenpad_backlight_power(asus);
3835 	if (power < 0)
3836 		return power;
3837 
3838 	if (bd->props.power != power) {
3839 		if (power != FB_BLANK_UNBLANK) {
3840 			/* Only brightness > 0 can power it back on */
3841 			ctrl_param = asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
3842 			err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT,
3843 						    ctrl_param, NULL);
3844 		} else {
3845 			err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER, 0, NULL);
3846 		}
3847 	} else if (power == FB_BLANK_UNBLANK) {
3848 		/* Only set brightness if powered on or we get invalid/unsync state */
3849 		ctrl_param = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
3850 		err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ctrl_param, NULL);
3851 	}
3852 
3853 	/* Ensure brightness is stored to turn back on with */
3854 	if (err == 0)
3855 		asus->driver->screenpad_brightness = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
3856 
3857 	return err;
3858 }
3859 
3860 static const struct backlight_ops asus_screenpad_bl_ops = {
3861 	.get_brightness = read_screenpad_brightness,
3862 	.update_status = update_screenpad_bl_status,
3863 	.options = BL_CORE_SUSPENDRESUME,
3864 };
3865 
3866 static int asus_screenpad_init(struct asus_wmi *asus)
3867 {
3868 	struct backlight_device *bd;
3869 	struct backlight_properties props;
3870 	int err, power;
3871 	int brightness = 0;
3872 
3873 	power = read_screenpad_backlight_power(asus);
3874 	if (power < 0)
3875 		return power;
3876 
3877 	if (power != FB_BLANK_POWERDOWN) {
3878 		err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &brightness);
3879 		if (err < 0)
3880 			return err;
3881 	}
3882 	/* default to an acceptable min brightness on boot if too low */
3883 	if (brightness < ASUS_SCREENPAD_BRIGHT_MIN)
3884 		brightness = ASUS_SCREENPAD_BRIGHT_DEFAULT;
3885 
3886 	memset(&props, 0, sizeof(struct backlight_properties));
3887 	props.type = BACKLIGHT_RAW; /* ensure this bd is last to be picked */
3888 	props.max_brightness = ASUS_SCREENPAD_BRIGHT_MAX - ASUS_SCREENPAD_BRIGHT_MIN;
3889 	bd = backlight_device_register("asus_screenpad",
3890 				       &asus->platform_device->dev, asus,
3891 				       &asus_screenpad_bl_ops, &props);
3892 	if (IS_ERR(bd)) {
3893 		pr_err("Could not register backlight device\n");
3894 		return PTR_ERR(bd);
3895 	}
3896 
3897 	asus->screenpad_backlight_device = bd;
3898 	asus->driver->screenpad_brightness = brightness;
3899 	bd->props.brightness = brightness - ASUS_SCREENPAD_BRIGHT_MIN;
3900 	bd->props.power = power;
3901 	backlight_update_status(bd);
3902 
3903 	return 0;
3904 }
3905 
3906 static void asus_screenpad_exit(struct asus_wmi *asus)
3907 {
3908 	backlight_device_unregister(asus->screenpad_backlight_device);
3909 
3910 	asus->screenpad_backlight_device = NULL;
3911 }
3912 
3913 /* Fn-lock ********************************************************************/
3914 
3915 static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus)
3916 {
3917 	u32 result;
3918 
3919 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FNLOCK, &result);
3920 
3921 	return (result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
3922 		!(result & ASUS_WMI_FNLOCK_BIOS_DISABLED);
3923 }
3924 
3925 static void asus_wmi_fnlock_update(struct asus_wmi *asus)
3926 {
3927 	int mode = asus->fnlock_locked;
3928 
3929 	asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK, mode, NULL);
3930 }
3931 
3932 /* WMI events *****************************************************************/
3933 
3934 static int asus_wmi_get_event_code(u32 value)
3935 {
3936 	struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
3937 	union acpi_object *obj;
3938 	acpi_status status;
3939 	int code;
3940 
3941 	status = wmi_get_event_data(value, &response);
3942 	if (ACPI_FAILURE(status)) {
3943 		pr_warn("Failed to get WMI notify code: %s\n",
3944 				acpi_format_exception(status));
3945 		return -EIO;
3946 	}
3947 
3948 	obj = (union acpi_object *)response.pointer;
3949 
3950 	if (obj && obj->type == ACPI_TYPE_INTEGER)
3951 		code = (int)(obj->integer.value & WMI_EVENT_MASK);
3952 	else
3953 		code = -EIO;
3954 
3955 	kfree(obj);
3956 	return code;
3957 }
3958 
3959 static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
3960 {
3961 	unsigned int key_value = 1;
3962 	bool autorelease = 1;
3963 
3964 	if (asus->driver->key_filter) {
3965 		asus->driver->key_filter(asus->driver, &code, &key_value,
3966 					 &autorelease);
3967 		if (code == ASUS_WMI_KEY_IGNORE)
3968 			return;
3969 	}
3970 
3971 	if (acpi_video_get_backlight_type() == acpi_backlight_vendor &&
3972 	    code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNDOWN_MAX) {
3973 		asus_wmi_backlight_notify(asus, code);
3974 		return;
3975 	}
3976 
3977 	if (code == NOTIFY_KBD_BRTUP) {
3978 		kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
3979 		return;
3980 	}
3981 	if (code == NOTIFY_KBD_BRTDWN) {
3982 		kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
3983 		return;
3984 	}
3985 	if (code == NOTIFY_KBD_BRTTOGGLE) {
3986 		if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
3987 			kbd_led_set_by_kbd(asus, 0);
3988 		else
3989 			kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
3990 		return;
3991 	}
3992 
3993 	if (code == NOTIFY_FNLOCK_TOGGLE) {
3994 		asus->fnlock_locked = !asus->fnlock_locked;
3995 		asus_wmi_fnlock_update(asus);
3996 		return;
3997 	}
3998 
3999 	if (code == asus->tablet_switch_event_code) {
4000 		asus_wmi_tablet_mode_get_state(asus);
4001 		return;
4002 	}
4003 
4004 	if (code == NOTIFY_KBD_FBM || code == NOTIFY_KBD_TTP) {
4005 		if (asus->fan_boost_mode_available)
4006 			fan_boost_mode_switch_next(asus);
4007 		if (asus->throttle_thermal_policy_available)
4008 			throttle_thermal_policy_switch_next(asus);
4009 		return;
4010 
4011 	}
4012 
4013 	if (is_display_toggle(code) && asus->driver->quirks->no_display_toggle)
4014 		return;
4015 
4016 	if (!sparse_keymap_report_event(asus->inputdev, code,
4017 					key_value, autorelease))
4018 		pr_info("Unknown key code 0x%x\n", code);
4019 }
4020 
4021 static void asus_wmi_notify(u32 value, void *context)
4022 {
4023 	struct asus_wmi *asus = context;
4024 	int code = asus_wmi_get_event_code(value);
4025 
4026 	if (code < 0) {
4027 		pr_warn("Failed to get notify code: %d\n", code);
4028 		return;
4029 	}
4030 
4031 	asus_wmi_handle_event_code(code, asus);
4032 }
4033 
4034 /* Sysfs **********************************************************************/
4035 
4036 static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
4037 			     const char *buf, size_t count)
4038 {
4039 	u32 retval;
4040 	int err, value;
4041 
4042 	value = asus_wmi_get_devstate_simple(asus, devid);
4043 	if (value < 0)
4044 		return value;
4045 
4046 	err = kstrtoint(buf, 0, &value);
4047 	if (err)
4048 		return err;
4049 
4050 	err = asus_wmi_set_devstate(devid, value, &retval);
4051 	if (err < 0)
4052 		return err;
4053 
4054 	return count;
4055 }
4056 
4057 static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
4058 {
4059 	int value = asus_wmi_get_devstate_simple(asus, devid);
4060 
4061 	if (value < 0)
4062 		return value;
4063 
4064 	return sprintf(buf, "%d\n", value);
4065 }
4066 
4067 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm)			\
4068 	static ssize_t show_##_name(struct device *dev,			\
4069 				    struct device_attribute *attr,	\
4070 				    char *buf)				\
4071 	{								\
4072 		struct asus_wmi *asus = dev_get_drvdata(dev);		\
4073 									\
4074 		return show_sys_wmi(asus, _cm, buf);			\
4075 	}								\
4076 	static ssize_t store_##_name(struct device *dev,		\
4077 				     struct device_attribute *attr,	\
4078 				     const char *buf, size_t count)	\
4079 	{								\
4080 		struct asus_wmi *asus = dev_get_drvdata(dev);		\
4081 									\
4082 		return store_sys_wmi(asus, _cm, buf, count);		\
4083 	}								\
4084 	static struct device_attribute dev_attr_##_name = {		\
4085 		.attr = {						\
4086 			.name = __stringify(_name),			\
4087 			.mode = _mode },				\
4088 		.show   = show_##_name,					\
4089 		.store  = store_##_name,				\
4090 	}
4091 
4092 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
4093 ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
4094 ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
4095 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
4096 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable, 0644, ASUS_WMI_DEVID_ALS_ENABLE);
4097 
4098 static ssize_t cpufv_store(struct device *dev, struct device_attribute *attr,
4099 			   const char *buf, size_t count)
4100 {
4101 	int value, rv;
4102 
4103 	rv = kstrtoint(buf, 0, &value);
4104 	if (rv)
4105 		return rv;
4106 
4107 	if (value < 0 || value > 2)
4108 		return -EINVAL;
4109 
4110 	rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
4111 	if (rv < 0)
4112 		return rv;
4113 
4114 	return count;
4115 }
4116 
4117 static DEVICE_ATTR_WO(cpufv);
4118 
4119 static struct attribute *platform_attributes[] = {
4120 	&dev_attr_cpufv.attr,
4121 	&dev_attr_camera.attr,
4122 	&dev_attr_cardr.attr,
4123 	&dev_attr_touchpad.attr,
4124 	&dev_attr_charge_mode.attr,
4125 	&dev_attr_egpu_enable.attr,
4126 	&dev_attr_egpu_connected.attr,
4127 	&dev_attr_dgpu_disable.attr,
4128 	&dev_attr_gpu_mux_mode.attr,
4129 	&dev_attr_lid_resume.attr,
4130 	&dev_attr_als_enable.attr,
4131 	&dev_attr_fan_boost_mode.attr,
4132 	&dev_attr_throttle_thermal_policy.attr,
4133 	&dev_attr_ppt_pl2_sppt.attr,
4134 	&dev_attr_ppt_pl1_spl.attr,
4135 	&dev_attr_ppt_fppt.attr,
4136 	&dev_attr_ppt_apu_sppt.attr,
4137 	&dev_attr_ppt_platform_sppt.attr,
4138 	&dev_attr_nv_dynamic_boost.attr,
4139 	&dev_attr_nv_temp_target.attr,
4140 	&dev_attr_panel_od.attr,
4141 	&dev_attr_mini_led_mode.attr,
4142 	NULL
4143 };
4144 
4145 static umode_t asus_sysfs_is_visible(struct kobject *kobj,
4146 				    struct attribute *attr, int idx)
4147 {
4148 	struct device *dev = kobj_to_dev(kobj);
4149 	struct asus_wmi *asus = dev_get_drvdata(dev);
4150 	bool ok = true;
4151 	int devid = -1;
4152 
4153 	if (attr == &dev_attr_camera.attr)
4154 		devid = ASUS_WMI_DEVID_CAMERA;
4155 	else if (attr == &dev_attr_cardr.attr)
4156 		devid = ASUS_WMI_DEVID_CARDREADER;
4157 	else if (attr == &dev_attr_touchpad.attr)
4158 		devid = ASUS_WMI_DEVID_TOUCHPAD;
4159 	else if (attr == &dev_attr_lid_resume.attr)
4160 		devid = ASUS_WMI_DEVID_LID_RESUME;
4161 	else if (attr == &dev_attr_als_enable.attr)
4162 		devid = ASUS_WMI_DEVID_ALS_ENABLE;
4163 	else if (attr == &dev_attr_charge_mode.attr)
4164 		ok = asus->charge_mode_available;
4165 	else if (attr == &dev_attr_egpu_enable.attr)
4166 		ok = asus->egpu_enable_available;
4167 	else if (attr == &dev_attr_egpu_connected.attr)
4168 		ok = asus->egpu_connect_available;
4169 	else if (attr == &dev_attr_dgpu_disable.attr)
4170 		ok = asus->dgpu_disable_available;
4171 	else if (attr == &dev_attr_gpu_mux_mode.attr)
4172 		ok = asus->gpu_mux_mode_available;
4173 	else if (attr == &dev_attr_fan_boost_mode.attr)
4174 		ok = asus->fan_boost_mode_available;
4175 	else if (attr == &dev_attr_throttle_thermal_policy.attr)
4176 		ok = asus->throttle_thermal_policy_available;
4177 	else if (attr == &dev_attr_ppt_pl2_sppt.attr)
4178 		ok = asus->ppt_pl2_sppt_available;
4179 	else if (attr == &dev_attr_ppt_pl1_spl.attr)
4180 		ok = asus->ppt_pl1_spl_available;
4181 	else if (attr == &dev_attr_ppt_fppt.attr)
4182 		ok = asus->ppt_fppt_available;
4183 	else if (attr == &dev_attr_ppt_apu_sppt.attr)
4184 		ok = asus->ppt_apu_sppt_available;
4185 	else if (attr == &dev_attr_ppt_platform_sppt.attr)
4186 		ok = asus->ppt_plat_sppt_available;
4187 	else if (attr == &dev_attr_nv_dynamic_boost.attr)
4188 		ok = asus->nv_dyn_boost_available;
4189 	else if (attr == &dev_attr_nv_temp_target.attr)
4190 		ok = asus->nv_temp_tgt_available;
4191 	else if (attr == &dev_attr_panel_od.attr)
4192 		ok = asus->panel_overdrive_available;
4193 	else if (attr == &dev_attr_mini_led_mode.attr)
4194 		ok = asus->mini_led_mode_available;
4195 
4196 	if (devid != -1)
4197 		ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
4198 
4199 	return ok ? attr->mode : 0;
4200 }
4201 
4202 static const struct attribute_group platform_attribute_group = {
4203 	.is_visible = asus_sysfs_is_visible,
4204 	.attrs = platform_attributes
4205 };
4206 
4207 static void asus_wmi_sysfs_exit(struct platform_device *device)
4208 {
4209 	sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
4210 }
4211 
4212 static int asus_wmi_sysfs_init(struct platform_device *device)
4213 {
4214 	return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
4215 }
4216 
4217 /* Platform device ************************************************************/
4218 
4219 static int asus_wmi_platform_init(struct asus_wmi *asus)
4220 {
4221 	struct device *dev = &asus->platform_device->dev;
4222 	char *wmi_uid;
4223 	int rv;
4224 
4225 	/* INIT enable hotkeys on some models */
4226 	if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
4227 		pr_info("Initialization: %#x\n", rv);
4228 
4229 	/* We don't know yet what to do with this version... */
4230 	if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
4231 		pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
4232 		asus->spec = rv;
4233 	}
4234 
4235 	/*
4236 	 * The SFUN method probably allows the original driver to get the list
4237 	 * of features supported by a given model. For now, 0x0100 or 0x0800
4238 	 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
4239 	 * The significance of others is yet to be found.
4240 	 */
4241 	if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
4242 		pr_info("SFUN value: %#x\n", rv);
4243 		asus->sfun = rv;
4244 	}
4245 
4246 	/*
4247 	 * Eee PC and Notebooks seems to have different method_id for DSTS,
4248 	 * but it may also be related to the BIOS's SPEC.
4249 	 * Note, on most Eeepc, there is no way to check if a method exist
4250 	 * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
4251 	 * but once again, SPEC may probably be used for that kind of things.
4252 	 *
4253 	 * Additionally at least TUF Gaming series laptops return nothing for
4254 	 * unknown methods, so the detection in this way is not possible.
4255 	 *
4256 	 * There is strong indication that only ACPI WMI devices that have _UID
4257 	 * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
4258 	 */
4259 	wmi_uid = wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID);
4260 	if (!wmi_uid)
4261 		return -ENODEV;
4262 
4263 	if (!strcmp(wmi_uid, ASUS_ACPI_UID_ASUSWMI)) {
4264 		dev_info(dev, "Detected ASUSWMI, use DCTS\n");
4265 		asus->dsts_id = ASUS_WMI_METHODID_DCTS;
4266 	} else {
4267 		dev_info(dev, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid);
4268 		asus->dsts_id = ASUS_WMI_METHODID_DSTS;
4269 	}
4270 
4271 	/* CWAP allow to define the behavior of the Fn+F2 key,
4272 	 * this method doesn't seems to be present on Eee PCs */
4273 	if (asus->driver->quirks->wapf >= 0)
4274 		asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
4275 				      asus->driver->quirks->wapf, NULL);
4276 
4277 	return 0;
4278 }
4279 
4280 /* debugfs ********************************************************************/
4281 
4282 struct asus_wmi_debugfs_node {
4283 	struct asus_wmi *asus;
4284 	char *name;
4285 	int (*show) (struct seq_file *m, void *data);
4286 };
4287 
4288 static int show_dsts(struct seq_file *m, void *data)
4289 {
4290 	struct asus_wmi *asus = m->private;
4291 	int err;
4292 	u32 retval = -1;
4293 
4294 	err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
4295 	if (err < 0)
4296 		return err;
4297 
4298 	seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
4299 
4300 	return 0;
4301 }
4302 
4303 static int show_devs(struct seq_file *m, void *data)
4304 {
4305 	struct asus_wmi *asus = m->private;
4306 	int err;
4307 	u32 retval = -1;
4308 
4309 	err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
4310 				    &retval);
4311 	if (err < 0)
4312 		return err;
4313 
4314 	seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
4315 		   asus->debug.ctrl_param, retval);
4316 
4317 	return 0;
4318 }
4319 
4320 static int show_call(struct seq_file *m, void *data)
4321 {
4322 	struct asus_wmi *asus = m->private;
4323 	struct bios_args args = {
4324 		.arg0 = asus->debug.dev_id,
4325 		.arg1 = asus->debug.ctrl_param,
4326 	};
4327 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
4328 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
4329 	union acpi_object *obj;
4330 	acpi_status status;
4331 
4332 	status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
4333 				     0, asus->debug.method_id,
4334 				     &input, &output);
4335 
4336 	if (ACPI_FAILURE(status))
4337 		return -EIO;
4338 
4339 	obj = (union acpi_object *)output.pointer;
4340 	if (obj && obj->type == ACPI_TYPE_INTEGER)
4341 		seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
4342 			   asus->debug.dev_id, asus->debug.ctrl_param,
4343 			   (u32) obj->integer.value);
4344 	else
4345 		seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
4346 			   asus->debug.dev_id, asus->debug.ctrl_param,
4347 			   obj ? obj->type : -1);
4348 
4349 	kfree(obj);
4350 
4351 	return 0;
4352 }
4353 
4354 static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
4355 	{NULL, "devs", show_devs},
4356 	{NULL, "dsts", show_dsts},
4357 	{NULL, "call", show_call},
4358 };
4359 
4360 static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
4361 {
4362 	struct asus_wmi_debugfs_node *node = inode->i_private;
4363 
4364 	return single_open(file, node->show, node->asus);
4365 }
4366 
4367 static const struct file_operations asus_wmi_debugfs_io_ops = {
4368 	.owner = THIS_MODULE,
4369 	.open = asus_wmi_debugfs_open,
4370 	.read = seq_read,
4371 	.llseek = seq_lseek,
4372 	.release = single_release,
4373 };
4374 
4375 static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
4376 {
4377 	debugfs_remove_recursive(asus->debug.root);
4378 }
4379 
4380 static void asus_wmi_debugfs_init(struct asus_wmi *asus)
4381 {
4382 	int i;
4383 
4384 	asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
4385 
4386 	debugfs_create_x32("method_id", S_IRUGO | S_IWUSR, asus->debug.root,
4387 			   &asus->debug.method_id);
4388 
4389 	debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR, asus->debug.root,
4390 			   &asus->debug.dev_id);
4391 
4392 	debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR, asus->debug.root,
4393 			   &asus->debug.ctrl_param);
4394 
4395 	for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
4396 		struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
4397 
4398 		node->asus = asus;
4399 		debugfs_create_file(node->name, S_IFREG | S_IRUGO,
4400 				    asus->debug.root, node,
4401 				    &asus_wmi_debugfs_io_ops);
4402 	}
4403 }
4404 
4405 /* Init / exit ****************************************************************/
4406 
4407 static int asus_wmi_add(struct platform_device *pdev)
4408 {
4409 	struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
4410 	struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
4411 	struct asus_wmi *asus;
4412 	acpi_status status;
4413 	int err;
4414 	u32 result;
4415 
4416 	asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
4417 	if (!asus)
4418 		return -ENOMEM;
4419 
4420 	asus->driver = wdrv;
4421 	asus->platform_device = pdev;
4422 	wdrv->platform_device = pdev;
4423 	platform_set_drvdata(asus->platform_device, asus);
4424 
4425 	if (wdrv->detect_quirks)
4426 		wdrv->detect_quirks(asus->driver);
4427 
4428 	err = asus_wmi_platform_init(asus);
4429 	if (err)
4430 		goto fail_platform;
4431 
4432 	asus->charge_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CHARGE_MODE);
4433 	asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
4434 	asus->egpu_connect_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
4435 	asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU);
4436 	asus->gpu_mux_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX);
4437 	asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE);
4438 	asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE);
4439 	asus->ppt_pl2_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL2_SPPT);
4440 	asus->ppt_pl1_spl_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL1_SPL);
4441 	asus->ppt_fppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_FPPT);
4442 	asus->ppt_apu_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_APU_SPPT);
4443 	asus->ppt_plat_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PLAT_SPPT);
4444 	asus->nv_dyn_boost_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_DYN_BOOST);
4445 	asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
4446 	asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
4447 	asus->mini_led_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
4448 	asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
4449 						&& dmi_match(DMI_BOARD_NAME, "RC71L");
4450 
4451 	err = fan_boost_mode_check_present(asus);
4452 	if (err)
4453 		goto fail_fan_boost_mode;
4454 
4455 	err = throttle_thermal_policy_check_present(asus);
4456 	if (err)
4457 		goto fail_throttle_thermal_policy;
4458 	else
4459 		throttle_thermal_policy_set_default(asus);
4460 
4461 	err = platform_profile_setup(asus);
4462 	if (err)
4463 		goto fail_platform_profile_setup;
4464 
4465 	err = asus_wmi_sysfs_init(asus->platform_device);
4466 	if (err)
4467 		goto fail_sysfs;
4468 
4469 	err = asus_wmi_input_init(asus);
4470 	if (err)
4471 		goto fail_input;
4472 
4473 	err = asus_wmi_fan_init(asus); /* probably no problems on error */
4474 
4475 	err = asus_wmi_hwmon_init(asus);
4476 	if (err)
4477 		goto fail_hwmon;
4478 
4479 	err = asus_wmi_custom_fan_curve_init(asus);
4480 	if (err)
4481 		goto fail_custom_fan_curve;
4482 
4483 	err = asus_wmi_led_init(asus);
4484 	if (err)
4485 		goto fail_leds;
4486 
4487 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
4488 	if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
4489 		asus->driver->wlan_ctrl_by_user = 1;
4490 
4491 	if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
4492 		err = asus_wmi_rfkill_init(asus);
4493 		if (err)
4494 			goto fail_rfkill;
4495 	}
4496 
4497 	if (asus->driver->quirks->wmi_force_als_set)
4498 		asus_wmi_set_als();
4499 
4500 	if (asus->driver->quirks->xusb2pr)
4501 		asus_wmi_set_xusb2pr(asus);
4502 
4503 	if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
4504 		err = asus_wmi_backlight_init(asus);
4505 		if (err && err != -ENODEV)
4506 			goto fail_backlight;
4507 	} else if (asus->driver->quirks->wmi_backlight_set_devstate)
4508 		err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);
4509 
4510 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT)) {
4511 		err = asus_screenpad_init(asus);
4512 		if (err && err != -ENODEV)
4513 			goto fail_screenpad;
4514 	}
4515 
4516 	if (asus_wmi_has_fnlock_key(asus)) {
4517 		asus->fnlock_locked = fnlock_default;
4518 		asus_wmi_fnlock_update(asus);
4519 	}
4520 
4521 	status = wmi_install_notify_handler(asus->driver->event_guid,
4522 					    asus_wmi_notify, asus);
4523 	if (ACPI_FAILURE(status)) {
4524 		pr_err("Unable to register notify handler - %d\n", status);
4525 		err = -ENODEV;
4526 		goto fail_wmi_handler;
4527 	}
4528 
4529 	if (asus->driver->i8042_filter) {
4530 		err = i8042_install_filter(asus->driver->i8042_filter);
4531 		if (err)
4532 			pr_warn("Unable to install key filter - %d\n", err);
4533 	}
4534 
4535 	asus_wmi_battery_init(asus);
4536 
4537 	asus_wmi_debugfs_init(asus);
4538 
4539 	return 0;
4540 
4541 fail_wmi_handler:
4542 	asus_wmi_backlight_exit(asus);
4543 fail_backlight:
4544 	asus_wmi_rfkill_exit(asus);
4545 fail_screenpad:
4546 	asus_screenpad_exit(asus);
4547 fail_rfkill:
4548 	asus_wmi_led_exit(asus);
4549 fail_leds:
4550 fail_hwmon:
4551 	asus_wmi_input_exit(asus);
4552 fail_input:
4553 	asus_wmi_sysfs_exit(asus->platform_device);
4554 fail_sysfs:
4555 fail_throttle_thermal_policy:
4556 fail_custom_fan_curve:
4557 fail_platform_profile_setup:
4558 	if (asus->platform_profile_support)
4559 		platform_profile_remove();
4560 fail_fan_boost_mode:
4561 fail_platform:
4562 	kfree(asus);
4563 	return err;
4564 }
4565 
4566 static void asus_wmi_remove(struct platform_device *device)
4567 {
4568 	struct asus_wmi *asus;
4569 
4570 	asus = platform_get_drvdata(device);
4571 	if (asus->driver->i8042_filter)
4572 		i8042_remove_filter(asus->driver->i8042_filter);
4573 	wmi_remove_notify_handler(asus->driver->event_guid);
4574 	asus_wmi_backlight_exit(asus);
4575 	asus_screenpad_exit(asus);
4576 	asus_wmi_input_exit(asus);
4577 	asus_wmi_led_exit(asus);
4578 	asus_wmi_rfkill_exit(asus);
4579 	asus_wmi_debugfs_exit(asus);
4580 	asus_wmi_sysfs_exit(asus->platform_device);
4581 	asus_fan_set_auto(asus);
4582 	throttle_thermal_policy_set_default(asus);
4583 	asus_wmi_battery_exit(asus);
4584 
4585 	if (asus->platform_profile_support)
4586 		platform_profile_remove();
4587 
4588 	kfree(asus);
4589 }
4590 
4591 /* Platform driver - hibernate/resume callbacks *******************************/
4592 
4593 static int asus_hotk_thaw(struct device *device)
4594 {
4595 	struct asus_wmi *asus = dev_get_drvdata(device);
4596 
4597 	if (asus->wlan.rfkill) {
4598 		bool wlan;
4599 
4600 		/*
4601 		 * Work around bios bug - acpi _PTS turns off the wireless led
4602 		 * during suspend.  Normally it restores it on resume, but
4603 		 * we should kick it ourselves in case hibernation is aborted.
4604 		 */
4605 		wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
4606 		asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
4607 	}
4608 
4609 	return 0;
4610 }
4611 
4612 static int asus_hotk_resume(struct device *device)
4613 {
4614 	struct asus_wmi *asus = dev_get_drvdata(device);
4615 
4616 	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
4617 		kbd_led_update(asus);
4618 
4619 	if (asus_wmi_has_fnlock_key(asus))
4620 		asus_wmi_fnlock_update(asus);
4621 
4622 	asus_wmi_tablet_mode_get_state(asus);
4623 
4624 	return 0;
4625 }
4626 
4627 static int asus_hotk_resume_early(struct device *device)
4628 {
4629 	struct asus_wmi *asus = dev_get_drvdata(device);
4630 
4631 	if (asus->ally_mcu_usb_switch) {
4632 		if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB8)))
4633 			dev_err(device, "ROG Ally MCU failed to connect USB dev\n");
4634 		else
4635 			msleep(ASUS_USB0_PWR_EC0_CSEE_WAIT);
4636 	}
4637 	return 0;
4638 }
4639 
4640 static int asus_hotk_prepare(struct device *device)
4641 {
4642 	struct asus_wmi *asus = dev_get_drvdata(device);
4643 	int result, err;
4644 
4645 	if (asus->ally_mcu_usb_switch) {
4646 		/* When powersave is enabled it causes many issues with resume of USB hub */
4647 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MCU_POWERSAVE);
4648 		if (result == 1) {
4649 			dev_warn(device, "MCU powersave enabled, disabling to prevent resume issues");
4650 			err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MCU_POWERSAVE, 0, &result);
4651 			if (err || result != 1)
4652 				dev_err(device, "Failed to set MCU powersave mode: %d\n", err);
4653 		}
4654 		/* sleep required to ensure USB0 is disabled before sleep continues */
4655 		if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB7)))
4656 			dev_err(device, "ROG Ally MCU failed to disconnect USB dev\n");
4657 		else
4658 			msleep(ASUS_USB0_PWR_EC0_CSEE_WAIT);
4659 	}
4660 	return 0;
4661 }
4662 
4663 static int asus_hotk_restore(struct device *device)
4664 {
4665 	struct asus_wmi *asus = dev_get_drvdata(device);
4666 	int bl;
4667 
4668 	/* Refresh both wlan rfkill state and pci hotplug */
4669 	if (asus->wlan.rfkill)
4670 		asus_rfkill_hotplug(asus);
4671 
4672 	if (asus->bluetooth.rfkill) {
4673 		bl = !asus_wmi_get_devstate_simple(asus,
4674 						   ASUS_WMI_DEVID_BLUETOOTH);
4675 		rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
4676 	}
4677 	if (asus->wimax.rfkill) {
4678 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
4679 		rfkill_set_sw_state(asus->wimax.rfkill, bl);
4680 	}
4681 	if (asus->wwan3g.rfkill) {
4682 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
4683 		rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
4684 	}
4685 	if (asus->gps.rfkill) {
4686 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
4687 		rfkill_set_sw_state(asus->gps.rfkill, bl);
4688 	}
4689 	if (asus->uwb.rfkill) {
4690 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
4691 		rfkill_set_sw_state(asus->uwb.rfkill, bl);
4692 	}
4693 	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
4694 		kbd_led_update(asus);
4695 
4696 	if (asus_wmi_has_fnlock_key(asus))
4697 		asus_wmi_fnlock_update(asus);
4698 
4699 	asus_wmi_tablet_mode_get_state(asus);
4700 	return 0;
4701 }
4702 
4703 static const struct dev_pm_ops asus_pm_ops = {
4704 	.thaw = asus_hotk_thaw,
4705 	.restore = asus_hotk_restore,
4706 	.resume = asus_hotk_resume,
4707 	.resume_early = asus_hotk_resume_early,
4708 	.prepare = asus_hotk_prepare,
4709 };
4710 
4711 /* Registration ***************************************************************/
4712 
4713 static int asus_wmi_probe(struct platform_device *pdev)
4714 {
4715 	struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
4716 	struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
4717 	int ret;
4718 
4719 	if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
4720 		pr_warn("ASUS Management GUID not found\n");
4721 		return -ENODEV;
4722 	}
4723 
4724 	if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
4725 		pr_warn("ASUS Event GUID not found\n");
4726 		return -ENODEV;
4727 	}
4728 
4729 	if (wdrv->probe) {
4730 		ret = wdrv->probe(pdev);
4731 		if (ret)
4732 			return ret;
4733 	}
4734 
4735 	return asus_wmi_add(pdev);
4736 }
4737 
4738 static bool used;
4739 
4740 int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
4741 {
4742 	struct platform_driver *platform_driver;
4743 	struct platform_device *platform_device;
4744 
4745 	if (used)
4746 		return -EBUSY;
4747 
4748 	platform_driver = &driver->platform_driver;
4749 	platform_driver->remove_new = asus_wmi_remove;
4750 	platform_driver->driver.owner = driver->owner;
4751 	platform_driver->driver.name = driver->name;
4752 	platform_driver->driver.pm = &asus_pm_ops;
4753 
4754 	platform_device = platform_create_bundle(platform_driver,
4755 						 asus_wmi_probe,
4756 						 NULL, 0, NULL, 0);
4757 	if (IS_ERR(platform_device))
4758 		return PTR_ERR(platform_device);
4759 
4760 	used = true;
4761 	return 0;
4762 }
4763 EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
4764 
4765 void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
4766 {
4767 	platform_device_unregister(driver->platform_device);
4768 	platform_driver_unregister(&driver->platform_driver);
4769 	used = false;
4770 }
4771 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
4772 
4773 static int __init asus_wmi_init(void)
4774 {
4775 	pr_info("ASUS WMI generic driver loaded\n");
4776 	return 0;
4777 }
4778 
4779 static void __exit asus_wmi_exit(void)
4780 {
4781 	pr_info("ASUS WMI generic driver unloaded\n");
4782 }
4783 
4784 module_init(asus_wmi_init);
4785 module_exit(asus_wmi_exit);
4786