xref: /openbmc/linux/drivers/platform/x86/asus-wmi.c (revision c4f7ac64)
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/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/types.h>
20 #include <linux/slab.h>
21 #include <linux/input.h>
22 #include <linux/input/sparse-keymap.h>
23 #include <linux/fb.h>
24 #include <linux/backlight.h>
25 #include <linux/leds.h>
26 #include <linux/rfkill.h>
27 #include <linux/pci.h>
28 #include <linux/pci_hotplug.h>
29 #include <linux/power_supply.h>
30 #include <linux/hwmon.h>
31 #include <linux/hwmon-sysfs.h>
32 #include <linux/debugfs.h>
33 #include <linux/seq_file.h>
34 #include <linux/platform_data/x86/asus-wmi.h>
35 #include <linux/platform_device.h>
36 #include <linux/acpi.h>
37 #include <linux/dmi.h>
38 #include <linux/units.h>
39 
40 #include <acpi/battery.h>
41 #include <acpi/video.h>
42 
43 #include "asus-wmi.h"
44 
45 MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>, "
46 	      "Yong Wang <yong.y.wang@intel.com>");
47 MODULE_DESCRIPTION("Asus Generic WMI Driver");
48 MODULE_LICENSE("GPL");
49 
50 static bool fnlock_default = true;
51 module_param(fnlock_default, bool, 0444);
52 
53 #define to_asus_wmi_driver(pdrv)					\
54 	(container_of((pdrv), struct asus_wmi_driver, platform_driver))
55 
56 #define ASUS_WMI_MGMT_GUID	"97845ED0-4E6D-11DE-8A39-0800200C9A66"
57 
58 #define NOTIFY_BRNUP_MIN		0x11
59 #define NOTIFY_BRNUP_MAX		0x1f
60 #define NOTIFY_BRNDOWN_MIN		0x20
61 #define NOTIFY_BRNDOWN_MAX		0x2e
62 #define NOTIFY_FNLOCK_TOGGLE		0x4e
63 #define NOTIFY_KBD_DOCK_CHANGE		0x75
64 #define NOTIFY_KBD_BRTUP		0xc4
65 #define NOTIFY_KBD_BRTDWN		0xc5
66 #define NOTIFY_KBD_BRTTOGGLE		0xc7
67 #define NOTIFY_KBD_FBM			0x99
68 #define NOTIFY_KBD_TTP			0xae
69 #define NOTIFY_LID_FLIP			0xfa
70 
71 #define ASUS_WMI_FNLOCK_BIOS_DISABLED	BIT(0)
72 
73 #define ASUS_FAN_DESC			"cpu_fan"
74 #define ASUS_FAN_MFUN			0x13
75 #define ASUS_FAN_SFUN_READ		0x06
76 #define ASUS_FAN_SFUN_WRITE		0x07
77 
78 /* Based on standard hwmon pwmX_enable values */
79 #define ASUS_FAN_CTRL_FULLSPEED		0
80 #define ASUS_FAN_CTRL_MANUAL		1
81 #define ASUS_FAN_CTRL_AUTO		2
82 
83 #define ASUS_FAN_BOOST_MODE_NORMAL		0
84 #define ASUS_FAN_BOOST_MODE_OVERBOOST		1
85 #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK	0x01
86 #define ASUS_FAN_BOOST_MODE_SILENT		2
87 #define ASUS_FAN_BOOST_MODE_SILENT_MASK		0x02
88 #define ASUS_FAN_BOOST_MODES_MASK		0x03
89 
90 #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT	0
91 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST	1
92 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT	2
93 
94 #define USB_INTEL_XUSB2PR		0xD0
95 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI	0x9c31
96 
97 #define ASUS_ACPI_UID_ASUSWMI		"ASUSWMI"
98 #define ASUS_ACPI_UID_ATK		"ATK"
99 
100 #define WMI_EVENT_QUEUE_SIZE		0x10
101 #define WMI_EVENT_QUEUE_END		0x1
102 #define WMI_EVENT_MASK			0xFFFF
103 /* The WMI hotkey event value is always the same. */
104 #define WMI_EVENT_VALUE_ATK		0xFF
105 
106 #define WMI_EVENT_MASK			0xFFFF
107 
108 static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
109 
110 static bool ashs_present(void)
111 {
112 	int i = 0;
113 	while (ashs_ids[i]) {
114 		if (acpi_dev_found(ashs_ids[i++]))
115 			return true;
116 	}
117 	return false;
118 }
119 
120 struct bios_args {
121 	u32 arg0;
122 	u32 arg1;
123 	u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */
124 	u32 arg4;
125 	u32 arg5;
126 } __packed;
127 
128 /*
129  * Struct that's used for all methods called via AGFN. Naming is
130  * identically to the AML code.
131  */
132 struct agfn_args {
133 	u16 mfun; /* probably "Multi-function" to be called */
134 	u16 sfun; /* probably "Sub-function" to be called */
135 	u16 len;  /* size of the hole struct, including subfunction fields */
136 	u8 stas;  /* not used by now */
137 	u8 err;   /* zero on success */
138 } __packed;
139 
140 /* struct used for calling fan read and write methods */
141 struct agfn_fan_args {
142 	struct agfn_args agfn;	/* common fields */
143 	u8 fan;			/* fan number: 0: set auto mode 1: 1st fan */
144 	u32 speed;		/* read: RPM/100 - write: 0-255 */
145 } __packed;
146 
147 /*
148  * <platform>/    - debugfs root directory
149  *   dev_id      - current dev_id
150  *   ctrl_param  - current ctrl_param
151  *   method_id   - current method_id
152  *   devs        - call DEVS(dev_id, ctrl_param) and print result
153  *   dsts        - call DSTS(dev_id)  and print result
154  *   call        - call method_id(dev_id, ctrl_param) and print result
155  */
156 struct asus_wmi_debug {
157 	struct dentry *root;
158 	u32 method_id;
159 	u32 dev_id;
160 	u32 ctrl_param;
161 };
162 
163 struct asus_rfkill {
164 	struct asus_wmi *asus;
165 	struct rfkill *rfkill;
166 	u32 dev_id;
167 };
168 
169 enum fan_type {
170 	FAN_TYPE_NONE = 0,
171 	FAN_TYPE_AGFN,		/* deprecated on newer platforms */
172 	FAN_TYPE_SPEC83,	/* starting in Spec 8.3, use CPU_FAN_CTRL */
173 };
174 
175 struct asus_wmi {
176 	int dsts_id;
177 	int spec;
178 	int sfun;
179 	bool wmi_event_queue;
180 
181 	struct input_dev *inputdev;
182 	struct backlight_device *backlight_device;
183 	struct platform_device *platform_device;
184 
185 	struct led_classdev wlan_led;
186 	int wlan_led_wk;
187 	struct led_classdev tpd_led;
188 	int tpd_led_wk;
189 	struct led_classdev kbd_led;
190 	int kbd_led_wk;
191 	struct led_classdev lightbar_led;
192 	int lightbar_led_wk;
193 	struct workqueue_struct *led_workqueue;
194 	struct work_struct tpd_led_work;
195 	struct work_struct wlan_led_work;
196 	struct work_struct lightbar_led_work;
197 
198 	struct asus_rfkill wlan;
199 	struct asus_rfkill bluetooth;
200 	struct asus_rfkill wimax;
201 	struct asus_rfkill wwan3g;
202 	struct asus_rfkill gps;
203 	struct asus_rfkill uwb;
204 
205 	enum fan_type fan_type;
206 	int fan_pwm_mode;
207 	int agfn_pwm;
208 
209 	bool fan_boost_mode_available;
210 	u8 fan_boost_mode_mask;
211 	u8 fan_boost_mode;
212 
213 	bool throttle_thermal_policy_available;
214 	u8 throttle_thermal_policy_mode;
215 
216 	// The RSOC controls the maximum charging percentage.
217 	bool battery_rsoc_available;
218 
219 	struct hotplug_slot hotplug_slot;
220 	struct mutex hotplug_lock;
221 	struct mutex wmi_lock;
222 	struct workqueue_struct *hotplug_workqueue;
223 	struct work_struct hotplug_work;
224 
225 	bool fnlock_locked;
226 
227 	struct asus_wmi_debug debug;
228 
229 	struct asus_wmi_driver *driver;
230 };
231 
232 /* WMI ************************************************************************/
233 
234 static int asus_wmi_evaluate_method3(u32 method_id,
235 		u32 arg0, u32 arg1, u32 arg2, u32 *retval)
236 {
237 	struct bios_args args = {
238 		.arg0 = arg0,
239 		.arg1 = arg1,
240 		.arg2 = arg2,
241 	};
242 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
243 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
244 	acpi_status status;
245 	union acpi_object *obj;
246 	u32 tmp = 0;
247 
248 	status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
249 				     &input, &output);
250 
251 	if (ACPI_FAILURE(status))
252 		return -EIO;
253 
254 	obj = (union acpi_object *)output.pointer;
255 	if (obj && obj->type == ACPI_TYPE_INTEGER)
256 		tmp = (u32) obj->integer.value;
257 
258 	if (retval)
259 		*retval = tmp;
260 
261 	kfree(obj);
262 
263 	if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
264 		return -ENODEV;
265 
266 	return 0;
267 }
268 
269 int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
270 {
271 	return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval);
272 }
273 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
274 
275 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
276 {
277 	struct acpi_buffer input;
278 	u64 phys_addr;
279 	u32 retval;
280 	u32 status;
281 
282 	/*
283 	 * Copy to dma capable address otherwise memory corruption occurs as
284 	 * bios has to be able to access it.
285 	 */
286 	input.pointer = kmemdup(args.pointer, args.length, GFP_DMA | GFP_KERNEL);
287 	input.length = args.length;
288 	if (!input.pointer)
289 		return -ENOMEM;
290 	phys_addr = virt_to_phys(input.pointer);
291 
292 	status = asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN,
293 					phys_addr, 0, &retval);
294 	if (!status)
295 		memcpy(args.pointer, input.pointer, args.length);
296 
297 	kfree(input.pointer);
298 	if (status)
299 		return -ENXIO;
300 
301 	return retval;
302 }
303 
304 static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
305 {
306 	return asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
307 }
308 
309 static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
310 				 u32 *retval)
311 {
312 	return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
313 					ctrl_param, retval);
314 }
315 
316 /* Helper for special devices with magic return codes */
317 static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
318 				      u32 dev_id, u32 mask)
319 {
320 	u32 retval = 0;
321 	int err;
322 
323 	err = asus_wmi_get_devstate(asus, dev_id, &retval);
324 	if (err < 0)
325 		return err;
326 
327 	if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
328 		return -ENODEV;
329 
330 	if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
331 		if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
332 			return -ENODEV;
333 	}
334 
335 	return retval & mask;
336 }
337 
338 static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
339 {
340 	return asus_wmi_get_devstate_bits(asus, dev_id,
341 					  ASUS_WMI_DSTS_STATUS_BIT);
342 }
343 
344 static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
345 {
346 	u32 retval;
347 	int status = asus_wmi_get_devstate(asus, dev_id, &retval);
348 
349 	return status == 0 && (retval & ASUS_WMI_DSTS_PRESENCE_BIT);
350 }
351 
352 /* Input **********************************************************************/
353 
354 static int asus_wmi_input_init(struct asus_wmi *asus)
355 {
356 	int err, result;
357 
358 	asus->inputdev = input_allocate_device();
359 	if (!asus->inputdev)
360 		return -ENOMEM;
361 
362 	asus->inputdev->name = asus->driver->input_name;
363 	asus->inputdev->phys = asus->driver->input_phys;
364 	asus->inputdev->id.bustype = BUS_HOST;
365 	asus->inputdev->dev.parent = &asus->platform_device->dev;
366 	set_bit(EV_REP, asus->inputdev->evbit);
367 
368 	err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
369 	if (err)
370 		goto err_free_dev;
371 
372 	if (asus->driver->quirks->use_kbd_dock_devid) {
373 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_KBD_DOCK);
374 		if (result >= 0) {
375 			input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
376 			input_report_switch(asus->inputdev, SW_TABLET_MODE, !result);
377 		} else if (result != -ENODEV) {
378 			pr_err("Error checking for keyboard-dock: %d\n", result);
379 		}
380 	}
381 
382 	if (asus->driver->quirks->use_lid_flip_devid) {
383 		result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP);
384 		if (result < 0)
385 			asus->driver->quirks->use_lid_flip_devid = 0;
386 		if (result >= 0) {
387 			input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
388 			input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
389 		} else if (result == -ENODEV) {
390 			pr_err("This device has lid_flip quirk but got ENODEV checking it. This is a bug.");
391 		} else {
392 			pr_err("Error checking for lid-flip: %d\n", result);
393 		}
394 	}
395 
396 	err = input_register_device(asus->inputdev);
397 	if (err)
398 		goto err_free_dev;
399 
400 	return 0;
401 
402 err_free_dev:
403 	input_free_device(asus->inputdev);
404 	return err;
405 }
406 
407 static void asus_wmi_input_exit(struct asus_wmi *asus)
408 {
409 	if (asus->inputdev)
410 		input_unregister_device(asus->inputdev);
411 
412 	asus->inputdev = NULL;
413 }
414 
415 /* Tablet mode ****************************************************************/
416 
417 static void lid_flip_tablet_mode_get_state(struct asus_wmi *asus)
418 {
419 	int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_LID_FLIP);
420 
421 	if (result >= 0) {
422 		input_report_switch(asus->inputdev, SW_TABLET_MODE, result);
423 		input_sync(asus->inputdev);
424 	}
425 }
426 
427 /* Battery ********************************************************************/
428 
429 /* The battery maximum charging percentage */
430 static int charge_end_threshold;
431 
432 static ssize_t charge_control_end_threshold_store(struct device *dev,
433 						  struct device_attribute *attr,
434 						  const char *buf, size_t count)
435 {
436 	int value, ret, rv;
437 
438 	ret = kstrtouint(buf, 10, &value);
439 	if (ret)
440 		return ret;
441 
442 	if (value < 0 || value > 100)
443 		return -EINVAL;
444 
445 	ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, value, &rv);
446 	if (ret)
447 		return ret;
448 
449 	if (rv != 1)
450 		return -EIO;
451 
452 	/* There isn't any method in the DSDT to read the threshold, so we
453 	 * save the threshold.
454 	 */
455 	charge_end_threshold = value;
456 	return count;
457 }
458 
459 static ssize_t charge_control_end_threshold_show(struct device *device,
460 						 struct device_attribute *attr,
461 						 char *buf)
462 {
463 	return sprintf(buf, "%d\n", charge_end_threshold);
464 }
465 
466 static DEVICE_ATTR_RW(charge_control_end_threshold);
467 
468 static int asus_wmi_battery_add(struct power_supply *battery)
469 {
470 	/* The WMI method does not provide a way to specific a battery, so we
471 	 * just assume it is the first battery.
472 	 * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
473 	 * battery is named BATT.
474 	 */
475 	if (strcmp(battery->desc->name, "BAT0") != 0 &&
476 	    strcmp(battery->desc->name, "BAT1") != 0 &&
477 	    strcmp(battery->desc->name, "BATC") != 0 &&
478 	    strcmp(battery->desc->name, "BATT") != 0)
479 		return -ENODEV;
480 
481 	if (device_create_file(&battery->dev,
482 	    &dev_attr_charge_control_end_threshold))
483 		return -ENODEV;
484 
485 	/* The charge threshold is only reset when the system is power cycled,
486 	 * and we can't get the current threshold so let set it to 100% when
487 	 * a battery is added.
488 	 */
489 	asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, 100, NULL);
490 	charge_end_threshold = 100;
491 
492 	return 0;
493 }
494 
495 static int asus_wmi_battery_remove(struct power_supply *battery)
496 {
497 	device_remove_file(&battery->dev,
498 			   &dev_attr_charge_control_end_threshold);
499 	return 0;
500 }
501 
502 static struct acpi_battery_hook battery_hook = {
503 	.add_battery = asus_wmi_battery_add,
504 	.remove_battery = asus_wmi_battery_remove,
505 	.name = "ASUS Battery Extension",
506 };
507 
508 static void asus_wmi_battery_init(struct asus_wmi *asus)
509 {
510 	asus->battery_rsoc_available = false;
511 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_RSOC)) {
512 		asus->battery_rsoc_available = true;
513 		battery_hook_register(&battery_hook);
514 	}
515 }
516 
517 static void asus_wmi_battery_exit(struct asus_wmi *asus)
518 {
519 	if (asus->battery_rsoc_available)
520 		battery_hook_unregister(&battery_hook);
521 }
522 
523 /* LEDs ***********************************************************************/
524 
525 /*
526  * These functions actually update the LED's, and are called from a
527  * workqueue. By doing this as separate work rather than when the LED
528  * subsystem asks, we avoid messing with the Asus ACPI stuff during a
529  * potentially bad time, such as a timer interrupt.
530  */
531 static void tpd_led_update(struct work_struct *work)
532 {
533 	int ctrl_param;
534 	struct asus_wmi *asus;
535 
536 	asus = container_of(work, struct asus_wmi, tpd_led_work);
537 
538 	ctrl_param = asus->tpd_led_wk;
539 	asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
540 }
541 
542 static void tpd_led_set(struct led_classdev *led_cdev,
543 			enum led_brightness value)
544 {
545 	struct asus_wmi *asus;
546 
547 	asus = container_of(led_cdev, struct asus_wmi, tpd_led);
548 
549 	asus->tpd_led_wk = !!value;
550 	queue_work(asus->led_workqueue, &asus->tpd_led_work);
551 }
552 
553 static int read_tpd_led_state(struct asus_wmi *asus)
554 {
555 	return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
556 }
557 
558 static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
559 {
560 	struct asus_wmi *asus;
561 
562 	asus = container_of(led_cdev, struct asus_wmi, tpd_led);
563 
564 	return read_tpd_led_state(asus);
565 }
566 
567 static void kbd_led_update(struct asus_wmi *asus)
568 {
569 	int ctrl_param = 0;
570 
571 	ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
572 	asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
573 }
574 
575 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
576 {
577 	int retval;
578 
579 	/*
580 	 * bits 0-2: level
581 	 * bit 7: light on/off
582 	 * bit 8-10: environment (0: dark, 1: normal, 2: light)
583 	 * bit 17: status unknown
584 	 */
585 	retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
586 					    0xFFFF);
587 
588 	/* Unknown status is considered as off */
589 	if (retval == 0x8000)
590 		retval = 0;
591 
592 	if (retval < 0)
593 		return retval;
594 
595 	if (level)
596 		*level = retval & 0x7F;
597 	if (env)
598 		*env = (retval >> 8) & 0x7F;
599 	return 0;
600 }
601 
602 static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
603 {
604 	struct asus_wmi *asus;
605 	int max_level;
606 
607 	asus = container_of(led_cdev, struct asus_wmi, kbd_led);
608 	max_level = asus->kbd_led.max_brightness;
609 
610 	asus->kbd_led_wk = clamp_val(value, 0, max_level);
611 	kbd_led_update(asus);
612 }
613 
614 static void kbd_led_set(struct led_classdev *led_cdev,
615 			enum led_brightness value)
616 {
617 	/* Prevent disabling keyboard backlight on module unregister */
618 	if (led_cdev->flags & LED_UNREGISTERING)
619 		return;
620 
621 	do_kbd_led_set(led_cdev, value);
622 }
623 
624 static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
625 {
626 	struct led_classdev *led_cdev = &asus->kbd_led;
627 
628 	do_kbd_led_set(led_cdev, value);
629 	led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
630 }
631 
632 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
633 {
634 	struct asus_wmi *asus;
635 	int retval, value;
636 
637 	asus = container_of(led_cdev, struct asus_wmi, kbd_led);
638 
639 	retval = kbd_led_read(asus, &value, NULL);
640 	if (retval < 0)
641 		return retval;
642 
643 	return value;
644 }
645 
646 static int wlan_led_unknown_state(struct asus_wmi *asus)
647 {
648 	u32 result;
649 
650 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
651 
652 	return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
653 }
654 
655 static void wlan_led_update(struct work_struct *work)
656 {
657 	int ctrl_param;
658 	struct asus_wmi *asus;
659 
660 	asus = container_of(work, struct asus_wmi, wlan_led_work);
661 
662 	ctrl_param = asus->wlan_led_wk;
663 	asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
664 }
665 
666 static void wlan_led_set(struct led_classdev *led_cdev,
667 			 enum led_brightness value)
668 {
669 	struct asus_wmi *asus;
670 
671 	asus = container_of(led_cdev, struct asus_wmi, wlan_led);
672 
673 	asus->wlan_led_wk = !!value;
674 	queue_work(asus->led_workqueue, &asus->wlan_led_work);
675 }
676 
677 static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
678 {
679 	struct asus_wmi *asus;
680 	u32 result;
681 
682 	asus = container_of(led_cdev, struct asus_wmi, wlan_led);
683 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
684 
685 	return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
686 }
687 
688 static void lightbar_led_update(struct work_struct *work)
689 {
690 	struct asus_wmi *asus;
691 	int ctrl_param;
692 
693 	asus = container_of(work, struct asus_wmi, lightbar_led_work);
694 
695 	ctrl_param = asus->lightbar_led_wk;
696 	asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR, ctrl_param, NULL);
697 }
698 
699 static void lightbar_led_set(struct led_classdev *led_cdev,
700 			     enum led_brightness value)
701 {
702 	struct asus_wmi *asus;
703 
704 	asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
705 
706 	asus->lightbar_led_wk = !!value;
707 	queue_work(asus->led_workqueue, &asus->lightbar_led_work);
708 }
709 
710 static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev)
711 {
712 	struct asus_wmi *asus;
713 	u32 result;
714 
715 	asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
716 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
717 
718 	return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
719 }
720 
721 static void asus_wmi_led_exit(struct asus_wmi *asus)
722 {
723 	led_classdev_unregister(&asus->kbd_led);
724 	led_classdev_unregister(&asus->tpd_led);
725 	led_classdev_unregister(&asus->wlan_led);
726 	led_classdev_unregister(&asus->lightbar_led);
727 
728 	if (asus->led_workqueue)
729 		destroy_workqueue(asus->led_workqueue);
730 }
731 
732 static int asus_wmi_led_init(struct asus_wmi *asus)
733 {
734 	int rv = 0, led_val;
735 
736 	asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
737 	if (!asus->led_workqueue)
738 		return -ENOMEM;
739 
740 	if (read_tpd_led_state(asus) >= 0) {
741 		INIT_WORK(&asus->tpd_led_work, tpd_led_update);
742 
743 		asus->tpd_led.name = "asus::touchpad";
744 		asus->tpd_led.brightness_set = tpd_led_set;
745 		asus->tpd_led.brightness_get = tpd_led_get;
746 		asus->tpd_led.max_brightness = 1;
747 
748 		rv = led_classdev_register(&asus->platform_device->dev,
749 					   &asus->tpd_led);
750 		if (rv)
751 			goto error;
752 	}
753 
754 	if (!kbd_led_read(asus, &led_val, NULL)) {
755 		asus->kbd_led_wk = led_val;
756 		asus->kbd_led.name = "asus::kbd_backlight";
757 		asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
758 		asus->kbd_led.brightness_set = kbd_led_set;
759 		asus->kbd_led.brightness_get = kbd_led_get;
760 		asus->kbd_led.max_brightness = 3;
761 
762 		rv = led_classdev_register(&asus->platform_device->dev,
763 					   &asus->kbd_led);
764 		if (rv)
765 			goto error;
766 	}
767 
768 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED)
769 			&& (asus->driver->quirks->wapf > 0)) {
770 		INIT_WORK(&asus->wlan_led_work, wlan_led_update);
771 
772 		asus->wlan_led.name = "asus::wlan";
773 		asus->wlan_led.brightness_set = wlan_led_set;
774 		if (!wlan_led_unknown_state(asus))
775 			asus->wlan_led.brightness_get = wlan_led_get;
776 		asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
777 		asus->wlan_led.max_brightness = 1;
778 		asus->wlan_led.default_trigger = "asus-wlan";
779 
780 		rv = led_classdev_register(&asus->platform_device->dev,
781 					   &asus->wlan_led);
782 		if (rv)
783 			goto error;
784 	}
785 
786 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_LIGHTBAR)) {
787 		INIT_WORK(&asus->lightbar_led_work, lightbar_led_update);
788 
789 		asus->lightbar_led.name = "asus::lightbar";
790 		asus->lightbar_led.brightness_set = lightbar_led_set;
791 		asus->lightbar_led.brightness_get = lightbar_led_get;
792 		asus->lightbar_led.max_brightness = 1;
793 
794 		rv = led_classdev_register(&asus->platform_device->dev,
795 					   &asus->lightbar_led);
796 	}
797 
798 error:
799 	if (rv)
800 		asus_wmi_led_exit(asus);
801 
802 	return rv;
803 }
804 
805 /* RF *************************************************************************/
806 
807 /*
808  * PCI hotplug (for wlan rfkill)
809  */
810 static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
811 {
812 	int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
813 
814 	if (result < 0)
815 		return false;
816 	return !result;
817 }
818 
819 static void asus_rfkill_hotplug(struct asus_wmi *asus)
820 {
821 	struct pci_dev *dev;
822 	struct pci_bus *bus;
823 	bool blocked;
824 	bool absent;
825 	u32 l;
826 
827 	mutex_lock(&asus->wmi_lock);
828 	blocked = asus_wlan_rfkill_blocked(asus);
829 	mutex_unlock(&asus->wmi_lock);
830 
831 	mutex_lock(&asus->hotplug_lock);
832 	pci_lock_rescan_remove();
833 
834 	if (asus->wlan.rfkill)
835 		rfkill_set_sw_state(asus->wlan.rfkill, blocked);
836 
837 	if (asus->hotplug_slot.ops) {
838 		bus = pci_find_bus(0, 1);
839 		if (!bus) {
840 			pr_warn("Unable to find PCI bus 1?\n");
841 			goto out_unlock;
842 		}
843 
844 		if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
845 			pr_err("Unable to read PCI config space?\n");
846 			goto out_unlock;
847 		}
848 		absent = (l == 0xffffffff);
849 
850 		if (blocked != absent) {
851 			pr_warn("BIOS says wireless lan is %s, "
852 				"but the pci device is %s\n",
853 				blocked ? "blocked" : "unblocked",
854 				absent ? "absent" : "present");
855 			pr_warn("skipped wireless hotplug as probably "
856 				"inappropriate for this model\n");
857 			goto out_unlock;
858 		}
859 
860 		if (!blocked) {
861 			dev = pci_get_slot(bus, 0);
862 			if (dev) {
863 				/* Device already present */
864 				pci_dev_put(dev);
865 				goto out_unlock;
866 			}
867 			dev = pci_scan_single_device(bus, 0);
868 			if (dev) {
869 				pci_bus_assign_resources(bus);
870 				pci_bus_add_device(dev);
871 			}
872 		} else {
873 			dev = pci_get_slot(bus, 0);
874 			if (dev) {
875 				pci_stop_and_remove_bus_device(dev);
876 				pci_dev_put(dev);
877 			}
878 		}
879 	}
880 
881 out_unlock:
882 	pci_unlock_rescan_remove();
883 	mutex_unlock(&asus->hotplug_lock);
884 }
885 
886 static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
887 {
888 	struct asus_wmi *asus = data;
889 
890 	if (event != ACPI_NOTIFY_BUS_CHECK)
891 		return;
892 
893 	/*
894 	 * We can't call directly asus_rfkill_hotplug because most
895 	 * of the time WMBC is still being executed and not reetrant.
896 	 * There is currently no way to tell ACPICA that  we want this
897 	 * method to be serialized, we schedule a asus_rfkill_hotplug
898 	 * call later, in a safer context.
899 	 */
900 	queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
901 }
902 
903 static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
904 {
905 	acpi_status status;
906 	acpi_handle handle;
907 
908 	status = acpi_get_handle(NULL, node, &handle);
909 	if (ACPI_FAILURE(status))
910 		return -ENODEV;
911 
912 	status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
913 					     asus_rfkill_notify, asus);
914 	if (ACPI_FAILURE(status))
915 		pr_warn("Failed to register notify on %s\n", node);
916 
917 	return 0;
918 }
919 
920 static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
921 {
922 	acpi_status status = AE_OK;
923 	acpi_handle handle;
924 
925 	status = acpi_get_handle(NULL, node, &handle);
926 	if (ACPI_FAILURE(status))
927 		return;
928 
929 	status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
930 					    asus_rfkill_notify);
931 	if (ACPI_FAILURE(status))
932 		pr_err("Error removing rfkill notify handler %s\n", node);
933 }
934 
935 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
936 				   u8 *value)
937 {
938 	struct asus_wmi *asus = container_of(hotplug_slot,
939 					     struct asus_wmi, hotplug_slot);
940 	int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
941 
942 	if (result < 0)
943 		return result;
944 
945 	*value = !!result;
946 	return 0;
947 }
948 
949 static const struct hotplug_slot_ops asus_hotplug_slot_ops = {
950 	.get_adapter_status = asus_get_adapter_status,
951 	.get_power_status = asus_get_adapter_status,
952 };
953 
954 static void asus_hotplug_work(struct work_struct *work)
955 {
956 	struct asus_wmi *asus;
957 
958 	asus = container_of(work, struct asus_wmi, hotplug_work);
959 	asus_rfkill_hotplug(asus);
960 }
961 
962 static int asus_setup_pci_hotplug(struct asus_wmi *asus)
963 {
964 	int ret = -ENOMEM;
965 	struct pci_bus *bus = pci_find_bus(0, 1);
966 
967 	if (!bus) {
968 		pr_err("Unable to find wifi PCI bus\n");
969 		return -ENODEV;
970 	}
971 
972 	asus->hotplug_workqueue =
973 	    create_singlethread_workqueue("hotplug_workqueue");
974 	if (!asus->hotplug_workqueue)
975 		goto error_workqueue;
976 
977 	INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
978 
979 	asus->hotplug_slot.ops = &asus_hotplug_slot_ops;
980 
981 	ret = pci_hp_register(&asus->hotplug_slot, bus, 0, "asus-wifi");
982 	if (ret) {
983 		pr_err("Unable to register hotplug slot - %d\n", ret);
984 		goto error_register;
985 	}
986 
987 	return 0;
988 
989 error_register:
990 	asus->hotplug_slot.ops = NULL;
991 	destroy_workqueue(asus->hotplug_workqueue);
992 error_workqueue:
993 	return ret;
994 }
995 
996 /*
997  * Rfkill devices
998  */
999 static int asus_rfkill_set(void *data, bool blocked)
1000 {
1001 	struct asus_rfkill *priv = data;
1002 	u32 ctrl_param = !blocked;
1003 	u32 dev_id = priv->dev_id;
1004 
1005 	/*
1006 	 * If the user bit is set, BIOS can't set and record the wlan status,
1007 	 * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
1008 	 * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
1009 	 * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
1010 	 * while setting the wlan status through WMI.
1011 	 * This is also the behavior that windows app will do.
1012 	 */
1013 	if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1014 	     priv->asus->driver->wlan_ctrl_by_user)
1015 		dev_id = ASUS_WMI_DEVID_WLAN_LED;
1016 
1017 	return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
1018 }
1019 
1020 static void asus_rfkill_query(struct rfkill *rfkill, void *data)
1021 {
1022 	struct asus_rfkill *priv = data;
1023 	int result;
1024 
1025 	result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
1026 
1027 	if (result < 0)
1028 		return;
1029 
1030 	rfkill_set_sw_state(priv->rfkill, !result);
1031 }
1032 
1033 static int asus_rfkill_wlan_set(void *data, bool blocked)
1034 {
1035 	struct asus_rfkill *priv = data;
1036 	struct asus_wmi *asus = priv->asus;
1037 	int ret;
1038 
1039 	/*
1040 	 * This handler is enabled only if hotplug is enabled.
1041 	 * In this case, the asus_wmi_set_devstate() will
1042 	 * trigger a wmi notification and we need to wait
1043 	 * this call to finish before being able to call
1044 	 * any wmi method
1045 	 */
1046 	mutex_lock(&asus->wmi_lock);
1047 	ret = asus_rfkill_set(data, blocked);
1048 	mutex_unlock(&asus->wmi_lock);
1049 	return ret;
1050 }
1051 
1052 static const struct rfkill_ops asus_rfkill_wlan_ops = {
1053 	.set_block = asus_rfkill_wlan_set,
1054 	.query = asus_rfkill_query,
1055 };
1056 
1057 static const struct rfkill_ops asus_rfkill_ops = {
1058 	.set_block = asus_rfkill_set,
1059 	.query = asus_rfkill_query,
1060 };
1061 
1062 static int asus_new_rfkill(struct asus_wmi *asus,
1063 			   struct asus_rfkill *arfkill,
1064 			   const char *name, enum rfkill_type type, int dev_id)
1065 {
1066 	int result = asus_wmi_get_devstate_simple(asus, dev_id);
1067 	struct rfkill **rfkill = &arfkill->rfkill;
1068 
1069 	if (result < 0)
1070 		return result;
1071 
1072 	arfkill->dev_id = dev_id;
1073 	arfkill->asus = asus;
1074 
1075 	if (dev_id == ASUS_WMI_DEVID_WLAN &&
1076 	    asus->driver->quirks->hotplug_wireless)
1077 		*rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
1078 				       &asus_rfkill_wlan_ops, arfkill);
1079 	else
1080 		*rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
1081 				       &asus_rfkill_ops, arfkill);
1082 
1083 	if (!*rfkill)
1084 		return -EINVAL;
1085 
1086 	if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
1087 			(asus->driver->quirks->wapf > 0))
1088 		rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
1089 
1090 	rfkill_init_sw_state(*rfkill, !result);
1091 	result = rfkill_register(*rfkill);
1092 	if (result) {
1093 		rfkill_destroy(*rfkill);
1094 		*rfkill = NULL;
1095 		return result;
1096 	}
1097 	return 0;
1098 }
1099 
1100 static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
1101 {
1102 	if (asus->driver->wlan_ctrl_by_user && ashs_present())
1103 		return;
1104 
1105 	asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
1106 	asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
1107 	asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
1108 	if (asus->wlan.rfkill) {
1109 		rfkill_unregister(asus->wlan.rfkill);
1110 		rfkill_destroy(asus->wlan.rfkill);
1111 		asus->wlan.rfkill = NULL;
1112 	}
1113 	/*
1114 	 * Refresh pci hotplug in case the rfkill state was changed after
1115 	 * asus_unregister_rfkill_notifier()
1116 	 */
1117 	asus_rfkill_hotplug(asus);
1118 	if (asus->hotplug_slot.ops)
1119 		pci_hp_deregister(&asus->hotplug_slot);
1120 	if (asus->hotplug_workqueue)
1121 		destroy_workqueue(asus->hotplug_workqueue);
1122 
1123 	if (asus->bluetooth.rfkill) {
1124 		rfkill_unregister(asus->bluetooth.rfkill);
1125 		rfkill_destroy(asus->bluetooth.rfkill);
1126 		asus->bluetooth.rfkill = NULL;
1127 	}
1128 	if (asus->wimax.rfkill) {
1129 		rfkill_unregister(asus->wimax.rfkill);
1130 		rfkill_destroy(asus->wimax.rfkill);
1131 		asus->wimax.rfkill = NULL;
1132 	}
1133 	if (asus->wwan3g.rfkill) {
1134 		rfkill_unregister(asus->wwan3g.rfkill);
1135 		rfkill_destroy(asus->wwan3g.rfkill);
1136 		asus->wwan3g.rfkill = NULL;
1137 	}
1138 	if (asus->gps.rfkill) {
1139 		rfkill_unregister(asus->gps.rfkill);
1140 		rfkill_destroy(asus->gps.rfkill);
1141 		asus->gps.rfkill = NULL;
1142 	}
1143 	if (asus->uwb.rfkill) {
1144 		rfkill_unregister(asus->uwb.rfkill);
1145 		rfkill_destroy(asus->uwb.rfkill);
1146 		asus->uwb.rfkill = NULL;
1147 	}
1148 }
1149 
1150 static int asus_wmi_rfkill_init(struct asus_wmi *asus)
1151 {
1152 	int result = 0;
1153 
1154 	mutex_init(&asus->hotplug_lock);
1155 	mutex_init(&asus->wmi_lock);
1156 
1157 	result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
1158 				 RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
1159 
1160 	if (result && result != -ENODEV)
1161 		goto exit;
1162 
1163 	result = asus_new_rfkill(asus, &asus->bluetooth,
1164 				 "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
1165 				 ASUS_WMI_DEVID_BLUETOOTH);
1166 
1167 	if (result && result != -ENODEV)
1168 		goto exit;
1169 
1170 	result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
1171 				 RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
1172 
1173 	if (result && result != -ENODEV)
1174 		goto exit;
1175 
1176 	result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
1177 				 RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
1178 
1179 	if (result && result != -ENODEV)
1180 		goto exit;
1181 
1182 	result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
1183 				 RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
1184 
1185 	if (result && result != -ENODEV)
1186 		goto exit;
1187 
1188 	result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
1189 				 RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
1190 
1191 	if (result && result != -ENODEV)
1192 		goto exit;
1193 
1194 	if (!asus->driver->quirks->hotplug_wireless)
1195 		goto exit;
1196 
1197 	result = asus_setup_pci_hotplug(asus);
1198 	/*
1199 	 * If we get -EBUSY then something else is handling the PCI hotplug -
1200 	 * don't fail in this case
1201 	 */
1202 	if (result == -EBUSY)
1203 		result = 0;
1204 
1205 	asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
1206 	asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
1207 	asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
1208 	/*
1209 	 * Refresh pci hotplug in case the rfkill state was changed during
1210 	 * setup.
1211 	 */
1212 	asus_rfkill_hotplug(asus);
1213 
1214 exit:
1215 	if (result && result != -ENODEV)
1216 		asus_wmi_rfkill_exit(asus);
1217 
1218 	if (result == -ENODEV)
1219 		result = 0;
1220 
1221 	return result;
1222 }
1223 
1224 /* Quirks *********************************************************************/
1225 
1226 static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
1227 {
1228 	struct pci_dev *xhci_pdev;
1229 	u32 orig_ports_available;
1230 	u32 ports_available = asus->driver->quirks->xusb2pr;
1231 
1232 	xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1233 			PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI,
1234 			NULL);
1235 
1236 	if (!xhci_pdev)
1237 		return;
1238 
1239 	pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
1240 				&orig_ports_available);
1241 
1242 	pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
1243 				cpu_to_le32(ports_available));
1244 
1245 	pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
1246 			orig_ports_available, ports_available);
1247 }
1248 
1249 /*
1250  * Some devices dont support or have borcken get_als method
1251  * but still support set method.
1252  */
1253 static void asus_wmi_set_als(void)
1254 {
1255 	asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE, 1, NULL);
1256 }
1257 
1258 /* Hwmon device ***************************************************************/
1259 
1260 static int asus_agfn_fan_speed_read(struct asus_wmi *asus, int fan,
1261 					  int *speed)
1262 {
1263 	struct agfn_fan_args args = {
1264 		.agfn.len = sizeof(args),
1265 		.agfn.mfun = ASUS_FAN_MFUN,
1266 		.agfn.sfun = ASUS_FAN_SFUN_READ,
1267 		.fan = fan,
1268 		.speed = 0,
1269 	};
1270 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
1271 	int status;
1272 
1273 	if (fan != 1)
1274 		return -EINVAL;
1275 
1276 	status = asus_wmi_evaluate_method_agfn(input);
1277 
1278 	if (status || args.agfn.err)
1279 		return -ENXIO;
1280 
1281 	if (speed)
1282 		*speed = args.speed;
1283 
1284 	return 0;
1285 }
1286 
1287 static int asus_agfn_fan_speed_write(struct asus_wmi *asus, int fan,
1288 				     int *speed)
1289 {
1290 	struct agfn_fan_args args = {
1291 		.agfn.len = sizeof(args),
1292 		.agfn.mfun = ASUS_FAN_MFUN,
1293 		.agfn.sfun = ASUS_FAN_SFUN_WRITE,
1294 		.fan = fan,
1295 		.speed = speed ?  *speed : 0,
1296 	};
1297 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
1298 	int status;
1299 
1300 	/* 1: for setting 1st fan's speed 0: setting auto mode */
1301 	if (fan != 1 && fan != 0)
1302 		return -EINVAL;
1303 
1304 	status = asus_wmi_evaluate_method_agfn(input);
1305 
1306 	if (status || args.agfn.err)
1307 		return -ENXIO;
1308 
1309 	if (speed && fan == 1)
1310 		asus->agfn_pwm = *speed;
1311 
1312 	return 0;
1313 }
1314 
1315 /*
1316  * Check if we can read the speed of one fan. If true we assume we can also
1317  * control it.
1318  */
1319 static bool asus_wmi_has_agfn_fan(struct asus_wmi *asus)
1320 {
1321 	int status;
1322 	int speed;
1323 	u32 value;
1324 
1325 	status = asus_agfn_fan_speed_read(asus, 1, &speed);
1326 	if (status != 0)
1327 		return false;
1328 
1329 	status = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
1330 	if (status != 0)
1331 		return false;
1332 
1333 	/*
1334 	 * We need to find a better way, probably using sfun,
1335 	 * bits or spec ...
1336 	 * Currently we disable it if:
1337 	 * - ASUS_WMI_UNSUPPORTED_METHOD is returned
1338 	 * - reverved bits are non-zero
1339 	 * - sfun and presence bit are not set
1340 	 */
1341 	return !(value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
1342 		 || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)));
1343 }
1344 
1345 static int asus_fan_set_auto(struct asus_wmi *asus)
1346 {
1347 	int status;
1348 	u32 retval;
1349 
1350 	switch (asus->fan_type) {
1351 	case FAN_TYPE_SPEC83:
1352 		status = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
1353 					       0, &retval);
1354 		if (status)
1355 			return status;
1356 
1357 		if (retval != 1)
1358 			return -EIO;
1359 		break;
1360 
1361 	case FAN_TYPE_AGFN:
1362 		status = asus_agfn_fan_speed_write(asus, 0, NULL);
1363 		if (status)
1364 			return -ENXIO;
1365 		break;
1366 
1367 	default:
1368 		return -ENXIO;
1369 	}
1370 
1371 
1372 	return 0;
1373 }
1374 
1375 static ssize_t pwm1_show(struct device *dev,
1376 			       struct device_attribute *attr,
1377 			       char *buf)
1378 {
1379 	struct asus_wmi *asus = dev_get_drvdata(dev);
1380 	int err;
1381 	int value;
1382 
1383 	/* If we already set a value then just return it */
1384 	if (asus->agfn_pwm >= 0)
1385 		return sprintf(buf, "%d\n", asus->agfn_pwm);
1386 
1387 	/*
1388 	 * If we haven't set already set a value through the AGFN interface,
1389 	 * we read a current value through the (now-deprecated) FAN_CTRL device.
1390 	 */
1391 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
1392 	if (err < 0)
1393 		return err;
1394 
1395 	value &= 0xFF;
1396 
1397 	if (value == 1) /* Low Speed */
1398 		value = 85;
1399 	else if (value == 2)
1400 		value = 170;
1401 	else if (value == 3)
1402 		value = 255;
1403 	else if (value) {
1404 		pr_err("Unknown fan speed %#x\n", value);
1405 		value = -1;
1406 	}
1407 
1408 	return sprintf(buf, "%d\n", value);
1409 }
1410 
1411 static ssize_t pwm1_store(struct device *dev,
1412 				     struct device_attribute *attr,
1413 				     const char *buf, size_t count) {
1414 	struct asus_wmi *asus = dev_get_drvdata(dev);
1415 	int value;
1416 	int state;
1417 	int ret;
1418 
1419 	ret = kstrtouint(buf, 10, &value);
1420 	if (ret)
1421 		return ret;
1422 
1423 	value = clamp(value, 0, 255);
1424 
1425 	state = asus_agfn_fan_speed_write(asus, 1, &value);
1426 	if (state)
1427 		pr_warn("Setting fan speed failed: %d\n", state);
1428 	else
1429 		asus->fan_pwm_mode = ASUS_FAN_CTRL_MANUAL;
1430 
1431 	return count;
1432 }
1433 
1434 static ssize_t fan1_input_show(struct device *dev,
1435 					struct device_attribute *attr,
1436 					char *buf)
1437 {
1438 	struct asus_wmi *asus = dev_get_drvdata(dev);
1439 	int value;
1440 	int ret;
1441 
1442 	switch (asus->fan_type) {
1443 	case FAN_TYPE_SPEC83:
1444 		ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL,
1445 					    &value);
1446 		if (ret < 0)
1447 			return ret;
1448 
1449 		value &= 0xffff;
1450 		break;
1451 
1452 	case FAN_TYPE_AGFN:
1453 		/* no speed readable on manual mode */
1454 		if (asus->fan_pwm_mode == ASUS_FAN_CTRL_MANUAL)
1455 			return -ENXIO;
1456 
1457 		ret = asus_agfn_fan_speed_read(asus, 1, &value);
1458 		if (ret) {
1459 			pr_warn("reading fan speed failed: %d\n", ret);
1460 			return -ENXIO;
1461 		}
1462 		break;
1463 
1464 	default:
1465 		return -ENXIO;
1466 	}
1467 
1468 	return sprintf(buf, "%d\n", value < 0 ? -1 : value*100);
1469 }
1470 
1471 static ssize_t pwm1_enable_show(struct device *dev,
1472 						 struct device_attribute *attr,
1473 						 char *buf)
1474 {
1475 	struct asus_wmi *asus = dev_get_drvdata(dev);
1476 
1477 	/*
1478 	 * Just read back the cached pwm mode.
1479 	 *
1480 	 * For the CPU_FAN device, the spec indicates that we should be
1481 	 * able to read the device status and consult bit 19 to see if we
1482 	 * are in Full On or Automatic mode. However, this does not work
1483 	 * in practice on X532FL at least (the bit is always 0) and there's
1484 	 * also nothing in the DSDT to indicate that this behaviour exists.
1485 	 */
1486 	return sprintf(buf, "%d\n", asus->fan_pwm_mode);
1487 }
1488 
1489 static ssize_t pwm1_enable_store(struct device *dev,
1490 						  struct device_attribute *attr,
1491 						  const char *buf, size_t count)
1492 {
1493 	struct asus_wmi *asus = dev_get_drvdata(dev);
1494 	int status = 0;
1495 	int state;
1496 	int value;
1497 	int ret;
1498 	u32 retval;
1499 
1500 	ret = kstrtouint(buf, 10, &state);
1501 	if (ret)
1502 		return ret;
1503 
1504 	if (asus->fan_type == FAN_TYPE_SPEC83) {
1505 		switch (state) { /* standard documented hwmon values */
1506 		case ASUS_FAN_CTRL_FULLSPEED:
1507 			value = 1;
1508 			break;
1509 		case ASUS_FAN_CTRL_AUTO:
1510 			value = 0;
1511 			break;
1512 		default:
1513 			return -EINVAL;
1514 		}
1515 
1516 		ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
1517 					    value, &retval);
1518 		if (ret)
1519 			return ret;
1520 
1521 		if (retval != 1)
1522 			return -EIO;
1523 	} else if (asus->fan_type == FAN_TYPE_AGFN) {
1524 		switch (state) {
1525 		case ASUS_FAN_CTRL_MANUAL:
1526 			break;
1527 
1528 		case ASUS_FAN_CTRL_AUTO:
1529 			status = asus_fan_set_auto(asus);
1530 			if (status)
1531 				return status;
1532 			break;
1533 
1534 		default:
1535 			return -EINVAL;
1536 		}
1537 	}
1538 
1539 	asus->fan_pwm_mode = state;
1540 	return count;
1541 }
1542 
1543 static ssize_t fan1_label_show(struct device *dev,
1544 					  struct device_attribute *attr,
1545 					  char *buf)
1546 {
1547 	return sprintf(buf, "%s\n", ASUS_FAN_DESC);
1548 }
1549 
1550 static ssize_t asus_hwmon_temp1(struct device *dev,
1551 				struct device_attribute *attr,
1552 				char *buf)
1553 {
1554 	struct asus_wmi *asus = dev_get_drvdata(dev);
1555 	u32 value;
1556 	int err;
1557 
1558 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
1559 	if (err < 0)
1560 		return err;
1561 
1562 	return sprintf(buf, "%ld\n",
1563 		       deci_kelvin_to_millicelsius(value & 0xFFFF));
1564 }
1565 
1566 /* Fan1 */
1567 static DEVICE_ATTR_RW(pwm1);
1568 static DEVICE_ATTR_RW(pwm1_enable);
1569 static DEVICE_ATTR_RO(fan1_input);
1570 static DEVICE_ATTR_RO(fan1_label);
1571 
1572 /* Temperature */
1573 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
1574 
1575 static struct attribute *hwmon_attributes[] = {
1576 	&dev_attr_pwm1.attr,
1577 	&dev_attr_pwm1_enable.attr,
1578 	&dev_attr_fan1_input.attr,
1579 	&dev_attr_fan1_label.attr,
1580 
1581 	&dev_attr_temp1_input.attr,
1582 	NULL
1583 };
1584 
1585 static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
1586 					  struct attribute *attr, int idx)
1587 {
1588 	struct device *dev = container_of(kobj, struct device, kobj);
1589 	struct asus_wmi *asus = dev_get_drvdata(dev->parent);
1590 	u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
1591 
1592 	if (attr == &dev_attr_pwm1.attr) {
1593 		if (asus->fan_type != FAN_TYPE_AGFN)
1594 			return 0;
1595 	} else if (attr == &dev_attr_fan1_input.attr
1596 	    || attr == &dev_attr_fan1_label.attr
1597 	    || attr == &dev_attr_pwm1_enable.attr) {
1598 		if (asus->fan_type == FAN_TYPE_NONE)
1599 			return 0;
1600 	} else if (attr == &dev_attr_temp1_input.attr) {
1601 		int err = asus_wmi_get_devstate(asus,
1602 						ASUS_WMI_DEVID_THERMAL_CTRL,
1603 						&value);
1604 
1605 		if (err < 0)
1606 			return 0; /* can't return negative here */
1607 
1608 		/*
1609 		 * If the temperature value in deci-Kelvin is near the absolute
1610 		 * zero temperature, something is clearly wrong
1611 		 */
1612 		if (value == 0 || value == 1)
1613 			return 0;
1614 	}
1615 
1616 	return attr->mode;
1617 }
1618 
1619 static const struct attribute_group hwmon_attribute_group = {
1620 	.is_visible = asus_hwmon_sysfs_is_visible,
1621 	.attrs = hwmon_attributes
1622 };
1623 __ATTRIBUTE_GROUPS(hwmon_attribute);
1624 
1625 static int asus_wmi_hwmon_init(struct asus_wmi *asus)
1626 {
1627 	struct device *dev = &asus->platform_device->dev;
1628 	struct device *hwmon;
1629 
1630 	hwmon = devm_hwmon_device_register_with_groups(dev, "asus", asus,
1631 			hwmon_attribute_groups);
1632 
1633 	if (IS_ERR(hwmon)) {
1634 		pr_err("Could not register asus hwmon device\n");
1635 		return PTR_ERR(hwmon);
1636 	}
1637 	return 0;
1638 }
1639 
1640 static int asus_wmi_fan_init(struct asus_wmi *asus)
1641 {
1642 	asus->fan_type = FAN_TYPE_NONE;
1643 	asus->agfn_pwm = -1;
1644 
1645 	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))
1646 		asus->fan_type = FAN_TYPE_SPEC83;
1647 	else if (asus_wmi_has_agfn_fan(asus))
1648 		asus->fan_type = FAN_TYPE_AGFN;
1649 
1650 	if (asus->fan_type == FAN_TYPE_NONE)
1651 		return -ENODEV;
1652 
1653 	asus_fan_set_auto(asus);
1654 	asus->fan_pwm_mode = ASUS_FAN_CTRL_AUTO;
1655 	return 0;
1656 }
1657 
1658 /* Fan mode *******************************************************************/
1659 
1660 static int fan_boost_mode_check_present(struct asus_wmi *asus)
1661 {
1662 	u32 result;
1663 	int err;
1664 
1665 	asus->fan_boost_mode_available = false;
1666 
1667 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE,
1668 				    &result);
1669 	if (err) {
1670 		if (err == -ENODEV)
1671 			return 0;
1672 		else
1673 			return err;
1674 	}
1675 
1676 	if ((result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
1677 			(result & ASUS_FAN_BOOST_MODES_MASK)) {
1678 		asus->fan_boost_mode_available = true;
1679 		asus->fan_boost_mode_mask = result & ASUS_FAN_BOOST_MODES_MASK;
1680 	}
1681 
1682 	return 0;
1683 }
1684 
1685 static int fan_boost_mode_write(struct asus_wmi *asus)
1686 {
1687 	int err;
1688 	u8 value;
1689 	u32 retval;
1690 
1691 	value = asus->fan_boost_mode;
1692 
1693 	pr_info("Set fan boost mode: %u\n", value);
1694 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value,
1695 				    &retval);
1696 
1697 	sysfs_notify(&asus->platform_device->dev.kobj, NULL,
1698 			"fan_boost_mode");
1699 
1700 	if (err) {
1701 		pr_warn("Failed to set fan boost mode: %d\n", err);
1702 		return err;
1703 	}
1704 
1705 	if (retval != 1) {
1706 		pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
1707 			retval);
1708 		return -EIO;
1709 	}
1710 
1711 	return 0;
1712 }
1713 
1714 static int fan_boost_mode_switch_next(struct asus_wmi *asus)
1715 {
1716 	u8 mask = asus->fan_boost_mode_mask;
1717 
1718 	if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_NORMAL) {
1719 		if (mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK)
1720 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST;
1721 		else if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
1722 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
1723 	} else if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
1724 		if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
1725 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
1726 		else
1727 			asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
1728 	} else {
1729 		asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
1730 	}
1731 
1732 	return fan_boost_mode_write(asus);
1733 }
1734 
1735 static ssize_t fan_boost_mode_show(struct device *dev,
1736 				   struct device_attribute *attr, char *buf)
1737 {
1738 	struct asus_wmi *asus = dev_get_drvdata(dev);
1739 
1740 	return scnprintf(buf, PAGE_SIZE, "%d\n", asus->fan_boost_mode);
1741 }
1742 
1743 static ssize_t fan_boost_mode_store(struct device *dev,
1744 				    struct device_attribute *attr,
1745 				    const char *buf, size_t count)
1746 {
1747 	int result;
1748 	u8 new_mode;
1749 	struct asus_wmi *asus = dev_get_drvdata(dev);
1750 	u8 mask = asus->fan_boost_mode_mask;
1751 
1752 	result = kstrtou8(buf, 10, &new_mode);
1753 	if (result < 0) {
1754 		pr_warn("Trying to store invalid value\n");
1755 		return result;
1756 	}
1757 
1758 	if (new_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
1759 		if (!(mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK))
1760 			return -EINVAL;
1761 	} else if (new_mode == ASUS_FAN_BOOST_MODE_SILENT) {
1762 		if (!(mask & ASUS_FAN_BOOST_MODE_SILENT_MASK))
1763 			return -EINVAL;
1764 	} else if (new_mode != ASUS_FAN_BOOST_MODE_NORMAL) {
1765 		return -EINVAL;
1766 	}
1767 
1768 	asus->fan_boost_mode = new_mode;
1769 	fan_boost_mode_write(asus);
1770 
1771 	return count;
1772 }
1773 
1774 // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
1775 static DEVICE_ATTR_RW(fan_boost_mode);
1776 
1777 /* Throttle thermal policy ****************************************************/
1778 
1779 static int throttle_thermal_policy_check_present(struct asus_wmi *asus)
1780 {
1781 	u32 result;
1782 	int err;
1783 
1784 	asus->throttle_thermal_policy_available = false;
1785 
1786 	err = asus_wmi_get_devstate(asus,
1787 				    ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
1788 				    &result);
1789 	if (err) {
1790 		if (err == -ENODEV)
1791 			return 0;
1792 		return err;
1793 	}
1794 
1795 	if (result & ASUS_WMI_DSTS_PRESENCE_BIT)
1796 		asus->throttle_thermal_policy_available = true;
1797 
1798 	return 0;
1799 }
1800 
1801 static int throttle_thermal_policy_write(struct asus_wmi *asus)
1802 {
1803 	int err;
1804 	u8 value;
1805 	u32 retval;
1806 
1807 	value = asus->throttle_thermal_policy_mode;
1808 
1809 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
1810 				    value, &retval);
1811 
1812 	sysfs_notify(&asus->platform_device->dev.kobj, NULL,
1813 			"throttle_thermal_policy");
1814 
1815 	if (err) {
1816 		pr_warn("Failed to set throttle thermal policy: %d\n", err);
1817 		return err;
1818 	}
1819 
1820 	if (retval != 1) {
1821 		pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n",
1822 			retval);
1823 		return -EIO;
1824 	}
1825 
1826 	return 0;
1827 }
1828 
1829 static int throttle_thermal_policy_set_default(struct asus_wmi *asus)
1830 {
1831 	if (!asus->throttle_thermal_policy_available)
1832 		return 0;
1833 
1834 	asus->throttle_thermal_policy_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
1835 	return throttle_thermal_policy_write(asus);
1836 }
1837 
1838 static int throttle_thermal_policy_switch_next(struct asus_wmi *asus)
1839 {
1840 	u8 new_mode = asus->throttle_thermal_policy_mode + 1;
1841 
1842 	if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
1843 		new_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
1844 
1845 	asus->throttle_thermal_policy_mode = new_mode;
1846 	return throttle_thermal_policy_write(asus);
1847 }
1848 
1849 static ssize_t throttle_thermal_policy_show(struct device *dev,
1850 				   struct device_attribute *attr, char *buf)
1851 {
1852 	struct asus_wmi *asus = dev_get_drvdata(dev);
1853 	u8 mode = asus->throttle_thermal_policy_mode;
1854 
1855 	return scnprintf(buf, PAGE_SIZE, "%d\n", mode);
1856 }
1857 
1858 static ssize_t throttle_thermal_policy_store(struct device *dev,
1859 				    struct device_attribute *attr,
1860 				    const char *buf, size_t count)
1861 {
1862 	int result;
1863 	u8 new_mode;
1864 	struct asus_wmi *asus = dev_get_drvdata(dev);
1865 
1866 	result = kstrtou8(buf, 10, &new_mode);
1867 	if (result < 0)
1868 		return result;
1869 
1870 	if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
1871 		return -EINVAL;
1872 
1873 	asus->throttle_thermal_policy_mode = new_mode;
1874 	throttle_thermal_policy_write(asus);
1875 
1876 	return count;
1877 }
1878 
1879 // Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
1880 static DEVICE_ATTR_RW(throttle_thermal_policy);
1881 
1882 /* Backlight ******************************************************************/
1883 
1884 static int read_backlight_power(struct asus_wmi *asus)
1885 {
1886 	int ret;
1887 
1888 	if (asus->driver->quirks->store_backlight_power)
1889 		ret = !asus->driver->panel_power;
1890 	else
1891 		ret = asus_wmi_get_devstate_simple(asus,
1892 						   ASUS_WMI_DEVID_BACKLIGHT);
1893 
1894 	if (ret < 0)
1895 		return ret;
1896 
1897 	return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
1898 }
1899 
1900 static int read_brightness_max(struct asus_wmi *asus)
1901 {
1902 	u32 retval;
1903 	int err;
1904 
1905 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
1906 	if (err < 0)
1907 		return err;
1908 
1909 	retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
1910 	retval >>= 8;
1911 
1912 	if (!retval)
1913 		return -ENODEV;
1914 
1915 	return retval;
1916 }
1917 
1918 static int read_brightness(struct backlight_device *bd)
1919 {
1920 	struct asus_wmi *asus = bl_get_data(bd);
1921 	u32 retval;
1922 	int err;
1923 
1924 	err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
1925 	if (err < 0)
1926 		return err;
1927 
1928 	return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1929 }
1930 
1931 static u32 get_scalar_command(struct backlight_device *bd)
1932 {
1933 	struct asus_wmi *asus = bl_get_data(bd);
1934 	u32 ctrl_param = 0;
1935 
1936 	if ((asus->driver->brightness < bd->props.brightness) ||
1937 	    bd->props.brightness == bd->props.max_brightness)
1938 		ctrl_param = 0x00008001;
1939 	else if ((asus->driver->brightness > bd->props.brightness) ||
1940 		 bd->props.brightness == 0)
1941 		ctrl_param = 0x00008000;
1942 
1943 	asus->driver->brightness = bd->props.brightness;
1944 
1945 	return ctrl_param;
1946 }
1947 
1948 static int update_bl_status(struct backlight_device *bd)
1949 {
1950 	struct asus_wmi *asus = bl_get_data(bd);
1951 	u32 ctrl_param;
1952 	int power, err = 0;
1953 
1954 	power = read_backlight_power(asus);
1955 	if (power != -ENODEV && bd->props.power != power) {
1956 		ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
1957 		err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
1958 					    ctrl_param, NULL);
1959 		if (asus->driver->quirks->store_backlight_power)
1960 			asus->driver->panel_power = bd->props.power;
1961 
1962 		/* When using scalar brightness, updating the brightness
1963 		 * will mess with the backlight power */
1964 		if (asus->driver->quirks->scalar_panel_brightness)
1965 			return err;
1966 	}
1967 
1968 	if (asus->driver->quirks->scalar_panel_brightness)
1969 		ctrl_param = get_scalar_command(bd);
1970 	else
1971 		ctrl_param = bd->props.brightness;
1972 
1973 	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
1974 				    ctrl_param, NULL);
1975 
1976 	return err;
1977 }
1978 
1979 static const struct backlight_ops asus_wmi_bl_ops = {
1980 	.get_brightness = read_brightness,
1981 	.update_status = update_bl_status,
1982 };
1983 
1984 static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
1985 {
1986 	struct backlight_device *bd = asus->backlight_device;
1987 	int old = bd->props.brightness;
1988 	int new = old;
1989 
1990 	if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
1991 		new = code - NOTIFY_BRNUP_MIN + 1;
1992 	else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
1993 		new = code - NOTIFY_BRNDOWN_MIN;
1994 
1995 	bd->props.brightness = new;
1996 	backlight_update_status(bd);
1997 	backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
1998 
1999 	return old;
2000 }
2001 
2002 static int asus_wmi_backlight_init(struct asus_wmi *asus)
2003 {
2004 	struct backlight_device *bd;
2005 	struct backlight_properties props;
2006 	int max;
2007 	int power;
2008 
2009 	max = read_brightness_max(asus);
2010 	if (max < 0)
2011 		return max;
2012 
2013 	power = read_backlight_power(asus);
2014 	if (power == -ENODEV)
2015 		power = FB_BLANK_UNBLANK;
2016 	else if (power < 0)
2017 		return power;
2018 
2019 	memset(&props, 0, sizeof(struct backlight_properties));
2020 	props.type = BACKLIGHT_PLATFORM;
2021 	props.max_brightness = max;
2022 	bd = backlight_device_register(asus->driver->name,
2023 				       &asus->platform_device->dev, asus,
2024 				       &asus_wmi_bl_ops, &props);
2025 	if (IS_ERR(bd)) {
2026 		pr_err("Could not register backlight device\n");
2027 		return PTR_ERR(bd);
2028 	}
2029 
2030 	asus->backlight_device = bd;
2031 
2032 	if (asus->driver->quirks->store_backlight_power)
2033 		asus->driver->panel_power = power;
2034 
2035 	bd->props.brightness = read_brightness(bd);
2036 	bd->props.power = power;
2037 	backlight_update_status(bd);
2038 
2039 	asus->driver->brightness = bd->props.brightness;
2040 
2041 	return 0;
2042 }
2043 
2044 static void asus_wmi_backlight_exit(struct asus_wmi *asus)
2045 {
2046 	backlight_device_unregister(asus->backlight_device);
2047 
2048 	asus->backlight_device = NULL;
2049 }
2050 
2051 static int is_display_toggle(int code)
2052 {
2053 	/* display toggle keys */
2054 	if ((code >= 0x61 && code <= 0x67) ||
2055 	    (code >= 0x8c && code <= 0x93) ||
2056 	    (code >= 0xa0 && code <= 0xa7) ||
2057 	    (code >= 0xd0 && code <= 0xd5))
2058 		return 1;
2059 
2060 	return 0;
2061 }
2062 
2063 /* Fn-lock ********************************************************************/
2064 
2065 static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus)
2066 {
2067 	u32 result;
2068 
2069 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FNLOCK, &result);
2070 
2071 	return (result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
2072 		!(result & ASUS_WMI_FNLOCK_BIOS_DISABLED);
2073 }
2074 
2075 static void asus_wmi_fnlock_update(struct asus_wmi *asus)
2076 {
2077 	int mode = asus->fnlock_locked;
2078 
2079 	asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK, mode, NULL);
2080 }
2081 
2082 /* WMI events *****************************************************************/
2083 
2084 static int asus_wmi_get_event_code(u32 value)
2085 {
2086 	struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
2087 	union acpi_object *obj;
2088 	acpi_status status;
2089 	int code;
2090 
2091 	status = wmi_get_event_data(value, &response);
2092 	if (ACPI_FAILURE(status)) {
2093 		pr_warn("Failed to get WMI notify code: %s\n",
2094 				acpi_format_exception(status));
2095 		return -EIO;
2096 	}
2097 
2098 	obj = (union acpi_object *)response.pointer;
2099 
2100 	if (obj && obj->type == ACPI_TYPE_INTEGER)
2101 		code = (int)(obj->integer.value & WMI_EVENT_MASK);
2102 	else
2103 		code = -EIO;
2104 
2105 	kfree(obj);
2106 	return code;
2107 }
2108 
2109 static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
2110 {
2111 	unsigned int key_value = 1;
2112 	bool autorelease = 1;
2113 	int result, orig_code;
2114 
2115 	orig_code = code;
2116 
2117 	if (asus->driver->key_filter) {
2118 		asus->driver->key_filter(asus->driver, &code, &key_value,
2119 					 &autorelease);
2120 		if (code == ASUS_WMI_KEY_IGNORE)
2121 			return;
2122 	}
2123 
2124 	if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
2125 		code = ASUS_WMI_BRN_UP;
2126 	else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
2127 		code = ASUS_WMI_BRN_DOWN;
2128 
2129 	if (code == ASUS_WMI_BRN_DOWN || code == ASUS_WMI_BRN_UP) {
2130 		if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
2131 			asus_wmi_backlight_notify(asus, orig_code);
2132 			return;
2133 		}
2134 	}
2135 
2136 	if (code == NOTIFY_KBD_BRTUP) {
2137 		kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
2138 		return;
2139 	}
2140 	if (code == NOTIFY_KBD_BRTDWN) {
2141 		kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
2142 		return;
2143 	}
2144 	if (code == NOTIFY_KBD_BRTTOGGLE) {
2145 		if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
2146 			kbd_led_set_by_kbd(asus, 0);
2147 		else
2148 			kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
2149 		return;
2150 	}
2151 
2152 	if (code == NOTIFY_FNLOCK_TOGGLE) {
2153 		asus->fnlock_locked = !asus->fnlock_locked;
2154 		asus_wmi_fnlock_update(asus);
2155 		return;
2156 	}
2157 
2158 	if (asus->driver->quirks->use_kbd_dock_devid && code == NOTIFY_KBD_DOCK_CHANGE) {
2159 		result = asus_wmi_get_devstate_simple(asus,
2160 						      ASUS_WMI_DEVID_KBD_DOCK);
2161 		if (result >= 0) {
2162 			input_report_switch(asus->inputdev, SW_TABLET_MODE,
2163 					    !result);
2164 			input_sync(asus->inputdev);
2165 		}
2166 		return;
2167 	}
2168 
2169 	if (asus->driver->quirks->use_lid_flip_devid && code == NOTIFY_LID_FLIP) {
2170 		lid_flip_tablet_mode_get_state(asus);
2171 		return;
2172 	}
2173 
2174 	if (asus->fan_boost_mode_available && code == NOTIFY_KBD_FBM) {
2175 		fan_boost_mode_switch_next(asus);
2176 		return;
2177 	}
2178 
2179 	if (asus->throttle_thermal_policy_available && code == NOTIFY_KBD_TTP) {
2180 		throttle_thermal_policy_switch_next(asus);
2181 		return;
2182 	}
2183 
2184 	if (is_display_toggle(code) && asus->driver->quirks->no_display_toggle)
2185 		return;
2186 
2187 	if (!sparse_keymap_report_event(asus->inputdev, code,
2188 					key_value, autorelease))
2189 		pr_info("Unknown key %x pressed\n", code);
2190 }
2191 
2192 static void asus_wmi_notify(u32 value, void *context)
2193 {
2194 	struct asus_wmi *asus = context;
2195 	int code;
2196 	int i;
2197 
2198 	for (i = 0; i < WMI_EVENT_QUEUE_SIZE + 1; i++) {
2199 		code = asus_wmi_get_event_code(value);
2200 		if (code < 0) {
2201 			pr_warn("Failed to get notify code: %d\n", code);
2202 			return;
2203 		}
2204 
2205 		if (code == WMI_EVENT_QUEUE_END || code == WMI_EVENT_MASK)
2206 			return;
2207 
2208 		asus_wmi_handle_event_code(code, asus);
2209 
2210 		/*
2211 		 * Double check that queue is present:
2212 		 * ATK (with queue) uses 0xff, ASUSWMI (without) 0xd2.
2213 		 */
2214 		if (!asus->wmi_event_queue || value != WMI_EVENT_VALUE_ATK)
2215 			return;
2216 	}
2217 
2218 	pr_warn("Failed to process event queue, last code: 0x%x\n", code);
2219 }
2220 
2221 static int asus_wmi_notify_queue_flush(struct asus_wmi *asus)
2222 {
2223 	int code;
2224 	int i;
2225 
2226 	for (i = 0; i < WMI_EVENT_QUEUE_SIZE + 1; i++) {
2227 		code = asus_wmi_get_event_code(WMI_EVENT_VALUE_ATK);
2228 		if (code < 0) {
2229 			pr_warn("Failed to get event during flush: %d\n", code);
2230 			return code;
2231 		}
2232 
2233 		if (code == WMI_EVENT_QUEUE_END || code == WMI_EVENT_MASK)
2234 			return 0;
2235 	}
2236 
2237 	pr_warn("Failed to flush event queue\n");
2238 	return -EIO;
2239 }
2240 
2241 /* Sysfs **********************************************************************/
2242 
2243 static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
2244 			     const char *buf, size_t count)
2245 {
2246 	u32 retval;
2247 	int err, value;
2248 
2249 	value = asus_wmi_get_devstate_simple(asus, devid);
2250 	if (value < 0)
2251 		return value;
2252 
2253 	err = kstrtoint(buf, 0, &value);
2254 	if (err)
2255 		return err;
2256 
2257 	err = asus_wmi_set_devstate(devid, value, &retval);
2258 	if (err < 0)
2259 		return err;
2260 
2261 	return count;
2262 }
2263 
2264 static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
2265 {
2266 	int value = asus_wmi_get_devstate_simple(asus, devid);
2267 
2268 	if (value < 0)
2269 		return value;
2270 
2271 	return sprintf(buf, "%d\n", value);
2272 }
2273 
2274 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm)			\
2275 	static ssize_t show_##_name(struct device *dev,			\
2276 				    struct device_attribute *attr,	\
2277 				    char *buf)				\
2278 	{								\
2279 		struct asus_wmi *asus = dev_get_drvdata(dev);		\
2280 									\
2281 		return show_sys_wmi(asus, _cm, buf);			\
2282 	}								\
2283 	static ssize_t store_##_name(struct device *dev,		\
2284 				     struct device_attribute *attr,	\
2285 				     const char *buf, size_t count)	\
2286 	{								\
2287 		struct asus_wmi *asus = dev_get_drvdata(dev);		\
2288 									\
2289 		return store_sys_wmi(asus, _cm, buf, count);		\
2290 	}								\
2291 	static struct device_attribute dev_attr_##_name = {		\
2292 		.attr = {						\
2293 			.name = __stringify(_name),			\
2294 			.mode = _mode },				\
2295 		.show   = show_##_name,					\
2296 		.store  = store_##_name,				\
2297 	}
2298 
2299 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
2300 ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
2301 ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
2302 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
2303 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable, 0644, ASUS_WMI_DEVID_ALS_ENABLE);
2304 
2305 static ssize_t cpufv_store(struct device *dev, struct device_attribute *attr,
2306 			   const char *buf, size_t count)
2307 {
2308 	int value, rv;
2309 
2310 	rv = kstrtoint(buf, 0, &value);
2311 	if (rv)
2312 		return rv;
2313 
2314 	if (value < 0 || value > 2)
2315 		return -EINVAL;
2316 
2317 	rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
2318 	if (rv < 0)
2319 		return rv;
2320 
2321 	return count;
2322 }
2323 
2324 static DEVICE_ATTR_WO(cpufv);
2325 
2326 static struct attribute *platform_attributes[] = {
2327 	&dev_attr_cpufv.attr,
2328 	&dev_attr_camera.attr,
2329 	&dev_attr_cardr.attr,
2330 	&dev_attr_touchpad.attr,
2331 	&dev_attr_lid_resume.attr,
2332 	&dev_attr_als_enable.attr,
2333 	&dev_attr_fan_boost_mode.attr,
2334 	&dev_attr_throttle_thermal_policy.attr,
2335 	NULL
2336 };
2337 
2338 static umode_t asus_sysfs_is_visible(struct kobject *kobj,
2339 				    struct attribute *attr, int idx)
2340 {
2341 	struct device *dev = container_of(kobj, struct device, kobj);
2342 	struct asus_wmi *asus = dev_get_drvdata(dev);
2343 	bool ok = true;
2344 	int devid = -1;
2345 
2346 	if (attr == &dev_attr_camera.attr)
2347 		devid = ASUS_WMI_DEVID_CAMERA;
2348 	else if (attr == &dev_attr_cardr.attr)
2349 		devid = ASUS_WMI_DEVID_CARDREADER;
2350 	else if (attr == &dev_attr_touchpad.attr)
2351 		devid = ASUS_WMI_DEVID_TOUCHPAD;
2352 	else if (attr == &dev_attr_lid_resume.attr)
2353 		devid = ASUS_WMI_DEVID_LID_RESUME;
2354 	else if (attr == &dev_attr_als_enable.attr)
2355 		devid = ASUS_WMI_DEVID_ALS_ENABLE;
2356 	else if (attr == &dev_attr_fan_boost_mode.attr)
2357 		ok = asus->fan_boost_mode_available;
2358 	else if (attr == &dev_attr_throttle_thermal_policy.attr)
2359 		ok = asus->throttle_thermal_policy_available;
2360 
2361 	if (devid != -1)
2362 		ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
2363 
2364 	return ok ? attr->mode : 0;
2365 }
2366 
2367 static const struct attribute_group platform_attribute_group = {
2368 	.is_visible = asus_sysfs_is_visible,
2369 	.attrs = platform_attributes
2370 };
2371 
2372 static void asus_wmi_sysfs_exit(struct platform_device *device)
2373 {
2374 	sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
2375 }
2376 
2377 static int asus_wmi_sysfs_init(struct platform_device *device)
2378 {
2379 	return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
2380 }
2381 
2382 /* Platform device ************************************************************/
2383 
2384 static int asus_wmi_platform_init(struct asus_wmi *asus)
2385 {
2386 	struct device *dev = &asus->platform_device->dev;
2387 	char *wmi_uid;
2388 	int rv;
2389 
2390 	/* INIT enable hotkeys on some models */
2391 	if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
2392 		pr_info("Initialization: %#x\n", rv);
2393 
2394 	/* We don't know yet what to do with this version... */
2395 	if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
2396 		pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
2397 		asus->spec = rv;
2398 	}
2399 
2400 	/*
2401 	 * The SFUN method probably allows the original driver to get the list
2402 	 * of features supported by a given model. For now, 0x0100 or 0x0800
2403 	 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
2404 	 * The significance of others is yet to be found.
2405 	 */
2406 	if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
2407 		pr_info("SFUN value: %#x\n", rv);
2408 		asus->sfun = rv;
2409 	}
2410 
2411 	/*
2412 	 * Eee PC and Notebooks seems to have different method_id for DSTS,
2413 	 * but it may also be related to the BIOS's SPEC.
2414 	 * Note, on most Eeepc, there is no way to check if a method exist
2415 	 * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
2416 	 * but once again, SPEC may probably be used for that kind of things.
2417 	 *
2418 	 * Additionally at least TUF Gaming series laptops return nothing for
2419 	 * unknown methods, so the detection in this way is not possible.
2420 	 *
2421 	 * There is strong indication that only ACPI WMI devices that have _UID
2422 	 * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
2423 	 */
2424 	wmi_uid = wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID);
2425 	if (!wmi_uid)
2426 		return -ENODEV;
2427 
2428 	if (!strcmp(wmi_uid, ASUS_ACPI_UID_ASUSWMI)) {
2429 		dev_info(dev, "Detected ASUSWMI, use DCTS\n");
2430 		asus->dsts_id = ASUS_WMI_METHODID_DCTS;
2431 	} else {
2432 		dev_info(dev, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid);
2433 		asus->dsts_id = ASUS_WMI_METHODID_DSTS;
2434 	}
2435 
2436 	/*
2437 	 * Some devices can have multiple event codes stored in a queue before
2438 	 * the module load if it was unloaded intermittently after calling
2439 	 * the INIT method (enables event handling). The WMI notify handler is
2440 	 * expected to retrieve all event codes until a retrieved code equals
2441 	 * queue end marker (One or Ones). Old codes are flushed from the queue
2442 	 * upon module load. Not enabling this when it should be has minimal
2443 	 * visible impact so fall back if anything goes wrong.
2444 	 */
2445 	wmi_uid = wmi_get_acpi_device_uid(asus->driver->event_guid);
2446 	if (wmi_uid && !strcmp(wmi_uid, ASUS_ACPI_UID_ATK)) {
2447 		dev_info(dev, "Detected ATK, enable event queue\n");
2448 
2449 		if (!asus_wmi_notify_queue_flush(asus))
2450 			asus->wmi_event_queue = true;
2451 	}
2452 
2453 	/* CWAP allow to define the behavior of the Fn+F2 key,
2454 	 * this method doesn't seems to be present on Eee PCs */
2455 	if (asus->driver->quirks->wapf >= 0)
2456 		asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
2457 				      asus->driver->quirks->wapf, NULL);
2458 
2459 	return 0;
2460 }
2461 
2462 /* debugfs ********************************************************************/
2463 
2464 struct asus_wmi_debugfs_node {
2465 	struct asus_wmi *asus;
2466 	char *name;
2467 	int (*show) (struct seq_file *m, void *data);
2468 };
2469 
2470 static int show_dsts(struct seq_file *m, void *data)
2471 {
2472 	struct asus_wmi *asus = m->private;
2473 	int err;
2474 	u32 retval = -1;
2475 
2476 	err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
2477 	if (err < 0)
2478 		return err;
2479 
2480 	seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
2481 
2482 	return 0;
2483 }
2484 
2485 static int show_devs(struct seq_file *m, void *data)
2486 {
2487 	struct asus_wmi *asus = m->private;
2488 	int err;
2489 	u32 retval = -1;
2490 
2491 	err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
2492 				    &retval);
2493 	if (err < 0)
2494 		return err;
2495 
2496 	seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
2497 		   asus->debug.ctrl_param, retval);
2498 
2499 	return 0;
2500 }
2501 
2502 static int show_call(struct seq_file *m, void *data)
2503 {
2504 	struct asus_wmi *asus = m->private;
2505 	struct bios_args args = {
2506 		.arg0 = asus->debug.dev_id,
2507 		.arg1 = asus->debug.ctrl_param,
2508 	};
2509 	struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
2510 	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
2511 	union acpi_object *obj;
2512 	acpi_status status;
2513 
2514 	status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
2515 				     0, asus->debug.method_id,
2516 				     &input, &output);
2517 
2518 	if (ACPI_FAILURE(status))
2519 		return -EIO;
2520 
2521 	obj = (union acpi_object *)output.pointer;
2522 	if (obj && obj->type == ACPI_TYPE_INTEGER)
2523 		seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
2524 			   asus->debug.dev_id, asus->debug.ctrl_param,
2525 			   (u32) obj->integer.value);
2526 	else
2527 		seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
2528 			   asus->debug.dev_id, asus->debug.ctrl_param,
2529 			   obj ? obj->type : -1);
2530 
2531 	kfree(obj);
2532 
2533 	return 0;
2534 }
2535 
2536 static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
2537 	{NULL, "devs", show_devs},
2538 	{NULL, "dsts", show_dsts},
2539 	{NULL, "call", show_call},
2540 };
2541 
2542 static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
2543 {
2544 	struct asus_wmi_debugfs_node *node = inode->i_private;
2545 
2546 	return single_open(file, node->show, node->asus);
2547 }
2548 
2549 static const struct file_operations asus_wmi_debugfs_io_ops = {
2550 	.owner = THIS_MODULE,
2551 	.open = asus_wmi_debugfs_open,
2552 	.read = seq_read,
2553 	.llseek = seq_lseek,
2554 	.release = single_release,
2555 };
2556 
2557 static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
2558 {
2559 	debugfs_remove_recursive(asus->debug.root);
2560 }
2561 
2562 static void asus_wmi_debugfs_init(struct asus_wmi *asus)
2563 {
2564 	int i;
2565 
2566 	asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
2567 
2568 	debugfs_create_x32("method_id", S_IRUGO | S_IWUSR, asus->debug.root,
2569 			   &asus->debug.method_id);
2570 
2571 	debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR, asus->debug.root,
2572 			   &asus->debug.dev_id);
2573 
2574 	debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR, asus->debug.root,
2575 			   &asus->debug.ctrl_param);
2576 
2577 	for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
2578 		struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
2579 
2580 		node->asus = asus;
2581 		debugfs_create_file(node->name, S_IFREG | S_IRUGO,
2582 				    asus->debug.root, node,
2583 				    &asus_wmi_debugfs_io_ops);
2584 	}
2585 }
2586 
2587 /* Init / exit ****************************************************************/
2588 
2589 static int asus_wmi_add(struct platform_device *pdev)
2590 {
2591 	struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
2592 	struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
2593 	struct asus_wmi *asus;
2594 	const char *chassis_type;
2595 	acpi_status status;
2596 	int err;
2597 	u32 result;
2598 
2599 	asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
2600 	if (!asus)
2601 		return -ENOMEM;
2602 
2603 	asus->driver = wdrv;
2604 	asus->platform_device = pdev;
2605 	wdrv->platform_device = pdev;
2606 	platform_set_drvdata(asus->platform_device, asus);
2607 
2608 	if (wdrv->detect_quirks)
2609 		wdrv->detect_quirks(asus->driver);
2610 
2611 	err = asus_wmi_platform_init(asus);
2612 	if (err)
2613 		goto fail_platform;
2614 
2615 	err = fan_boost_mode_check_present(asus);
2616 	if (err)
2617 		goto fail_fan_boost_mode;
2618 
2619 	err = throttle_thermal_policy_check_present(asus);
2620 	if (err)
2621 		goto fail_throttle_thermal_policy;
2622 	else
2623 		throttle_thermal_policy_set_default(asus);
2624 
2625 	err = asus_wmi_sysfs_init(asus->platform_device);
2626 	if (err)
2627 		goto fail_sysfs;
2628 
2629 	err = asus_wmi_input_init(asus);
2630 	if (err)
2631 		goto fail_input;
2632 
2633 	err = asus_wmi_fan_init(asus); /* probably no problems on error */
2634 
2635 	err = asus_wmi_hwmon_init(asus);
2636 	if (err)
2637 		goto fail_hwmon;
2638 
2639 	err = asus_wmi_led_init(asus);
2640 	if (err)
2641 		goto fail_leds;
2642 
2643 	asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
2644 	if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
2645 		asus->driver->wlan_ctrl_by_user = 1;
2646 
2647 	if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
2648 		err = asus_wmi_rfkill_init(asus);
2649 		if (err)
2650 			goto fail_rfkill;
2651 	}
2652 
2653 	if (asus->driver->quirks->wmi_force_als_set)
2654 		asus_wmi_set_als();
2655 
2656 	/* Some Asus desktop boards export an acpi-video backlight interface,
2657 	   stop this from showing up */
2658 	chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
2659 	if (chassis_type && !strcmp(chassis_type, "3"))
2660 		acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
2661 
2662 	if (asus->driver->quirks->wmi_backlight_power)
2663 		acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
2664 
2665 	if (asus->driver->quirks->wmi_backlight_native)
2666 		acpi_video_set_dmi_backlight_type(acpi_backlight_native);
2667 
2668 	if (asus->driver->quirks->xusb2pr)
2669 		asus_wmi_set_xusb2pr(asus);
2670 
2671 	if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
2672 		err = asus_wmi_backlight_init(asus);
2673 		if (err && err != -ENODEV)
2674 			goto fail_backlight;
2675 	} else if (asus->driver->quirks->wmi_backlight_set_devstate)
2676 		err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);
2677 
2678 	if (asus_wmi_has_fnlock_key(asus)) {
2679 		asus->fnlock_locked = fnlock_default;
2680 		asus_wmi_fnlock_update(asus);
2681 	}
2682 
2683 	status = wmi_install_notify_handler(asus->driver->event_guid,
2684 					    asus_wmi_notify, asus);
2685 	if (ACPI_FAILURE(status)) {
2686 		pr_err("Unable to register notify handler - %d\n", status);
2687 		err = -ENODEV;
2688 		goto fail_wmi_handler;
2689 	}
2690 
2691 	asus_wmi_battery_init(asus);
2692 
2693 	asus_wmi_debugfs_init(asus);
2694 
2695 	return 0;
2696 
2697 fail_wmi_handler:
2698 	asus_wmi_backlight_exit(asus);
2699 fail_backlight:
2700 	asus_wmi_rfkill_exit(asus);
2701 fail_rfkill:
2702 	asus_wmi_led_exit(asus);
2703 fail_leds:
2704 fail_hwmon:
2705 	asus_wmi_input_exit(asus);
2706 fail_input:
2707 	asus_wmi_sysfs_exit(asus->platform_device);
2708 fail_sysfs:
2709 fail_throttle_thermal_policy:
2710 fail_fan_boost_mode:
2711 fail_platform:
2712 	kfree(asus);
2713 	return err;
2714 }
2715 
2716 static int asus_wmi_remove(struct platform_device *device)
2717 {
2718 	struct asus_wmi *asus;
2719 
2720 	asus = platform_get_drvdata(device);
2721 	wmi_remove_notify_handler(asus->driver->event_guid);
2722 	asus_wmi_backlight_exit(asus);
2723 	asus_wmi_input_exit(asus);
2724 	asus_wmi_led_exit(asus);
2725 	asus_wmi_rfkill_exit(asus);
2726 	asus_wmi_debugfs_exit(asus);
2727 	asus_wmi_sysfs_exit(asus->platform_device);
2728 	asus_fan_set_auto(asus);
2729 	asus_wmi_battery_exit(asus);
2730 
2731 	kfree(asus);
2732 	return 0;
2733 }
2734 
2735 /* Platform driver - hibernate/resume callbacks *******************************/
2736 
2737 static int asus_hotk_thaw(struct device *device)
2738 {
2739 	struct asus_wmi *asus = dev_get_drvdata(device);
2740 
2741 	if (asus->wlan.rfkill) {
2742 		bool wlan;
2743 
2744 		/*
2745 		 * Work around bios bug - acpi _PTS turns off the wireless led
2746 		 * during suspend.  Normally it restores it on resume, but
2747 		 * we should kick it ourselves in case hibernation is aborted.
2748 		 */
2749 		wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
2750 		asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
2751 	}
2752 
2753 	return 0;
2754 }
2755 
2756 static int asus_hotk_resume(struct device *device)
2757 {
2758 	struct asus_wmi *asus = dev_get_drvdata(device);
2759 
2760 	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
2761 		kbd_led_update(asus);
2762 
2763 	if (asus_wmi_has_fnlock_key(asus))
2764 		asus_wmi_fnlock_update(asus);
2765 
2766 	if (asus->driver->quirks->use_lid_flip_devid)
2767 		lid_flip_tablet_mode_get_state(asus);
2768 
2769 	return 0;
2770 }
2771 
2772 static int asus_hotk_restore(struct device *device)
2773 {
2774 	struct asus_wmi *asus = dev_get_drvdata(device);
2775 	int bl;
2776 
2777 	/* Refresh both wlan rfkill state and pci hotplug */
2778 	if (asus->wlan.rfkill)
2779 		asus_rfkill_hotplug(asus);
2780 
2781 	if (asus->bluetooth.rfkill) {
2782 		bl = !asus_wmi_get_devstate_simple(asus,
2783 						   ASUS_WMI_DEVID_BLUETOOTH);
2784 		rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
2785 	}
2786 	if (asus->wimax.rfkill) {
2787 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
2788 		rfkill_set_sw_state(asus->wimax.rfkill, bl);
2789 	}
2790 	if (asus->wwan3g.rfkill) {
2791 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
2792 		rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
2793 	}
2794 	if (asus->gps.rfkill) {
2795 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
2796 		rfkill_set_sw_state(asus->gps.rfkill, bl);
2797 	}
2798 	if (asus->uwb.rfkill) {
2799 		bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
2800 		rfkill_set_sw_state(asus->uwb.rfkill, bl);
2801 	}
2802 	if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
2803 		kbd_led_update(asus);
2804 
2805 	if (asus_wmi_has_fnlock_key(asus))
2806 		asus_wmi_fnlock_update(asus);
2807 
2808 	if (asus->driver->quirks->use_lid_flip_devid)
2809 		lid_flip_tablet_mode_get_state(asus);
2810 
2811 	return 0;
2812 }
2813 
2814 static const struct dev_pm_ops asus_pm_ops = {
2815 	.thaw = asus_hotk_thaw,
2816 	.restore = asus_hotk_restore,
2817 	.resume = asus_hotk_resume,
2818 };
2819 
2820 /* Registration ***************************************************************/
2821 
2822 static int asus_wmi_probe(struct platform_device *pdev)
2823 {
2824 	struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
2825 	struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
2826 	int ret;
2827 
2828 	if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
2829 		pr_warn("ASUS Management GUID not found\n");
2830 		return -ENODEV;
2831 	}
2832 
2833 	if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
2834 		pr_warn("ASUS Event GUID not found\n");
2835 		return -ENODEV;
2836 	}
2837 
2838 	if (wdrv->probe) {
2839 		ret = wdrv->probe(pdev);
2840 		if (ret)
2841 			return ret;
2842 	}
2843 
2844 	return asus_wmi_add(pdev);
2845 }
2846 
2847 static bool used;
2848 
2849 int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
2850 {
2851 	struct platform_driver *platform_driver;
2852 	struct platform_device *platform_device;
2853 
2854 	if (used)
2855 		return -EBUSY;
2856 
2857 	platform_driver = &driver->platform_driver;
2858 	platform_driver->remove = asus_wmi_remove;
2859 	platform_driver->driver.owner = driver->owner;
2860 	platform_driver->driver.name = driver->name;
2861 	platform_driver->driver.pm = &asus_pm_ops;
2862 
2863 	platform_device = platform_create_bundle(platform_driver,
2864 						 asus_wmi_probe,
2865 						 NULL, 0, NULL, 0);
2866 	if (IS_ERR(platform_device))
2867 		return PTR_ERR(platform_device);
2868 
2869 	used = true;
2870 	return 0;
2871 }
2872 EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
2873 
2874 void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
2875 {
2876 	platform_device_unregister(driver->platform_device);
2877 	platform_driver_unregister(&driver->platform_driver);
2878 	used = false;
2879 }
2880 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
2881 
2882 static int __init asus_wmi_init(void)
2883 {
2884 	pr_info("ASUS WMI generic driver loaded\n");
2885 	return 0;
2886 }
2887 
2888 static void __exit asus_wmi_exit(void)
2889 {
2890 	pr_info("ASUS WMI generic driver unloaded\n");
2891 }
2892 
2893 module_init(asus_wmi_init);
2894 module_exit(asus_wmi_exit);
2895