diff options
Diffstat (limited to 'drivers/platform/x86/asus-wmi.c')
-rw-r--r-- | drivers/platform/x86/asus-wmi.c | 119 |
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 | ||
305 | static int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, | 222 | int 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 | } |
258 | EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method); | ||
342 | 259 | ||
343 | static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args) | 260 | static 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 | ||
459 | static void kbd_led_update(struct work_struct *work) | 376 | static 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 | ||
477 | static int kbd_led_read(struct asus_wmi *asus, int *level, int *env) | 390 | static 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 | ||
522 | static void kbd_led_set(struct led_classdev *led_cdev, | 435 | static 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 | ||
441 | static 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 | |||
528 | static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) | 449 | static 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 | } |