Merge tag 'mfd-for-linus-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/lee...
[firefly-linux-kernel-4.4.55.git] / drivers / platform / x86 / asus-wmi.c
1 /*
2  * Asus PC WMI hotkey driver
3  *
4  * Copyright(C) 2010 Intel Corporation.
5  * Copyright(C) 2010-2011 Corentin Chary <corentin.chary@gmail.com>
6  *
7  * Portions based on wistron_btns.c:
8  * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
9  * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
10  * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
11  *
12  *  This program is free software; you can redistribute it and/or modify
13  *  it under the terms of the GNU General Public License as published by
14  *  the Free Software Foundation; either version 2 of the License, or
15  *  (at your option) any later version.
16  *
17  *  This program is distributed in the hope that it will be useful,
18  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *  GNU General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public License
23  *  along with this program; if not, write to the Free Software
24  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25  */
26
27 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
28
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/init.h>
32 #include <linux/types.h>
33 #include <linux/slab.h>
34 #include <linux/input.h>
35 #include <linux/input/sparse-keymap.h>
36 #include <linux/fb.h>
37 #include <linux/backlight.h>
38 #include <linux/leds.h>
39 #include <linux/rfkill.h>
40 #include <linux/pci.h>
41 #include <linux/pci_hotplug.h>
42 #include <linux/hwmon.h>
43 #include <linux/hwmon-sysfs.h>
44 #include <linux/debugfs.h>
45 #include <linux/seq_file.h>
46 #include <linux/platform_device.h>
47 #include <linux/thermal.h>
48 #include <linux/acpi.h>
49 #include <acpi/video.h>
50
51 #include "asus-wmi.h"
52
53 MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>, "
54               "Yong Wang <yong.y.wang@intel.com>");
55 MODULE_DESCRIPTION("Asus Generic WMI Driver");
56 MODULE_LICENSE("GPL");
57
58 #define to_platform_driver(drv)                                 \
59         (container_of((drv), struct platform_driver, driver))
60
61 #define to_asus_wmi_driver(pdrv)                                        \
62         (container_of((pdrv), struct asus_wmi_driver, platform_driver))
63
64 #define ASUS_WMI_MGMT_GUID      "97845ED0-4E6D-11DE-8A39-0800200C9A66"
65
66 #define NOTIFY_BRNUP_MIN                0x11
67 #define NOTIFY_BRNUP_MAX                0x1f
68 #define NOTIFY_BRNDOWN_MIN              0x20
69 #define NOTIFY_BRNDOWN_MAX              0x2e
70 #define NOTIFY_KBD_BRTUP                0xc4
71 #define NOTIFY_KBD_BRTDWN               0xc5
72
73 /* WMI Methods */
74 #define ASUS_WMI_METHODID_SPEC          0x43455053 /* BIOS SPECification */
75 #define ASUS_WMI_METHODID_SFBD          0x44424653 /* Set First Boot Device */
76 #define ASUS_WMI_METHODID_GLCD          0x44434C47 /* Get LCD status */
77 #define ASUS_WMI_METHODID_GPID          0x44495047 /* Get Panel ID?? (Resol) */
78 #define ASUS_WMI_METHODID_QMOD          0x444F4D51 /* Quiet MODe */
79 #define ASUS_WMI_METHODID_SPLV          0x4C425053 /* Set Panel Light Value */
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_BACKLIGHT        0x00050011
119 #define ASUS_WMI_DEVID_BRIGHTNESS       0x00050012
120 #define ASUS_WMI_DEVID_KBD_BACKLIGHT    0x00050021
121 #define ASUS_WMI_DEVID_LIGHT_SENSOR     0x00050022 /* ?? */
122
123 /* Misc */
124 #define ASUS_WMI_DEVID_CAMERA           0x00060013
125
126 /* Storage */
127 #define ASUS_WMI_DEVID_CARDREADER       0x00080013
128
129 /* Input */
130 #define ASUS_WMI_DEVID_TOUCHPAD         0x00100011
131 #define ASUS_WMI_DEVID_TOUCHPAD_LED     0x00100012
132
133 /* Fan, Thermal */
134 #define ASUS_WMI_DEVID_THERMAL_CTRL     0x00110011
135 #define ASUS_WMI_DEVID_FAN_CTRL         0x00110012
136
137 /* Power */
138 #define ASUS_WMI_DEVID_PROCESSOR_STATE  0x00120012
139
140 /* Deep S3 / Resume on LID open */
141 #define ASUS_WMI_DEVID_LID_RESUME       0x00120031
142
143 /* DSTS masks */
144 #define ASUS_WMI_DSTS_STATUS_BIT        0x00000001
145 #define ASUS_WMI_DSTS_UNKNOWN_BIT       0x00000002
146 #define ASUS_WMI_DSTS_PRESENCE_BIT      0x00010000
147 #define ASUS_WMI_DSTS_USER_BIT          0x00020000
148 #define ASUS_WMI_DSTS_BIOS_BIT          0x00040000
149 #define ASUS_WMI_DSTS_BRIGHTNESS_MASK   0x000000FF
150 #define ASUS_WMI_DSTS_MAX_BRIGTH_MASK   0x0000FF00
151
152 struct bios_args {
153         u32 arg0;
154         u32 arg1;
155 } __packed;
156
157 /*
158  * <platform>/    - debugfs root directory
159  *   dev_id      - current dev_id
160  *   ctrl_param  - current ctrl_param
161  *   method_id   - current method_id
162  *   devs        - call DEVS(dev_id, ctrl_param) and print result
163  *   dsts        - call DSTS(dev_id)  and print result
164  *   call        - call method_id(dev_id, ctrl_param) and print result
165  */
166 struct asus_wmi_debug {
167         struct dentry *root;
168         u32 method_id;
169         u32 dev_id;
170         u32 ctrl_param;
171 };
172
173 struct asus_rfkill {
174         struct asus_wmi *asus;
175         struct rfkill *rfkill;
176         u32 dev_id;
177 };
178
179 struct asus_wmi {
180         int dsts_id;
181         int spec;
182         int sfun;
183
184         struct input_dev *inputdev;
185         struct backlight_device *backlight_device;
186         struct platform_device *platform_device;
187
188         struct led_classdev wlan_led;
189         int wlan_led_wk;
190         struct led_classdev tpd_led;
191         int tpd_led_wk;
192         struct led_classdev kbd_led;
193         int kbd_led_wk;
194         struct workqueue_struct *led_workqueue;
195         struct work_struct tpd_led_work;
196         struct work_struct kbd_led_work;
197         struct work_struct wlan_led_work;
198
199         struct asus_rfkill wlan;
200         struct asus_rfkill bluetooth;
201         struct asus_rfkill wimax;
202         struct asus_rfkill wwan3g;
203         struct asus_rfkill gps;
204         struct asus_rfkill uwb;
205
206         struct hotplug_slot *hotplug_slot;
207         struct mutex hotplug_lock;
208         struct mutex wmi_lock;
209         struct workqueue_struct *hotplug_workqueue;
210         struct work_struct hotplug_work;
211
212         struct asus_wmi_debug debug;
213
214         struct asus_wmi_driver *driver;
215 };
216
217 static int asus_wmi_input_init(struct asus_wmi *asus)
218 {
219         int err;
220
221         asus->inputdev = input_allocate_device();
222         if (!asus->inputdev)
223                 return -ENOMEM;
224
225         asus->inputdev->name = asus->driver->input_name;
226         asus->inputdev->phys = asus->driver->input_phys;
227         asus->inputdev->id.bustype = BUS_HOST;
228         asus->inputdev->dev.parent = &asus->platform_device->dev;
229         set_bit(EV_REP, asus->inputdev->evbit);
230
231         err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
232         if (err)
233                 goto err_free_dev;
234
235         err = input_register_device(asus->inputdev);
236         if (err)
237                 goto err_free_keymap;
238
239         return 0;
240
241 err_free_keymap:
242         sparse_keymap_free(asus->inputdev);
243 err_free_dev:
244         input_free_device(asus->inputdev);
245         return err;
246 }
247
248 static void asus_wmi_input_exit(struct asus_wmi *asus)
249 {
250         if (asus->inputdev) {
251                 sparse_keymap_free(asus->inputdev);
252                 input_unregister_device(asus->inputdev);
253         }
254
255         asus->inputdev = NULL;
256 }
257
258 static int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1,
259                                     u32 *retval)
260 {
261         struct bios_args args = {
262                 .arg0 = arg0,
263                 .arg1 = arg1,
264         };
265         struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
266         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
267         acpi_status status;
268         union acpi_object *obj;
269         u32 tmp;
270
271         status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 1, method_id,
272                                      &input, &output);
273
274         if (ACPI_FAILURE(status))
275                 goto exit;
276
277         obj = (union acpi_object *)output.pointer;
278         if (obj && obj->type == ACPI_TYPE_INTEGER)
279                 tmp = (u32) obj->integer.value;
280         else
281                 tmp = 0;
282
283         if (retval)
284                 *retval = tmp;
285
286         kfree(obj);
287
288 exit:
289         if (ACPI_FAILURE(status))
290                 return -EIO;
291
292         if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
293                 return -ENODEV;
294
295         return 0;
296 }
297
298 static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
299 {
300         return asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
301 }
302
303 static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
304                                  u32 *retval)
305 {
306         return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
307                                         ctrl_param, retval);
308 }
309
310 /* Helper for special devices with magic return codes */
311 static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
312                                       u32 dev_id, u32 mask)
313 {
314         u32 retval = 0;
315         int err;
316
317         err = asus_wmi_get_devstate(asus, dev_id, &retval);
318
319         if (err < 0)
320                 return err;
321
322         if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
323                 return -ENODEV;
324
325         if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
326                 if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
327                         return -ENODEV;
328         }
329
330         return retval & mask;
331 }
332
333 static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
334 {
335         return asus_wmi_get_devstate_bits(asus, dev_id,
336                                           ASUS_WMI_DSTS_STATUS_BIT);
337 }
338
339 /*
340  * LEDs
341  */
342 /*
343  * These functions actually update the LED's, and are called from a
344  * workqueue. By doing this as separate work rather than when the LED
345  * subsystem asks, we avoid messing with the Asus ACPI stuff during a
346  * potentially bad time, such as a timer interrupt.
347  */
348 static void tpd_led_update(struct work_struct *work)
349 {
350         int ctrl_param;
351         struct asus_wmi *asus;
352
353         asus = container_of(work, struct asus_wmi, tpd_led_work);
354
355         ctrl_param = asus->tpd_led_wk;
356         asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
357 }
358
359 static void tpd_led_set(struct led_classdev *led_cdev,
360                         enum led_brightness value)
361 {
362         struct asus_wmi *asus;
363
364         asus = container_of(led_cdev, struct asus_wmi, tpd_led);
365
366         asus->tpd_led_wk = !!value;
367         queue_work(asus->led_workqueue, &asus->tpd_led_work);
368 }
369
370 static int read_tpd_led_state(struct asus_wmi *asus)
371 {
372         return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
373 }
374
375 static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
376 {
377         struct asus_wmi *asus;
378
379         asus = container_of(led_cdev, struct asus_wmi, tpd_led);
380
381         return read_tpd_led_state(asus);
382 }
383
384 static void kbd_led_update(struct work_struct *work)
385 {
386         int ctrl_param = 0;
387         struct asus_wmi *asus;
388
389         asus = container_of(work, struct asus_wmi, kbd_led_work);
390
391         /*
392          * bits 0-2: level
393          * bit 7: light on/off
394          */
395         if (asus->kbd_led_wk > 0)
396                 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
397
398         asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
399 }
400
401 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
402 {
403         int retval;
404
405         /*
406          * bits 0-2: level
407          * bit 7: light on/off
408          * bit 8-10: environment (0: dark, 1: normal, 2: light)
409          * bit 17: status unknown
410          */
411         retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
412                                             0xFFFF);
413
414         /* Unknown status is considered as off */
415         if (retval == 0x8000)
416                 retval = 0;
417
418         if (retval >= 0) {
419                 if (level)
420                         *level = retval & 0x7F;
421                 if (env)
422                         *env = (retval >> 8) & 0x7F;
423                 retval = 0;
424         }
425
426         return retval;
427 }
428
429 static void kbd_led_set(struct led_classdev *led_cdev,
430                         enum led_brightness value)
431 {
432         struct asus_wmi *asus;
433
434         asus = container_of(led_cdev, struct asus_wmi, kbd_led);
435
436         if (value > asus->kbd_led.max_brightness)
437                 value = asus->kbd_led.max_brightness;
438         else if (value < 0)
439                 value = 0;
440
441         asus->kbd_led_wk = value;
442         queue_work(asus->led_workqueue, &asus->kbd_led_work);
443 }
444
445 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
446 {
447         struct asus_wmi *asus;
448         int retval, value;
449
450         asus = container_of(led_cdev, struct asus_wmi, kbd_led);
451
452         retval = kbd_led_read(asus, &value, NULL);
453
454         if (retval < 0)
455                 return retval;
456
457         return value;
458 }
459
460 static int wlan_led_unknown_state(struct asus_wmi *asus)
461 {
462         u32 result;
463
464         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
465
466         return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
467 }
468
469 static int wlan_led_presence(struct asus_wmi *asus)
470 {
471         u32 result;
472
473         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
474
475         return result & ASUS_WMI_DSTS_PRESENCE_BIT;
476 }
477
478 static void wlan_led_update(struct work_struct *work)
479 {
480         int ctrl_param;
481         struct asus_wmi *asus;
482
483         asus = container_of(work, struct asus_wmi, wlan_led_work);
484
485         ctrl_param = asus->wlan_led_wk;
486         asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
487 }
488
489 static void wlan_led_set(struct led_classdev *led_cdev,
490                          enum led_brightness value)
491 {
492         struct asus_wmi *asus;
493
494         asus = container_of(led_cdev, struct asus_wmi, wlan_led);
495
496         asus->wlan_led_wk = !!value;
497         queue_work(asus->led_workqueue, &asus->wlan_led_work);
498 }
499
500 static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
501 {
502         struct asus_wmi *asus;
503         u32 result;
504
505         asus = container_of(led_cdev, struct asus_wmi, wlan_led);
506         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
507
508         return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
509 }
510
511 static void asus_wmi_led_exit(struct asus_wmi *asus)
512 {
513         if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
514                 led_classdev_unregister(&asus->kbd_led);
515         if (!IS_ERR_OR_NULL(asus->tpd_led.dev))
516                 led_classdev_unregister(&asus->tpd_led);
517         if (!IS_ERR_OR_NULL(asus->wlan_led.dev))
518                 led_classdev_unregister(&asus->wlan_led);
519         if (asus->led_workqueue)
520                 destroy_workqueue(asus->led_workqueue);
521 }
522
523 static int asus_wmi_led_init(struct asus_wmi *asus)
524 {
525         int rv = 0;
526
527         asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
528         if (!asus->led_workqueue)
529                 return -ENOMEM;
530
531         if (read_tpd_led_state(asus) >= 0) {
532                 INIT_WORK(&asus->tpd_led_work, tpd_led_update);
533
534                 asus->tpd_led.name = "asus::touchpad";
535                 asus->tpd_led.brightness_set = tpd_led_set;
536                 asus->tpd_led.brightness_get = tpd_led_get;
537                 asus->tpd_led.max_brightness = 1;
538
539                 rv = led_classdev_register(&asus->platform_device->dev,
540                                            &asus->tpd_led);
541                 if (rv)
542                         goto error;
543         }
544
545         if (kbd_led_read(asus, NULL, NULL) >= 0) {
546                 INIT_WORK(&asus->kbd_led_work, kbd_led_update);
547
548                 asus->kbd_led.name = "asus::kbd_backlight";
549                 asus->kbd_led.brightness_set = kbd_led_set;
550                 asus->kbd_led.brightness_get = kbd_led_get;
551                 asus->kbd_led.max_brightness = 3;
552
553                 rv = led_classdev_register(&asus->platform_device->dev,
554                                            &asus->kbd_led);
555                 if (rv)
556                         goto error;
557         }
558
559         if (wlan_led_presence(asus) && (asus->driver->quirks->wapf == 4)) {
560                 INIT_WORK(&asus->wlan_led_work, wlan_led_update);
561
562                 asus->wlan_led.name = "asus::wlan";
563                 asus->wlan_led.brightness_set = wlan_led_set;
564                 if (!wlan_led_unknown_state(asus))
565                         asus->wlan_led.brightness_get = wlan_led_get;
566                 asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
567                 asus->wlan_led.max_brightness = 1;
568                 asus->wlan_led.default_trigger = "asus-wlan";
569
570                 rv = led_classdev_register(&asus->platform_device->dev,
571                                            &asus->wlan_led);
572         }
573
574 error:
575         if (rv)
576                 asus_wmi_led_exit(asus);
577
578         return rv;
579 }
580
581
582 /*
583  * PCI hotplug (for wlan rfkill)
584  */
585 static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
586 {
587         int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
588
589         if (result < 0)
590                 return false;
591         return !result;
592 }
593
594 static void asus_rfkill_hotplug(struct asus_wmi *asus)
595 {
596         struct pci_dev *dev;
597         struct pci_bus *bus;
598         bool blocked;
599         bool absent;
600         u32 l;
601
602         mutex_lock(&asus->wmi_lock);
603         blocked = asus_wlan_rfkill_blocked(asus);
604         mutex_unlock(&asus->wmi_lock);
605
606         mutex_lock(&asus->hotplug_lock);
607         pci_lock_rescan_remove();
608
609         if (asus->wlan.rfkill)
610                 rfkill_set_sw_state(asus->wlan.rfkill, blocked);
611
612         if (asus->hotplug_slot) {
613                 bus = pci_find_bus(0, 1);
614                 if (!bus) {
615                         pr_warn("Unable to find PCI bus 1?\n");
616                         goto out_unlock;
617                 }
618
619                 if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
620                         pr_err("Unable to read PCI config space?\n");
621                         goto out_unlock;
622                 }
623                 absent = (l == 0xffffffff);
624
625                 if (blocked != absent) {
626                         pr_warn("BIOS says wireless lan is %s, "
627                                 "but the pci device is %s\n",
628                                 blocked ? "blocked" : "unblocked",
629                                 absent ? "absent" : "present");
630                         pr_warn("skipped wireless hotplug as probably "
631                                 "inappropriate for this model\n");
632                         goto out_unlock;
633                 }
634
635                 if (!blocked) {
636                         dev = pci_get_slot(bus, 0);
637                         if (dev) {
638                                 /* Device already present */
639                                 pci_dev_put(dev);
640                                 goto out_unlock;
641                         }
642                         dev = pci_scan_single_device(bus, 0);
643                         if (dev) {
644                                 pci_bus_assign_resources(bus);
645                                 pci_bus_add_device(dev);
646                         }
647                 } else {
648                         dev = pci_get_slot(bus, 0);
649                         if (dev) {
650                                 pci_stop_and_remove_bus_device(dev);
651                                 pci_dev_put(dev);
652                         }
653                 }
654         }
655
656 out_unlock:
657         pci_unlock_rescan_remove();
658         mutex_unlock(&asus->hotplug_lock);
659 }
660
661 static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
662 {
663         struct asus_wmi *asus = data;
664
665         if (event != ACPI_NOTIFY_BUS_CHECK)
666                 return;
667
668         /*
669          * We can't call directly asus_rfkill_hotplug because most
670          * of the time WMBC is still being executed and not reetrant.
671          * There is currently no way to tell ACPICA that  we want this
672          * method to be serialized, we schedule a asus_rfkill_hotplug
673          * call later, in a safer context.
674          */
675         queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
676 }
677
678 static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
679 {
680         acpi_status status;
681         acpi_handle handle;
682
683         status = acpi_get_handle(NULL, node, &handle);
684
685         if (ACPI_SUCCESS(status)) {
686                 status = acpi_install_notify_handler(handle,
687                                                      ACPI_SYSTEM_NOTIFY,
688                                                      asus_rfkill_notify, asus);
689                 if (ACPI_FAILURE(status))
690                         pr_warn("Failed to register notify on %s\n", node);
691         } else
692                 return -ENODEV;
693
694         return 0;
695 }
696
697 static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
698 {
699         acpi_status status = AE_OK;
700         acpi_handle handle;
701
702         status = acpi_get_handle(NULL, node, &handle);
703
704         if (ACPI_SUCCESS(status)) {
705                 status = acpi_remove_notify_handler(handle,
706                                                     ACPI_SYSTEM_NOTIFY,
707                                                     asus_rfkill_notify);
708                 if (ACPI_FAILURE(status))
709                         pr_err("Error removing rfkill notify handler %s\n",
710                                node);
711         }
712 }
713
714 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
715                                    u8 *value)
716 {
717         struct asus_wmi *asus = hotplug_slot->private;
718         int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
719
720         if (result < 0)
721                 return result;
722
723         *value = !!result;
724         return 0;
725 }
726
727 static void asus_cleanup_pci_hotplug(struct hotplug_slot *hotplug_slot)
728 {
729         kfree(hotplug_slot->info);
730         kfree(hotplug_slot);
731 }
732
733 static struct hotplug_slot_ops asus_hotplug_slot_ops = {
734         .owner = THIS_MODULE,
735         .get_adapter_status = asus_get_adapter_status,
736         .get_power_status = asus_get_adapter_status,
737 };
738
739 static void asus_hotplug_work(struct work_struct *work)
740 {
741         struct asus_wmi *asus;
742
743         asus = container_of(work, struct asus_wmi, hotplug_work);
744         asus_rfkill_hotplug(asus);
745 }
746
747 static int asus_setup_pci_hotplug(struct asus_wmi *asus)
748 {
749         int ret = -ENOMEM;
750         struct pci_bus *bus = pci_find_bus(0, 1);
751
752         if (!bus) {
753                 pr_err("Unable to find wifi PCI bus\n");
754                 return -ENODEV;
755         }
756
757         asus->hotplug_workqueue =
758             create_singlethread_workqueue("hotplug_workqueue");
759         if (!asus->hotplug_workqueue)
760                 goto error_workqueue;
761
762         INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
763
764         asus->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
765         if (!asus->hotplug_slot)
766                 goto error_slot;
767
768         asus->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
769                                            GFP_KERNEL);
770         if (!asus->hotplug_slot->info)
771                 goto error_info;
772
773         asus->hotplug_slot->private = asus;
774         asus->hotplug_slot->release = &asus_cleanup_pci_hotplug;
775         asus->hotplug_slot->ops = &asus_hotplug_slot_ops;
776         asus_get_adapter_status(asus->hotplug_slot,
777                                 &asus->hotplug_slot->info->adapter_status);
778
779         ret = pci_hp_register(asus->hotplug_slot, bus, 0, "asus-wifi");
780         if (ret) {
781                 pr_err("Unable to register hotplug slot - %d\n", ret);
782                 goto error_register;
783         }
784
785         return 0;
786
787 error_register:
788         kfree(asus->hotplug_slot->info);
789 error_info:
790         kfree(asus->hotplug_slot);
791         asus->hotplug_slot = NULL;
792 error_slot:
793         destroy_workqueue(asus->hotplug_workqueue);
794 error_workqueue:
795         return ret;
796 }
797
798 /*
799  * Rfkill devices
800  */
801 static int asus_rfkill_set(void *data, bool blocked)
802 {
803         struct asus_rfkill *priv = data;
804         u32 ctrl_param = !blocked;
805         u32 dev_id = priv->dev_id;
806
807         /*
808          * If the user bit is set, BIOS can't set and record the wlan status,
809          * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
810          * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
811          * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
812          * while setting the wlan status through WMI.
813          * This is also the behavior that windows app will do.
814          */
815         if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
816              priv->asus->driver->wlan_ctrl_by_user)
817                 dev_id = ASUS_WMI_DEVID_WLAN_LED;
818
819         return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
820 }
821
822 static void asus_rfkill_query(struct rfkill *rfkill, void *data)
823 {
824         struct asus_rfkill *priv = data;
825         int result;
826
827         result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
828
829         if (result < 0)
830                 return;
831
832         rfkill_set_sw_state(priv->rfkill, !result);
833 }
834
835 static int asus_rfkill_wlan_set(void *data, bool blocked)
836 {
837         struct asus_rfkill *priv = data;
838         struct asus_wmi *asus = priv->asus;
839         int ret;
840
841         /*
842          * This handler is enabled only if hotplug is enabled.
843          * In this case, the asus_wmi_set_devstate() will
844          * trigger a wmi notification and we need to wait
845          * this call to finish before being able to call
846          * any wmi method
847          */
848         mutex_lock(&asus->wmi_lock);
849         ret = asus_rfkill_set(data, blocked);
850         mutex_unlock(&asus->wmi_lock);
851         return ret;
852 }
853
854 static const struct rfkill_ops asus_rfkill_wlan_ops = {
855         .set_block = asus_rfkill_wlan_set,
856         .query = asus_rfkill_query,
857 };
858
859 static const struct rfkill_ops asus_rfkill_ops = {
860         .set_block = asus_rfkill_set,
861         .query = asus_rfkill_query,
862 };
863
864 static int asus_new_rfkill(struct asus_wmi *asus,
865                            struct asus_rfkill *arfkill,
866                            const char *name, enum rfkill_type type, int dev_id)
867 {
868         int result = asus_wmi_get_devstate_simple(asus, dev_id);
869         struct rfkill **rfkill = &arfkill->rfkill;
870
871         if (result < 0)
872                 return result;
873
874         arfkill->dev_id = dev_id;
875         arfkill->asus = asus;
876
877         if (dev_id == ASUS_WMI_DEVID_WLAN &&
878             asus->driver->quirks->hotplug_wireless)
879                 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
880                                        &asus_rfkill_wlan_ops, arfkill);
881         else
882                 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
883                                        &asus_rfkill_ops, arfkill);
884
885         if (!*rfkill)
886                 return -EINVAL;
887
888         if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
889                         (asus->driver->quirks->wapf == 4))
890                 rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
891
892         rfkill_init_sw_state(*rfkill, !result);
893         result = rfkill_register(*rfkill);
894         if (result) {
895                 rfkill_destroy(*rfkill);
896                 *rfkill = NULL;
897                 return result;
898         }
899         return 0;
900 }
901
902 static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
903 {
904         asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
905         asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
906         asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
907         if (asus->wlan.rfkill) {
908                 rfkill_unregister(asus->wlan.rfkill);
909                 rfkill_destroy(asus->wlan.rfkill);
910                 asus->wlan.rfkill = NULL;
911         }
912         /*
913          * Refresh pci hotplug in case the rfkill state was changed after
914          * asus_unregister_rfkill_notifier()
915          */
916         asus_rfkill_hotplug(asus);
917         if (asus->hotplug_slot)
918                 pci_hp_deregister(asus->hotplug_slot);
919         if (asus->hotplug_workqueue)
920                 destroy_workqueue(asus->hotplug_workqueue);
921
922         if (asus->bluetooth.rfkill) {
923                 rfkill_unregister(asus->bluetooth.rfkill);
924                 rfkill_destroy(asus->bluetooth.rfkill);
925                 asus->bluetooth.rfkill = NULL;
926         }
927         if (asus->wimax.rfkill) {
928                 rfkill_unregister(asus->wimax.rfkill);
929                 rfkill_destroy(asus->wimax.rfkill);
930                 asus->wimax.rfkill = NULL;
931         }
932         if (asus->wwan3g.rfkill) {
933                 rfkill_unregister(asus->wwan3g.rfkill);
934                 rfkill_destroy(asus->wwan3g.rfkill);
935                 asus->wwan3g.rfkill = NULL;
936         }
937         if (asus->gps.rfkill) {
938                 rfkill_unregister(asus->gps.rfkill);
939                 rfkill_destroy(asus->gps.rfkill);
940                 asus->gps.rfkill = NULL;
941         }
942         if (asus->uwb.rfkill) {
943                 rfkill_unregister(asus->uwb.rfkill);
944                 rfkill_destroy(asus->uwb.rfkill);
945                 asus->uwb.rfkill = NULL;
946         }
947 }
948
949 static int asus_wmi_rfkill_init(struct asus_wmi *asus)
950 {
951         int result = 0;
952
953         mutex_init(&asus->hotplug_lock);
954         mutex_init(&asus->wmi_lock);
955
956         result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
957                                  RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
958
959         if (result && result != -ENODEV)
960                 goto exit;
961
962         result = asus_new_rfkill(asus, &asus->bluetooth,
963                                  "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
964                                  ASUS_WMI_DEVID_BLUETOOTH);
965
966         if (result && result != -ENODEV)
967                 goto exit;
968
969         result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
970                                  RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
971
972         if (result && result != -ENODEV)
973                 goto exit;
974
975         result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
976                                  RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
977
978         if (result && result != -ENODEV)
979                 goto exit;
980
981         result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
982                                  RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
983
984         if (result && result != -ENODEV)
985                 goto exit;
986
987         result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
988                                  RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
989
990         if (result && result != -ENODEV)
991                 goto exit;
992
993         if (!asus->driver->quirks->hotplug_wireless)
994                 goto exit;
995
996         result = asus_setup_pci_hotplug(asus);
997         /*
998          * If we get -EBUSY then something else is handling the PCI hotplug -
999          * don't fail in this case
1000          */
1001         if (result == -EBUSY)
1002                 result = 0;
1003
1004         asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
1005         asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
1006         asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
1007         /*
1008          * Refresh pci hotplug in case the rfkill state was changed during
1009          * setup.
1010          */
1011         asus_rfkill_hotplug(asus);
1012
1013 exit:
1014         if (result && result != -ENODEV)
1015                 asus_wmi_rfkill_exit(asus);
1016
1017         if (result == -ENODEV)
1018                 result = 0;
1019
1020         return result;
1021 }
1022
1023 /*
1024  * Hwmon device
1025  */
1026 static ssize_t asus_hwmon_pwm1(struct device *dev,
1027                                struct device_attribute *attr,
1028                                char *buf)
1029 {
1030         struct asus_wmi *asus = dev_get_drvdata(dev);
1031         u32 value;
1032         int err;
1033
1034         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
1035
1036         if (err < 0)
1037                 return err;
1038
1039         value &= 0xFF;
1040
1041         if (value == 1) /* Low Speed */
1042                 value = 85;
1043         else if (value == 2)
1044                 value = 170;
1045         else if (value == 3)
1046                 value = 255;
1047         else if (value != 0) {
1048                 pr_err("Unknown fan speed %#x\n", value);
1049                 value = -1;
1050         }
1051
1052         return sprintf(buf, "%d\n", value);
1053 }
1054
1055 static ssize_t asus_hwmon_temp1(struct device *dev,
1056                                 struct device_attribute *attr,
1057                                 char *buf)
1058 {
1059         struct asus_wmi *asus = dev_get_drvdata(dev);
1060         u32 value;
1061         int err;
1062
1063         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
1064
1065         if (err < 0)
1066                 return err;
1067
1068         value = KELVIN_TO_CELSIUS((value & 0xFFFF)) * 1000;
1069
1070         return sprintf(buf, "%d\n", value);
1071 }
1072
1073 static DEVICE_ATTR(pwm1, S_IRUGO, asus_hwmon_pwm1, NULL);
1074 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
1075
1076 static struct attribute *hwmon_attributes[] = {
1077         &dev_attr_pwm1.attr,
1078         &dev_attr_temp1_input.attr,
1079         NULL
1080 };
1081
1082 static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
1083                                           struct attribute *attr, int idx)
1084 {
1085         struct device *dev = container_of(kobj, struct device, kobj);
1086         struct platform_device *pdev = to_platform_device(dev->parent);
1087         struct asus_wmi *asus = platform_get_drvdata(pdev);
1088         bool ok = true;
1089         int dev_id = -1;
1090         u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
1091
1092         if (attr == &dev_attr_pwm1.attr)
1093                 dev_id = ASUS_WMI_DEVID_FAN_CTRL;
1094         else if (attr == &dev_attr_temp1_input.attr)
1095                 dev_id = ASUS_WMI_DEVID_THERMAL_CTRL;
1096
1097         if (dev_id != -1) {
1098                 int err = asus_wmi_get_devstate(asus, dev_id, &value);
1099
1100                 if (err < 0)
1101                         return 0; /* can't return negative here */
1102         }
1103
1104         if (dev_id == ASUS_WMI_DEVID_FAN_CTRL) {
1105                 /*
1106                  * We need to find a better way, probably using sfun,
1107                  * bits or spec ...
1108                  * Currently we disable it if:
1109                  * - ASUS_WMI_UNSUPPORTED_METHOD is returned
1110                  * - reverved bits are non-zero
1111                  * - sfun and presence bit are not set
1112                  */
1113                 if (value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
1114                     || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)))
1115                         ok = false;
1116         } else if (dev_id == ASUS_WMI_DEVID_THERMAL_CTRL) {
1117                 /* If value is zero, something is clearly wrong */
1118                 if (value == 0)
1119                         ok = false;
1120         }
1121
1122         return ok ? attr->mode : 0;
1123 }
1124
1125 static struct attribute_group hwmon_attribute_group = {
1126         .is_visible = asus_hwmon_sysfs_is_visible,
1127         .attrs = hwmon_attributes
1128 };
1129 __ATTRIBUTE_GROUPS(hwmon_attribute);
1130
1131 static int asus_wmi_hwmon_init(struct asus_wmi *asus)
1132 {
1133         struct device *hwmon;
1134
1135         hwmon = hwmon_device_register_with_groups(&asus->platform_device->dev,
1136                                                   "asus", asus,
1137                                                   hwmon_attribute_groups);
1138         if (IS_ERR(hwmon)) {
1139                 pr_err("Could not register asus hwmon device\n");
1140                 return PTR_ERR(hwmon);
1141         }
1142         return 0;
1143 }
1144
1145 /*
1146  * Backlight
1147  */
1148 static int read_backlight_power(struct asus_wmi *asus)
1149 {
1150         int ret;
1151         if (asus->driver->quirks->store_backlight_power)
1152                 ret = !asus->driver->panel_power;
1153         else
1154                 ret = asus_wmi_get_devstate_simple(asus,
1155                                                    ASUS_WMI_DEVID_BACKLIGHT);
1156
1157         if (ret < 0)
1158                 return ret;
1159
1160         return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
1161 }
1162
1163 static int read_brightness_max(struct asus_wmi *asus)
1164 {
1165         u32 retval;
1166         int err;
1167
1168         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
1169
1170         if (err < 0)
1171                 return err;
1172
1173         retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
1174         retval >>= 8;
1175
1176         if (!retval)
1177                 return -ENODEV;
1178
1179         return retval;
1180 }
1181
1182 static int read_brightness(struct backlight_device *bd)
1183 {
1184         struct asus_wmi *asus = bl_get_data(bd);
1185         u32 retval;
1186         int err;
1187
1188         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
1189
1190         if (err < 0)
1191                 return err;
1192
1193         return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1194 }
1195
1196 static u32 get_scalar_command(struct backlight_device *bd)
1197 {
1198         struct asus_wmi *asus = bl_get_data(bd);
1199         u32 ctrl_param = 0;
1200
1201         if ((asus->driver->brightness < bd->props.brightness) ||
1202             bd->props.brightness == bd->props.max_brightness)
1203                 ctrl_param = 0x00008001;
1204         else if ((asus->driver->brightness > bd->props.brightness) ||
1205                  bd->props.brightness == 0)
1206                 ctrl_param = 0x00008000;
1207
1208         asus->driver->brightness = bd->props.brightness;
1209
1210         return ctrl_param;
1211 }
1212
1213 static int update_bl_status(struct backlight_device *bd)
1214 {
1215         struct asus_wmi *asus = bl_get_data(bd);
1216         u32 ctrl_param;
1217         int power, err = 0;
1218
1219         power = read_backlight_power(asus);
1220         if (power != -ENODEV && bd->props.power != power) {
1221                 ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
1222                 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
1223                                             ctrl_param, NULL);
1224                 if (asus->driver->quirks->store_backlight_power)
1225                         asus->driver->panel_power = bd->props.power;
1226
1227                 /* When using scalar brightness, updating the brightness
1228                  * will mess with the backlight power */
1229                 if (asus->driver->quirks->scalar_panel_brightness)
1230                         return err;
1231         }
1232
1233         if (asus->driver->quirks->scalar_panel_brightness)
1234                 ctrl_param = get_scalar_command(bd);
1235         else
1236                 ctrl_param = bd->props.brightness;
1237
1238         err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
1239                                     ctrl_param, NULL);
1240
1241         return err;
1242 }
1243
1244 static const struct backlight_ops asus_wmi_bl_ops = {
1245         .get_brightness = read_brightness,
1246         .update_status = update_bl_status,
1247 };
1248
1249 static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
1250 {
1251         struct backlight_device *bd = asus->backlight_device;
1252         int old = bd->props.brightness;
1253         int new = old;
1254
1255         if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
1256                 new = code - NOTIFY_BRNUP_MIN + 1;
1257         else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
1258                 new = code - NOTIFY_BRNDOWN_MIN;
1259
1260         bd->props.brightness = new;
1261         backlight_update_status(bd);
1262         backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
1263
1264         return old;
1265 }
1266
1267 static int asus_wmi_backlight_init(struct asus_wmi *asus)
1268 {
1269         struct backlight_device *bd;
1270         struct backlight_properties props;
1271         int max;
1272         int power;
1273
1274         max = read_brightness_max(asus);
1275
1276         if (max == -ENODEV)
1277                 max = 0;
1278         else if (max < 0)
1279                 return max;
1280
1281         power = read_backlight_power(asus);
1282
1283         if (power == -ENODEV)
1284                 power = FB_BLANK_UNBLANK;
1285         else if (power < 0)
1286                 return power;
1287
1288         memset(&props, 0, sizeof(struct backlight_properties));
1289         props.type = BACKLIGHT_PLATFORM;
1290         props.max_brightness = max;
1291         bd = backlight_device_register(asus->driver->name,
1292                                        &asus->platform_device->dev, asus,
1293                                        &asus_wmi_bl_ops, &props);
1294         if (IS_ERR(bd)) {
1295                 pr_err("Could not register backlight device\n");
1296                 return PTR_ERR(bd);
1297         }
1298
1299         asus->backlight_device = bd;
1300
1301         if (asus->driver->quirks->store_backlight_power)
1302                 asus->driver->panel_power = power;
1303
1304         bd->props.brightness = read_brightness(bd);
1305         bd->props.power = power;
1306         backlight_update_status(bd);
1307
1308         asus->driver->brightness = bd->props.brightness;
1309
1310         return 0;
1311 }
1312
1313 static void asus_wmi_backlight_exit(struct asus_wmi *asus)
1314 {
1315         if (asus->backlight_device)
1316                 backlight_device_unregister(asus->backlight_device);
1317
1318         asus->backlight_device = NULL;
1319 }
1320
1321 static int is_display_toggle(int code)
1322 {
1323         /* display toggle keys */
1324         if ((code >= 0x61 && code <= 0x67) ||
1325             (code >= 0x8c && code <= 0x93) ||
1326             (code >= 0xa0 && code <= 0xa7) ||
1327             (code >= 0xd0 && code <= 0xd5))
1328                 return 1;
1329
1330         return 0;
1331 }
1332
1333 static void asus_wmi_notify(u32 value, void *context)
1334 {
1335         struct asus_wmi *asus = context;
1336         struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
1337         union acpi_object *obj;
1338         acpi_status status;
1339         int code;
1340         int orig_code;
1341         unsigned int key_value = 1;
1342         bool autorelease = 1;
1343
1344         status = wmi_get_event_data(value, &response);
1345         if (status != AE_OK) {
1346                 pr_err("bad event status 0x%x\n", status);
1347                 return;
1348         }
1349
1350         obj = (union acpi_object *)response.pointer;
1351
1352         if (!obj || obj->type != ACPI_TYPE_INTEGER)
1353                 goto exit;
1354
1355         code = obj->integer.value;
1356         orig_code = code;
1357
1358         if (asus->driver->key_filter) {
1359                 asus->driver->key_filter(asus->driver, &code, &key_value,
1360                                          &autorelease);
1361                 if (code == ASUS_WMI_KEY_IGNORE)
1362                         goto exit;
1363         }
1364
1365         if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
1366                 code = ASUS_WMI_BRN_UP;
1367         else if (code >= NOTIFY_BRNDOWN_MIN &&
1368                  code <= NOTIFY_BRNDOWN_MAX)
1369                 code = ASUS_WMI_BRN_DOWN;
1370
1371         if (code == ASUS_WMI_BRN_DOWN || code == ASUS_WMI_BRN_UP) {
1372                 if (!acpi_video_backlight_support()) {
1373                         asus_wmi_backlight_notify(asus, orig_code);
1374                         goto exit;
1375                 }
1376         }
1377
1378         if (is_display_toggle(code) &&
1379             asus->driver->quirks->no_display_toggle)
1380                 goto exit;
1381
1382         if (!sparse_keymap_report_event(asus->inputdev, code,
1383                                         key_value, autorelease))
1384                 pr_info("Unknown key %x pressed\n", code);
1385
1386 exit:
1387         kfree(obj);
1388 }
1389
1390 /*
1391  * Sys helpers
1392  */
1393 static int parse_arg(const char *buf, unsigned long count, int *val)
1394 {
1395         if (!count)
1396                 return 0;
1397         if (sscanf(buf, "%i", val) != 1)
1398                 return -EINVAL;
1399         return count;
1400 }
1401
1402 static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
1403                              const char *buf, size_t count)
1404 {
1405         u32 retval;
1406         int rv, err, value;
1407
1408         value = asus_wmi_get_devstate_simple(asus, devid);
1409         if (value == -ENODEV)   /* Check device presence */
1410                 return value;
1411
1412         rv = parse_arg(buf, count, &value);
1413         err = asus_wmi_set_devstate(devid, value, &retval);
1414
1415         if (err < 0)
1416                 return err;
1417
1418         return rv;
1419 }
1420
1421 static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
1422 {
1423         int value = asus_wmi_get_devstate_simple(asus, devid);
1424
1425         if (value < 0)
1426                 return value;
1427
1428         return sprintf(buf, "%d\n", value);
1429 }
1430
1431 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm)                  \
1432         static ssize_t show_##_name(struct device *dev,                 \
1433                                     struct device_attribute *attr,      \
1434                                     char *buf)                          \
1435         {                                                               \
1436                 struct asus_wmi *asus = dev_get_drvdata(dev);           \
1437                                                                         \
1438                 return show_sys_wmi(asus, _cm, buf);                    \
1439         }                                                               \
1440         static ssize_t store_##_name(struct device *dev,                \
1441                                      struct device_attribute *attr,     \
1442                                      const char *buf, size_t count)     \
1443         {                                                               \
1444                 struct asus_wmi *asus = dev_get_drvdata(dev);           \
1445                                                                         \
1446                 return store_sys_wmi(asus, _cm, buf, count);            \
1447         }                                                               \
1448         static struct device_attribute dev_attr_##_name = {             \
1449                 .attr = {                                               \
1450                         .name = __stringify(_name),                     \
1451                         .mode = _mode },                                \
1452                 .show   = show_##_name,                                 \
1453                 .store  = store_##_name,                                \
1454         }
1455
1456 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
1457 ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
1458 ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
1459 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
1460
1461 static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr,
1462                            const char *buf, size_t count)
1463 {
1464         int value, rv;
1465
1466         if (!count || sscanf(buf, "%i", &value) != 1)
1467                 return -EINVAL;
1468         if (value < 0 || value > 2)
1469                 return -EINVAL;
1470
1471         rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
1472         if (rv < 0)
1473                 return rv;
1474
1475         return count;
1476 }
1477
1478 static DEVICE_ATTR(cpufv, S_IRUGO | S_IWUSR, NULL, store_cpufv);
1479
1480 static struct attribute *platform_attributes[] = {
1481         &dev_attr_cpufv.attr,
1482         &dev_attr_camera.attr,
1483         &dev_attr_cardr.attr,
1484         &dev_attr_touchpad.attr,
1485         &dev_attr_lid_resume.attr,
1486         NULL
1487 };
1488
1489 static umode_t asus_sysfs_is_visible(struct kobject *kobj,
1490                                     struct attribute *attr, int idx)
1491 {
1492         struct device *dev = container_of(kobj, struct device, kobj);
1493         struct platform_device *pdev = to_platform_device(dev);
1494         struct asus_wmi *asus = platform_get_drvdata(pdev);
1495         bool ok = true;
1496         int devid = -1;
1497
1498         if (attr == &dev_attr_camera.attr)
1499                 devid = ASUS_WMI_DEVID_CAMERA;
1500         else if (attr == &dev_attr_cardr.attr)
1501                 devid = ASUS_WMI_DEVID_CARDREADER;
1502         else if (attr == &dev_attr_touchpad.attr)
1503                 devid = ASUS_WMI_DEVID_TOUCHPAD;
1504         else if (attr == &dev_attr_lid_resume.attr)
1505                 devid = ASUS_WMI_DEVID_LID_RESUME;
1506
1507         if (devid != -1)
1508                 ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
1509
1510         return ok ? attr->mode : 0;
1511 }
1512
1513 static struct attribute_group platform_attribute_group = {
1514         .is_visible = asus_sysfs_is_visible,
1515         .attrs = platform_attributes
1516 };
1517
1518 static void asus_wmi_sysfs_exit(struct platform_device *device)
1519 {
1520         sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
1521 }
1522
1523 static int asus_wmi_sysfs_init(struct platform_device *device)
1524 {
1525         return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
1526 }
1527
1528 /*
1529  * Platform device
1530  */
1531 static int asus_wmi_platform_init(struct asus_wmi *asus)
1532 {
1533         int rv;
1534
1535         /* INIT enable hotkeys on some models */
1536         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
1537                 pr_info("Initialization: %#x\n", rv);
1538
1539         /* We don't know yet what to do with this version... */
1540         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
1541                 pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
1542                 asus->spec = rv;
1543         }
1544
1545         /*
1546          * The SFUN method probably allows the original driver to get the list
1547          * of features supported by a given model. For now, 0x0100 or 0x0800
1548          * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
1549          * The significance of others is yet to be found.
1550          */
1551         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
1552                 pr_info("SFUN value: %#x\n", rv);
1553                 asus->sfun = rv;
1554         }
1555
1556         /*
1557          * Eee PC and Notebooks seems to have different method_id for DSTS,
1558          * but it may also be related to the BIOS's SPEC.
1559          * Note, on most Eeepc, there is no way to check if a method exist
1560          * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
1561          * but once again, SPEC may probably be used for that kind of things.
1562          */
1563         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, 0, 0, NULL))
1564                 asus->dsts_id = ASUS_WMI_METHODID_DSTS;
1565         else
1566                 asus->dsts_id = ASUS_WMI_METHODID_DSTS2;
1567
1568         /* CWAP allow to define the behavior of the Fn+F2 key,
1569          * this method doesn't seems to be present on Eee PCs */
1570         if (asus->driver->quirks->wapf >= 0)
1571                 asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
1572                                       asus->driver->quirks->wapf, NULL);
1573
1574         return asus_wmi_sysfs_init(asus->platform_device);
1575 }
1576
1577 static void asus_wmi_platform_exit(struct asus_wmi *asus)
1578 {
1579         asus_wmi_sysfs_exit(asus->platform_device);
1580 }
1581
1582 /*
1583  * debugfs
1584  */
1585 struct asus_wmi_debugfs_node {
1586         struct asus_wmi *asus;
1587         char *name;
1588         int (*show) (struct seq_file *m, void *data);
1589 };
1590
1591 static int show_dsts(struct seq_file *m, void *data)
1592 {
1593         struct asus_wmi *asus = m->private;
1594         int err;
1595         u32 retval = -1;
1596
1597         err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
1598
1599         if (err < 0)
1600                 return err;
1601
1602         seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
1603
1604         return 0;
1605 }
1606
1607 static int show_devs(struct seq_file *m, void *data)
1608 {
1609         struct asus_wmi *asus = m->private;
1610         int err;
1611         u32 retval = -1;
1612
1613         err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
1614                                     &retval);
1615
1616         if (err < 0)
1617                 return err;
1618
1619         seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
1620                    asus->debug.ctrl_param, retval);
1621
1622         return 0;
1623 }
1624
1625 static int show_call(struct seq_file *m, void *data)
1626 {
1627         struct asus_wmi *asus = m->private;
1628         struct bios_args args = {
1629                 .arg0 = asus->debug.dev_id,
1630                 .arg1 = asus->debug.ctrl_param,
1631         };
1632         struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
1633         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
1634         union acpi_object *obj;
1635         acpi_status status;
1636
1637         status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
1638                                      1, asus->debug.method_id,
1639                                      &input, &output);
1640
1641         if (ACPI_FAILURE(status))
1642                 return -EIO;
1643
1644         obj = (union acpi_object *)output.pointer;
1645         if (obj && obj->type == ACPI_TYPE_INTEGER)
1646                 seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
1647                            asus->debug.dev_id, asus->debug.ctrl_param,
1648                            (u32) obj->integer.value);
1649         else
1650                 seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
1651                            asus->debug.dev_id, asus->debug.ctrl_param,
1652                            obj ? obj->type : -1);
1653
1654         kfree(obj);
1655
1656         return 0;
1657 }
1658
1659 static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
1660         {NULL, "devs", show_devs},
1661         {NULL, "dsts", show_dsts},
1662         {NULL, "call", show_call},
1663 };
1664
1665 static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
1666 {
1667         struct asus_wmi_debugfs_node *node = inode->i_private;
1668
1669         return single_open(file, node->show, node->asus);
1670 }
1671
1672 static const struct file_operations asus_wmi_debugfs_io_ops = {
1673         .owner = THIS_MODULE,
1674         .open = asus_wmi_debugfs_open,
1675         .read = seq_read,
1676         .llseek = seq_lseek,
1677         .release = single_release,
1678 };
1679
1680 static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
1681 {
1682         debugfs_remove_recursive(asus->debug.root);
1683 }
1684
1685 static int asus_wmi_debugfs_init(struct asus_wmi *asus)
1686 {
1687         struct dentry *dent;
1688         int i;
1689
1690         asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
1691         if (!asus->debug.root) {
1692                 pr_err("failed to create debugfs directory\n");
1693                 goto error_debugfs;
1694         }
1695
1696         dent = debugfs_create_x32("method_id", S_IRUGO | S_IWUSR,
1697                                   asus->debug.root, &asus->debug.method_id);
1698         if (!dent)
1699                 goto error_debugfs;
1700
1701         dent = debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR,
1702                                   asus->debug.root, &asus->debug.dev_id);
1703         if (!dent)
1704                 goto error_debugfs;
1705
1706         dent = debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR,
1707                                   asus->debug.root, &asus->debug.ctrl_param);
1708         if (!dent)
1709                 goto error_debugfs;
1710
1711         for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
1712                 struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
1713
1714                 node->asus = asus;
1715                 dent = debugfs_create_file(node->name, S_IFREG | S_IRUGO,
1716                                            asus->debug.root, node,
1717                                            &asus_wmi_debugfs_io_ops);
1718                 if (!dent) {
1719                         pr_err("failed to create debug file: %s\n", node->name);
1720                         goto error_debugfs;
1721                 }
1722         }
1723
1724         return 0;
1725
1726 error_debugfs:
1727         asus_wmi_debugfs_exit(asus);
1728         return -ENOMEM;
1729 }
1730
1731 /*
1732  * WMI Driver
1733  */
1734 static int asus_wmi_add(struct platform_device *pdev)
1735 {
1736         struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
1737         struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
1738         struct asus_wmi *asus;
1739         acpi_status status;
1740         int err;
1741         u32 result;
1742
1743         asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
1744         if (!asus)
1745                 return -ENOMEM;
1746
1747         asus->driver = wdrv;
1748         asus->platform_device = pdev;
1749         wdrv->platform_device = pdev;
1750         platform_set_drvdata(asus->platform_device, asus);
1751
1752         if (wdrv->detect_quirks)
1753                 wdrv->detect_quirks(asus->driver);
1754
1755         err = asus_wmi_platform_init(asus);
1756         if (err)
1757                 goto fail_platform;
1758
1759         err = asus_wmi_input_init(asus);
1760         if (err)
1761                 goto fail_input;
1762
1763         err = asus_wmi_hwmon_init(asus);
1764         if (err)
1765                 goto fail_hwmon;
1766
1767         err = asus_wmi_led_init(asus);
1768         if (err)
1769                 goto fail_leds;
1770
1771         err = asus_wmi_rfkill_init(asus);
1772         if (err)
1773                 goto fail_rfkill;
1774
1775         if (asus->driver->quirks->wmi_backlight_power)
1776                 acpi_video_dmi_promote_vendor();
1777         if (!acpi_video_backlight_support()) {
1778                 pr_info("Disabling ACPI video driver\n");
1779                 acpi_video_unregister();
1780                 err = asus_wmi_backlight_init(asus);
1781                 if (err && err != -ENODEV)
1782                         goto fail_backlight;
1783         } else
1784                 pr_info("Backlight controlled by ACPI video driver\n");
1785
1786         status = wmi_install_notify_handler(asus->driver->event_guid,
1787                                             asus_wmi_notify, asus);
1788         if (ACPI_FAILURE(status)) {
1789                 pr_err("Unable to register notify handler - %d\n", status);
1790                 err = -ENODEV;
1791                 goto fail_wmi_handler;
1792         }
1793
1794         err = asus_wmi_debugfs_init(asus);
1795         if (err)
1796                 goto fail_debugfs;
1797
1798         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
1799         if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
1800                 asus->driver->wlan_ctrl_by_user = 1;
1801
1802         return 0;
1803
1804 fail_debugfs:
1805         wmi_remove_notify_handler(asus->driver->event_guid);
1806 fail_wmi_handler:
1807         asus_wmi_backlight_exit(asus);
1808 fail_backlight:
1809         asus_wmi_rfkill_exit(asus);
1810 fail_rfkill:
1811         asus_wmi_led_exit(asus);
1812 fail_leds:
1813 fail_hwmon:
1814         asus_wmi_input_exit(asus);
1815 fail_input:
1816         asus_wmi_platform_exit(asus);
1817 fail_platform:
1818         kfree(asus);
1819         return err;
1820 }
1821
1822 static int asus_wmi_remove(struct platform_device *device)
1823 {
1824         struct asus_wmi *asus;
1825
1826         asus = platform_get_drvdata(device);
1827         wmi_remove_notify_handler(asus->driver->event_guid);
1828         asus_wmi_backlight_exit(asus);
1829         asus_wmi_input_exit(asus);
1830         asus_wmi_led_exit(asus);
1831         asus_wmi_rfkill_exit(asus);
1832         asus_wmi_debugfs_exit(asus);
1833         asus_wmi_platform_exit(asus);
1834
1835         kfree(asus);
1836         return 0;
1837 }
1838
1839 /*
1840  * Platform driver - hibernate/resume callbacks
1841  */
1842 static int asus_hotk_thaw(struct device *device)
1843 {
1844         struct asus_wmi *asus = dev_get_drvdata(device);
1845
1846         if (asus->wlan.rfkill) {
1847                 bool wlan;
1848
1849                 /*
1850                  * Work around bios bug - acpi _PTS turns off the wireless led
1851                  * during suspend.  Normally it restores it on resume, but
1852                  * we should kick it ourselves in case hibernation is aborted.
1853                  */
1854                 wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
1855                 asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
1856         }
1857
1858         return 0;
1859 }
1860
1861 static int asus_hotk_restore(struct device *device)
1862 {
1863         struct asus_wmi *asus = dev_get_drvdata(device);
1864         int bl;
1865
1866         /* Refresh both wlan rfkill state and pci hotplug */
1867         if (asus->wlan.rfkill)
1868                 asus_rfkill_hotplug(asus);
1869
1870         if (asus->bluetooth.rfkill) {
1871                 bl = !asus_wmi_get_devstate_simple(asus,
1872                                                    ASUS_WMI_DEVID_BLUETOOTH);
1873                 rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
1874         }
1875         if (asus->wimax.rfkill) {
1876                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
1877                 rfkill_set_sw_state(asus->wimax.rfkill, bl);
1878         }
1879         if (asus->wwan3g.rfkill) {
1880                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
1881                 rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
1882         }
1883         if (asus->gps.rfkill) {
1884                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
1885                 rfkill_set_sw_state(asus->gps.rfkill, bl);
1886         }
1887         if (asus->uwb.rfkill) {
1888                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
1889                 rfkill_set_sw_state(asus->uwb.rfkill, bl);
1890         }
1891
1892         return 0;
1893 }
1894
1895 static const struct dev_pm_ops asus_pm_ops = {
1896         .thaw = asus_hotk_thaw,
1897         .restore = asus_hotk_restore,
1898 };
1899
1900 static int asus_wmi_probe(struct platform_device *pdev)
1901 {
1902         struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
1903         struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
1904         int ret;
1905
1906         if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
1907                 pr_warn("Management GUID not found\n");
1908                 return -ENODEV;
1909         }
1910
1911         if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
1912                 pr_warn("Event GUID not found\n");
1913                 return -ENODEV;
1914         }
1915
1916         if (wdrv->probe) {
1917                 ret = wdrv->probe(pdev);
1918                 if (ret)
1919                         return ret;
1920         }
1921
1922         return asus_wmi_add(pdev);
1923 }
1924
1925 static bool used;
1926
1927 int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
1928 {
1929         struct platform_driver *platform_driver;
1930         struct platform_device *platform_device;
1931
1932         if (used)
1933                 return -EBUSY;
1934
1935         platform_driver = &driver->platform_driver;
1936         platform_driver->remove = asus_wmi_remove;
1937         platform_driver->driver.owner = driver->owner;
1938         platform_driver->driver.name = driver->name;
1939         platform_driver->driver.pm = &asus_pm_ops;
1940
1941         platform_device = platform_create_bundle(platform_driver,
1942                                                  asus_wmi_probe,
1943                                                  NULL, 0, NULL, 0);
1944         if (IS_ERR(platform_device))
1945                 return PTR_ERR(platform_device);
1946
1947         used = true;
1948         return 0;
1949 }
1950 EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
1951
1952 void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
1953 {
1954         platform_device_unregister(driver->platform_device);
1955         platform_driver_unregister(&driver->platform_driver);
1956         used = false;
1957 }
1958 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
1959
1960 static int __init asus_wmi_init(void)
1961 {
1962         if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
1963                 pr_info("Asus Management GUID not found\n");
1964                 return -ENODEV;
1965         }
1966
1967         pr_info("ASUS WMI generic driver loaded\n");
1968         return 0;
1969 }
1970
1971 static void __exit asus_wmi_exit(void)
1972 {
1973         pr_info("ASUS WMI generic driver unloaded\n");
1974 }
1975
1976 module_init(asus_wmi_init);
1977 module_exit(asus_wmi_exit);