aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/asus-wmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/platform/x86/asus-wmi.c')
-rw-r--r--drivers/platform/x86/asus-wmi.c119
1 files changed, 19 insertions, 100 deletions
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
index 93ee2d5466f8..c285a16675ee 100644
--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -43,6 +43,7 @@
43#include <linux/hwmon-sysfs.h> 43#include <linux/hwmon-sysfs.h>
44#include <linux/debugfs.h> 44#include <linux/debugfs.h>
45#include <linux/seq_file.h> 45#include <linux/seq_file.h>
46#include <linux/platform_data/x86/asus-wmi.h>
46#include <linux/platform_device.h> 47#include <linux/platform_device.h>
47#include <linux/thermal.h> 48#include <linux/thermal.h>
48#include <linux/acpi.h> 49#include <linux/acpi.h>
@@ -69,89 +70,6 @@ MODULE_LICENSE("GPL");
69#define NOTIFY_KBD_BRTDWN 0xc5 70#define NOTIFY_KBD_BRTDWN 0xc5
70#define NOTIFY_KBD_BRTTOGGLE 0xc7 71#define NOTIFY_KBD_BRTTOGGLE 0xc7
71 72
72/* WMI Methods */
73#define ASUS_WMI_METHODID_SPEC 0x43455053 /* BIOS SPECification */
74#define ASUS_WMI_METHODID_SFBD 0x44424653 /* Set First Boot Device */
75#define ASUS_WMI_METHODID_GLCD 0x44434C47 /* Get LCD status */
76#define ASUS_WMI_METHODID_GPID 0x44495047 /* Get Panel ID?? (Resol) */
77#define ASUS_WMI_METHODID_QMOD 0x444F4D51 /* Quiet MODe */
78#define ASUS_WMI_METHODID_SPLV 0x4C425053 /* Set Panel Light Value */
79#define ASUS_WMI_METHODID_AGFN 0x4E464741 /* FaN? */
80#define ASUS_WMI_METHODID_SFUN 0x4E554653 /* FUNCtionalities */
81#define ASUS_WMI_METHODID_SDSP 0x50534453 /* Set DiSPlay output */
82#define ASUS_WMI_METHODID_GDSP 0x50534447 /* Get DiSPlay output */
83#define ASUS_WMI_METHODID_DEVP 0x50564544 /* DEVice Policy */
84#define ASUS_WMI_METHODID_OSVR 0x5256534F /* OS VeRsion */
85#define ASUS_WMI_METHODID_DSTS 0x53544344 /* Device STatuS */
86#define ASUS_WMI_METHODID_DSTS2 0x53545344 /* Device STatuS #2*/
87#define ASUS_WMI_METHODID_BSTS 0x53545342 /* Bios STatuS ? */
88#define ASUS_WMI_METHODID_DEVS 0x53564544 /* DEVice Set */
89#define ASUS_WMI_METHODID_CFVS 0x53564643 /* CPU Frequency Volt Set */
90#define ASUS_WMI_METHODID_KBFT 0x5446424B /* KeyBoard FilTer */
91#define ASUS_WMI_METHODID_INIT 0x54494E49 /* INITialize */
92#define ASUS_WMI_METHODID_HKEY 0x59454B48 /* Hot KEY ?? */
93
94#define ASUS_WMI_UNSUPPORTED_METHOD 0xFFFFFFFE
95
96/* Wireless */
97#define ASUS_WMI_DEVID_HW_SWITCH 0x00010001
98#define ASUS_WMI_DEVID_WIRELESS_LED 0x00010002
99#define ASUS_WMI_DEVID_CWAP 0x00010003
100#define ASUS_WMI_DEVID_WLAN 0x00010011
101#define ASUS_WMI_DEVID_WLAN_LED 0x00010012
102#define ASUS_WMI_DEVID_BLUETOOTH 0x00010013
103#define ASUS_WMI_DEVID_GPS 0x00010015
104#define ASUS_WMI_DEVID_WIMAX 0x00010017
105#define ASUS_WMI_DEVID_WWAN3G 0x00010019
106#define ASUS_WMI_DEVID_UWB 0x00010021
107
108/* Leds */
109/* 0x000200XX and 0x000400XX */
110#define ASUS_WMI_DEVID_LED1 0x00020011
111#define ASUS_WMI_DEVID_LED2 0x00020012
112#define ASUS_WMI_DEVID_LED3 0x00020013
113#define ASUS_WMI_DEVID_LED4 0x00020014
114#define ASUS_WMI_DEVID_LED5 0x00020015
115#define ASUS_WMI_DEVID_LED6 0x00020016
116
117/* Backlight and Brightness */
118#define ASUS_WMI_DEVID_ALS_ENABLE 0x00050001 /* Ambient Light Sensor */
119#define ASUS_WMI_DEVID_BACKLIGHT 0x00050011
120#define ASUS_WMI_DEVID_BRIGHTNESS 0x00050012
121#define ASUS_WMI_DEVID_KBD_BACKLIGHT 0x00050021
122#define ASUS_WMI_DEVID_LIGHT_SENSOR 0x00050022 /* ?? */
123#define ASUS_WMI_DEVID_LIGHTBAR 0x00050025
124
125/* Misc */
126#define ASUS_WMI_DEVID_CAMERA 0x00060013
127
128/* Storage */
129#define ASUS_WMI_DEVID_CARDREADER 0x00080013
130
131/* Input */
132#define ASUS_WMI_DEVID_TOUCHPAD 0x00100011
133#define ASUS_WMI_DEVID_TOUCHPAD_LED 0x00100012
134
135/* Fan, Thermal */
136#define ASUS_WMI_DEVID_THERMAL_CTRL 0x00110011
137#define ASUS_WMI_DEVID_FAN_CTRL 0x00110012
138
139/* Power */
140#define ASUS_WMI_DEVID_PROCESSOR_STATE 0x00120012
141
142/* Deep S3 / Resume on LID open */
143#define ASUS_WMI_DEVID_LID_RESUME 0x00120031
144
145/* DSTS masks */
146#define ASUS_WMI_DSTS_STATUS_BIT 0x00000001
147#define ASUS_WMI_DSTS_UNKNOWN_BIT 0x00000002
148#define ASUS_WMI_DSTS_PRESENCE_BIT 0x00010000
149#define ASUS_WMI_DSTS_USER_BIT 0x00020000
150#define ASUS_WMI_DSTS_BIOS_BIT 0x00040000
151#define ASUS_WMI_DSTS_BRIGHTNESS_MASK 0x000000FF
152#define ASUS_WMI_DSTS_MAX_BRIGTH_MASK 0x0000FF00
153#define ASUS_WMI_DSTS_LIGHTBAR_MASK 0x0000000F
154
155#define ASUS_FAN_DESC "cpu_fan" 73#define ASUS_FAN_DESC "cpu_fan"
156#define ASUS_FAN_MFUN 0x13 74#define ASUS_FAN_MFUN 0x13
157#define ASUS_FAN_SFUN_READ 0x06 75#define ASUS_FAN_SFUN_READ 0x06
@@ -239,7 +157,6 @@ struct asus_wmi {
239 int lightbar_led_wk; 157 int lightbar_led_wk;
240 struct workqueue_struct *led_workqueue; 158 struct workqueue_struct *led_workqueue;
241 struct work_struct tpd_led_work; 159 struct work_struct tpd_led_work;
242 struct work_struct kbd_led_work;
243 struct work_struct wlan_led_work; 160 struct work_struct wlan_led_work;
244 struct work_struct lightbar_led_work; 161 struct work_struct lightbar_led_work;
245 162
@@ -302,8 +219,7 @@ static void asus_wmi_input_exit(struct asus_wmi *asus)
302 asus->inputdev = NULL; 219 asus->inputdev = NULL;
303} 220}
304 221
305static int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, 222int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
306 u32 *retval)
307{ 223{
308 struct bios_args args = { 224 struct bios_args args = {
309 .arg0 = arg0, 225 .arg0 = arg0,
@@ -339,6 +255,7 @@ exit:
339 255
340 return 0; 256 return 0;
341} 257}
258EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
342 259
343static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args) 260static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
344{ 261{
@@ -456,12 +373,9 @@ static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
456 return read_tpd_led_state(asus); 373 return read_tpd_led_state(asus);
457} 374}
458 375
459static void kbd_led_update(struct work_struct *work) 376static void kbd_led_update(struct asus_wmi *asus)
460{ 377{
461 int ctrl_param = 0; 378 int ctrl_param = 0;
462 struct asus_wmi *asus;
463
464 asus = container_of(work, struct asus_wmi, kbd_led_work);
465 379
466 /* 380 /*
467 * bits 0-2: level 381 * bits 0-2: level
@@ -471,7 +385,6 @@ static void kbd_led_update(struct work_struct *work)
471 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F); 385 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
472 386
473 asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); 387 asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
474 led_classdev_notify_brightness_hw_changed(&asus->kbd_led, asus->kbd_led_wk);
475} 388}
476 389
477static int kbd_led_read(struct asus_wmi *asus, int *level, int *env) 390static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
@@ -516,7 +429,7 @@ static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
516 value = 0; 429 value = 0;
517 430
518 asus->kbd_led_wk = value; 431 asus->kbd_led_wk = value;
519 queue_work(asus->led_workqueue, &asus->kbd_led_work); 432 kbd_led_update(asus);
520} 433}
521 434
522static void kbd_led_set(struct led_classdev *led_cdev, 435static void kbd_led_set(struct led_classdev *led_cdev,
@@ -525,6 +438,14 @@ static void kbd_led_set(struct led_classdev *led_cdev,
525 do_kbd_led_set(led_cdev, value); 438 do_kbd_led_set(led_cdev, value);
526} 439}
527 440
441static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
442{
443 struct led_classdev *led_cdev = &asus->kbd_led;
444
445 do_kbd_led_set(led_cdev, value);
446 led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
447}
448
528static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) 449static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
529{ 450{
530 struct asus_wmi *asus; 451 struct asus_wmi *asus;
@@ -671,8 +592,6 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
671 592
672 led_val = kbd_led_read(asus, NULL, NULL); 593 led_val = kbd_led_read(asus, NULL, NULL);
673 if (led_val >= 0) { 594 if (led_val >= 0) {
674 INIT_WORK(&asus->kbd_led_work, kbd_led_update);
675
676 asus->kbd_led_wk = led_val; 595 asus->kbd_led_wk = led_val;
677 asus->kbd_led.name = "asus::kbd_backlight"; 596 asus->kbd_led.name = "asus::kbd_backlight";
678 asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED; 597 asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
@@ -1746,18 +1665,18 @@ static void asus_wmi_notify(u32 value, void *context)
1746 } 1665 }
1747 1666
1748 if (code == NOTIFY_KBD_BRTUP) { 1667 if (code == NOTIFY_KBD_BRTUP) {
1749 do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1); 1668 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
1750 goto exit; 1669 goto exit;
1751 } 1670 }
1752 if (code == NOTIFY_KBD_BRTDWN) { 1671 if (code == NOTIFY_KBD_BRTDWN) {
1753 do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk - 1); 1672 kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
1754 goto exit; 1673 goto exit;
1755 } 1674 }
1756 if (code == NOTIFY_KBD_BRTTOGGLE) { 1675 if (code == NOTIFY_KBD_BRTTOGGLE) {
1757 if (asus->kbd_led_wk == asus->kbd_led.max_brightness) 1676 if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
1758 do_kbd_led_set(&asus->kbd_led, 0); 1677 kbd_led_set_by_kbd(asus, 0);
1759 else 1678 else
1760 do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1); 1679 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
1761 goto exit; 1680 goto exit;
1762 } 1681 }
1763 1682
@@ -2291,7 +2210,7 @@ static int asus_hotk_resume(struct device *device)
2291 struct asus_wmi *asus = dev_get_drvdata(device); 2210 struct asus_wmi *asus = dev_get_drvdata(device);
2292 2211
2293 if (!IS_ERR_OR_NULL(asus->kbd_led.dev)) 2212 if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
2294 queue_work(asus->led_workqueue, &asus->kbd_led_work); 2213 kbd_led_update(asus);
2295 2214
2296 return 0; 2215 return 0;
2297} 2216}
@@ -2327,7 +2246,7 @@ static int asus_hotk_restore(struct device *device)
2327 rfkill_set_sw_state(asus->uwb.rfkill, bl); 2246 rfkill_set_sw_state(asus->uwb.rfkill, bl);
2328 } 2247 }
2329 if (!IS_ERR_OR_NULL(asus->kbd_led.dev)) 2248 if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
2330 queue_work(asus->led_workqueue, &asus->kbd_led_work); 2249 kbd_led_update(asus);
2331 2250
2332 return 0; 2251 return 0;
2333} 2252}