]> Git Repo - J-linux.git/blob - drivers/platform/x86/asus-wmi.c
HID: asus: only support backlight when it's not driven by WMI
[J-linux.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 <[email protected]>
6  *
7  * Portions based on wistron_btns.c:
8  * Copyright (C) 2005 Miloslav Trmac <[email protected]>
9  * Copyright (C) 2005 Bernhard Rosenkraenzer <[email protected]>
10  * Copyright (C) 2005 Dmitry Torokhov <[email protected]>
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_data/x86/asus-wmi.h>
47 #include <linux/platform_device.h>
48 #include <linux/thermal.h>
49 #include <linux/acpi.h>
50 #include <linux/dmi.h>
51 #include <acpi/video.h>
52
53 #include "asus-wmi.h"
54
55 MODULE_AUTHOR("Corentin Chary <[email protected]>, "
56               "Yong Wang <[email protected]>");
57 MODULE_DESCRIPTION("Asus Generic WMI Driver");
58 MODULE_LICENSE("GPL");
59
60 #define to_asus_wmi_driver(pdrv)                                        \
61         (container_of((pdrv), struct asus_wmi_driver, platform_driver))
62
63 #define ASUS_WMI_MGMT_GUID      "97845ED0-4E6D-11DE-8A39-0800200C9A66"
64
65 #define NOTIFY_BRNUP_MIN                0x11
66 #define NOTIFY_BRNUP_MAX                0x1f
67 #define NOTIFY_BRNDOWN_MIN              0x20
68 #define NOTIFY_BRNDOWN_MAX              0x2e
69 #define NOTIFY_KBD_BRTUP                0xc4
70 #define NOTIFY_KBD_BRTDWN               0xc5
71 #define NOTIFY_KBD_BRTTOGGLE            0xc7
72
73 #define ASUS_FAN_DESC                   "cpu_fan"
74 #define ASUS_FAN_MFUN                   0x13
75 #define ASUS_FAN_SFUN_READ              0x06
76 #define ASUS_FAN_SFUN_WRITE             0x07
77 #define ASUS_FAN_CTRL_MANUAL            1
78 #define ASUS_FAN_CTRL_AUTO              2
79
80 #define USB_INTEL_XUSB2PR               0xD0
81 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI   0x9c31
82
83 static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
84
85 static bool ashs_present(void)
86 {
87         int i = 0;
88         while (ashs_ids[i]) {
89                 if (acpi_dev_found(ashs_ids[i++]))
90                         return true;
91         }
92         return false;
93 }
94
95 struct bios_args {
96         u32 arg0;
97         u32 arg1;
98 } __packed;
99
100 /*
101  * Struct that's used for all methods called via AGFN. Naming is
102  * identically to the AML code.
103  */
104 struct agfn_args {
105         u16 mfun; /* probably "Multi-function" to be called */
106         u16 sfun; /* probably "Sub-function" to be called */
107         u16 len;  /* size of the hole struct, including subfunction fields */
108         u8 stas;  /* not used by now */
109         u8 err;   /* zero on success */
110 } __packed;
111
112 /* struct used for calling fan read and write methods */
113 struct fan_args {
114         struct agfn_args agfn;  /* common fields */
115         u8 fan;                 /* fan number: 0: set auto mode 1: 1st fan */
116         u32 speed;              /* read: RPM/100 - write: 0-255 */
117 } __packed;
118
119 /*
120  * <platform>/    - debugfs root directory
121  *   dev_id      - current dev_id
122  *   ctrl_param  - current ctrl_param
123  *   method_id   - current method_id
124  *   devs        - call DEVS(dev_id, ctrl_param) and print result
125  *   dsts        - call DSTS(dev_id)  and print result
126  *   call        - call method_id(dev_id, ctrl_param) and print result
127  */
128 struct asus_wmi_debug {
129         struct dentry *root;
130         u32 method_id;
131         u32 dev_id;
132         u32 ctrl_param;
133 };
134
135 struct asus_rfkill {
136         struct asus_wmi *asus;
137         struct rfkill *rfkill;
138         u32 dev_id;
139 };
140
141 struct asus_wmi {
142         int dsts_id;
143         int spec;
144         int sfun;
145
146         struct input_dev *inputdev;
147         struct backlight_device *backlight_device;
148         struct platform_device *platform_device;
149
150         struct led_classdev wlan_led;
151         int wlan_led_wk;
152         struct led_classdev tpd_led;
153         int tpd_led_wk;
154         struct led_classdev kbd_led;
155         int kbd_led_wk;
156         struct led_classdev lightbar_led;
157         int lightbar_led_wk;
158         struct workqueue_struct *led_workqueue;
159         struct work_struct tpd_led_work;
160         struct work_struct wlan_led_work;
161         struct work_struct lightbar_led_work;
162
163         struct asus_rfkill wlan;
164         struct asus_rfkill bluetooth;
165         struct asus_rfkill wimax;
166         struct asus_rfkill wwan3g;
167         struct asus_rfkill gps;
168         struct asus_rfkill uwb;
169
170         bool asus_hwmon_fan_manual_mode;
171         int asus_hwmon_num_fans;
172         int asus_hwmon_pwm;
173
174         struct hotplug_slot *hotplug_slot;
175         struct mutex hotplug_lock;
176         struct mutex wmi_lock;
177         struct workqueue_struct *hotplug_workqueue;
178         struct work_struct hotplug_work;
179
180         struct asus_wmi_debug debug;
181
182         struct asus_wmi_driver *driver;
183 };
184
185 static int asus_wmi_input_init(struct asus_wmi *asus)
186 {
187         int err;
188
189         asus->inputdev = input_allocate_device();
190         if (!asus->inputdev)
191                 return -ENOMEM;
192
193         asus->inputdev->name = asus->driver->input_name;
194         asus->inputdev->phys = asus->driver->input_phys;
195         asus->inputdev->id.bustype = BUS_HOST;
196         asus->inputdev->dev.parent = &asus->platform_device->dev;
197         set_bit(EV_REP, asus->inputdev->evbit);
198
199         err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
200         if (err)
201                 goto err_free_dev;
202
203         err = input_register_device(asus->inputdev);
204         if (err)
205                 goto err_free_dev;
206
207         return 0;
208
209 err_free_dev:
210         input_free_device(asus->inputdev);
211         return err;
212 }
213
214 static void asus_wmi_input_exit(struct asus_wmi *asus)
215 {
216         if (asus->inputdev)
217                 input_unregister_device(asus->inputdev);
218
219         asus->inputdev = NULL;
220 }
221
222 int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
223 {
224         struct bios_args args = {
225                 .arg0 = arg0,
226                 .arg1 = arg1,
227         };
228         struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
229         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
230         acpi_status status;
231         union acpi_object *obj;
232         u32 tmp = 0;
233
234         status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
235                                      &input, &output);
236
237         if (ACPI_FAILURE(status))
238                 goto exit;
239
240         obj = (union acpi_object *)output.pointer;
241         if (obj && obj->type == ACPI_TYPE_INTEGER)
242                 tmp = (u32) obj->integer.value;
243
244         if (retval)
245                 *retval = tmp;
246
247         kfree(obj);
248
249 exit:
250         if (ACPI_FAILURE(status))
251                 return -EIO;
252
253         if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
254                 return -ENODEV;
255
256         return 0;
257 }
258 EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
259
260 static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
261 {
262         struct acpi_buffer input;
263         u64 phys_addr;
264         u32 retval;
265         u32 status = -1;
266
267         /*
268          * Copy to dma capable address otherwise memory corruption occurs as
269          * bios has to be able to access it.
270          */
271         input.pointer = kzalloc(args.length, GFP_DMA | GFP_KERNEL);
272         input.length = args.length;
273         if (!input.pointer)
274                 return -ENOMEM;
275         phys_addr = virt_to_phys(input.pointer);
276         memcpy(input.pointer, args.pointer, args.length);
277
278         status = asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN,
279                                         phys_addr, 0, &retval);
280         if (!status)
281                 memcpy(args.pointer, input.pointer, args.length);
282
283         kfree(input.pointer);
284         if (status)
285                 return -ENXIO;
286
287         return retval;
288 }
289
290 static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
291 {
292         return asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
293 }
294
295 static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
296                                  u32 *retval)
297 {
298         return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
299                                         ctrl_param, retval);
300 }
301
302 /* Helper for special devices with magic return codes */
303 static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
304                                       u32 dev_id, u32 mask)
305 {
306         u32 retval = 0;
307         int err;
308
309         err = asus_wmi_get_devstate(asus, dev_id, &retval);
310
311         if (err < 0)
312                 return err;
313
314         if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
315                 return -ENODEV;
316
317         if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
318                 if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
319                         return -ENODEV;
320         }
321
322         return retval & mask;
323 }
324
325 static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
326 {
327         return asus_wmi_get_devstate_bits(asus, dev_id,
328                                           ASUS_WMI_DSTS_STATUS_BIT);
329 }
330
331 /*
332  * LEDs
333  */
334 /*
335  * These functions actually update the LED's, and are called from a
336  * workqueue. By doing this as separate work rather than when the LED
337  * subsystem asks, we avoid messing with the Asus ACPI stuff during a
338  * potentially bad time, such as a timer interrupt.
339  */
340 static void tpd_led_update(struct work_struct *work)
341 {
342         int ctrl_param;
343         struct asus_wmi *asus;
344
345         asus = container_of(work, struct asus_wmi, tpd_led_work);
346
347         ctrl_param = asus->tpd_led_wk;
348         asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
349 }
350
351 static void tpd_led_set(struct led_classdev *led_cdev,
352                         enum led_brightness value)
353 {
354         struct asus_wmi *asus;
355
356         asus = container_of(led_cdev, struct asus_wmi, tpd_led);
357
358         asus->tpd_led_wk = !!value;
359         queue_work(asus->led_workqueue, &asus->tpd_led_work);
360 }
361
362 static int read_tpd_led_state(struct asus_wmi *asus)
363 {
364         return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
365 }
366
367 static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
368 {
369         struct asus_wmi *asus;
370
371         asus = container_of(led_cdev, struct asus_wmi, tpd_led);
372
373         return read_tpd_led_state(asus);
374 }
375
376 static void kbd_led_update(struct asus_wmi *asus)
377 {
378         int ctrl_param = 0;
379
380         /*
381          * bits 0-2: level
382          * bit 7: light on/off
383          */
384         if (asus->kbd_led_wk > 0)
385                 ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
386
387         asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
388 }
389
390 static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
391 {
392         int retval;
393
394         /*
395          * bits 0-2: level
396          * bit 7: light on/off
397          * bit 8-10: environment (0: dark, 1: normal, 2: light)
398          * bit 17: status unknown
399          */
400         retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
401                                             0xFFFF);
402
403         /* Unknown status is considered as off */
404         if (retval == 0x8000)
405                 retval = 0;
406
407         if (retval >= 0) {
408                 if (level)
409                         *level = retval & 0x7F;
410                 if (env)
411                         *env = (retval >> 8) & 0x7F;
412                 retval = 0;
413         }
414
415         return retval;
416 }
417
418 static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
419 {
420         struct asus_wmi *asus;
421         int max_level;
422
423         asus = container_of(led_cdev, struct asus_wmi, kbd_led);
424         max_level = asus->kbd_led.max_brightness;
425
426         if (value > max_level)
427                 value = max_level;
428         else if (value < 0)
429                 value = 0;
430
431         asus->kbd_led_wk = value;
432         kbd_led_update(asus);
433 }
434
435 static void kbd_led_set(struct led_classdev *led_cdev,
436                         enum led_brightness value)
437 {
438         do_kbd_led_set(led_cdev, value);
439 }
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
449 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
450 {
451         struct asus_wmi *asus;
452         int retval, value;
453
454         asus = container_of(led_cdev, struct asus_wmi, kbd_led);
455
456         retval = kbd_led_read(asus, &value, NULL);
457
458         if (retval < 0)
459                 return retval;
460
461         return value;
462 }
463
464 static int wlan_led_unknown_state(struct asus_wmi *asus)
465 {
466         u32 result;
467
468         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
469
470         return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
471 }
472
473 static int wlan_led_presence(struct asus_wmi *asus)
474 {
475         u32 result;
476
477         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
478
479         return result & ASUS_WMI_DSTS_PRESENCE_BIT;
480 }
481
482 static void wlan_led_update(struct work_struct *work)
483 {
484         int ctrl_param;
485         struct asus_wmi *asus;
486
487         asus = container_of(work, struct asus_wmi, wlan_led_work);
488
489         ctrl_param = asus->wlan_led_wk;
490         asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
491 }
492
493 static void wlan_led_set(struct led_classdev *led_cdev,
494                          enum led_brightness value)
495 {
496         struct asus_wmi *asus;
497
498         asus = container_of(led_cdev, struct asus_wmi, wlan_led);
499
500         asus->wlan_led_wk = !!value;
501         queue_work(asus->led_workqueue, &asus->wlan_led_work);
502 }
503
504 static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
505 {
506         struct asus_wmi *asus;
507         u32 result;
508
509         asus = container_of(led_cdev, struct asus_wmi, wlan_led);
510         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
511
512         return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
513 }
514
515 static void lightbar_led_update(struct work_struct *work)
516 {
517         struct asus_wmi *asus;
518         int ctrl_param;
519
520         asus = container_of(work, struct asus_wmi, lightbar_led_work);
521
522         ctrl_param = asus->lightbar_led_wk;
523         asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR, ctrl_param, NULL);
524 }
525
526 static void lightbar_led_set(struct led_classdev *led_cdev,
527                              enum led_brightness value)
528 {
529         struct asus_wmi *asus;
530
531         asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
532
533         asus->lightbar_led_wk = !!value;
534         queue_work(asus->led_workqueue, &asus->lightbar_led_work);
535 }
536
537 static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev)
538 {
539         struct asus_wmi *asus;
540         u32 result;
541
542         asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
543         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
544
545         return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
546 }
547
548 static int lightbar_led_presence(struct asus_wmi *asus)
549 {
550         u32 result;
551
552         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
553
554         return result & ASUS_WMI_DSTS_PRESENCE_BIT;
555 }
556
557 static void asus_wmi_led_exit(struct asus_wmi *asus)
558 {
559         if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
560                 led_classdev_unregister(&asus->kbd_led);
561         if (!IS_ERR_OR_NULL(asus->tpd_led.dev))
562                 led_classdev_unregister(&asus->tpd_led);
563         if (!IS_ERR_OR_NULL(asus->wlan_led.dev))
564                 led_classdev_unregister(&asus->wlan_led);
565         if (!IS_ERR_OR_NULL(asus->lightbar_led.dev))
566                 led_classdev_unregister(&asus->lightbar_led);
567         if (asus->led_workqueue)
568                 destroy_workqueue(asus->led_workqueue);
569 }
570
571 static int asus_wmi_led_init(struct asus_wmi *asus)
572 {
573         int rv = 0, led_val;
574
575         asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
576         if (!asus->led_workqueue)
577                 return -ENOMEM;
578
579         if (read_tpd_led_state(asus) >= 0) {
580                 INIT_WORK(&asus->tpd_led_work, tpd_led_update);
581
582                 asus->tpd_led.name = "asus::touchpad";
583                 asus->tpd_led.brightness_set = tpd_led_set;
584                 asus->tpd_led.brightness_get = tpd_led_get;
585                 asus->tpd_led.max_brightness = 1;
586
587                 rv = led_classdev_register(&asus->platform_device->dev,
588                                            &asus->tpd_led);
589                 if (rv)
590                         goto error;
591         }
592
593         led_val = kbd_led_read(asus, NULL, NULL);
594         if (led_val >= 0) {
595                 asus->kbd_led_wk = led_val;
596                 asus->kbd_led.name = "asus::kbd_backlight";
597                 asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
598                 asus->kbd_led.brightness_set = kbd_led_set;
599                 asus->kbd_led.brightness_get = kbd_led_get;
600                 asus->kbd_led.max_brightness = 3;
601
602                 rv = led_classdev_register(&asus->platform_device->dev,
603                                            &asus->kbd_led);
604                 if (rv)
605                         goto error;
606         }
607
608         if (wlan_led_presence(asus) && (asus->driver->quirks->wapf > 0)) {
609                 INIT_WORK(&asus->wlan_led_work, wlan_led_update);
610
611                 asus->wlan_led.name = "asus::wlan";
612                 asus->wlan_led.brightness_set = wlan_led_set;
613                 if (!wlan_led_unknown_state(asus))
614                         asus->wlan_led.brightness_get = wlan_led_get;
615                 asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
616                 asus->wlan_led.max_brightness = 1;
617                 asus->wlan_led.default_trigger = "asus-wlan";
618
619                 rv = led_classdev_register(&asus->platform_device->dev,
620                                            &asus->wlan_led);
621                 if (rv)
622                         goto error;
623         }
624
625         if (lightbar_led_presence(asus)) {
626                 INIT_WORK(&asus->lightbar_led_work, lightbar_led_update);
627
628                 asus->lightbar_led.name = "asus::lightbar";
629                 asus->lightbar_led.brightness_set = lightbar_led_set;
630                 asus->lightbar_led.brightness_get = lightbar_led_get;
631                 asus->lightbar_led.max_brightness = 1;
632
633                 rv = led_classdev_register(&asus->platform_device->dev,
634                                            &asus->lightbar_led);
635         }
636
637 error:
638         if (rv)
639                 asus_wmi_led_exit(asus);
640
641         return rv;
642 }
643
644
645 /*
646  * PCI hotplug (for wlan rfkill)
647  */
648 static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
649 {
650         int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
651
652         if (result < 0)
653                 return false;
654         return !result;
655 }
656
657 static void asus_rfkill_hotplug(struct asus_wmi *asus)
658 {
659         struct pci_dev *dev;
660         struct pci_bus *bus;
661         bool blocked;
662         bool absent;
663         u32 l;
664
665         mutex_lock(&asus->wmi_lock);
666         blocked = asus_wlan_rfkill_blocked(asus);
667         mutex_unlock(&asus->wmi_lock);
668
669         mutex_lock(&asus->hotplug_lock);
670         pci_lock_rescan_remove();
671
672         if (asus->wlan.rfkill)
673                 rfkill_set_sw_state(asus->wlan.rfkill, blocked);
674
675         if (asus->hotplug_slot) {
676                 bus = pci_find_bus(0, 1);
677                 if (!bus) {
678                         pr_warn("Unable to find PCI bus 1?\n");
679                         goto out_unlock;
680                 }
681
682                 if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
683                         pr_err("Unable to read PCI config space?\n");
684                         goto out_unlock;
685                 }
686                 absent = (l == 0xffffffff);
687
688                 if (blocked != absent) {
689                         pr_warn("BIOS says wireless lan is %s, "
690                                 "but the pci device is %s\n",
691                                 blocked ? "blocked" : "unblocked",
692                                 absent ? "absent" : "present");
693                         pr_warn("skipped wireless hotplug as probably "
694                                 "inappropriate for this model\n");
695                         goto out_unlock;
696                 }
697
698                 if (!blocked) {
699                         dev = pci_get_slot(bus, 0);
700                         if (dev) {
701                                 /* Device already present */
702                                 pci_dev_put(dev);
703                                 goto out_unlock;
704                         }
705                         dev = pci_scan_single_device(bus, 0);
706                         if (dev) {
707                                 pci_bus_assign_resources(bus);
708                                 pci_bus_add_device(dev);
709                         }
710                 } else {
711                         dev = pci_get_slot(bus, 0);
712                         if (dev) {
713                                 pci_stop_and_remove_bus_device(dev);
714                                 pci_dev_put(dev);
715                         }
716                 }
717         }
718
719 out_unlock:
720         pci_unlock_rescan_remove();
721         mutex_unlock(&asus->hotplug_lock);
722 }
723
724 static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
725 {
726         struct asus_wmi *asus = data;
727
728         if (event != ACPI_NOTIFY_BUS_CHECK)
729                 return;
730
731         /*
732          * We can't call directly asus_rfkill_hotplug because most
733          * of the time WMBC is still being executed and not reetrant.
734          * There is currently no way to tell ACPICA that  we want this
735          * method to be serialized, we schedule a asus_rfkill_hotplug
736          * call later, in a safer context.
737          */
738         queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
739 }
740
741 static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
742 {
743         acpi_status status;
744         acpi_handle handle;
745
746         status = acpi_get_handle(NULL, node, &handle);
747
748         if (ACPI_SUCCESS(status)) {
749                 status = acpi_install_notify_handler(handle,
750                                                      ACPI_SYSTEM_NOTIFY,
751                                                      asus_rfkill_notify, asus);
752                 if (ACPI_FAILURE(status))
753                         pr_warn("Failed to register notify on %s\n", node);
754         } else
755                 return -ENODEV;
756
757         return 0;
758 }
759
760 static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
761 {
762         acpi_status status = AE_OK;
763         acpi_handle handle;
764
765         status = acpi_get_handle(NULL, node, &handle);
766
767         if (ACPI_SUCCESS(status)) {
768                 status = acpi_remove_notify_handler(handle,
769                                                     ACPI_SYSTEM_NOTIFY,
770                                                     asus_rfkill_notify);
771                 if (ACPI_FAILURE(status))
772                         pr_err("Error removing rfkill notify handler %s\n",
773                                node);
774         }
775 }
776
777 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
778                                    u8 *value)
779 {
780         struct asus_wmi *asus = hotplug_slot->private;
781         int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
782
783         if (result < 0)
784                 return result;
785
786         *value = !!result;
787         return 0;
788 }
789
790 static struct hotplug_slot_ops asus_hotplug_slot_ops = {
791         .owner = THIS_MODULE,
792         .get_adapter_status = asus_get_adapter_status,
793         .get_power_status = asus_get_adapter_status,
794 };
795
796 static void asus_hotplug_work(struct work_struct *work)
797 {
798         struct asus_wmi *asus;
799
800         asus = container_of(work, struct asus_wmi, hotplug_work);
801         asus_rfkill_hotplug(asus);
802 }
803
804 static int asus_setup_pci_hotplug(struct asus_wmi *asus)
805 {
806         int ret = -ENOMEM;
807         struct pci_bus *bus = pci_find_bus(0, 1);
808
809         if (!bus) {
810                 pr_err("Unable to find wifi PCI bus\n");
811                 return -ENODEV;
812         }
813
814         asus->hotplug_workqueue =
815             create_singlethread_workqueue("hotplug_workqueue");
816         if (!asus->hotplug_workqueue)
817                 goto error_workqueue;
818
819         INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
820
821         asus->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
822         if (!asus->hotplug_slot)
823                 goto error_slot;
824
825         asus->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
826                                            GFP_KERNEL);
827         if (!asus->hotplug_slot->info)
828                 goto error_info;
829
830         asus->hotplug_slot->private = asus;
831         asus->hotplug_slot->ops = &asus_hotplug_slot_ops;
832         asus_get_adapter_status(asus->hotplug_slot,
833                                 &asus->hotplug_slot->info->adapter_status);
834
835         ret = pci_hp_register(asus->hotplug_slot, bus, 0, "asus-wifi");
836         if (ret) {
837                 pr_err("Unable to register hotplug slot - %d\n", ret);
838                 goto error_register;
839         }
840
841         return 0;
842
843 error_register:
844         kfree(asus->hotplug_slot->info);
845 error_info:
846         kfree(asus->hotplug_slot);
847         asus->hotplug_slot = NULL;
848 error_slot:
849         destroy_workqueue(asus->hotplug_workqueue);
850 error_workqueue:
851         return ret;
852 }
853
854 /*
855  * Rfkill devices
856  */
857 static int asus_rfkill_set(void *data, bool blocked)
858 {
859         struct asus_rfkill *priv = data;
860         u32 ctrl_param = !blocked;
861         u32 dev_id = priv->dev_id;
862
863         /*
864          * If the user bit is set, BIOS can't set and record the wlan status,
865          * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
866          * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
867          * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
868          * while setting the wlan status through WMI.
869          * This is also the behavior that windows app will do.
870          */
871         if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
872              priv->asus->driver->wlan_ctrl_by_user)
873                 dev_id = ASUS_WMI_DEVID_WLAN_LED;
874
875         return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
876 }
877
878 static void asus_rfkill_query(struct rfkill *rfkill, void *data)
879 {
880         struct asus_rfkill *priv = data;
881         int result;
882
883         result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
884
885         if (result < 0)
886                 return;
887
888         rfkill_set_sw_state(priv->rfkill, !result);
889 }
890
891 static int asus_rfkill_wlan_set(void *data, bool blocked)
892 {
893         struct asus_rfkill *priv = data;
894         struct asus_wmi *asus = priv->asus;
895         int ret;
896
897         /*
898          * This handler is enabled only if hotplug is enabled.
899          * In this case, the asus_wmi_set_devstate() will
900          * trigger a wmi notification and we need to wait
901          * this call to finish before being able to call
902          * any wmi method
903          */
904         mutex_lock(&asus->wmi_lock);
905         ret = asus_rfkill_set(data, blocked);
906         mutex_unlock(&asus->wmi_lock);
907         return ret;
908 }
909
910 static const struct rfkill_ops asus_rfkill_wlan_ops = {
911         .set_block = asus_rfkill_wlan_set,
912         .query = asus_rfkill_query,
913 };
914
915 static const struct rfkill_ops asus_rfkill_ops = {
916         .set_block = asus_rfkill_set,
917         .query = asus_rfkill_query,
918 };
919
920 static int asus_new_rfkill(struct asus_wmi *asus,
921                            struct asus_rfkill *arfkill,
922                            const char *name, enum rfkill_type type, int dev_id)
923 {
924         int result = asus_wmi_get_devstate_simple(asus, dev_id);
925         struct rfkill **rfkill = &arfkill->rfkill;
926
927         if (result < 0)
928                 return result;
929
930         arfkill->dev_id = dev_id;
931         arfkill->asus = asus;
932
933         if (dev_id == ASUS_WMI_DEVID_WLAN &&
934             asus->driver->quirks->hotplug_wireless)
935                 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
936                                        &asus_rfkill_wlan_ops, arfkill);
937         else
938                 *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
939                                        &asus_rfkill_ops, arfkill);
940
941         if (!*rfkill)
942                 return -EINVAL;
943
944         if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
945                         (asus->driver->quirks->wapf > 0))
946                 rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
947
948         rfkill_init_sw_state(*rfkill, !result);
949         result = rfkill_register(*rfkill);
950         if (result) {
951                 rfkill_destroy(*rfkill);
952                 *rfkill = NULL;
953                 return result;
954         }
955         return 0;
956 }
957
958 static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
959 {
960         if (asus->driver->wlan_ctrl_by_user && ashs_present())
961                 return;
962
963         asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
964         asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
965         asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
966         if (asus->wlan.rfkill) {
967                 rfkill_unregister(asus->wlan.rfkill);
968                 rfkill_destroy(asus->wlan.rfkill);
969                 asus->wlan.rfkill = NULL;
970         }
971         /*
972          * Refresh pci hotplug in case the rfkill state was changed after
973          * asus_unregister_rfkill_notifier()
974          */
975         asus_rfkill_hotplug(asus);
976         if (asus->hotplug_slot) {
977                 pci_hp_deregister(asus->hotplug_slot);
978                 kfree(asus->hotplug_slot->info);
979                 kfree(asus->hotplug_slot);
980         }
981         if (asus->hotplug_workqueue)
982                 destroy_workqueue(asus->hotplug_workqueue);
983
984         if (asus->bluetooth.rfkill) {
985                 rfkill_unregister(asus->bluetooth.rfkill);
986                 rfkill_destroy(asus->bluetooth.rfkill);
987                 asus->bluetooth.rfkill = NULL;
988         }
989         if (asus->wimax.rfkill) {
990                 rfkill_unregister(asus->wimax.rfkill);
991                 rfkill_destroy(asus->wimax.rfkill);
992                 asus->wimax.rfkill = NULL;
993         }
994         if (asus->wwan3g.rfkill) {
995                 rfkill_unregister(asus->wwan3g.rfkill);
996                 rfkill_destroy(asus->wwan3g.rfkill);
997                 asus->wwan3g.rfkill = NULL;
998         }
999         if (asus->gps.rfkill) {
1000                 rfkill_unregister(asus->gps.rfkill);
1001                 rfkill_destroy(asus->gps.rfkill);
1002                 asus->gps.rfkill = NULL;
1003         }
1004         if (asus->uwb.rfkill) {
1005                 rfkill_unregister(asus->uwb.rfkill);
1006                 rfkill_destroy(asus->uwb.rfkill);
1007                 asus->uwb.rfkill = NULL;
1008         }
1009 }
1010
1011 static int asus_wmi_rfkill_init(struct asus_wmi *asus)
1012 {
1013         int result = 0;
1014
1015         mutex_init(&asus->hotplug_lock);
1016         mutex_init(&asus->wmi_lock);
1017
1018         result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
1019                                  RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
1020
1021         if (result && result != -ENODEV)
1022                 goto exit;
1023
1024         result = asus_new_rfkill(asus, &asus->bluetooth,
1025                                  "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
1026                                  ASUS_WMI_DEVID_BLUETOOTH);
1027
1028         if (result && result != -ENODEV)
1029                 goto exit;
1030
1031         result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
1032                                  RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
1033
1034         if (result && result != -ENODEV)
1035                 goto exit;
1036
1037         result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
1038                                  RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
1039
1040         if (result && result != -ENODEV)
1041                 goto exit;
1042
1043         result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
1044                                  RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
1045
1046         if (result && result != -ENODEV)
1047                 goto exit;
1048
1049         result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
1050                                  RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
1051
1052         if (result && result != -ENODEV)
1053                 goto exit;
1054
1055         if (!asus->driver->quirks->hotplug_wireless)
1056                 goto exit;
1057
1058         result = asus_setup_pci_hotplug(asus);
1059         /*
1060          * If we get -EBUSY then something else is handling the PCI hotplug -
1061          * don't fail in this case
1062          */
1063         if (result == -EBUSY)
1064                 result = 0;
1065
1066         asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
1067         asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
1068         asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
1069         /*
1070          * Refresh pci hotplug in case the rfkill state was changed during
1071          * setup.
1072          */
1073         asus_rfkill_hotplug(asus);
1074
1075 exit:
1076         if (result && result != -ENODEV)
1077                 asus_wmi_rfkill_exit(asus);
1078
1079         if (result == -ENODEV)
1080                 result = 0;
1081
1082         return result;
1083 }
1084
1085 static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
1086 {
1087         struct pci_dev *xhci_pdev;
1088         u32 orig_ports_available;
1089         u32 ports_available = asus->driver->quirks->xusb2pr;
1090
1091         xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1092                         PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI,
1093                         NULL);
1094
1095         if (!xhci_pdev)
1096                 return;
1097
1098         pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
1099                                 &orig_ports_available);
1100
1101         pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
1102                                 cpu_to_le32(ports_available));
1103
1104         pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
1105                         orig_ports_available, ports_available);
1106 }
1107
1108 /*
1109  * Some devices dont support or have borcken get_als method
1110  * but still support set method.
1111  */
1112 static void asus_wmi_set_als(void)
1113 {
1114         asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE, 1, NULL);
1115 }
1116
1117 /*
1118  * Hwmon device
1119  */
1120 static int asus_hwmon_agfn_fan_speed_read(struct asus_wmi *asus, int fan,
1121                                           int *speed)
1122 {
1123         struct fan_args args = {
1124                 .agfn.len = sizeof(args),
1125                 .agfn.mfun = ASUS_FAN_MFUN,
1126                 .agfn.sfun = ASUS_FAN_SFUN_READ,
1127                 .fan = fan,
1128                 .speed = 0,
1129         };
1130         struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
1131         int status;
1132
1133         if (fan != 1)
1134                 return -EINVAL;
1135
1136         status = asus_wmi_evaluate_method_agfn(input);
1137
1138         if (status || args.agfn.err)
1139                 return -ENXIO;
1140
1141         if (speed)
1142                 *speed = args.speed;
1143
1144         return 0;
1145 }
1146
1147 static int asus_hwmon_agfn_fan_speed_write(struct asus_wmi *asus, int fan,
1148                                      int *speed)
1149 {
1150         struct fan_args args = {
1151                 .agfn.len = sizeof(args),
1152                 .agfn.mfun = ASUS_FAN_MFUN,
1153                 .agfn.sfun = ASUS_FAN_SFUN_WRITE,
1154                 .fan = fan,
1155                 .speed = speed ?  *speed : 0,
1156         };
1157         struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
1158         int status;
1159
1160         /* 1: for setting 1st fan's speed 0: setting auto mode */
1161         if (fan != 1 && fan != 0)
1162                 return -EINVAL;
1163
1164         status = asus_wmi_evaluate_method_agfn(input);
1165
1166         if (status || args.agfn.err)
1167                 return -ENXIO;
1168
1169         if (speed && fan == 1)
1170                 asus->asus_hwmon_pwm = *speed;
1171
1172         return 0;
1173 }
1174
1175 /*
1176  * Check if we can read the speed of one fan. If true we assume we can also
1177  * control it.
1178  */
1179 static int asus_hwmon_get_fan_number(struct asus_wmi *asus, int *num_fans)
1180 {
1181         int status;
1182         int speed = 0;
1183
1184         *num_fans = 0;
1185
1186         status = asus_hwmon_agfn_fan_speed_read(asus, 1, &speed);
1187         if (!status)
1188                 *num_fans = 1;
1189
1190         return 0;
1191 }
1192
1193 static int asus_hwmon_fan_set_auto(struct asus_wmi *asus)
1194 {
1195         int status;
1196
1197         status = asus_hwmon_agfn_fan_speed_write(asus, 0, NULL);
1198         if (status)
1199                 return -ENXIO;
1200
1201         asus->asus_hwmon_fan_manual_mode = false;
1202
1203         return 0;
1204 }
1205
1206 static int asus_hwmon_fan_rpm_show(struct device *dev, int fan)
1207 {
1208         struct asus_wmi *asus = dev_get_drvdata(dev);
1209         int value;
1210         int ret;
1211
1212         /* no speed readable on manual mode */
1213         if (asus->asus_hwmon_fan_manual_mode)
1214                 return -ENXIO;
1215
1216         ret = asus_hwmon_agfn_fan_speed_read(asus, fan+1, &value);
1217         if (ret) {
1218                 pr_warn("reading fan speed failed: %d\n", ret);
1219                 return -ENXIO;
1220         }
1221
1222         return value;
1223 }
1224
1225 static void asus_hwmon_pwm_show(struct asus_wmi *asus, int fan, int *value)
1226 {
1227         int err;
1228
1229         if (asus->asus_hwmon_pwm >= 0) {
1230                 *value = asus->asus_hwmon_pwm;
1231                 return;
1232         }
1233
1234         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, value);
1235         if (err < 0)
1236                 return;
1237
1238         *value &= 0xFF;
1239
1240         if (*value == 1) /* Low Speed */
1241                 *value = 85;
1242         else if (*value == 2)
1243                 *value = 170;
1244         else if (*value == 3)
1245                 *value = 255;
1246         else if (*value) {
1247                 pr_err("Unknown fan speed %#x\n", *value);
1248                 *value = -1;
1249         }
1250 }
1251
1252 static ssize_t pwm1_show(struct device *dev,
1253                                struct device_attribute *attr,
1254                                char *buf)
1255 {
1256         struct asus_wmi *asus = dev_get_drvdata(dev);
1257         int value;
1258
1259         asus_hwmon_pwm_show(asus, 0, &value);
1260
1261         return sprintf(buf, "%d\n", value);
1262 }
1263
1264 static ssize_t pwm1_store(struct device *dev,
1265                                      struct device_attribute *attr,
1266                                      const char *buf, size_t count) {
1267         struct asus_wmi *asus = dev_get_drvdata(dev);
1268         int value;
1269         int state;
1270         int ret;
1271
1272         ret = kstrtouint(buf, 10, &value);
1273
1274         if (ret)
1275                 return ret;
1276
1277         value = clamp(value, 0, 255);
1278
1279         state = asus_hwmon_agfn_fan_speed_write(asus, 1, &value);
1280         if (state)
1281                 pr_warn("Setting fan speed failed: %d\n", state);
1282         else
1283                 asus->asus_hwmon_fan_manual_mode = true;
1284
1285         return count;
1286 }
1287
1288 static ssize_t fan1_input_show(struct device *dev,
1289                                         struct device_attribute *attr,
1290                                         char *buf)
1291 {
1292         int value = asus_hwmon_fan_rpm_show(dev, 0);
1293
1294         return sprintf(buf, "%d\n", value < 0 ? -1 : value*100);
1295
1296 }
1297
1298 static ssize_t pwm1_enable_show(struct device *dev,
1299                                                  struct device_attribute *attr,
1300                                                  char *buf)
1301 {
1302         struct asus_wmi *asus = dev_get_drvdata(dev);
1303
1304         if (asus->asus_hwmon_fan_manual_mode)
1305                 return sprintf(buf, "%d\n", ASUS_FAN_CTRL_MANUAL);
1306
1307         return sprintf(buf, "%d\n", ASUS_FAN_CTRL_AUTO);
1308 }
1309
1310 static ssize_t pwm1_enable_store(struct device *dev,
1311                                                   struct device_attribute *attr,
1312                                                   const char *buf, size_t count)
1313 {
1314         struct asus_wmi *asus = dev_get_drvdata(dev);
1315         int status = 0;
1316         int state;
1317         int ret;
1318
1319         ret = kstrtouint(buf, 10, &state);
1320
1321         if (ret)
1322                 return ret;
1323
1324         if (state == ASUS_FAN_CTRL_MANUAL)
1325                 asus->asus_hwmon_fan_manual_mode = true;
1326         else
1327                 status = asus_hwmon_fan_set_auto(asus);
1328
1329         if (status)
1330                 return status;
1331
1332         return count;
1333 }
1334
1335 static ssize_t fan1_label_show(struct device *dev,
1336                                           struct device_attribute *attr,
1337                                           char *buf)
1338 {
1339         return sprintf(buf, "%s\n", ASUS_FAN_DESC);
1340 }
1341
1342 static ssize_t asus_hwmon_temp1(struct device *dev,
1343                                 struct device_attribute *attr,
1344                                 char *buf)
1345 {
1346         struct asus_wmi *asus = dev_get_drvdata(dev);
1347         u32 value;
1348         int err;
1349
1350         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
1351
1352         if (err < 0)
1353                 return err;
1354
1355         value = DECI_KELVIN_TO_CELSIUS((value & 0xFFFF)) * 1000;
1356
1357         return sprintf(buf, "%d\n", value);
1358 }
1359
1360 /* Fan1 */
1361 static DEVICE_ATTR_RW(pwm1);
1362 static DEVICE_ATTR_RW(pwm1_enable);
1363 static DEVICE_ATTR_RO(fan1_input);
1364 static DEVICE_ATTR_RO(fan1_label);
1365
1366 /* Temperature */
1367 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
1368
1369 static struct attribute *hwmon_attributes[] = {
1370         &dev_attr_pwm1.attr,
1371         &dev_attr_pwm1_enable.attr,
1372         &dev_attr_fan1_input.attr,
1373         &dev_attr_fan1_label.attr,
1374
1375         &dev_attr_temp1_input.attr,
1376         NULL
1377 };
1378
1379 static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
1380                                           struct attribute *attr, int idx)
1381 {
1382         struct device *dev = container_of(kobj, struct device, kobj);
1383         struct platform_device *pdev = to_platform_device(dev->parent);
1384         struct asus_wmi *asus = platform_get_drvdata(pdev);
1385         int dev_id = -1;
1386         int fan_attr = -1;
1387         u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
1388         bool ok = true;
1389
1390         if (attr == &dev_attr_pwm1.attr)
1391                 dev_id = ASUS_WMI_DEVID_FAN_CTRL;
1392         else if (attr == &dev_attr_temp1_input.attr)
1393                 dev_id = ASUS_WMI_DEVID_THERMAL_CTRL;
1394
1395
1396         if (attr == &dev_attr_fan1_input.attr
1397             || attr == &dev_attr_fan1_label.attr
1398             || attr == &dev_attr_pwm1.attr
1399             || attr == &dev_attr_pwm1_enable.attr) {
1400                 fan_attr = 1;
1401         }
1402
1403         if (dev_id != -1) {
1404                 int err = asus_wmi_get_devstate(asus, dev_id, &value);
1405
1406                 if (err < 0 && fan_attr == -1)
1407                         return 0; /* can't return negative here */
1408         }
1409
1410         if (dev_id == ASUS_WMI_DEVID_FAN_CTRL) {
1411                 /*
1412                  * We need to find a better way, probably using sfun,
1413                  * bits or spec ...
1414                  * Currently we disable it if:
1415                  * - ASUS_WMI_UNSUPPORTED_METHOD is returned
1416                  * - reverved bits are non-zero
1417                  * - sfun and presence bit are not set
1418                  */
1419                 if (value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
1420                     || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)))
1421                         ok = false;
1422                 else
1423                         ok = fan_attr <= asus->asus_hwmon_num_fans;
1424         } else if (dev_id == ASUS_WMI_DEVID_THERMAL_CTRL) {
1425                 /* If value is zero, something is clearly wrong */
1426                 if (!value)
1427                         ok = false;
1428         } else if (fan_attr <= asus->asus_hwmon_num_fans && fan_attr != -1) {
1429                 ok = true;
1430         } else {
1431                 ok = false;
1432         }
1433
1434         return ok ? attr->mode : 0;
1435 }
1436
1437 static const struct attribute_group hwmon_attribute_group = {
1438         .is_visible = asus_hwmon_sysfs_is_visible,
1439         .attrs = hwmon_attributes
1440 };
1441 __ATTRIBUTE_GROUPS(hwmon_attribute);
1442
1443 static int asus_wmi_hwmon_init(struct asus_wmi *asus)
1444 {
1445         struct device *hwmon;
1446
1447         hwmon = hwmon_device_register_with_groups(&asus->platform_device->dev,
1448                                                   "asus", asus,
1449                                                   hwmon_attribute_groups);
1450         if (IS_ERR(hwmon)) {
1451                 pr_err("Could not register asus hwmon device\n");
1452                 return PTR_ERR(hwmon);
1453         }
1454         return 0;
1455 }
1456
1457 /*
1458  * Backlight
1459  */
1460 static int read_backlight_power(struct asus_wmi *asus)
1461 {
1462         int ret;
1463         if (asus->driver->quirks->store_backlight_power)
1464                 ret = !asus->driver->panel_power;
1465         else
1466                 ret = asus_wmi_get_devstate_simple(asus,
1467                                                    ASUS_WMI_DEVID_BACKLIGHT);
1468
1469         if (ret < 0)
1470                 return ret;
1471
1472         return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
1473 }
1474
1475 static int read_brightness_max(struct asus_wmi *asus)
1476 {
1477         u32 retval;
1478         int err;
1479
1480         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
1481
1482         if (err < 0)
1483                 return err;
1484
1485         retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
1486         retval >>= 8;
1487
1488         if (!retval)
1489                 return -ENODEV;
1490
1491         return retval;
1492 }
1493
1494 static int read_brightness(struct backlight_device *bd)
1495 {
1496         struct asus_wmi *asus = bl_get_data(bd);
1497         u32 retval;
1498         int err;
1499
1500         err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
1501
1502         if (err < 0)
1503                 return err;
1504
1505         return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
1506 }
1507
1508 static u32 get_scalar_command(struct backlight_device *bd)
1509 {
1510         struct asus_wmi *asus = bl_get_data(bd);
1511         u32 ctrl_param = 0;
1512
1513         if ((asus->driver->brightness < bd->props.brightness) ||
1514             bd->props.brightness == bd->props.max_brightness)
1515                 ctrl_param = 0x00008001;
1516         else if ((asus->driver->brightness > bd->props.brightness) ||
1517                  bd->props.brightness == 0)
1518                 ctrl_param = 0x00008000;
1519
1520         asus->driver->brightness = bd->props.brightness;
1521
1522         return ctrl_param;
1523 }
1524
1525 static int update_bl_status(struct backlight_device *bd)
1526 {
1527         struct asus_wmi *asus = bl_get_data(bd);
1528         u32 ctrl_param;
1529         int power, err = 0;
1530
1531         power = read_backlight_power(asus);
1532         if (power != -ENODEV && bd->props.power != power) {
1533                 ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
1534                 err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
1535                                             ctrl_param, NULL);
1536                 if (asus->driver->quirks->store_backlight_power)
1537                         asus->driver->panel_power = bd->props.power;
1538
1539                 /* When using scalar brightness, updating the brightness
1540                  * will mess with the backlight power */
1541                 if (asus->driver->quirks->scalar_panel_brightness)
1542                         return err;
1543         }
1544
1545         if (asus->driver->quirks->scalar_panel_brightness)
1546                 ctrl_param = get_scalar_command(bd);
1547         else
1548                 ctrl_param = bd->props.brightness;
1549
1550         err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
1551                                     ctrl_param, NULL);
1552
1553         return err;
1554 }
1555
1556 static const struct backlight_ops asus_wmi_bl_ops = {
1557         .get_brightness = read_brightness,
1558         .update_status = update_bl_status,
1559 };
1560
1561 static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
1562 {
1563         struct backlight_device *bd = asus->backlight_device;
1564         int old = bd->props.brightness;
1565         int new = old;
1566
1567         if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
1568                 new = code - NOTIFY_BRNUP_MIN + 1;
1569         else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
1570                 new = code - NOTIFY_BRNDOWN_MIN;
1571
1572         bd->props.brightness = new;
1573         backlight_update_status(bd);
1574         backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
1575
1576         return old;
1577 }
1578
1579 static int asus_wmi_backlight_init(struct asus_wmi *asus)
1580 {
1581         struct backlight_device *bd;
1582         struct backlight_properties props;
1583         int max;
1584         int power;
1585
1586         max = read_brightness_max(asus);
1587         if (max < 0)
1588                 return max;
1589
1590         power = read_backlight_power(asus);
1591
1592         if (power == -ENODEV)
1593                 power = FB_BLANK_UNBLANK;
1594         else if (power < 0)
1595                 return power;
1596
1597         memset(&props, 0, sizeof(struct backlight_properties));
1598         props.type = BACKLIGHT_PLATFORM;
1599         props.max_brightness = max;
1600         bd = backlight_device_register(asus->driver->name,
1601                                        &asus->platform_device->dev, asus,
1602                                        &asus_wmi_bl_ops, &props);
1603         if (IS_ERR(bd)) {
1604                 pr_err("Could not register backlight device\n");
1605                 return PTR_ERR(bd);
1606         }
1607
1608         asus->backlight_device = bd;
1609
1610         if (asus->driver->quirks->store_backlight_power)
1611                 asus->driver->panel_power = power;
1612
1613         bd->props.brightness = read_brightness(bd);
1614         bd->props.power = power;
1615         backlight_update_status(bd);
1616
1617         asus->driver->brightness = bd->props.brightness;
1618
1619         return 0;
1620 }
1621
1622 static void asus_wmi_backlight_exit(struct asus_wmi *asus)
1623 {
1624         backlight_device_unregister(asus->backlight_device);
1625
1626         asus->backlight_device = NULL;
1627 }
1628
1629 static int is_display_toggle(int code)
1630 {
1631         /* display toggle keys */
1632         if ((code >= 0x61 && code <= 0x67) ||
1633             (code >= 0x8c && code <= 0x93) ||
1634             (code >= 0xa0 && code <= 0xa7) ||
1635             (code >= 0xd0 && code <= 0xd5))
1636                 return 1;
1637
1638         return 0;
1639 }
1640
1641 static void asus_wmi_notify(u32 value, void *context)
1642 {
1643         struct asus_wmi *asus = context;
1644         struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
1645         union acpi_object *obj;
1646         acpi_status status;
1647         int code;
1648         int orig_code;
1649         unsigned int key_value = 1;
1650         bool autorelease = 1;
1651
1652         status = wmi_get_event_data(value, &response);
1653         if (status != AE_OK) {
1654                 pr_err("bad event status 0x%x\n", status);
1655                 return;
1656         }
1657
1658         obj = (union acpi_object *)response.pointer;
1659
1660         if (!obj || obj->type != ACPI_TYPE_INTEGER)
1661                 goto exit;
1662
1663         code = obj->integer.value;
1664         orig_code = code;
1665
1666         if (asus->driver->key_filter) {
1667                 asus->driver->key_filter(asus->driver, &code, &key_value,
1668                                          &autorelease);
1669                 if (code == ASUS_WMI_KEY_IGNORE)
1670                         goto exit;
1671         }
1672
1673         if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
1674                 code = ASUS_WMI_BRN_UP;
1675         else if (code >= NOTIFY_BRNDOWN_MIN &&
1676                  code <= NOTIFY_BRNDOWN_MAX)
1677                 code = ASUS_WMI_BRN_DOWN;
1678
1679         if (code == ASUS_WMI_BRN_DOWN || code == ASUS_WMI_BRN_UP) {
1680                 if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
1681                         asus_wmi_backlight_notify(asus, orig_code);
1682                         goto exit;
1683                 }
1684         }
1685
1686         if (code == NOTIFY_KBD_BRTUP) {
1687                 kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
1688                 goto exit;
1689         }
1690         if (code == NOTIFY_KBD_BRTDWN) {
1691                 kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
1692                 goto exit;
1693         }
1694         if (code == NOTIFY_KBD_BRTTOGGLE) {
1695                 if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
1696                         kbd_led_set_by_kbd(asus, 0);
1697                 else
1698                         kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
1699                 goto exit;
1700         }
1701
1702         if (is_display_toggle(code) &&
1703             asus->driver->quirks->no_display_toggle)
1704                 goto exit;
1705
1706         if (!sparse_keymap_report_event(asus->inputdev, code,
1707                                         key_value, autorelease))
1708                 pr_info("Unknown key %x pressed\n", code);
1709
1710 exit:
1711         kfree(obj);
1712 }
1713
1714 /*
1715  * Sys helpers
1716  */
1717 static int parse_arg(const char *buf, unsigned long count, int *val)
1718 {
1719         if (!count)
1720                 return 0;
1721         if (sscanf(buf, "%i", val) != 1)
1722                 return -EINVAL;
1723         return count;
1724 }
1725
1726 static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
1727                              const char *buf, size_t count)
1728 {
1729         u32 retval;
1730         int rv, err, value;
1731
1732         value = asus_wmi_get_devstate_simple(asus, devid);
1733         if (value < 0)
1734                 return value;
1735
1736         rv = parse_arg(buf, count, &value);
1737         err = asus_wmi_set_devstate(devid, value, &retval);
1738
1739         if (err < 0)
1740                 return err;
1741
1742         return rv;
1743 }
1744
1745 static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
1746 {
1747         int value = asus_wmi_get_devstate_simple(asus, devid);
1748
1749         if (value < 0)
1750                 return value;
1751
1752         return sprintf(buf, "%d\n", value);
1753 }
1754
1755 #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm)                  \
1756         static ssize_t show_##_name(struct device *dev,                 \
1757                                     struct device_attribute *attr,      \
1758                                     char *buf)                          \
1759         {                                                               \
1760                 struct asus_wmi *asus = dev_get_drvdata(dev);           \
1761                                                                         \
1762                 return show_sys_wmi(asus, _cm, buf);                    \
1763         }                                                               \
1764         static ssize_t store_##_name(struct device *dev,                \
1765                                      struct device_attribute *attr,     \
1766                                      const char *buf, size_t count)     \
1767         {                                                               \
1768                 struct asus_wmi *asus = dev_get_drvdata(dev);           \
1769                                                                         \
1770                 return store_sys_wmi(asus, _cm, buf, count);            \
1771         }                                                               \
1772         static struct device_attribute dev_attr_##_name = {             \
1773                 .attr = {                                               \
1774                         .name = __stringify(_name),                     \
1775                         .mode = _mode },                                \
1776                 .show   = show_##_name,                                 \
1777                 .store  = store_##_name,                                \
1778         }
1779
1780 ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
1781 ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
1782 ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
1783 ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
1784 ASUS_WMI_CREATE_DEVICE_ATTR(als_enable, 0644, ASUS_WMI_DEVID_ALS_ENABLE);
1785
1786 static ssize_t cpufv_store(struct device *dev, struct device_attribute *attr,
1787                            const char *buf, size_t count)
1788 {
1789         int value, rv;
1790
1791         if (!count || sscanf(buf, "%i", &value) != 1)
1792                 return -EINVAL;
1793         if (value < 0 || value > 2)
1794                 return -EINVAL;
1795
1796         rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
1797         if (rv < 0)
1798                 return rv;
1799
1800         return count;
1801 }
1802
1803 static DEVICE_ATTR_WO(cpufv);
1804
1805 static struct attribute *platform_attributes[] = {
1806         &dev_attr_cpufv.attr,
1807         &dev_attr_camera.attr,
1808         &dev_attr_cardr.attr,
1809         &dev_attr_touchpad.attr,
1810         &dev_attr_lid_resume.attr,
1811         &dev_attr_als_enable.attr,
1812         NULL
1813 };
1814
1815 static umode_t asus_sysfs_is_visible(struct kobject *kobj,
1816                                     struct attribute *attr, int idx)
1817 {
1818         struct device *dev = container_of(kobj, struct device, kobj);
1819         struct asus_wmi *asus = dev_get_drvdata(dev);
1820         bool ok = true;
1821         int devid = -1;
1822
1823         if (attr == &dev_attr_camera.attr)
1824                 devid = ASUS_WMI_DEVID_CAMERA;
1825         else if (attr == &dev_attr_cardr.attr)
1826                 devid = ASUS_WMI_DEVID_CARDREADER;
1827         else if (attr == &dev_attr_touchpad.attr)
1828                 devid = ASUS_WMI_DEVID_TOUCHPAD;
1829         else if (attr == &dev_attr_lid_resume.attr)
1830                 devid = ASUS_WMI_DEVID_LID_RESUME;
1831         else if (attr == &dev_attr_als_enable.attr)
1832                 devid = ASUS_WMI_DEVID_ALS_ENABLE;
1833
1834         if (devid != -1)
1835                 ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
1836
1837         return ok ? attr->mode : 0;
1838 }
1839
1840 static const struct attribute_group platform_attribute_group = {
1841         .is_visible = asus_sysfs_is_visible,
1842         .attrs = platform_attributes
1843 };
1844
1845 static void asus_wmi_sysfs_exit(struct platform_device *device)
1846 {
1847         sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
1848 }
1849
1850 static int asus_wmi_sysfs_init(struct platform_device *device)
1851 {
1852         return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
1853 }
1854
1855 /*
1856  * Platform device
1857  */
1858 static int asus_wmi_platform_init(struct asus_wmi *asus)
1859 {
1860         int rv;
1861
1862         /* INIT enable hotkeys on some models */
1863         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
1864                 pr_info("Initialization: %#x\n", rv);
1865
1866         /* We don't know yet what to do with this version... */
1867         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
1868                 pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
1869                 asus->spec = rv;
1870         }
1871
1872         /*
1873          * The SFUN method probably allows the original driver to get the list
1874          * of features supported by a given model. For now, 0x0100 or 0x0800
1875          * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
1876          * The significance of others is yet to be found.
1877          */
1878         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
1879                 pr_info("SFUN value: %#x\n", rv);
1880                 asus->sfun = rv;
1881         }
1882
1883         /*
1884          * Eee PC and Notebooks seems to have different method_id for DSTS,
1885          * but it may also be related to the BIOS's SPEC.
1886          * Note, on most Eeepc, there is no way to check if a method exist
1887          * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
1888          * but once again, SPEC may probably be used for that kind of things.
1889          */
1890         if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, 0, 0, NULL))
1891                 asus->dsts_id = ASUS_WMI_METHODID_DSTS;
1892         else
1893                 asus->dsts_id = ASUS_WMI_METHODID_DSTS2;
1894
1895         /* CWAP allow to define the behavior of the Fn+F2 key,
1896          * this method doesn't seems to be present on Eee PCs */
1897         if (asus->driver->quirks->wapf >= 0)
1898                 asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
1899                                       asus->driver->quirks->wapf, NULL);
1900
1901         return asus_wmi_sysfs_init(asus->platform_device);
1902 }
1903
1904 static void asus_wmi_platform_exit(struct asus_wmi *asus)
1905 {
1906         asus_wmi_sysfs_exit(asus->platform_device);
1907 }
1908
1909 /*
1910  * debugfs
1911  */
1912 struct asus_wmi_debugfs_node {
1913         struct asus_wmi *asus;
1914         char *name;
1915         int (*show) (struct seq_file *m, void *data);
1916 };
1917
1918 static int show_dsts(struct seq_file *m, void *data)
1919 {
1920         struct asus_wmi *asus = m->private;
1921         int err;
1922         u32 retval = -1;
1923
1924         err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
1925
1926         if (err < 0)
1927                 return err;
1928
1929         seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
1930
1931         return 0;
1932 }
1933
1934 static int show_devs(struct seq_file *m, void *data)
1935 {
1936         struct asus_wmi *asus = m->private;
1937         int err;
1938         u32 retval = -1;
1939
1940         err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
1941                                     &retval);
1942
1943         if (err < 0)
1944                 return err;
1945
1946         seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
1947                    asus->debug.ctrl_param, retval);
1948
1949         return 0;
1950 }
1951
1952 static int show_call(struct seq_file *m, void *data)
1953 {
1954         struct asus_wmi *asus = m->private;
1955         struct bios_args args = {
1956                 .arg0 = asus->debug.dev_id,
1957                 .arg1 = asus->debug.ctrl_param,
1958         };
1959         struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
1960         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
1961         union acpi_object *obj;
1962         acpi_status status;
1963
1964         status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
1965                                      0, asus->debug.method_id,
1966                                      &input, &output);
1967
1968         if (ACPI_FAILURE(status))
1969                 return -EIO;
1970
1971         obj = (union acpi_object *)output.pointer;
1972         if (obj && obj->type == ACPI_TYPE_INTEGER)
1973                 seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
1974                            asus->debug.dev_id, asus->debug.ctrl_param,
1975                            (u32) obj->integer.value);
1976         else
1977                 seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
1978                            asus->debug.dev_id, asus->debug.ctrl_param,
1979                            obj ? obj->type : -1);
1980
1981         kfree(obj);
1982
1983         return 0;
1984 }
1985
1986 static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
1987         {NULL, "devs", show_devs},
1988         {NULL, "dsts", show_dsts},
1989         {NULL, "call", show_call},
1990 };
1991
1992 static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
1993 {
1994         struct asus_wmi_debugfs_node *node = inode->i_private;
1995
1996         return single_open(file, node->show, node->asus);
1997 }
1998
1999 static const struct file_operations asus_wmi_debugfs_io_ops = {
2000         .owner = THIS_MODULE,
2001         .open = asus_wmi_debugfs_open,
2002         .read = seq_read,
2003         .llseek = seq_lseek,
2004         .release = single_release,
2005 };
2006
2007 static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
2008 {
2009         debugfs_remove_recursive(asus->debug.root);
2010 }
2011
2012 static int asus_wmi_debugfs_init(struct asus_wmi *asus)
2013 {
2014         struct dentry *dent;
2015         int i;
2016
2017         asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
2018         if (!asus->debug.root) {
2019                 pr_err("failed to create debugfs directory\n");
2020                 goto error_debugfs;
2021         }
2022
2023         dent = debugfs_create_x32("method_id", S_IRUGO | S_IWUSR,
2024                                   asus->debug.root, &asus->debug.method_id);
2025         if (!dent)
2026                 goto error_debugfs;
2027
2028         dent = debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR,
2029                                   asus->debug.root, &asus->debug.dev_id);
2030         if (!dent)
2031                 goto error_debugfs;
2032
2033         dent = debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR,
2034                                   asus->debug.root, &asus->debug.ctrl_param);
2035         if (!dent)
2036                 goto error_debugfs;
2037
2038         for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
2039                 struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
2040
2041                 node->asus = asus;
2042                 dent = debugfs_create_file(node->name, S_IFREG | S_IRUGO,
2043                                            asus->debug.root, node,
2044                                            &asus_wmi_debugfs_io_ops);
2045                 if (!dent) {
2046                         pr_err("failed to create debug file: %s\n", node->name);
2047                         goto error_debugfs;
2048                 }
2049         }
2050
2051         return 0;
2052
2053 error_debugfs:
2054         asus_wmi_debugfs_exit(asus);
2055         return -ENOMEM;
2056 }
2057
2058 static int asus_wmi_fan_init(struct asus_wmi *asus)
2059 {
2060         int status;
2061
2062         asus->asus_hwmon_pwm = -1;
2063         asus->asus_hwmon_num_fans = -1;
2064         asus->asus_hwmon_fan_manual_mode = false;
2065
2066         status = asus_hwmon_get_fan_number(asus, &asus->asus_hwmon_num_fans);
2067         if (status) {
2068                 asus->asus_hwmon_num_fans = 0;
2069                 pr_warn("Could not determine number of fans: %d\n", status);
2070                 return -ENXIO;
2071         }
2072
2073         pr_info("Number of fans: %d\n", asus->asus_hwmon_num_fans);
2074         return 0;
2075 }
2076
2077 /*
2078  * WMI Driver
2079  */
2080 static int asus_wmi_add(struct platform_device *pdev)
2081 {
2082         struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
2083         struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
2084         struct asus_wmi *asus;
2085         const char *chassis_type;
2086         acpi_status status;
2087         int err;
2088         u32 result;
2089
2090         asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
2091         if (!asus)
2092                 return -ENOMEM;
2093
2094         asus->driver = wdrv;
2095         asus->platform_device = pdev;
2096         wdrv->platform_device = pdev;
2097         platform_set_drvdata(asus->platform_device, asus);
2098
2099         if (wdrv->detect_quirks)
2100                 wdrv->detect_quirks(asus->driver);
2101
2102         err = asus_wmi_platform_init(asus);
2103         if (err)
2104                 goto fail_platform;
2105
2106         err = asus_wmi_input_init(asus);
2107         if (err)
2108                 goto fail_input;
2109
2110         err = asus_wmi_fan_init(asus); /* probably no problems on error */
2111         asus_hwmon_fan_set_auto(asus);
2112
2113         err = asus_wmi_hwmon_init(asus);
2114         if (err)
2115                 goto fail_hwmon;
2116
2117         err = asus_wmi_led_init(asus);
2118         if (err)
2119                 goto fail_leds;
2120
2121         asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
2122         if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
2123                 asus->driver->wlan_ctrl_by_user = 1;
2124
2125         if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
2126                 err = asus_wmi_rfkill_init(asus);
2127                 if (err)
2128                         goto fail_rfkill;
2129         }
2130
2131         if (asus->driver->quirks->wmi_force_als_set)
2132                 asus_wmi_set_als();
2133
2134         /* Some Asus desktop boards export an acpi-video backlight interface,
2135            stop this from showing up */
2136         chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
2137         if (chassis_type && !strcmp(chassis_type, "3"))
2138                 acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
2139
2140         if (asus->driver->quirks->wmi_backlight_power)
2141                 acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
2142
2143         if (asus->driver->quirks->wmi_backlight_native)
2144                 acpi_video_set_dmi_backlight_type(acpi_backlight_native);
2145
2146         if (asus->driver->quirks->xusb2pr)
2147                 asus_wmi_set_xusb2pr(asus);
2148
2149         if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
2150                 err = asus_wmi_backlight_init(asus);
2151                 if (err && err != -ENODEV)
2152                         goto fail_backlight;
2153         }
2154
2155         status = wmi_install_notify_handler(asus->driver->event_guid,
2156                                             asus_wmi_notify, asus);
2157         if (ACPI_FAILURE(status)) {
2158                 pr_err("Unable to register notify handler - %d\n", status);
2159                 err = -ENODEV;
2160                 goto fail_wmi_handler;
2161         }
2162
2163         err = asus_wmi_debugfs_init(asus);
2164         if (err)
2165                 goto fail_debugfs;
2166
2167         return 0;
2168
2169 fail_debugfs:
2170         wmi_remove_notify_handler(asus->driver->event_guid);
2171 fail_wmi_handler:
2172         asus_wmi_backlight_exit(asus);
2173 fail_backlight:
2174         asus_wmi_rfkill_exit(asus);
2175 fail_rfkill:
2176         asus_wmi_led_exit(asus);
2177 fail_leds:
2178 fail_hwmon:
2179         asus_wmi_input_exit(asus);
2180 fail_input:
2181         asus_wmi_platform_exit(asus);
2182 fail_platform:
2183         kfree(asus);
2184         return err;
2185 }
2186
2187 static int asus_wmi_remove(struct platform_device *device)
2188 {
2189         struct asus_wmi *asus;
2190
2191         asus = platform_get_drvdata(device);
2192         wmi_remove_notify_handler(asus->driver->event_guid);
2193         asus_wmi_backlight_exit(asus);
2194         asus_wmi_input_exit(asus);
2195         asus_wmi_led_exit(asus);
2196         asus_wmi_rfkill_exit(asus);
2197         asus_wmi_debugfs_exit(asus);
2198         asus_wmi_platform_exit(asus);
2199         asus_hwmon_fan_set_auto(asus);
2200
2201         kfree(asus);
2202         return 0;
2203 }
2204
2205 /*
2206  * Platform driver - hibernate/resume callbacks
2207  */
2208 static int asus_hotk_thaw(struct device *device)
2209 {
2210         struct asus_wmi *asus = dev_get_drvdata(device);
2211
2212         if (asus->wlan.rfkill) {
2213                 bool wlan;
2214
2215                 /*
2216                  * Work around bios bug - acpi _PTS turns off the wireless led
2217                  * during suspend.  Normally it restores it on resume, but
2218                  * we should kick it ourselves in case hibernation is aborted.
2219                  */
2220                 wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
2221                 asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
2222         }
2223
2224         return 0;
2225 }
2226
2227 static int asus_hotk_resume(struct device *device)
2228 {
2229         struct asus_wmi *asus = dev_get_drvdata(device);
2230
2231         if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
2232                 kbd_led_update(asus);
2233
2234         return 0;
2235 }
2236
2237 static int asus_hotk_restore(struct device *device)
2238 {
2239         struct asus_wmi *asus = dev_get_drvdata(device);
2240         int bl;
2241
2242         /* Refresh both wlan rfkill state and pci hotplug */
2243         if (asus->wlan.rfkill)
2244                 asus_rfkill_hotplug(asus);
2245
2246         if (asus->bluetooth.rfkill) {
2247                 bl = !asus_wmi_get_devstate_simple(asus,
2248                                                    ASUS_WMI_DEVID_BLUETOOTH);
2249                 rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
2250         }
2251         if (asus->wimax.rfkill) {
2252                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
2253                 rfkill_set_sw_state(asus->wimax.rfkill, bl);
2254         }
2255         if (asus->wwan3g.rfkill) {
2256                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
2257                 rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
2258         }
2259         if (asus->gps.rfkill) {
2260                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
2261                 rfkill_set_sw_state(asus->gps.rfkill, bl);
2262         }
2263         if (asus->uwb.rfkill) {
2264                 bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
2265                 rfkill_set_sw_state(asus->uwb.rfkill, bl);
2266         }
2267         if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
2268                 kbd_led_update(asus);
2269
2270         return 0;
2271 }
2272
2273 static const struct dev_pm_ops asus_pm_ops = {
2274         .thaw = asus_hotk_thaw,
2275         .restore = asus_hotk_restore,
2276         .resume = asus_hotk_resume,
2277 };
2278
2279 static int asus_wmi_probe(struct platform_device *pdev)
2280 {
2281         struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
2282         struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
2283         int ret;
2284
2285         if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
2286                 pr_warn("Management GUID not found\n");
2287                 return -ENODEV;
2288         }
2289
2290         if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
2291                 pr_warn("Event GUID not found\n");
2292                 return -ENODEV;
2293         }
2294
2295         if (wdrv->probe) {
2296                 ret = wdrv->probe(pdev);
2297                 if (ret)
2298                         return ret;
2299         }
2300
2301         return asus_wmi_add(pdev);
2302 }
2303
2304 static bool used;
2305
2306 int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
2307 {
2308         struct platform_driver *platform_driver;
2309         struct platform_device *platform_device;
2310
2311         if (used)
2312                 return -EBUSY;
2313
2314         platform_driver = &driver->platform_driver;
2315         platform_driver->remove = asus_wmi_remove;
2316         platform_driver->driver.owner = driver->owner;
2317         platform_driver->driver.name = driver->name;
2318         platform_driver->driver.pm = &asus_pm_ops;
2319
2320         platform_device = platform_create_bundle(platform_driver,
2321                                                  asus_wmi_probe,
2322                                                  NULL, 0, NULL, 0);
2323         if (IS_ERR(platform_device))
2324                 return PTR_ERR(platform_device);
2325
2326         used = true;
2327         return 0;
2328 }
2329 EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
2330
2331 void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
2332 {
2333         platform_device_unregister(driver->platform_device);
2334         platform_driver_unregister(&driver->platform_driver);
2335         used = false;
2336 }
2337 EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
2338
2339 static int __init asus_wmi_init(void)
2340 {
2341         if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
2342                 pr_info("Asus Management GUID not found\n");
2343                 return -ENODEV;
2344         }
2345
2346         pr_info("ASUS WMI generic driver loaded\n");
2347         return 0;
2348 }
2349
2350 static void __exit asus_wmi_exit(void)
2351 {
2352         pr_info("ASUS WMI generic driver unloaded\n");
2353 }
2354
2355 module_init(asus_wmi_init);
2356 module_exit(asus_wmi_exit);
This page took 0.173615 seconds and 4 git commands to generate.