GNU Linux-libre 4.19.295-gnu1
[releases.git] / drivers / platform / x86 / acer-wmi.c
1 /*
2  *  Acer WMI Laptop Extras
3  *
4  *  Copyright (C) 2007-2009     Carlos Corbacho <carlos@strangeworlds.co.uk>
5  *
6  *  Based on acer_acpi:
7  *    Copyright (C) 2005-2007   E.M. Smith
8  *    Copyright (C) 2007-2008   Carlos Corbacho <cathectic@gmail.com>
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  */
24
25 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26
27 #include <linux/kernel.h>
28 #include <linux/module.h>
29 #include <linux/init.h>
30 #include <linux/types.h>
31 #include <linux/dmi.h>
32 #include <linux/fb.h>
33 #include <linux/backlight.h>
34 #include <linux/leds.h>
35 #include <linux/platform_device.h>
36 #include <linux/acpi.h>
37 #include <linux/i8042.h>
38 #include <linux/rfkill.h>
39 #include <linux/workqueue.h>
40 #include <linux/debugfs.h>
41 #include <linux/slab.h>
42 #include <linux/input.h>
43 #include <linux/input/sparse-keymap.h>
44 #include <acpi/video.h>
45
46 ACPI_MODULE_NAME(KBUILD_MODNAME);
47 MODULE_AUTHOR("Carlos Corbacho");
48 MODULE_DESCRIPTION("Acer Laptop WMI Extras Driver");
49 MODULE_LICENSE("GPL");
50
51 /*
52  * Magic Number
53  * Meaning is unknown - this number is required for writing to ACPI for AMW0
54  * (it's also used in acerhk when directly accessing the BIOS)
55  */
56 #define ACER_AMW0_WRITE 0x9610
57
58 /*
59  * Bit masks for the AMW0 interface
60  */
61 #define ACER_AMW0_WIRELESS_MASK  0x35
62 #define ACER_AMW0_BLUETOOTH_MASK 0x34
63 #define ACER_AMW0_MAILLED_MASK   0x31
64
65 /*
66  * Method IDs for WMID interface
67  */
68 #define ACER_WMID_GET_WIRELESS_METHODID         1
69 #define ACER_WMID_GET_BLUETOOTH_METHODID        2
70 #define ACER_WMID_GET_BRIGHTNESS_METHODID       3
71 #define ACER_WMID_SET_WIRELESS_METHODID         4
72 #define ACER_WMID_SET_BLUETOOTH_METHODID        5
73 #define ACER_WMID_SET_BRIGHTNESS_METHODID       6
74 #define ACER_WMID_GET_THREEG_METHODID           10
75 #define ACER_WMID_SET_THREEG_METHODID           11
76
77 /*
78  * Acer ACPI method GUIDs
79  */
80 #define AMW0_GUID1              "67C3371D-95A3-4C37-BB61-DD47B491DAAB"
81 #define AMW0_GUID2              "431F16ED-0C2B-444C-B267-27DEB140CF9C"
82 #define WMID_GUID1              "6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3"
83 #define WMID_GUID2              "95764E09-FB56-4E83-B31A-37761F60994A"
84 #define WMID_GUID3              "61EF69EA-865C-4BC3-A502-A0DEBA0CB531"
85
86 /*
87  * Acer ACPI event GUIDs
88  */
89 #define ACERWMID_EVENT_GUID "676AA15E-6A47-4D9F-A2CC-1E6D18D14026"
90
91 MODULE_ALIAS("wmi:67C3371D-95A3-4C37-BB61-DD47B491DAAB");
92 MODULE_ALIAS("wmi:6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3");
93 MODULE_ALIAS("wmi:676AA15E-6A47-4D9F-A2CC-1E6D18D14026");
94
95 enum acer_wmi_event_ids {
96         WMID_HOTKEY_EVENT = 0x1,
97         WMID_ACCEL_OR_KBD_DOCK_EVENT = 0x5,
98 };
99
100 static const struct key_entry acer_wmi_keymap[] __initconst = {
101         {KE_KEY, 0x01, {KEY_WLAN} },     /* WiFi */
102         {KE_KEY, 0x03, {KEY_WLAN} },     /* WiFi */
103         {KE_KEY, 0x04, {KEY_WLAN} },     /* WiFi */
104         {KE_KEY, 0x12, {KEY_BLUETOOTH} },       /* BT */
105         {KE_KEY, 0x21, {KEY_PROG1} },    /* Backup */
106         {KE_KEY, 0x22, {KEY_PROG2} },    /* Arcade */
107         {KE_KEY, 0x23, {KEY_PROG3} },    /* P_Key */
108         {KE_KEY, 0x24, {KEY_PROG4} },    /* Social networking_Key */
109         {KE_KEY, 0x27, {KEY_HELP} },
110         {KE_KEY, 0x29, {KEY_PROG3} },    /* P_Key for TM8372 */
111         {KE_IGNORE, 0x41, {KEY_MUTE} },
112         {KE_IGNORE, 0x42, {KEY_PREVIOUSSONG} },
113         {KE_IGNORE, 0x4d, {KEY_PREVIOUSSONG} },
114         {KE_IGNORE, 0x43, {KEY_NEXTSONG} },
115         {KE_IGNORE, 0x4e, {KEY_NEXTSONG} },
116         {KE_IGNORE, 0x44, {KEY_PLAYPAUSE} },
117         {KE_IGNORE, 0x4f, {KEY_PLAYPAUSE} },
118         {KE_IGNORE, 0x45, {KEY_STOP} },
119         {KE_IGNORE, 0x50, {KEY_STOP} },
120         {KE_IGNORE, 0x48, {KEY_VOLUMEUP} },
121         {KE_IGNORE, 0x49, {KEY_VOLUMEDOWN} },
122         {KE_IGNORE, 0x4a, {KEY_VOLUMEDOWN} },
123         /*
124          * 0x61 is KEY_SWITCHVIDEOMODE. Usually this is a duplicate input event
125          * with the "Video Bus" input device events. But sometimes it is not
126          * a dup. Map it to KEY_UNKNOWN instead of using KE_IGNORE so that
127          * udev/hwdb can override it on systems where it is not a dup.
128          */
129         {KE_KEY, 0x61, {KEY_UNKNOWN} },
130         {KE_IGNORE, 0x62, {KEY_BRIGHTNESSUP} },
131         {KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} },
132         {KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */
133         {KE_IGNORE, 0x81, {KEY_SLEEP} },
134         {KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} }, /* Touch Pad Toggle */
135         {KE_IGNORE, 0x84, {KEY_KBDILLUMTOGGLE} }, /* Automatic Keyboard background light toggle */
136         {KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} },
137         {KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} },
138         {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} },
139         {KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} },
140         {KE_KEY, 0x86, {KEY_WLAN} },
141         {KE_KEY, 0x87, {KEY_POWER} },
142         {KE_END, 0}
143 };
144
145 static struct input_dev *acer_wmi_input_dev;
146 static struct input_dev *acer_wmi_accel_dev;
147
148 struct event_return_value {
149         u8 function;
150         u8 key_num;
151         u16 device_state;
152         u16 reserved1;
153         u8 kbd_dock_state;
154         u8 reserved2;
155 } __attribute__((packed));
156
157 /*
158  * GUID3 Get Device Status device flags
159  */
160 #define ACER_WMID3_GDS_WIRELESS         (1<<0)  /* WiFi */
161 #define ACER_WMID3_GDS_THREEG           (1<<6)  /* 3G */
162 #define ACER_WMID3_GDS_WIMAX            (1<<7)  /* WiMAX */
163 #define ACER_WMID3_GDS_BLUETOOTH        (1<<11) /* BT */
164 #define ACER_WMID3_GDS_RFBTN            (1<<14) /* RF Button */
165
166 #define ACER_WMID3_GDS_TOUCHPAD         (1<<1)  /* Touchpad */
167
168 /* Hotkey Customized Setting and Acer Application Status.
169  * Set Device Default Value and Report Acer Application Status.
170  * When Acer Application starts, it will run this method to inform
171  * BIOS/EC that Acer Application is on.
172  * App Status
173  *      Bit[0]: Launch Manager Status
174  *      Bit[1]: ePM Status
175  *      Bit[2]: Device Control Status
176  *      Bit[3]: Acer Power Button Utility Status
177  *      Bit[4]: RF Button Status
178  *      Bit[5]: ODD PM Status
179  *      Bit[6]: Device Default Value Control
180  *      Bit[7]: Hall Sensor Application Status
181  */
182 struct func_input_params {
183         u8 function_num;        /* Function Number */
184         u16 commun_devices;     /* Communication type devices default status */
185         u16 devices;            /* Other type devices default status */
186         u8 app_status;          /* Acer Device Status. LM, ePM, RF Button... */
187         u8 app_mask;            /* Bit mask to app_status */
188         u8 reserved;
189 } __attribute__((packed));
190
191 struct func_return_value {
192         u8 error_code;          /* Error Code */
193         u8 ec_return_value;     /* EC Return Value */
194         u16 reserved;
195 } __attribute__((packed));
196
197 struct wmid3_gds_set_input_param {     /* Set Device Status input parameter */
198         u8 function_num;        /* Function Number */
199         u8 hotkey_number;       /* Hotkey Number */
200         u16 devices;            /* Set Device */
201         u8 volume_value;        /* Volume Value */
202 } __attribute__((packed));
203
204 struct wmid3_gds_get_input_param {     /* Get Device Status input parameter */
205         u8 function_num;        /* Function Number */
206         u8 hotkey_number;       /* Hotkey Number */
207         u16 devices;            /* Get Device */
208 } __attribute__((packed));
209
210 struct wmid3_gds_return_value { /* Get Device Status return value*/
211         u8 error_code;          /* Error Code */
212         u8 ec_return_value;     /* EC Return Value */
213         u16 devices;            /* Current Device Status */
214         u32 reserved;
215 } __attribute__((packed));
216
217 struct hotkey_function_type_aa {
218         u8 type;
219         u8 length;
220         u16 handle;
221         u16 commun_func_bitmap;
222         u16 application_func_bitmap;
223         u16 media_func_bitmap;
224         u16 display_func_bitmap;
225         u16 others_func_bitmap;
226         u8 commun_fn_key_number;
227 } __attribute__((packed));
228
229 /*
230  * Interface capability flags
231  */
232 #define ACER_CAP_MAILLED                BIT(0)
233 #define ACER_CAP_WIRELESS               BIT(1)
234 #define ACER_CAP_BLUETOOTH              BIT(2)
235 #define ACER_CAP_BRIGHTNESS             BIT(3)
236 #define ACER_CAP_THREEG                 BIT(4)
237 #define ACER_CAP_SET_FUNCTION_MODE      BIT(5)
238 #define ACER_CAP_KBD_DOCK               BIT(6)
239
240 /*
241  * Interface type flags
242  */
243 enum interface_flags {
244         ACER_AMW0,
245         ACER_AMW0_V2,
246         ACER_WMID,
247         ACER_WMID_v2,
248 };
249
250 #define ACER_DEFAULT_WIRELESS  0
251 #define ACER_DEFAULT_BLUETOOTH 0
252 #define ACER_DEFAULT_MAILLED   0
253 #define ACER_DEFAULT_THREEG    0
254
255 static int max_brightness = 0xF;
256
257 static int mailled = -1;
258 static int brightness = -1;
259 static int threeg = -1;
260 static int force_series;
261 static int force_caps = -1;
262 static bool ec_raw_mode;
263 static bool has_type_aa;
264 static u16 commun_func_bitmap;
265 static u8 commun_fn_key_number;
266
267 module_param(mailled, int, 0444);
268 module_param(brightness, int, 0444);
269 module_param(threeg, int, 0444);
270 module_param(force_series, int, 0444);
271 module_param(force_caps, int, 0444);
272 module_param(ec_raw_mode, bool, 0444);
273 MODULE_PARM_DESC(mailled, "Set initial state of Mail LED");
274 MODULE_PARM_DESC(brightness, "Set initial LCD backlight brightness");
275 MODULE_PARM_DESC(threeg, "Set initial state of 3G hardware");
276 MODULE_PARM_DESC(force_series, "Force a different laptop series");
277 MODULE_PARM_DESC(force_caps, "Force the capability bitmask to this value");
278 MODULE_PARM_DESC(ec_raw_mode, "Enable EC raw mode");
279
280 struct acer_data {
281         int mailled;
282         int threeg;
283         int brightness;
284 };
285
286 struct acer_debug {
287         struct dentry *root;
288         struct dentry *devices;
289         u32 wmid_devices;
290 };
291
292 static struct rfkill *wireless_rfkill;
293 static struct rfkill *bluetooth_rfkill;
294 static struct rfkill *threeg_rfkill;
295 static bool rfkill_inited;
296
297 /* Each low-level interface must define at least some of the following */
298 struct wmi_interface {
299         /* The WMI device type */
300         u32 type;
301
302         /* The capabilities this interface provides */
303         u32 capability;
304
305         /* Private data for the current interface */
306         struct acer_data data;
307
308         /* debugfs entries associated with this interface */
309         struct acer_debug debug;
310 };
311
312 /* The static interface pointer, points to the currently detected interface */
313 static struct wmi_interface *interface;
314
315 /*
316  * Embedded Controller quirks
317  * Some laptops require us to directly access the EC to either enable or query
318  * features that are not available through WMI.
319  */
320
321 struct quirk_entry {
322         u8 wireless;
323         u8 mailled;
324         s8 brightness;
325         u8 bluetooth;
326 };
327
328 static struct quirk_entry *quirks;
329
330 static void __init set_quirks(void)
331 {
332         if (!interface)
333                 return;
334
335         if (quirks->mailled)
336                 interface->capability |= ACER_CAP_MAILLED;
337
338         if (quirks->brightness)
339                 interface->capability |= ACER_CAP_BRIGHTNESS;
340 }
341
342 static int __init dmi_matched(const struct dmi_system_id *dmi)
343 {
344         quirks = dmi->driver_data;
345         return 1;
346 }
347
348 static int __init set_force_caps(const struct dmi_system_id *dmi)
349 {
350         if (force_caps == -1) {
351                 force_caps = (uintptr_t)dmi->driver_data;
352                 pr_info("Found %s, set force_caps to 0x%x\n", dmi->ident, force_caps);
353         }
354         return 1;
355 }
356
357 static struct quirk_entry quirk_unknown = {
358 };
359
360 static struct quirk_entry quirk_acer_aspire_1520 = {
361         .brightness = -1,
362 };
363
364 static struct quirk_entry quirk_acer_travelmate_2490 = {
365         .mailled = 1,
366 };
367
368 /* This AMW0 laptop has no bluetooth */
369 static struct quirk_entry quirk_medion_md_98300 = {
370         .wireless = 1,
371 };
372
373 static struct quirk_entry quirk_fujitsu_amilo_li_1718 = {
374         .wireless = 2,
375 };
376
377 static struct quirk_entry quirk_lenovo_ideapad_s205 = {
378         .wireless = 3,
379 };
380
381 /* The Aspire One has a dummy ACPI-WMI interface - disable it */
382 static const struct dmi_system_id acer_blacklist[] __initconst = {
383         {
384                 .ident = "Acer Aspire One (SSD)",
385                 .matches = {
386                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
387                         DMI_MATCH(DMI_PRODUCT_NAME, "AOA110"),
388                 },
389         },
390         {
391                 .ident = "Acer Aspire One (HDD)",
392                 .matches = {
393                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
394                         DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
395                 },
396         },
397         {}
398 };
399
400 static const struct dmi_system_id amw0_whitelist[] __initconst = {
401         {
402                 .ident = "Acer",
403                 .matches = {
404                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
405                 },
406         },
407         {
408                 .ident = "Gateway",
409                 .matches = {
410                         DMI_MATCH(DMI_SYS_VENDOR, "Gateway"),
411                 },
412         },
413         {
414                 .ident = "Packard Bell",
415                 .matches = {
416                         DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"),
417                 },
418         },
419         {}
420 };
421
422 /*
423  * This quirk table is only for Acer/Gateway/Packard Bell family
424  * that those machines are supported by acer-wmi driver.
425  */
426 static const struct dmi_system_id acer_quirks[] __initconst = {
427         {
428                 .callback = dmi_matched,
429                 .ident = "Acer Aspire 1360",
430                 .matches = {
431                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
432                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
433                 },
434                 .driver_data = &quirk_acer_aspire_1520,
435         },
436         {
437                 .callback = dmi_matched,
438                 .ident = "Acer Aspire 1520",
439                 .matches = {
440                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
441                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1520"),
442                 },
443                 .driver_data = &quirk_acer_aspire_1520,
444         },
445         {
446                 .callback = dmi_matched,
447                 .ident = "Acer Aspire 3100",
448                 .matches = {
449                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
450                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
451                 },
452                 .driver_data = &quirk_acer_travelmate_2490,
453         },
454         {
455                 .callback = dmi_matched,
456                 .ident = "Acer Aspire 3610",
457                 .matches = {
458                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
459                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3610"),
460                 },
461                 .driver_data = &quirk_acer_travelmate_2490,
462         },
463         {
464                 .callback = dmi_matched,
465                 .ident = "Acer Aspire 5100",
466                 .matches = {
467                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
468                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
469                 },
470                 .driver_data = &quirk_acer_travelmate_2490,
471         },
472         {
473                 .callback = dmi_matched,
474                 .ident = "Acer Aspire 5610",
475                 .matches = {
476                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
477                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
478                 },
479                 .driver_data = &quirk_acer_travelmate_2490,
480         },
481         {
482                 .callback = dmi_matched,
483                 .ident = "Acer Aspire 5630",
484                 .matches = {
485                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
486                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
487                 },
488                 .driver_data = &quirk_acer_travelmate_2490,
489         },
490         {
491                 .callback = dmi_matched,
492                 .ident = "Acer Aspire 5650",
493                 .matches = {
494                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
495                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
496                 },
497                 .driver_data = &quirk_acer_travelmate_2490,
498         },
499         {
500                 .callback = dmi_matched,
501                 .ident = "Acer Aspire 5680",
502                 .matches = {
503                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
504                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
505                 },
506                 .driver_data = &quirk_acer_travelmate_2490,
507         },
508         {
509                 .callback = dmi_matched,
510                 .ident = "Acer Aspire 9110",
511                 .matches = {
512                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
513                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
514                 },
515                 .driver_data = &quirk_acer_travelmate_2490,
516         },
517         {
518                 .callback = dmi_matched,
519                 .ident = "Acer TravelMate 2490",
520                 .matches = {
521                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
522                         DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
523                 },
524                 .driver_data = &quirk_acer_travelmate_2490,
525         },
526         {
527                 .callback = dmi_matched,
528                 .ident = "Acer TravelMate 4200",
529                 .matches = {
530                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
531                         DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4200"),
532                 },
533                 .driver_data = &quirk_acer_travelmate_2490,
534         },
535         {
536                 .callback = set_force_caps,
537                 .ident = "Acer Aspire Switch 10E SW3-016",
538                 .matches = {
539                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
540                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW3-016"),
541                 },
542                 .driver_data = (void *)ACER_CAP_KBD_DOCK,
543         },
544         {
545                 .callback = set_force_caps,
546                 .ident = "Acer Aspire Switch 10 SW5-012",
547                 .matches = {
548                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
549                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
550                 },
551                 .driver_data = (void *)ACER_CAP_KBD_DOCK,
552         },
553         {
554                 .callback = set_force_caps,
555                 .ident = "Acer Aspire Switch V 10 SW5-017",
556                 .matches = {
557                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
558                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
559                 },
560                 .driver_data = (void *)ACER_CAP_KBD_DOCK,
561         },
562         {
563                 .callback = set_force_caps,
564                 .ident = "Acer One 10 (S1003)",
565                 .matches = {
566                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
567                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"),
568                 },
569                 .driver_data = (void *)ACER_CAP_KBD_DOCK,
570         },
571         {}
572 };
573
574 /*
575  * This quirk list is for those non-acer machines that have AMW0_GUID1
576  * but supported by acer-wmi in past days. Keeping this quirk list here
577  * is only for backward compatible. Please do not add new machine to
578  * here anymore. Those non-acer machines should be supported by
579  * appropriate wmi drivers.
580  */
581 static const struct dmi_system_id non_acer_quirks[] __initconst = {
582         {
583                 .callback = dmi_matched,
584                 .ident = "Fujitsu Siemens Amilo Li 1718",
585                 .matches = {
586                         DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
587                         DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Li 1718"),
588                 },
589                 .driver_data = &quirk_fujitsu_amilo_li_1718,
590         },
591         {
592                 .callback = dmi_matched,
593                 .ident = "Medion MD 98300",
594                 .matches = {
595                         DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
596                         DMI_MATCH(DMI_PRODUCT_NAME, "WAM2030"),
597                 },
598                 .driver_data = &quirk_medion_md_98300,
599         },
600         {
601                 .callback = dmi_matched,
602                 .ident = "Lenovo Ideapad S205",
603                 .matches = {
604                         DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
605                         DMI_MATCH(DMI_PRODUCT_NAME, "10382LG"),
606                 },
607                 .driver_data = &quirk_lenovo_ideapad_s205,
608         },
609         {
610                 .callback = dmi_matched,
611                 .ident = "Lenovo Ideapad S205 (Brazos)",
612                 .matches = {
613                         DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
614                         DMI_MATCH(DMI_PRODUCT_NAME, "Brazos"),
615                 },
616                 .driver_data = &quirk_lenovo_ideapad_s205,
617         },
618         {
619                 .callback = dmi_matched,
620                 .ident = "Lenovo 3000 N200",
621                 .matches = {
622                         DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
623                         DMI_MATCH(DMI_PRODUCT_NAME, "0687A31"),
624                 },
625                 .driver_data = &quirk_fujitsu_amilo_li_1718,
626         },
627         {
628                 .callback = dmi_matched,
629                 .ident = "Lenovo Ideapad S205-10382JG",
630                 .matches = {
631                         DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
632                         DMI_MATCH(DMI_PRODUCT_NAME, "10382JG"),
633                 },
634                 .driver_data = &quirk_lenovo_ideapad_s205,
635         },
636         {
637                 .callback = dmi_matched,
638                 .ident = "Lenovo Ideapad S205-1038DPG",
639                 .matches = {
640                         DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
641                         DMI_MATCH(DMI_PRODUCT_NAME, "1038DPG"),
642                 },
643                 .driver_data = &quirk_lenovo_ideapad_s205,
644         },
645         {}
646 };
647
648 static int __init
649 video_set_backlight_video_vendor(const struct dmi_system_id *d)
650 {
651         interface->capability &= ~ACER_CAP_BRIGHTNESS;
652         pr_info("Brightness must be controlled by generic video driver\n");
653         return 0;
654 }
655
656 static const struct dmi_system_id video_vendor_dmi_table[] __initconst = {
657         {
658                 .callback = video_set_backlight_video_vendor,
659                 .ident = "Acer TravelMate 4750",
660                 .matches = {
661                         DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
662                         DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4750"),
663                 },
664         },
665         {
666                 .callback = video_set_backlight_video_vendor,
667                 .ident = "Acer Extensa 5235",
668                 .matches = {
669                         DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
670                         DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5235"),
671                 },
672         },
673         {
674                 .callback = video_set_backlight_video_vendor,
675                 .ident = "Acer TravelMate 5760",
676                 .matches = {
677                         DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
678                         DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5760"),
679                 },
680         },
681         {
682                 .callback = video_set_backlight_video_vendor,
683                 .ident = "Acer Aspire 5750",
684                 .matches = {
685                         DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
686                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5750"),
687                 },
688         },
689         {
690                 .callback = video_set_backlight_video_vendor,
691                 .ident = "Acer Aspire 5741",
692                 .matches = {
693                         DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
694                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"),
695                 },
696         },
697         {
698                 /*
699                  * Note no video_set_backlight_video_vendor, we must use the
700                  * acer interface, as there is no native backlight interface.
701                  */
702                 .ident = "Acer KAV80",
703                 .matches = {
704                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
705                         DMI_MATCH(DMI_PRODUCT_NAME, "KAV80"),
706                 },
707         },
708         {}
709 };
710
711 /* Find which quirks are needed for a particular vendor/ model pair */
712 static void __init find_quirks(void)
713 {
714         if (!force_series) {
715                 dmi_check_system(acer_quirks);
716                 dmi_check_system(non_acer_quirks);
717         } else if (force_series == 2490) {
718                 quirks = &quirk_acer_travelmate_2490;
719         }
720
721         if (quirks == NULL)
722                 quirks = &quirk_unknown;
723
724         set_quirks();
725 }
726
727 /*
728  * General interface convenience methods
729  */
730
731 static bool has_cap(u32 cap)
732 {
733         return interface->capability & cap;
734 }
735
736 /*
737  * AMW0 (V1) interface
738  */
739 struct wmab_args {
740         u32 eax;
741         u32 ebx;
742         u32 ecx;
743         u32 edx;
744 };
745
746 struct wmab_ret {
747         u32 eax;
748         u32 ebx;
749         u32 ecx;
750         u32 edx;
751         u32 eex;
752 };
753
754 static acpi_status wmab_execute(struct wmab_args *regbuf,
755 struct acpi_buffer *result)
756 {
757         struct acpi_buffer input;
758         acpi_status status;
759         input.length = sizeof(struct wmab_args);
760         input.pointer = (u8 *)regbuf;
761
762         status = wmi_evaluate_method(AMW0_GUID1, 0, 1, &input, result);
763
764         return status;
765 }
766
767 static acpi_status AMW0_get_u32(u32 *value, u32 cap)
768 {
769         int err;
770         u8 result;
771
772         switch (cap) {
773         case ACER_CAP_MAILLED:
774                 switch (quirks->mailled) {
775                 default:
776                         err = ec_read(0xA, &result);
777                         if (err)
778                                 return AE_ERROR;
779                         *value = (result >> 7) & 0x1;
780                         return AE_OK;
781                 }
782                 break;
783         case ACER_CAP_WIRELESS:
784                 switch (quirks->wireless) {
785                 case 1:
786                         err = ec_read(0x7B, &result);
787                         if (err)
788                                 return AE_ERROR;
789                         *value = result & 0x1;
790                         return AE_OK;
791                 case 2:
792                         err = ec_read(0x71, &result);
793                         if (err)
794                                 return AE_ERROR;
795                         *value = result & 0x1;
796                         return AE_OK;
797                 case 3:
798                         err = ec_read(0x78, &result);
799                         if (err)
800                                 return AE_ERROR;
801                         *value = result & 0x1;
802                         return AE_OK;
803                 default:
804                         err = ec_read(0xA, &result);
805                         if (err)
806                                 return AE_ERROR;
807                         *value = (result >> 2) & 0x1;
808                         return AE_OK;
809                 }
810                 break;
811         case ACER_CAP_BLUETOOTH:
812                 switch (quirks->bluetooth) {
813                 default:
814                         err = ec_read(0xA, &result);
815                         if (err)
816                                 return AE_ERROR;
817                         *value = (result >> 4) & 0x1;
818                         return AE_OK;
819                 }
820                 break;
821         case ACER_CAP_BRIGHTNESS:
822                 switch (quirks->brightness) {
823                 default:
824                         err = ec_read(0x83, &result);
825                         if (err)
826                                 return AE_ERROR;
827                         *value = result;
828                         return AE_OK;
829                 }
830                 break;
831         default:
832                 return AE_ERROR;
833         }
834         return AE_OK;
835 }
836
837 static acpi_status AMW0_set_u32(u32 value, u32 cap)
838 {
839         struct wmab_args args;
840
841         args.eax = ACER_AMW0_WRITE;
842         args.ebx = value ? (1<<8) : 0;
843         args.ecx = args.edx = 0;
844
845         switch (cap) {
846         case ACER_CAP_MAILLED:
847                 if (value > 1)
848                         return AE_BAD_PARAMETER;
849                 args.ebx |= ACER_AMW0_MAILLED_MASK;
850                 break;
851         case ACER_CAP_WIRELESS:
852                 if (value > 1)
853                         return AE_BAD_PARAMETER;
854                 args.ebx |= ACER_AMW0_WIRELESS_MASK;
855                 break;
856         case ACER_CAP_BLUETOOTH:
857                 if (value > 1)
858                         return AE_BAD_PARAMETER;
859                 args.ebx |= ACER_AMW0_BLUETOOTH_MASK;
860                 break;
861         case ACER_CAP_BRIGHTNESS:
862                 if (value > max_brightness)
863                         return AE_BAD_PARAMETER;
864                 switch (quirks->brightness) {
865                 default:
866                         return ec_write(0x83, value);
867                         break;
868                 }
869         default:
870                 return AE_ERROR;
871         }
872
873         /* Actually do the set */
874         return wmab_execute(&args, NULL);
875 }
876
877 static acpi_status __init AMW0_find_mailled(void)
878 {
879         struct wmab_args args;
880         struct wmab_ret ret;
881         acpi_status status = AE_OK;
882         struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL };
883         union acpi_object *obj;
884
885         args.eax = 0x86;
886         args.ebx = args.ecx = args.edx = 0;
887
888         status = wmab_execute(&args, &out);
889         if (ACPI_FAILURE(status))
890                 return status;
891
892         obj = (union acpi_object *) out.pointer;
893         if (obj && obj->type == ACPI_TYPE_BUFFER &&
894         obj->buffer.length == sizeof(struct wmab_ret)) {
895                 ret = *((struct wmab_ret *) obj->buffer.pointer);
896         } else {
897                 kfree(out.pointer);
898                 return AE_ERROR;
899         }
900
901         if (ret.eex & 0x1)
902                 interface->capability |= ACER_CAP_MAILLED;
903
904         kfree(out.pointer);
905
906         return AE_OK;
907 }
908
909 static const struct acpi_device_id norfkill_ids[] __initconst = {
910         { "VPC2004", 0},
911         { "IBM0068", 0},
912         { "LEN0068", 0},
913         { "SNY5001", 0},        /* sony-laptop in charge */
914         { "HPQ6601", 0},
915         { "", 0},
916 };
917
918 static int __init AMW0_set_cap_acpi_check_device(void)
919 {
920         const struct acpi_device_id *id;
921
922         for (id = norfkill_ids; id->id[0]; id++)
923                 if (acpi_dev_found(id->id))
924                         return true;
925
926         return false;
927 }
928
929 static acpi_status __init AMW0_set_capabilities(void)
930 {
931         struct wmab_args args;
932         struct wmab_ret ret;
933         acpi_status status;
934         struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL };
935         union acpi_object *obj;
936
937         /*
938          * On laptops with this strange GUID (non Acer), normal probing doesn't
939          * work.
940          */
941         if (wmi_has_guid(AMW0_GUID2)) {
942                 if ((quirks != &quirk_unknown) ||
943                     !AMW0_set_cap_acpi_check_device())
944                         interface->capability |= ACER_CAP_WIRELESS;
945                 return AE_OK;
946         }
947
948         args.eax = ACER_AMW0_WRITE;
949         args.ecx = args.edx = 0;
950
951         args.ebx = 0xa2 << 8;
952         args.ebx |= ACER_AMW0_WIRELESS_MASK;
953
954         status = wmab_execute(&args, &out);
955         if (ACPI_FAILURE(status))
956                 return status;
957
958         obj = out.pointer;
959         if (obj && obj->type == ACPI_TYPE_BUFFER &&
960         obj->buffer.length == sizeof(struct wmab_ret)) {
961                 ret = *((struct wmab_ret *) obj->buffer.pointer);
962         } else {
963                 status = AE_ERROR;
964                 goto out;
965         }
966
967         if (ret.eax & 0x1)
968                 interface->capability |= ACER_CAP_WIRELESS;
969
970         args.ebx = 2 << 8;
971         args.ebx |= ACER_AMW0_BLUETOOTH_MASK;
972
973         /*
974          * It's ok to use existing buffer for next wmab_execute call.
975          * But we need to kfree(out.pointer) if next wmab_execute fail.
976          */
977         status = wmab_execute(&args, &out);
978         if (ACPI_FAILURE(status))
979                 goto out;
980
981         obj = (union acpi_object *) out.pointer;
982         if (obj && obj->type == ACPI_TYPE_BUFFER
983         && obj->buffer.length == sizeof(struct wmab_ret)) {
984                 ret = *((struct wmab_ret *) obj->buffer.pointer);
985         } else {
986                 status = AE_ERROR;
987                 goto out;
988         }
989
990         if (ret.eax & 0x1)
991                 interface->capability |= ACER_CAP_BLUETOOTH;
992
993         /*
994          * This appears to be safe to enable, since all Wistron based laptops
995          * appear to use the same EC register for brightness, even if they
996          * differ for wireless, etc
997          */
998         if (quirks->brightness >= 0)
999                 interface->capability |= ACER_CAP_BRIGHTNESS;
1000
1001         status = AE_OK;
1002 out:
1003         kfree(out.pointer);
1004         return status;
1005 }
1006
1007 static struct wmi_interface AMW0_interface = {
1008         .type = ACER_AMW0,
1009 };
1010
1011 static struct wmi_interface AMW0_V2_interface = {
1012         .type = ACER_AMW0_V2,
1013 };
1014
1015 /*
1016  * New interface (The WMID interface)
1017  */
1018 static acpi_status
1019 WMI_execute_u32(u32 method_id, u32 in, u32 *out)
1020 {
1021         struct acpi_buffer input = { (acpi_size) sizeof(u32), (void *)(&in) };
1022         struct acpi_buffer result = { ACPI_ALLOCATE_BUFFER, NULL };
1023         union acpi_object *obj;
1024         u32 tmp = 0;
1025         acpi_status status;
1026
1027         status = wmi_evaluate_method(WMID_GUID1, 0, method_id, &input, &result);
1028
1029         if (ACPI_FAILURE(status))
1030                 return status;
1031
1032         obj = (union acpi_object *) result.pointer;
1033         if (obj) {
1034                 if (obj->type == ACPI_TYPE_BUFFER &&
1035                         (obj->buffer.length == sizeof(u32) ||
1036                         obj->buffer.length == sizeof(u64))) {
1037                         tmp = *((u32 *) obj->buffer.pointer);
1038                 } else if (obj->type == ACPI_TYPE_INTEGER) {
1039                         tmp = (u32) obj->integer.value;
1040                 }
1041         }
1042
1043         if (out)
1044                 *out = tmp;
1045
1046         kfree(result.pointer);
1047
1048         return status;
1049 }
1050
1051 static acpi_status WMID_get_u32(u32 *value, u32 cap)
1052 {
1053         acpi_status status;
1054         u8 tmp;
1055         u32 result, method_id = 0;
1056
1057         switch (cap) {
1058         case ACER_CAP_WIRELESS:
1059                 method_id = ACER_WMID_GET_WIRELESS_METHODID;
1060                 break;
1061         case ACER_CAP_BLUETOOTH:
1062                 method_id = ACER_WMID_GET_BLUETOOTH_METHODID;
1063                 break;
1064         case ACER_CAP_BRIGHTNESS:
1065                 method_id = ACER_WMID_GET_BRIGHTNESS_METHODID;
1066                 break;
1067         case ACER_CAP_THREEG:
1068                 method_id = ACER_WMID_GET_THREEG_METHODID;
1069                 break;
1070         case ACER_CAP_MAILLED:
1071                 if (quirks->mailled == 1) {
1072                         ec_read(0x9f, &tmp);
1073                         *value = tmp & 0x1;
1074                         return 0;
1075                 }
1076         default:
1077                 return AE_ERROR;
1078         }
1079         status = WMI_execute_u32(method_id, 0, &result);
1080
1081         if (ACPI_SUCCESS(status))
1082                 *value = (u8)result;
1083
1084         return status;
1085 }
1086
1087 static acpi_status WMID_set_u32(u32 value, u32 cap)
1088 {
1089         u32 method_id = 0;
1090         char param;
1091
1092         switch (cap) {
1093         case ACER_CAP_BRIGHTNESS:
1094                 if (value > max_brightness)
1095                         return AE_BAD_PARAMETER;
1096                 method_id = ACER_WMID_SET_BRIGHTNESS_METHODID;
1097                 break;
1098         case ACER_CAP_WIRELESS:
1099                 if (value > 1)
1100                         return AE_BAD_PARAMETER;
1101                 method_id = ACER_WMID_SET_WIRELESS_METHODID;
1102                 break;
1103         case ACER_CAP_BLUETOOTH:
1104                 if (value > 1)
1105                         return AE_BAD_PARAMETER;
1106                 method_id = ACER_WMID_SET_BLUETOOTH_METHODID;
1107                 break;
1108         case ACER_CAP_THREEG:
1109                 if (value > 1)
1110                         return AE_BAD_PARAMETER;
1111                 method_id = ACER_WMID_SET_THREEG_METHODID;
1112                 break;
1113         case ACER_CAP_MAILLED:
1114                 if (value > 1)
1115                         return AE_BAD_PARAMETER;
1116                 if (quirks->mailled == 1) {
1117                         param = value ? 0x92 : 0x93;
1118                         i8042_lock_chip();
1119                         i8042_command(&param, 0x1059);
1120                         i8042_unlock_chip();
1121                         return 0;
1122                 }
1123                 break;
1124         default:
1125                 return AE_ERROR;
1126         }
1127         return WMI_execute_u32(method_id, (u32)value, NULL);
1128 }
1129
1130 static acpi_status wmid3_get_device_status(u32 *value, u16 device)
1131 {
1132         struct wmid3_gds_return_value return_value;
1133         acpi_status status;
1134         union acpi_object *obj;
1135         struct wmid3_gds_get_input_param params = {
1136                 .function_num = 0x1,
1137                 .hotkey_number = commun_fn_key_number,
1138                 .devices = device,
1139         };
1140         struct acpi_buffer input = {
1141                 sizeof(struct wmid3_gds_get_input_param),
1142                 &params
1143         };
1144         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
1145
1146         status = wmi_evaluate_method(WMID_GUID3, 0, 0x2, &input, &output);
1147         if (ACPI_FAILURE(status))
1148                 return status;
1149
1150         obj = output.pointer;
1151
1152         if (!obj)
1153                 return AE_ERROR;
1154         else if (obj->type != ACPI_TYPE_BUFFER) {
1155                 kfree(obj);
1156                 return AE_ERROR;
1157         }
1158         if (obj->buffer.length != 8) {
1159                 pr_warn("Unknown buffer length %d\n", obj->buffer.length);
1160                 kfree(obj);
1161                 return AE_ERROR;
1162         }
1163
1164         return_value = *((struct wmid3_gds_return_value *)obj->buffer.pointer);
1165         kfree(obj);
1166
1167         if (return_value.error_code || return_value.ec_return_value)
1168                 pr_warn("Get 0x%x Device Status failed: 0x%x - 0x%x\n",
1169                         device,
1170                         return_value.error_code,
1171                         return_value.ec_return_value);
1172         else
1173                 *value = !!(return_value.devices & device);
1174
1175         return status;
1176 }
1177
1178 static acpi_status wmid_v2_get_u32(u32 *value, u32 cap)
1179 {
1180         u16 device;
1181
1182         switch (cap) {
1183         case ACER_CAP_WIRELESS:
1184                 device = ACER_WMID3_GDS_WIRELESS;
1185                 break;
1186         case ACER_CAP_BLUETOOTH:
1187                 device = ACER_WMID3_GDS_BLUETOOTH;
1188                 break;
1189         case ACER_CAP_THREEG:
1190                 device = ACER_WMID3_GDS_THREEG;
1191                 break;
1192         default:
1193                 return AE_ERROR;
1194         }
1195         return wmid3_get_device_status(value, device);
1196 }
1197
1198 static acpi_status wmid3_set_device_status(u32 value, u16 device)
1199 {
1200         struct wmid3_gds_return_value return_value;
1201         acpi_status status;
1202         union acpi_object *obj;
1203         u16 devices;
1204         struct wmid3_gds_get_input_param get_params = {
1205                 .function_num = 0x1,
1206                 .hotkey_number = commun_fn_key_number,
1207                 .devices = commun_func_bitmap,
1208         };
1209         struct acpi_buffer get_input = {
1210                 sizeof(struct wmid3_gds_get_input_param),
1211                 &get_params
1212         };
1213         struct wmid3_gds_set_input_param set_params = {
1214                 .function_num = 0x2,
1215                 .hotkey_number = commun_fn_key_number,
1216                 .devices = commun_func_bitmap,
1217         };
1218         struct acpi_buffer set_input = {
1219                 sizeof(struct wmid3_gds_set_input_param),
1220                 &set_params
1221         };
1222         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
1223         struct acpi_buffer output2 = { ACPI_ALLOCATE_BUFFER, NULL };
1224
1225         status = wmi_evaluate_method(WMID_GUID3, 0, 0x2, &get_input, &output);
1226         if (ACPI_FAILURE(status))
1227                 return status;
1228
1229         obj = output.pointer;
1230
1231         if (!obj)
1232                 return AE_ERROR;
1233         else if (obj->type != ACPI_TYPE_BUFFER) {
1234                 kfree(obj);
1235                 return AE_ERROR;
1236         }
1237         if (obj->buffer.length != 8) {
1238                 pr_warn("Unknown buffer length %d\n", obj->buffer.length);
1239                 kfree(obj);
1240                 return AE_ERROR;
1241         }
1242
1243         return_value = *((struct wmid3_gds_return_value *)obj->buffer.pointer);
1244         kfree(obj);
1245
1246         if (return_value.error_code || return_value.ec_return_value) {
1247                 pr_warn("Get Current Device Status failed: 0x%x - 0x%x\n",
1248                         return_value.error_code,
1249                         return_value.ec_return_value);
1250                 return status;
1251         }
1252
1253         devices = return_value.devices;
1254         set_params.devices = (value) ? (devices | device) : (devices & ~device);
1255
1256         status = wmi_evaluate_method(WMID_GUID3, 0, 0x1, &set_input, &output2);
1257         if (ACPI_FAILURE(status))
1258                 return status;
1259
1260         obj = output2.pointer;
1261
1262         if (!obj)
1263                 return AE_ERROR;
1264         else if (obj->type != ACPI_TYPE_BUFFER) {
1265                 kfree(obj);
1266                 return AE_ERROR;
1267         }
1268         if (obj->buffer.length != 4) {
1269                 pr_warn("Unknown buffer length %d\n", obj->buffer.length);
1270                 kfree(obj);
1271                 return AE_ERROR;
1272         }
1273
1274         return_value = *((struct wmid3_gds_return_value *)obj->buffer.pointer);
1275         kfree(obj);
1276
1277         if (return_value.error_code || return_value.ec_return_value)
1278                 pr_warn("Set Device Status failed: 0x%x - 0x%x\n",
1279                         return_value.error_code,
1280                         return_value.ec_return_value);
1281
1282         return status;
1283 }
1284
1285 static acpi_status wmid_v2_set_u32(u32 value, u32 cap)
1286 {
1287         u16 device;
1288
1289         switch (cap) {
1290         case ACER_CAP_WIRELESS:
1291                 device = ACER_WMID3_GDS_WIRELESS;
1292                 break;
1293         case ACER_CAP_BLUETOOTH:
1294                 device = ACER_WMID3_GDS_BLUETOOTH;
1295                 break;
1296         case ACER_CAP_THREEG:
1297                 device = ACER_WMID3_GDS_THREEG;
1298                 break;
1299         default:
1300                 return AE_ERROR;
1301         }
1302         return wmid3_set_device_status(value, device);
1303 }
1304
1305 static void __init type_aa_dmi_decode(const struct dmi_header *header, void *d)
1306 {
1307         struct hotkey_function_type_aa *type_aa;
1308
1309         /* We are looking for OEM-specific Type AAh */
1310         if (header->type != 0xAA)
1311                 return;
1312
1313         has_type_aa = true;
1314         type_aa = (struct hotkey_function_type_aa *) header;
1315
1316         pr_info("Function bitmap for Communication Button: 0x%x\n",
1317                 type_aa->commun_func_bitmap);
1318         commun_func_bitmap = type_aa->commun_func_bitmap;
1319
1320         if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_WIRELESS)
1321                 interface->capability |= ACER_CAP_WIRELESS;
1322         if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_THREEG)
1323                 interface->capability |= ACER_CAP_THREEG;
1324         if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_BLUETOOTH)
1325                 interface->capability |= ACER_CAP_BLUETOOTH;
1326         if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_RFBTN)
1327                 commun_func_bitmap &= ~ACER_WMID3_GDS_RFBTN;
1328
1329         commun_fn_key_number = type_aa->commun_fn_key_number;
1330 }
1331
1332 static acpi_status __init WMID_set_capabilities(void)
1333 {
1334         struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
1335         union acpi_object *obj;
1336         acpi_status status;
1337         u32 devices;
1338
1339         status = wmi_query_block(WMID_GUID2, 0, &out);
1340         if (ACPI_FAILURE(status))
1341                 return status;
1342
1343         obj = (union acpi_object *) out.pointer;
1344         if (obj) {
1345                 if (obj->type == ACPI_TYPE_BUFFER &&
1346                         (obj->buffer.length == sizeof(u32) ||
1347                         obj->buffer.length == sizeof(u64))) {
1348                         devices = *((u32 *) obj->buffer.pointer);
1349                 } else if (obj->type == ACPI_TYPE_INTEGER) {
1350                         devices = (u32) obj->integer.value;
1351                 } else {
1352                         kfree(out.pointer);
1353                         return AE_ERROR;
1354                 }
1355         } else {
1356                 kfree(out.pointer);
1357                 return AE_ERROR;
1358         }
1359
1360         pr_info("Function bitmap for Communication Device: 0x%x\n", devices);
1361         if (devices & 0x07)
1362                 interface->capability |= ACER_CAP_WIRELESS;
1363         if (devices & 0x40)
1364                 interface->capability |= ACER_CAP_THREEG;
1365         if (devices & 0x10)
1366                 interface->capability |= ACER_CAP_BLUETOOTH;
1367
1368         if (!(devices & 0x20))
1369                 max_brightness = 0x9;
1370
1371         kfree(out.pointer);
1372         return status;
1373 }
1374
1375 static struct wmi_interface wmid_interface = {
1376         .type = ACER_WMID,
1377 };
1378
1379 static struct wmi_interface wmid_v2_interface = {
1380         .type = ACER_WMID_v2,
1381 };
1382
1383 /*
1384  * Generic Device (interface-independent)
1385  */
1386
1387 static acpi_status get_u32(u32 *value, u32 cap)
1388 {
1389         acpi_status status = AE_ERROR;
1390
1391         switch (interface->type) {
1392         case ACER_AMW0:
1393                 status = AMW0_get_u32(value, cap);
1394                 break;
1395         case ACER_AMW0_V2:
1396                 if (cap == ACER_CAP_MAILLED) {
1397                         status = AMW0_get_u32(value, cap);
1398                         break;
1399                 }
1400         case ACER_WMID:
1401                 status = WMID_get_u32(value, cap);
1402                 break;
1403         case ACER_WMID_v2:
1404                 if (cap & (ACER_CAP_WIRELESS |
1405                            ACER_CAP_BLUETOOTH |
1406                            ACER_CAP_THREEG))
1407                         status = wmid_v2_get_u32(value, cap);
1408                 else if (wmi_has_guid(WMID_GUID2))
1409                         status = WMID_get_u32(value, cap);
1410                 break;
1411         }
1412
1413         return status;
1414 }
1415
1416 static acpi_status set_u32(u32 value, u32 cap)
1417 {
1418         acpi_status status;
1419
1420         if (interface->capability & cap) {
1421                 switch (interface->type) {
1422                 case ACER_AMW0:
1423                         return AMW0_set_u32(value, cap);
1424                 case ACER_AMW0_V2:
1425                         if (cap == ACER_CAP_MAILLED)
1426                                 return AMW0_set_u32(value, cap);
1427
1428                         /*
1429                          * On some models, some WMID methods don't toggle
1430                          * properly. For those cases, we want to run the AMW0
1431                          * method afterwards to be certain we've really toggled
1432                          * the device state.
1433                          */
1434                         if (cap == ACER_CAP_WIRELESS ||
1435                                 cap == ACER_CAP_BLUETOOTH) {
1436                                 status = WMID_set_u32(value, cap);
1437                                 if (ACPI_FAILURE(status))
1438                                         return status;
1439
1440                                 return AMW0_set_u32(value, cap);
1441                         }
1442                 case ACER_WMID:
1443                         return WMID_set_u32(value, cap);
1444                 case ACER_WMID_v2:
1445                         if (cap & (ACER_CAP_WIRELESS |
1446                                    ACER_CAP_BLUETOOTH |
1447                                    ACER_CAP_THREEG))
1448                                 return wmid_v2_set_u32(value, cap);
1449                         else if (wmi_has_guid(WMID_GUID2))
1450                                 return WMID_set_u32(value, cap);
1451                 default:
1452                         return AE_BAD_PARAMETER;
1453                 }
1454         }
1455         return AE_BAD_PARAMETER;
1456 }
1457
1458 static void __init acer_commandline_init(void)
1459 {
1460         /*
1461          * These will all fail silently if the value given is invalid, or the
1462          * capability isn't available on the given interface
1463          */
1464         if (mailled >= 0)
1465                 set_u32(mailled, ACER_CAP_MAILLED);
1466         if (!has_type_aa && threeg >= 0)
1467                 set_u32(threeg, ACER_CAP_THREEG);
1468         if (brightness >= 0)
1469                 set_u32(brightness, ACER_CAP_BRIGHTNESS);
1470 }
1471
1472 /*
1473  * LED device (Mail LED only, no other LEDs known yet)
1474  */
1475 static void mail_led_set(struct led_classdev *led_cdev,
1476 enum led_brightness value)
1477 {
1478         set_u32(value, ACER_CAP_MAILLED);
1479 }
1480
1481 static struct led_classdev mail_led = {
1482         .name = "acer-wmi::mail",
1483         .brightness_set = mail_led_set,
1484 };
1485
1486 static int acer_led_init(struct device *dev)
1487 {
1488         return led_classdev_register(dev, &mail_led);
1489 }
1490
1491 static void acer_led_exit(void)
1492 {
1493         set_u32(LED_OFF, ACER_CAP_MAILLED);
1494         led_classdev_unregister(&mail_led);
1495 }
1496
1497 /*
1498  * Backlight device
1499  */
1500 static struct backlight_device *acer_backlight_device;
1501
1502 static int read_brightness(struct backlight_device *bd)
1503 {
1504         u32 value;
1505         get_u32(&value, ACER_CAP_BRIGHTNESS);
1506         return value;
1507 }
1508
1509 static int update_bl_status(struct backlight_device *bd)
1510 {
1511         int intensity = bd->props.brightness;
1512
1513         if (bd->props.power != FB_BLANK_UNBLANK)
1514                 intensity = 0;
1515         if (bd->props.fb_blank != FB_BLANK_UNBLANK)
1516                 intensity = 0;
1517
1518         set_u32(intensity, ACER_CAP_BRIGHTNESS);
1519
1520         return 0;
1521 }
1522
1523 static const struct backlight_ops acer_bl_ops = {
1524         .get_brightness = read_brightness,
1525         .update_status = update_bl_status,
1526 };
1527
1528 static int acer_backlight_init(struct device *dev)
1529 {
1530         struct backlight_properties props;
1531         struct backlight_device *bd;
1532
1533         memset(&props, 0, sizeof(struct backlight_properties));
1534         props.type = BACKLIGHT_PLATFORM;
1535         props.max_brightness = max_brightness;
1536         bd = backlight_device_register("acer-wmi", dev, NULL, &acer_bl_ops,
1537                                        &props);
1538         if (IS_ERR(bd)) {
1539                 pr_err("Could not register Acer backlight device\n");
1540                 acer_backlight_device = NULL;
1541                 return PTR_ERR(bd);
1542         }
1543
1544         acer_backlight_device = bd;
1545
1546         bd->props.power = FB_BLANK_UNBLANK;
1547         bd->props.brightness = read_brightness(bd);
1548         backlight_update_status(bd);
1549         return 0;
1550 }
1551
1552 static void acer_backlight_exit(void)
1553 {
1554         backlight_device_unregister(acer_backlight_device);
1555 }
1556
1557 /*
1558  * Accelerometer device
1559  */
1560 static acpi_handle gsensor_handle;
1561
1562 static int acer_gsensor_init(void)
1563 {
1564         acpi_status status;
1565         struct acpi_buffer output;
1566         union acpi_object out_obj;
1567
1568         output.length = sizeof(out_obj);
1569         output.pointer = &out_obj;
1570         status = acpi_evaluate_object(gsensor_handle, "_INI", NULL, &output);
1571         if (ACPI_FAILURE(status))
1572                 return -1;
1573
1574         return 0;
1575 }
1576
1577 static int acer_gsensor_open(struct input_dev *input)
1578 {
1579         return acer_gsensor_init();
1580 }
1581
1582 static int acer_gsensor_event(void)
1583 {
1584         acpi_status status;
1585         struct acpi_buffer output;
1586         union acpi_object out_obj[5];
1587
1588         if (!acer_wmi_accel_dev)
1589                 return -1;
1590
1591         output.length = sizeof(out_obj);
1592         output.pointer = out_obj;
1593
1594         status = acpi_evaluate_object(gsensor_handle, "RDVL", NULL, &output);
1595         if (ACPI_FAILURE(status))
1596                 return -1;
1597
1598         if (out_obj->package.count != 4)
1599                 return -1;
1600
1601         input_report_abs(acer_wmi_accel_dev, ABS_X,
1602                 (s16)out_obj->package.elements[0].integer.value);
1603         input_report_abs(acer_wmi_accel_dev, ABS_Y,
1604                 (s16)out_obj->package.elements[1].integer.value);
1605         input_report_abs(acer_wmi_accel_dev, ABS_Z,
1606                 (s16)out_obj->package.elements[2].integer.value);
1607         input_sync(acer_wmi_accel_dev);
1608         return 0;
1609 }
1610
1611 /*
1612  * Switch series keyboard dock status
1613  */
1614 static int acer_kbd_dock_state_to_sw_tablet_mode(u8 kbd_dock_state)
1615 {
1616         switch (kbd_dock_state) {
1617         case 0x01: /* Docked, traditional clamshell laptop mode */
1618                 return 0;
1619         case 0x04: /* Stand-alone tablet */
1620         case 0x40: /* Docked, tent mode, keyboard not usable */
1621                 return 1;
1622         default:
1623                 pr_warn("Unknown kbd_dock_state 0x%02x\n", kbd_dock_state);
1624         }
1625
1626         return 0;
1627 }
1628
1629 static void acer_kbd_dock_get_initial_state(void)
1630 {
1631         u8 *output, input[8] = { 0x05, 0x00, };
1632         struct acpi_buffer input_buf = { sizeof(input), input };
1633         struct acpi_buffer output_buf = { ACPI_ALLOCATE_BUFFER, NULL };
1634         union acpi_object *obj;
1635         acpi_status status;
1636         int sw_tablet_mode;
1637
1638         status = wmi_evaluate_method(WMID_GUID3, 0, 0x2, &input_buf, &output_buf);
1639         if (ACPI_FAILURE(status)) {
1640                 ACPI_EXCEPTION((AE_INFO, status, "Error getting keyboard-dock initial status"));
1641                 return;
1642         }
1643
1644         obj = output_buf.pointer;
1645         if (!obj || obj->type != ACPI_TYPE_BUFFER || obj->buffer.length != 8) {
1646                 pr_err("Unexpected output format getting keyboard-dock initial status\n");
1647                 goto out_free_obj;
1648         }
1649
1650         output = obj->buffer.pointer;
1651         if (output[0] != 0x00 || (output[3] != 0x05 && output[3] != 0x45)) {
1652                 pr_err("Unexpected output [0]=0x%02x [3]=0x%02x getting keyboard-dock initial status\n",
1653                        output[0], output[3]);
1654                 goto out_free_obj;
1655         }
1656
1657         sw_tablet_mode = acer_kbd_dock_state_to_sw_tablet_mode(output[4]);
1658         input_report_switch(acer_wmi_input_dev, SW_TABLET_MODE, sw_tablet_mode);
1659
1660 out_free_obj:
1661         kfree(obj);
1662 }
1663
1664 static void acer_kbd_dock_event(const struct event_return_value *event)
1665 {
1666         int sw_tablet_mode;
1667
1668         if (!has_cap(ACER_CAP_KBD_DOCK))
1669                 return;
1670
1671         sw_tablet_mode = acer_kbd_dock_state_to_sw_tablet_mode(event->kbd_dock_state);
1672         input_report_switch(acer_wmi_input_dev, SW_TABLET_MODE, sw_tablet_mode);
1673         input_sync(acer_wmi_input_dev);
1674 }
1675
1676 /*
1677  * Rfkill devices
1678  */
1679 static void acer_rfkill_update(struct work_struct *ignored);
1680 static DECLARE_DELAYED_WORK(acer_rfkill_work, acer_rfkill_update);
1681 static void acer_rfkill_update(struct work_struct *ignored)
1682 {
1683         u32 state;
1684         acpi_status status;
1685
1686         if (has_cap(ACER_CAP_WIRELESS)) {
1687                 status = get_u32(&state, ACER_CAP_WIRELESS);
1688                 if (ACPI_SUCCESS(status)) {
1689                         if (quirks->wireless == 3)
1690                                 rfkill_set_hw_state(wireless_rfkill, !state);
1691                         else
1692                                 rfkill_set_sw_state(wireless_rfkill, !state);
1693                 }
1694         }
1695
1696         if (has_cap(ACER_CAP_BLUETOOTH)) {
1697                 status = get_u32(&state, ACER_CAP_BLUETOOTH);
1698                 if (ACPI_SUCCESS(status))
1699                         rfkill_set_sw_state(bluetooth_rfkill, !state);
1700         }
1701
1702         if (has_cap(ACER_CAP_THREEG) && wmi_has_guid(WMID_GUID3)) {
1703                 status = get_u32(&state, ACER_WMID3_GDS_THREEG);
1704                 if (ACPI_SUCCESS(status))
1705                         rfkill_set_sw_state(threeg_rfkill, !state);
1706         }
1707
1708         schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ));
1709 }
1710
1711 static int acer_rfkill_set(void *data, bool blocked)
1712 {
1713         acpi_status status;
1714         u32 cap = (unsigned long)data;
1715
1716         if (rfkill_inited) {
1717                 status = set_u32(!blocked, cap);
1718                 if (ACPI_FAILURE(status))
1719                         return -ENODEV;
1720         }
1721
1722         return 0;
1723 }
1724
1725 static const struct rfkill_ops acer_rfkill_ops = {
1726         .set_block = acer_rfkill_set,
1727 };
1728
1729 static struct rfkill *acer_rfkill_register(struct device *dev,
1730                                            enum rfkill_type type,
1731                                            char *name, u32 cap)
1732 {
1733         int err;
1734         struct rfkill *rfkill_dev;
1735         u32 state;
1736         acpi_status status;
1737
1738         rfkill_dev = rfkill_alloc(name, dev, type,
1739                                   &acer_rfkill_ops,
1740                                   (void *)(unsigned long)cap);
1741         if (!rfkill_dev)
1742                 return ERR_PTR(-ENOMEM);
1743
1744         status = get_u32(&state, cap);
1745
1746         err = rfkill_register(rfkill_dev);
1747         if (err) {
1748                 rfkill_destroy(rfkill_dev);
1749                 return ERR_PTR(err);
1750         }
1751
1752         if (ACPI_SUCCESS(status))
1753                 rfkill_set_sw_state(rfkill_dev, !state);
1754
1755         return rfkill_dev;
1756 }
1757
1758 static int acer_rfkill_init(struct device *dev)
1759 {
1760         int err;
1761
1762         if (has_cap(ACER_CAP_WIRELESS)) {
1763                 wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN,
1764                         "acer-wireless", ACER_CAP_WIRELESS);
1765                 if (IS_ERR(wireless_rfkill)) {
1766                         err = PTR_ERR(wireless_rfkill);
1767                         goto error_wireless;
1768                 }
1769         }
1770
1771         if (has_cap(ACER_CAP_BLUETOOTH)) {
1772                 bluetooth_rfkill = acer_rfkill_register(dev,
1773                         RFKILL_TYPE_BLUETOOTH, "acer-bluetooth",
1774                         ACER_CAP_BLUETOOTH);
1775                 if (IS_ERR(bluetooth_rfkill)) {
1776                         err = PTR_ERR(bluetooth_rfkill);
1777                         goto error_bluetooth;
1778                 }
1779         }
1780
1781         if (has_cap(ACER_CAP_THREEG)) {
1782                 threeg_rfkill = acer_rfkill_register(dev,
1783                         RFKILL_TYPE_WWAN, "acer-threeg",
1784                         ACER_CAP_THREEG);
1785                 if (IS_ERR(threeg_rfkill)) {
1786                         err = PTR_ERR(threeg_rfkill);
1787                         goto error_threeg;
1788                 }
1789         }
1790
1791         rfkill_inited = true;
1792
1793         if ((ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID)) &&
1794             has_cap(ACER_CAP_WIRELESS | ACER_CAP_BLUETOOTH | ACER_CAP_THREEG))
1795                 schedule_delayed_work(&acer_rfkill_work,
1796                         round_jiffies_relative(HZ));
1797
1798         return 0;
1799
1800 error_threeg:
1801         if (has_cap(ACER_CAP_BLUETOOTH)) {
1802                 rfkill_unregister(bluetooth_rfkill);
1803                 rfkill_destroy(bluetooth_rfkill);
1804         }
1805 error_bluetooth:
1806         if (has_cap(ACER_CAP_WIRELESS)) {
1807                 rfkill_unregister(wireless_rfkill);
1808                 rfkill_destroy(wireless_rfkill);
1809         }
1810 error_wireless:
1811         return err;
1812 }
1813
1814 static void acer_rfkill_exit(void)
1815 {
1816         if ((ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID)) &&
1817             has_cap(ACER_CAP_WIRELESS | ACER_CAP_BLUETOOTH | ACER_CAP_THREEG))
1818                 cancel_delayed_work_sync(&acer_rfkill_work);
1819
1820         if (has_cap(ACER_CAP_WIRELESS)) {
1821                 rfkill_unregister(wireless_rfkill);
1822                 rfkill_destroy(wireless_rfkill);
1823         }
1824
1825         if (has_cap(ACER_CAP_BLUETOOTH)) {
1826                 rfkill_unregister(bluetooth_rfkill);
1827                 rfkill_destroy(bluetooth_rfkill);
1828         }
1829
1830         if (has_cap(ACER_CAP_THREEG)) {
1831                 rfkill_unregister(threeg_rfkill);
1832                 rfkill_destroy(threeg_rfkill);
1833         }
1834         return;
1835 }
1836
1837 static void acer_wmi_notify(u32 value, void *context)
1838 {
1839         struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
1840         union acpi_object *obj;
1841         struct event_return_value return_value;
1842         acpi_status status;
1843         u16 device_state;
1844         const struct key_entry *key;
1845         u32 scancode;
1846
1847         status = wmi_get_event_data(value, &response);
1848         if (status != AE_OK) {
1849                 pr_warn("bad event status 0x%x\n", status);
1850                 return;
1851         }
1852
1853         obj = (union acpi_object *)response.pointer;
1854
1855         if (!obj)
1856                 return;
1857         if (obj->type != ACPI_TYPE_BUFFER) {
1858                 pr_warn("Unknown response received %d\n", obj->type);
1859                 kfree(obj);
1860                 return;
1861         }
1862         if (obj->buffer.length != 8) {
1863                 pr_warn("Unknown buffer length %d\n", obj->buffer.length);
1864                 kfree(obj);
1865                 return;
1866         }
1867
1868         return_value = *((struct event_return_value *)obj->buffer.pointer);
1869         kfree(obj);
1870
1871         switch (return_value.function) {
1872         case WMID_HOTKEY_EVENT:
1873                 device_state = return_value.device_state;
1874                 pr_debug("device state: 0x%x\n", device_state);
1875
1876                 key = sparse_keymap_entry_from_scancode(acer_wmi_input_dev,
1877                                                         return_value.key_num);
1878                 if (!key) {
1879                         pr_warn("Unknown key number - 0x%x\n",
1880                                 return_value.key_num);
1881                 } else {
1882                         scancode = return_value.key_num;
1883                         switch (key->keycode) {
1884                         case KEY_WLAN:
1885                         case KEY_BLUETOOTH:
1886                                 if (has_cap(ACER_CAP_WIRELESS))
1887                                         rfkill_set_sw_state(wireless_rfkill,
1888                                                 !(device_state & ACER_WMID3_GDS_WIRELESS));
1889                                 if (has_cap(ACER_CAP_THREEG))
1890                                         rfkill_set_sw_state(threeg_rfkill,
1891                                                 !(device_state & ACER_WMID3_GDS_THREEG));
1892                                 if (has_cap(ACER_CAP_BLUETOOTH))
1893                                         rfkill_set_sw_state(bluetooth_rfkill,
1894                                                 !(device_state & ACER_WMID3_GDS_BLUETOOTH));
1895                                 break;
1896                         case KEY_TOUCHPAD_TOGGLE:
1897                                 scancode = (device_state & ACER_WMID3_GDS_TOUCHPAD) ?
1898                                                 KEY_TOUCHPAD_ON : KEY_TOUCHPAD_OFF;
1899                         }
1900                         sparse_keymap_report_event(acer_wmi_input_dev, scancode, 1, true);
1901                 }
1902                 break;
1903         case WMID_ACCEL_OR_KBD_DOCK_EVENT:
1904                 acer_gsensor_event();
1905                 acer_kbd_dock_event(&return_value);
1906                 break;
1907         default:
1908                 pr_warn("Unknown function number - %d - %d\n",
1909                         return_value.function, return_value.key_num);
1910                 break;
1911         }
1912 }
1913
1914 static acpi_status __init
1915 wmid3_set_function_mode(struct func_input_params *params,
1916                         struct func_return_value *return_value)
1917 {
1918         acpi_status status;
1919         union acpi_object *obj;
1920
1921         struct acpi_buffer input = { sizeof(struct func_input_params), params };
1922         struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
1923
1924         status = wmi_evaluate_method(WMID_GUID3, 0, 0x1, &input, &output);
1925         if (ACPI_FAILURE(status))
1926                 return status;
1927
1928         obj = output.pointer;
1929
1930         if (!obj)
1931                 return AE_ERROR;
1932         else if (obj->type != ACPI_TYPE_BUFFER) {
1933                 kfree(obj);
1934                 return AE_ERROR;
1935         }
1936         if (obj->buffer.length != 4) {
1937                 pr_warn("Unknown buffer length %d\n", obj->buffer.length);
1938                 kfree(obj);
1939                 return AE_ERROR;
1940         }
1941
1942         *return_value = *((struct func_return_value *)obj->buffer.pointer);
1943         kfree(obj);
1944
1945         return status;
1946 }
1947
1948 static int __init acer_wmi_enable_ec_raw(void)
1949 {
1950         struct func_return_value return_value;
1951         acpi_status status;
1952         struct func_input_params params = {
1953                 .function_num = 0x1,
1954                 .commun_devices = 0xFFFF,
1955                 .devices = 0xFFFF,
1956                 .app_status = 0x00,             /* Launch Manager Deactive */
1957                 .app_mask = 0x01,
1958         };
1959
1960         status = wmid3_set_function_mode(&params, &return_value);
1961
1962         if (return_value.error_code || return_value.ec_return_value)
1963                 pr_warn("Enabling EC raw mode failed: 0x%x - 0x%x\n",
1964                         return_value.error_code,
1965                         return_value.ec_return_value);
1966         else
1967                 pr_info("Enabled EC raw mode\n");
1968
1969         return status;
1970 }
1971
1972 static int __init acer_wmi_enable_lm(void)
1973 {
1974         struct func_return_value return_value;
1975         acpi_status status;
1976         struct func_input_params params = {
1977                 .function_num = 0x1,
1978                 .commun_devices = 0xFFFF,
1979                 .devices = 0xFFFF,
1980                 .app_status = 0x01,            /* Launch Manager Active */
1981                 .app_mask = 0x01,
1982         };
1983
1984         status = wmid3_set_function_mode(&params, &return_value);
1985
1986         if (return_value.error_code || return_value.ec_return_value)
1987                 pr_warn("Enabling Launch Manager failed: 0x%x - 0x%x\n",
1988                         return_value.error_code,
1989                         return_value.ec_return_value);
1990
1991         return status;
1992 }
1993
1994 static int __init acer_wmi_enable_rf_button(void)
1995 {
1996         struct func_return_value return_value;
1997         acpi_status status;
1998         struct func_input_params params = {
1999                 .function_num = 0x1,
2000                 .commun_devices = 0xFFFF,
2001                 .devices = 0xFFFF,
2002                 .app_status = 0x10,            /* RF Button Active */
2003                 .app_mask = 0x10,
2004         };
2005
2006         status = wmid3_set_function_mode(&params, &return_value);
2007
2008         if (return_value.error_code || return_value.ec_return_value)
2009                 pr_warn("Enabling RF Button failed: 0x%x - 0x%x\n",
2010                         return_value.error_code,
2011                         return_value.ec_return_value);
2012
2013         return status;
2014 }
2015
2016 #define ACER_WMID_ACCEL_HID     "BST0001"
2017
2018 static acpi_status __init acer_wmi_get_handle_cb(acpi_handle ah, u32 level,
2019                                                 void *ctx, void **retval)
2020 {
2021         struct acpi_device *dev;
2022
2023         if (!strcmp(ctx, "SENR")) {
2024                 if (acpi_bus_get_device(ah, &dev))
2025                         return AE_OK;
2026                 if (strcmp(ACER_WMID_ACCEL_HID, acpi_device_hid(dev)))
2027                         return AE_OK;
2028         } else
2029                 return AE_OK;
2030
2031         *(acpi_handle *)retval = ah;
2032
2033         return AE_CTRL_TERMINATE;
2034 }
2035
2036 static int __init acer_wmi_get_handle(const char *name, const char *prop,
2037                                         acpi_handle *ah)
2038 {
2039         acpi_status status;
2040         acpi_handle handle;
2041
2042         BUG_ON(!name || !ah);
2043
2044         handle = NULL;
2045         status = acpi_get_devices(prop, acer_wmi_get_handle_cb,
2046                                         (void *)name, &handle);
2047         if (ACPI_SUCCESS(status) && handle) {
2048                 *ah = handle;
2049                 return 0;
2050         } else {
2051                 return -ENODEV;
2052         }
2053 }
2054
2055 static int __init acer_wmi_accel_setup(void)
2056 {
2057         int err;
2058
2059         err = acer_wmi_get_handle("SENR", ACER_WMID_ACCEL_HID, &gsensor_handle);
2060         if (err)
2061                 return err;
2062
2063         acer_wmi_accel_dev = input_allocate_device();
2064         if (!acer_wmi_accel_dev)
2065                 return -ENOMEM;
2066
2067         acer_wmi_accel_dev->open = acer_gsensor_open;
2068
2069         acer_wmi_accel_dev->name = "Acer BMA150 accelerometer";
2070         acer_wmi_accel_dev->phys = "wmi/input1";
2071         acer_wmi_accel_dev->id.bustype = BUS_HOST;
2072         acer_wmi_accel_dev->evbit[0] = BIT_MASK(EV_ABS);
2073         input_set_abs_params(acer_wmi_accel_dev, ABS_X, -16384, 16384, 0, 0);
2074         input_set_abs_params(acer_wmi_accel_dev, ABS_Y, -16384, 16384, 0, 0);
2075         input_set_abs_params(acer_wmi_accel_dev, ABS_Z, -16384, 16384, 0, 0);
2076
2077         err = input_register_device(acer_wmi_accel_dev);
2078         if (err)
2079                 goto err_free_dev;
2080
2081         return 0;
2082
2083 err_free_dev:
2084         input_free_device(acer_wmi_accel_dev);
2085         return err;
2086 }
2087
2088 static int __init acer_wmi_input_setup(void)
2089 {
2090         acpi_status status;
2091         int err;
2092
2093         acer_wmi_input_dev = input_allocate_device();
2094         if (!acer_wmi_input_dev)
2095                 return -ENOMEM;
2096
2097         acer_wmi_input_dev->name = "Acer WMI hotkeys";
2098         acer_wmi_input_dev->phys = "wmi/input0";
2099         acer_wmi_input_dev->id.bustype = BUS_HOST;
2100
2101         err = sparse_keymap_setup(acer_wmi_input_dev, acer_wmi_keymap, NULL);
2102         if (err)
2103                 goto err_free_dev;
2104
2105         if (has_cap(ACER_CAP_KBD_DOCK))
2106                 input_set_capability(acer_wmi_input_dev, EV_SW, SW_TABLET_MODE);
2107
2108         status = wmi_install_notify_handler(ACERWMID_EVENT_GUID,
2109                                                 acer_wmi_notify, NULL);
2110         if (ACPI_FAILURE(status)) {
2111                 err = -EIO;
2112                 goto err_free_dev;
2113         }
2114
2115         if (has_cap(ACER_CAP_KBD_DOCK))
2116                 acer_kbd_dock_get_initial_state();
2117
2118         err = input_register_device(acer_wmi_input_dev);
2119         if (err)
2120                 goto err_uninstall_notifier;
2121
2122         return 0;
2123
2124 err_uninstall_notifier:
2125         wmi_remove_notify_handler(ACERWMID_EVENT_GUID);
2126 err_free_dev:
2127         input_free_device(acer_wmi_input_dev);
2128         return err;
2129 }
2130
2131 static void acer_wmi_input_destroy(void)
2132 {
2133         wmi_remove_notify_handler(ACERWMID_EVENT_GUID);
2134         input_unregister_device(acer_wmi_input_dev);
2135 }
2136
2137 /*
2138  * debugfs functions
2139  */
2140 static u32 get_wmid_devices(void)
2141 {
2142         struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
2143         union acpi_object *obj;
2144         acpi_status status;
2145         u32 devices = 0;
2146
2147         status = wmi_query_block(WMID_GUID2, 0, &out);
2148         if (ACPI_FAILURE(status))
2149                 return 0;
2150
2151         obj = (union acpi_object *) out.pointer;
2152         if (obj) {
2153                 if (obj->type == ACPI_TYPE_BUFFER &&
2154                         (obj->buffer.length == sizeof(u32) ||
2155                         obj->buffer.length == sizeof(u64))) {
2156                         devices = *((u32 *) obj->buffer.pointer);
2157                 } else if (obj->type == ACPI_TYPE_INTEGER) {
2158                         devices = (u32) obj->integer.value;
2159                 }
2160         }
2161
2162         kfree(out.pointer);
2163         return devices;
2164 }
2165
2166 /*
2167  * Platform device
2168  */
2169 static int acer_platform_probe(struct platform_device *device)
2170 {
2171         int err;
2172
2173         if (has_cap(ACER_CAP_MAILLED)) {
2174                 err = acer_led_init(&device->dev);
2175                 if (err)
2176                         goto error_mailled;
2177         }
2178
2179         if (has_cap(ACER_CAP_BRIGHTNESS)) {
2180                 err = acer_backlight_init(&device->dev);
2181                 if (err)
2182                         goto error_brightness;
2183         }
2184
2185         err = acer_rfkill_init(&device->dev);
2186         if (err)
2187                 goto error_rfkill;
2188
2189         return err;
2190
2191 error_rfkill:
2192         if (has_cap(ACER_CAP_BRIGHTNESS))
2193                 acer_backlight_exit();
2194 error_brightness:
2195         if (has_cap(ACER_CAP_MAILLED))
2196                 acer_led_exit();
2197 error_mailled:
2198         return err;
2199 }
2200
2201 static int acer_platform_remove(struct platform_device *device)
2202 {
2203         if (has_cap(ACER_CAP_MAILLED))
2204                 acer_led_exit();
2205         if (has_cap(ACER_CAP_BRIGHTNESS))
2206                 acer_backlight_exit();
2207
2208         acer_rfkill_exit();
2209         return 0;
2210 }
2211
2212 #ifdef CONFIG_PM_SLEEP
2213 static int acer_suspend(struct device *dev)
2214 {
2215         u32 value;
2216         struct acer_data *data = &interface->data;
2217
2218         if (!data)
2219                 return -ENOMEM;
2220
2221         if (has_cap(ACER_CAP_MAILLED)) {
2222                 get_u32(&value, ACER_CAP_MAILLED);
2223                 set_u32(LED_OFF, ACER_CAP_MAILLED);
2224                 data->mailled = value;
2225         }
2226
2227         if (has_cap(ACER_CAP_BRIGHTNESS)) {
2228                 get_u32(&value, ACER_CAP_BRIGHTNESS);
2229                 data->brightness = value;
2230         }
2231
2232         return 0;
2233 }
2234
2235 static int acer_resume(struct device *dev)
2236 {
2237         struct acer_data *data = &interface->data;
2238
2239         if (!data)
2240                 return -ENOMEM;
2241
2242         if (has_cap(ACER_CAP_MAILLED))
2243                 set_u32(data->mailled, ACER_CAP_MAILLED);
2244
2245         if (has_cap(ACER_CAP_BRIGHTNESS))
2246                 set_u32(data->brightness, ACER_CAP_BRIGHTNESS);
2247
2248         if (acer_wmi_accel_dev)
2249                 acer_gsensor_init();
2250
2251         return 0;
2252 }
2253 #else
2254 #define acer_suspend    NULL
2255 #define acer_resume     NULL
2256 #endif
2257
2258 static SIMPLE_DEV_PM_OPS(acer_pm, acer_suspend, acer_resume);
2259
2260 static void acer_platform_shutdown(struct platform_device *device)
2261 {
2262         struct acer_data *data = &interface->data;
2263
2264         if (!data)
2265                 return;
2266
2267         if (has_cap(ACER_CAP_MAILLED))
2268                 set_u32(LED_OFF, ACER_CAP_MAILLED);
2269 }
2270
2271 static struct platform_driver acer_platform_driver = {
2272         .driver = {
2273                 .name = "acer-wmi",
2274                 .pm = &acer_pm,
2275         },
2276         .probe = acer_platform_probe,
2277         .remove = acer_platform_remove,
2278         .shutdown = acer_platform_shutdown,
2279 };
2280
2281 static struct platform_device *acer_platform_device;
2282
2283 static void remove_debugfs(void)
2284 {
2285         debugfs_remove(interface->debug.devices);
2286         debugfs_remove(interface->debug.root);
2287 }
2288
2289 static int __init create_debugfs(void)
2290 {
2291         interface->debug.root = debugfs_create_dir("acer-wmi", NULL);
2292         if (!interface->debug.root) {
2293                 pr_err("Failed to create debugfs directory");
2294                 return -ENOMEM;
2295         }
2296
2297         interface->debug.devices = debugfs_create_u32("devices", S_IRUGO,
2298                                         interface->debug.root,
2299                                         &interface->debug.wmid_devices);
2300         if (!interface->debug.devices)
2301                 goto error_debugfs;
2302
2303         return 0;
2304
2305 error_debugfs:
2306         remove_debugfs();
2307         return -ENOMEM;
2308 }
2309
2310 static int __init acer_wmi_init(void)
2311 {
2312         int err;
2313
2314         pr_info("Acer Laptop ACPI-WMI Extras\n");
2315
2316         if (dmi_check_system(acer_blacklist)) {
2317                 pr_info("Blacklisted hardware detected - not loading\n");
2318                 return -ENODEV;
2319         }
2320
2321         find_quirks();
2322
2323         /*
2324          * The AMW0_GUID1 wmi is not only found on Acer family but also other
2325          * machines like Lenovo, Fujitsu and Medion. In the past days,
2326          * acer-wmi driver handled those non-Acer machines by quirks list.
2327          * But actually acer-wmi driver was loaded on any machines that have
2328          * AMW0_GUID1. This behavior is strange because those machines should
2329          * be supported by appropriate wmi drivers. e.g. fujitsu-laptop,
2330          * ideapad-laptop. So, here checks the machine that has AMW0_GUID1
2331          * should be in Acer/Gateway/Packard Bell white list, or it's already
2332          * in the past quirk list.
2333          */
2334         if (wmi_has_guid(AMW0_GUID1) &&
2335             !dmi_check_system(amw0_whitelist) &&
2336             quirks == &quirk_unknown) {
2337                 pr_debug("Unsupported machine has AMW0_GUID1, unable to load\n");
2338                 return -ENODEV;
2339         }
2340
2341         /*
2342          * Detect which ACPI-WMI interface we're using.
2343          */
2344         if (wmi_has_guid(AMW0_GUID1) && wmi_has_guid(WMID_GUID1))
2345                 interface = &AMW0_V2_interface;
2346
2347         if (!wmi_has_guid(AMW0_GUID1) && wmi_has_guid(WMID_GUID1))
2348                 interface = &wmid_interface;
2349
2350         if (wmi_has_guid(WMID_GUID3))
2351                 interface = &wmid_v2_interface;
2352
2353         if (interface)
2354                 dmi_walk(type_aa_dmi_decode, NULL);
2355
2356         if (wmi_has_guid(WMID_GUID2) && interface) {
2357                 if (!has_type_aa && ACPI_FAILURE(WMID_set_capabilities())) {
2358                         pr_err("Unable to detect available WMID devices\n");
2359                         return -ENODEV;
2360                 }
2361                 /* WMID always provides brightness methods */
2362                 interface->capability |= ACER_CAP_BRIGHTNESS;
2363         } else if (!wmi_has_guid(WMID_GUID2) && interface && !has_type_aa && force_caps == -1) {
2364                 pr_err("No WMID device detection method found\n");
2365                 return -ENODEV;
2366         }
2367
2368         if (wmi_has_guid(AMW0_GUID1) && !wmi_has_guid(WMID_GUID1)) {
2369                 interface = &AMW0_interface;
2370
2371                 if (ACPI_FAILURE(AMW0_set_capabilities())) {
2372                         pr_err("Unable to detect available AMW0 devices\n");
2373                         return -ENODEV;
2374                 }
2375         }
2376
2377         if (wmi_has_guid(AMW0_GUID1))
2378                 AMW0_find_mailled();
2379
2380         if (!interface) {
2381                 pr_err("No or unsupported WMI interface, unable to load\n");
2382                 return -ENODEV;
2383         }
2384
2385         set_quirks();
2386
2387         if (dmi_check_system(video_vendor_dmi_table))
2388                 acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
2389
2390         if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
2391                 interface->capability &= ~ACER_CAP_BRIGHTNESS;
2392
2393         if (wmi_has_guid(WMID_GUID3))
2394                 interface->capability |= ACER_CAP_SET_FUNCTION_MODE;
2395
2396         if (force_caps != -1)
2397                 interface->capability = force_caps;
2398
2399         if (wmi_has_guid(WMID_GUID3) &&
2400             (interface->capability & ACER_CAP_SET_FUNCTION_MODE)) {
2401                 if (ACPI_FAILURE(acer_wmi_enable_rf_button()))
2402                         pr_warn("Cannot enable RF Button Driver\n");
2403
2404                 if (ec_raw_mode) {
2405                         if (ACPI_FAILURE(acer_wmi_enable_ec_raw())) {
2406                                 pr_err("Cannot enable EC raw mode\n");
2407                                 return -ENODEV;
2408                         }
2409                 } else if (ACPI_FAILURE(acer_wmi_enable_lm())) {
2410                         pr_err("Cannot enable Launch Manager mode\n");
2411                         return -ENODEV;
2412                 }
2413         } else if (ec_raw_mode) {
2414                 pr_info("No WMID EC raw mode enable method\n");
2415         }
2416
2417         if (wmi_has_guid(ACERWMID_EVENT_GUID)) {
2418                 err = acer_wmi_input_setup();
2419                 if (err)
2420                         return err;
2421                 err = acer_wmi_accel_setup();
2422                 if (err && err != -ENODEV)
2423                         pr_warn("Cannot enable accelerometer\n");
2424         }
2425
2426         err = platform_driver_register(&acer_platform_driver);
2427         if (err) {
2428                 pr_err("Unable to register platform driver\n");
2429                 goto error_platform_register;
2430         }
2431
2432         acer_platform_device = platform_device_alloc("acer-wmi", -1);
2433         if (!acer_platform_device) {
2434                 err = -ENOMEM;
2435                 goto error_device_alloc;
2436         }
2437
2438         err = platform_device_add(acer_platform_device);
2439         if (err)
2440                 goto error_device_add;
2441
2442         if (wmi_has_guid(WMID_GUID2)) {
2443                 interface->debug.wmid_devices = get_wmid_devices();
2444                 err = create_debugfs();
2445                 if (err)
2446                         goto error_create_debugfs;
2447         }
2448
2449         /* Override any initial settings with values from the commandline */
2450         acer_commandline_init();
2451
2452         return 0;
2453
2454 error_create_debugfs:
2455         platform_device_del(acer_platform_device);
2456 error_device_add:
2457         platform_device_put(acer_platform_device);
2458 error_device_alloc:
2459         platform_driver_unregister(&acer_platform_driver);
2460 error_platform_register:
2461         if (wmi_has_guid(ACERWMID_EVENT_GUID))
2462                 acer_wmi_input_destroy();
2463         if (acer_wmi_accel_dev)
2464                 input_unregister_device(acer_wmi_accel_dev);
2465
2466         return err;
2467 }
2468
2469 static void __exit acer_wmi_exit(void)
2470 {
2471         if (wmi_has_guid(ACERWMID_EVENT_GUID))
2472                 acer_wmi_input_destroy();
2473
2474         if (acer_wmi_accel_dev)
2475                 input_unregister_device(acer_wmi_accel_dev);
2476
2477         remove_debugfs();
2478         platform_device_unregister(acer_platform_device);
2479         platform_driver_unregister(&acer_platform_driver);
2480
2481         pr_info("Acer Laptop WMI Extras unloaded\n");
2482         return;
2483 }
2484
2485 module_init(acer_wmi_init);
2486 module_exit(acer_wmi_exit);