0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/init.h>
0013 #include <linux/input.h>
0014 #include <linux/input/sparse-keymap.h>
0015 #include <linux/fb.h>
0016 #include <linux/dmi.h>
0017 #include <linux/i8042.h>
0018
0019 #include "asus-wmi.h"
0020
0021 #define ASUS_NB_WMI_FILE "asus-nb-wmi"
0022
0023 MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>");
0024 MODULE_DESCRIPTION("Asus Notebooks WMI Hotkey Driver");
0025 MODULE_LICENSE("GPL");
0026
0027 #define ASUS_NB_WMI_EVENT_GUID "0B3CBB35-E3C2-45ED-91C2-4C5A6D195D1C"
0028
0029 MODULE_ALIAS("wmi:"ASUS_NB_WMI_EVENT_GUID);
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 static int wapf = -1;
0041 module_param(wapf, uint, 0444);
0042 MODULE_PARM_DESC(wapf, "WAPF value");
0043
0044 static int tablet_mode_sw = -1;
0045 module_param(tablet_mode_sw, uint, 0444);
0046 MODULE_PARM_DESC(tablet_mode_sw, "Tablet mode detect: -1:auto 0:disable 1:kbd-dock 2:lid-flip");
0047
0048 static struct quirk_entry *quirks;
0049
0050 static bool asus_q500a_i8042_filter(unsigned char data, unsigned char str,
0051 struct serio *port)
0052 {
0053 static bool extended;
0054 bool ret = false;
0055
0056 if (str & I8042_STR_AUXDATA)
0057 return false;
0058
0059 if (unlikely(data == 0xe1)) {
0060 extended = true;
0061 ret = true;
0062 } else if (unlikely(extended)) {
0063 extended = false;
0064 ret = true;
0065 }
0066
0067 return ret;
0068 }
0069
0070 static struct quirk_entry quirk_asus_unknown = {
0071 .wapf = 0,
0072 .wmi_backlight_set_devstate = true,
0073 };
0074
0075 static struct quirk_entry quirk_asus_q500a = {
0076 .i8042_filter = asus_q500a_i8042_filter,
0077 .wmi_backlight_set_devstate = true,
0078 };
0079
0080
0081
0082
0083
0084
0085 static struct quirk_entry quirk_asus_x55u = {
0086 .wapf = 4,
0087 .wmi_backlight_power = true,
0088 .wmi_backlight_set_devstate = true,
0089 .no_display_toggle = true,
0090 };
0091
0092 static struct quirk_entry quirk_asus_wapf4 = {
0093 .wapf = 4,
0094 .wmi_backlight_set_devstate = true,
0095 };
0096
0097 static struct quirk_entry quirk_asus_x200ca = {
0098 .wapf = 2,
0099 .wmi_backlight_set_devstate = true,
0100 };
0101
0102 static struct quirk_entry quirk_asus_ux303ub = {
0103 .wmi_backlight_native = true,
0104 .wmi_backlight_set_devstate = true,
0105 };
0106
0107 static struct quirk_entry quirk_asus_x550lb = {
0108 .wmi_backlight_set_devstate = true,
0109 .xusb2pr = 0x01D9,
0110 };
0111
0112 static struct quirk_entry quirk_asus_forceals = {
0113 .wmi_backlight_set_devstate = true,
0114 .wmi_force_als_set = true,
0115 };
0116
0117 static struct quirk_entry quirk_asus_use_kbd_dock_devid = {
0118 .use_kbd_dock_devid = true,
0119 };
0120
0121 static struct quirk_entry quirk_asus_use_lid_flip_devid = {
0122 .wmi_backlight_set_devstate = true,
0123 .use_lid_flip_devid = true,
0124 };
0125
0126 static int dmi_matched(const struct dmi_system_id *dmi)
0127 {
0128 pr_info("Identified laptop model '%s'\n", dmi->ident);
0129 quirks = dmi->driver_data;
0130 return 1;
0131 }
0132
0133 static const struct dmi_system_id asus_quirks[] = {
0134 {
0135 .callback = dmi_matched,
0136 .ident = "ASUSTeK COMPUTER INC. Q500A",
0137 .matches = {
0138 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0139 DMI_MATCH(DMI_PRODUCT_NAME, "Q500A"),
0140 },
0141 .driver_data = &quirk_asus_q500a,
0142 },
0143 {
0144 .callback = dmi_matched,
0145 .ident = "ASUSTeK COMPUTER INC. U32U",
0146 .matches = {
0147 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
0148 DMI_MATCH(DMI_PRODUCT_NAME, "U32U"),
0149 },
0150
0151
0152
0153
0154
0155 .driver_data = &quirk_asus_wapf4,
0156 },
0157 {
0158 .callback = dmi_matched,
0159 .ident = "ASUSTeK COMPUTER INC. X302UA",
0160 .matches = {
0161 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0162 DMI_MATCH(DMI_PRODUCT_NAME, "X302UA"),
0163 },
0164 .driver_data = &quirk_asus_wapf4,
0165 },
0166 {
0167 .callback = dmi_matched,
0168 .ident = "ASUSTeK COMPUTER INC. X401U",
0169 .matches = {
0170 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0171 DMI_MATCH(DMI_PRODUCT_NAME, "X401U"),
0172 },
0173 .driver_data = &quirk_asus_x55u,
0174 },
0175 {
0176 .callback = dmi_matched,
0177 .ident = "ASUSTeK COMPUTER INC. X401A",
0178 .matches = {
0179 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0180 DMI_MATCH(DMI_PRODUCT_NAME, "X401A"),
0181 },
0182 .driver_data = &quirk_asus_wapf4,
0183 },
0184 {
0185 .callback = dmi_matched,
0186 .ident = "ASUSTeK COMPUTER INC. X401A1",
0187 .matches = {
0188 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0189 DMI_MATCH(DMI_PRODUCT_NAME, "X401A1"),
0190 },
0191 .driver_data = &quirk_asus_wapf4,
0192 },
0193 {
0194 .callback = dmi_matched,
0195 .ident = "ASUSTeK COMPUTER INC. X45U",
0196 .matches = {
0197 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0198 DMI_MATCH(DMI_PRODUCT_NAME, "X45U"),
0199 },
0200 .driver_data = &quirk_asus_wapf4,
0201 },
0202 {
0203 .callback = dmi_matched,
0204 .ident = "ASUSTeK COMPUTER INC. X456UA",
0205 .matches = {
0206 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0207 DMI_MATCH(DMI_PRODUCT_NAME, "X456UA"),
0208 },
0209 .driver_data = &quirk_asus_wapf4,
0210 },
0211 {
0212 .callback = dmi_matched,
0213 .ident = "ASUSTeK COMPUTER INC. X456UF",
0214 .matches = {
0215 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0216 DMI_MATCH(DMI_PRODUCT_NAME, "X456UF"),
0217 },
0218 .driver_data = &quirk_asus_wapf4,
0219 },
0220 {
0221 .callback = dmi_matched,
0222 .ident = "ASUSTeK COMPUTER INC. X501U",
0223 .matches = {
0224 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0225 DMI_MATCH(DMI_PRODUCT_NAME, "X501U"),
0226 },
0227 .driver_data = &quirk_asus_x55u,
0228 },
0229 {
0230 .callback = dmi_matched,
0231 .ident = "ASUSTeK COMPUTER INC. X501A",
0232 .matches = {
0233 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0234 DMI_MATCH(DMI_PRODUCT_NAME, "X501A"),
0235 },
0236 .driver_data = &quirk_asus_wapf4,
0237 },
0238 {
0239 .callback = dmi_matched,
0240 .ident = "ASUSTeK COMPUTER INC. X501A1",
0241 .matches = {
0242 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0243 DMI_MATCH(DMI_PRODUCT_NAME, "X501A1"),
0244 },
0245 .driver_data = &quirk_asus_wapf4,
0246 },
0247 {
0248 .callback = dmi_matched,
0249 .ident = "ASUSTeK COMPUTER INC. X550CA",
0250 .matches = {
0251 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0252 DMI_MATCH(DMI_PRODUCT_NAME, "X550CA"),
0253 },
0254 .driver_data = &quirk_asus_wapf4,
0255 },
0256 {
0257 .callback = dmi_matched,
0258 .ident = "ASUSTeK COMPUTER INC. X550CC",
0259 .matches = {
0260 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0261 DMI_MATCH(DMI_PRODUCT_NAME, "X550CC"),
0262 },
0263 .driver_data = &quirk_asus_wapf4,
0264 },
0265 {
0266 .callback = dmi_matched,
0267 .ident = "ASUSTeK COMPUTER INC. X550CL",
0268 .matches = {
0269 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0270 DMI_MATCH(DMI_PRODUCT_NAME, "X550CL"),
0271 },
0272 .driver_data = &quirk_asus_wapf4,
0273 },
0274 {
0275 .callback = dmi_matched,
0276 .ident = "ASUSTeK COMPUTER INC. X550VB",
0277 .matches = {
0278 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0279 DMI_MATCH(DMI_PRODUCT_NAME, "X550VB"),
0280 },
0281 .driver_data = &quirk_asus_wapf4,
0282 },
0283 {
0284 .callback = dmi_matched,
0285 .ident = "ASUSTeK COMPUTER INC. X551CA",
0286 .matches = {
0287 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0288 DMI_MATCH(DMI_PRODUCT_NAME, "X551CA"),
0289 },
0290 .driver_data = &quirk_asus_wapf4,
0291 },
0292 {
0293 .callback = dmi_matched,
0294 .ident = "ASUSTeK COMPUTER INC. X55A",
0295 .matches = {
0296 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0297 DMI_MATCH(DMI_PRODUCT_NAME, "X55A"),
0298 },
0299 .driver_data = &quirk_asus_wapf4,
0300 },
0301 {
0302 .callback = dmi_matched,
0303 .ident = "ASUSTeK COMPUTER INC. X55C",
0304 .matches = {
0305 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0306 DMI_MATCH(DMI_PRODUCT_NAME, "X55C"),
0307 },
0308 .driver_data = &quirk_asus_wapf4,
0309 },
0310 {
0311 .callback = dmi_matched,
0312 .ident = "ASUSTeK COMPUTER INC. X55U",
0313 .matches = {
0314 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0315 DMI_MATCH(DMI_PRODUCT_NAME, "X55U"),
0316 },
0317 .driver_data = &quirk_asus_x55u,
0318 },
0319 {
0320 .callback = dmi_matched,
0321 .ident = "ASUSTeK COMPUTER INC. X55VD",
0322 .matches = {
0323 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0324 DMI_MATCH(DMI_PRODUCT_NAME, "X55VD"),
0325 },
0326 .driver_data = &quirk_asus_wapf4,
0327 },
0328 {
0329 .callback = dmi_matched,
0330 .ident = "ASUSTeK COMPUTER INC. X75A",
0331 .matches = {
0332 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0333 DMI_MATCH(DMI_PRODUCT_NAME, "X75A"),
0334 },
0335 .driver_data = &quirk_asus_wapf4,
0336 },
0337 {
0338 .callback = dmi_matched,
0339 .ident = "ASUSTeK COMPUTER INC. X75VBP",
0340 .matches = {
0341 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0342 DMI_MATCH(DMI_PRODUCT_NAME, "X75VBP"),
0343 },
0344 .driver_data = &quirk_asus_wapf4,
0345 },
0346 {
0347 .callback = dmi_matched,
0348 .ident = "ASUSTeK COMPUTER INC. X75VD",
0349 .matches = {
0350 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0351 DMI_MATCH(DMI_PRODUCT_NAME, "X75VD"),
0352 },
0353 .driver_data = &quirk_asus_wapf4,
0354 },
0355 {
0356 .callback = dmi_matched,
0357 .ident = "ASUSTeK COMPUTER INC. 1015E",
0358 .matches = {
0359 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0360 DMI_MATCH(DMI_PRODUCT_NAME, "1015E"),
0361 },
0362 .driver_data = &quirk_asus_wapf4,
0363 },
0364 {
0365 .callback = dmi_matched,
0366 .ident = "ASUSTeK COMPUTER INC. 1015U",
0367 .matches = {
0368 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0369 DMI_MATCH(DMI_PRODUCT_NAME, "1015U"),
0370 },
0371 .driver_data = &quirk_asus_wapf4,
0372 },
0373 {
0374 .callback = dmi_matched,
0375 .ident = "ASUSTeK COMPUTER INC. X200CA",
0376 .matches = {
0377 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0378 DMI_MATCH(DMI_PRODUCT_NAME, "X200CA"),
0379 },
0380 .driver_data = &quirk_asus_x200ca,
0381 },
0382 {
0383 .callback = dmi_matched,
0384 .ident = "ASUSTeK COMPUTER INC. UX303UB",
0385 .matches = {
0386 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0387 DMI_MATCH(DMI_PRODUCT_NAME, "UX303UB"),
0388 },
0389 .driver_data = &quirk_asus_ux303ub,
0390 },
0391 {
0392 .callback = dmi_matched,
0393 .ident = "ASUSTeK COMPUTER INC. UX330UAK",
0394 .matches = {
0395 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0396 DMI_MATCH(DMI_PRODUCT_NAME, "UX330UAK"),
0397 },
0398 .driver_data = &quirk_asus_forceals,
0399 },
0400 {
0401 .callback = dmi_matched,
0402 .ident = "ASUSTeK COMPUTER INC. X550LB",
0403 .matches = {
0404 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0405 DMI_MATCH(DMI_PRODUCT_NAME, "X550LB"),
0406 },
0407 .driver_data = &quirk_asus_x550lb,
0408 },
0409 {
0410 .callback = dmi_matched,
0411 .ident = "ASUSTeK COMPUTER INC. UX430UQ",
0412 .matches = {
0413 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0414 DMI_MATCH(DMI_PRODUCT_NAME, "UX430UQ"),
0415 },
0416 .driver_data = &quirk_asus_forceals,
0417 },
0418 {
0419 .callback = dmi_matched,
0420 .ident = "ASUSTeK COMPUTER INC. UX430UNR",
0421 .matches = {
0422 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0423 DMI_MATCH(DMI_PRODUCT_NAME, "UX430UNR"),
0424 },
0425 .driver_data = &quirk_asus_forceals,
0426 },
0427 {
0428 .callback = dmi_matched,
0429 .ident = "Asus Transformer T100TA / T100HA / T100CHI",
0430 .matches = {
0431 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0432
0433 DMI_MATCH(DMI_PRODUCT_NAME, "T100"),
0434 },
0435 .driver_data = &quirk_asus_use_kbd_dock_devid,
0436 },
0437 {
0438 .callback = dmi_matched,
0439 .ident = "Asus Transformer T101HA",
0440 .matches = {
0441 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0442 DMI_MATCH(DMI_PRODUCT_NAME, "T101HA"),
0443 },
0444 .driver_data = &quirk_asus_use_kbd_dock_devid,
0445 },
0446 {
0447 .callback = dmi_matched,
0448 .ident = "Asus Transformer T200TA",
0449 .matches = {
0450 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0451 DMI_MATCH(DMI_PRODUCT_NAME, "T200TA"),
0452 },
0453 .driver_data = &quirk_asus_use_kbd_dock_devid,
0454 },
0455 {
0456 .callback = dmi_matched,
0457 .ident = "ASUS ZenBook Flip UX360",
0458 .matches = {
0459 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0460
0461 DMI_MATCH(DMI_PRODUCT_NAME, "UX360"),
0462 },
0463 .driver_data = &quirk_asus_use_lid_flip_devid,
0464 },
0465 {
0466 .callback = dmi_matched,
0467 .ident = "ASUS TP200s / E205SA",
0468 .matches = {
0469 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
0470 DMI_MATCH(DMI_PRODUCT_NAME, "E205SA"),
0471 },
0472 .driver_data = &quirk_asus_use_lid_flip_devid,
0473 },
0474 {},
0475 };
0476
0477 static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
0478 {
0479 int ret;
0480
0481 quirks = &quirk_asus_unknown;
0482 dmi_check_system(asus_quirks);
0483
0484 driver->quirks = quirks;
0485 driver->panel_power = FB_BLANK_UNBLANK;
0486
0487
0488 if (wapf != -1)
0489 quirks->wapf = wapf;
0490 else
0491 wapf = quirks->wapf;
0492
0493 switch (tablet_mode_sw) {
0494 case 0:
0495 quirks->use_kbd_dock_devid = false;
0496 quirks->use_lid_flip_devid = false;
0497 break;
0498 case 1:
0499 quirks->use_kbd_dock_devid = true;
0500 quirks->use_lid_flip_devid = false;
0501 break;
0502 case 2:
0503 quirks->use_kbd_dock_devid = false;
0504 quirks->use_lid_flip_devid = true;
0505 break;
0506 }
0507
0508 if (quirks->i8042_filter) {
0509 ret = i8042_install_filter(quirks->i8042_filter);
0510 if (ret) {
0511 pr_warn("Unable to install key filter\n");
0512 return;
0513 }
0514 pr_info("Using i8042 filter function for receiving events\n");
0515 }
0516 }
0517
0518 static const struct key_entry asus_nb_wmi_keymap[] = {
0519 { KE_KEY, ASUS_WMI_BRN_DOWN, { KEY_BRIGHTNESSDOWN } },
0520 { KE_KEY, ASUS_WMI_BRN_UP, { KEY_BRIGHTNESSUP } },
0521 { KE_KEY, 0x30, { KEY_VOLUMEUP } },
0522 { KE_KEY, 0x31, { KEY_VOLUMEDOWN } },
0523 { KE_KEY, 0x32, { KEY_MUTE } },
0524 { KE_KEY, 0x35, { KEY_SCREENLOCK } },
0525 { KE_KEY, 0x38, { KEY_PROG3 } },
0526 { KE_KEY, 0x40, { KEY_PREVIOUSSONG } },
0527 { KE_KEY, 0x41, { KEY_NEXTSONG } },
0528 { KE_KEY, 0x43, { KEY_STOPCD } },
0529 { KE_KEY, 0x45, { KEY_PLAYPAUSE } },
0530 { KE_KEY, 0x4c, { KEY_MEDIA } },
0531 { KE_KEY, 0x50, { KEY_EMAIL } },
0532 { KE_KEY, 0x51, { KEY_WWW } },
0533 { KE_KEY, 0x55, { KEY_CALC } },
0534 { KE_IGNORE, 0x57, },
0535 { KE_IGNORE, 0x58, },
0536 { KE_KEY, 0x5C, { KEY_F15 } },
0537 { KE_KEY, 0x5D, { KEY_WLAN } },
0538 { KE_KEY, 0x5E, { KEY_WLAN } },
0539 { KE_KEY, 0x5F, { KEY_WLAN } },
0540 { KE_KEY, 0x60, { KEY_TOUCHPAD_ON } },
0541 { KE_KEY, 0x61, { KEY_SWITCHVIDEOMODE } },
0542 { KE_KEY, 0x62, { KEY_SWITCHVIDEOMODE } },
0543 { KE_KEY, 0x63, { KEY_SWITCHVIDEOMODE } },
0544 { KE_KEY, 0x64, { KEY_SWITCHVIDEOMODE } },
0545 { KE_KEY, 0x65, { KEY_SWITCHVIDEOMODE } },
0546 { KE_KEY, 0x66, { KEY_SWITCHVIDEOMODE } },
0547 { KE_KEY, 0x67, { KEY_SWITCHVIDEOMODE } },
0548 { KE_KEY, 0x6B, { KEY_TOUCHPAD_TOGGLE } },
0549 { KE_IGNORE, 0x6E, },
0550 { KE_KEY, 0x71, { KEY_F13 } },
0551 { KE_IGNORE, 0x79, },
0552 { KE_KEY, 0x7a, { KEY_ALS_TOGGLE } },
0553 { KE_KEY, 0x7c, { KEY_MICMUTE } },
0554 { KE_KEY, 0x7D, { KEY_BLUETOOTH } },
0555 { KE_KEY, 0x7E, { KEY_BLUETOOTH } },
0556 { KE_KEY, 0x82, { KEY_CAMERA } },
0557 { KE_KEY, 0x86, { KEY_PROG1 } },
0558 { KE_KEY, 0x88, { KEY_RFKILL } },
0559 { KE_KEY, 0x8A, { KEY_PROG1 } },
0560 { KE_KEY, 0x8C, { KEY_SWITCHVIDEOMODE } },
0561 { KE_KEY, 0x8D, { KEY_SWITCHVIDEOMODE } },
0562 { KE_KEY, 0x8E, { KEY_SWITCHVIDEOMODE } },
0563 { KE_KEY, 0x8F, { KEY_SWITCHVIDEOMODE } },
0564 { KE_KEY, 0x90, { KEY_SWITCHVIDEOMODE } },
0565 { KE_KEY, 0x91, { KEY_SWITCHVIDEOMODE } },
0566 { KE_KEY, 0x92, { KEY_SWITCHVIDEOMODE } },
0567 { KE_KEY, 0x93, { KEY_SWITCHVIDEOMODE } },
0568 { KE_KEY, 0x95, { KEY_MEDIA } },
0569 { KE_KEY, 0x99, { KEY_PHONE } },
0570 { KE_KEY, 0xA0, { KEY_SWITCHVIDEOMODE } },
0571 { KE_KEY, 0xA1, { KEY_SWITCHVIDEOMODE } },
0572 { KE_KEY, 0xA2, { KEY_SWITCHVIDEOMODE } },
0573 { KE_KEY, 0xA3, { KEY_SWITCHVIDEOMODE } },
0574 { KE_KEY, 0xA4, { KEY_SWITCHVIDEOMODE } },
0575 { KE_KEY, 0xA5, { KEY_SWITCHVIDEOMODE } },
0576 { KE_KEY, 0xA6, { KEY_SWITCHVIDEOMODE } },
0577 { KE_KEY, 0xA7, { KEY_SWITCHVIDEOMODE } },
0578 { KE_KEY, 0xB3, { KEY_PROG4 } },
0579 { KE_KEY, 0xB5, { KEY_CALC } },
0580 { KE_KEY, 0xC4, { KEY_KBDILLUMUP } },
0581 { KE_KEY, 0xC5, { KEY_KBDILLUMDOWN } },
0582 { KE_IGNORE, 0xC6, },
0583 { KE_KEY, 0xFA, { KEY_PROG2 } },
0584 { KE_END, 0},
0585 };
0586
0587 static struct asus_wmi_driver asus_nb_wmi_driver = {
0588 .name = ASUS_NB_WMI_FILE,
0589 .owner = THIS_MODULE,
0590 .event_guid = ASUS_NB_WMI_EVENT_GUID,
0591 .keymap = asus_nb_wmi_keymap,
0592 .input_name = "Asus WMI hotkeys",
0593 .input_phys = ASUS_NB_WMI_FILE "/input0",
0594 .detect_quirks = asus_nb_wmi_quirks,
0595 };
0596
0597
0598 static int __init asus_nb_wmi_init(void)
0599 {
0600 return asus_wmi_register_driver(&asus_nb_wmi_driver);
0601 }
0602
0603 static void __exit asus_nb_wmi_exit(void)
0604 {
0605 asus_wmi_unregister_driver(&asus_nb_wmi_driver);
0606 }
0607
0608 module_init(asus_nb_wmi_init);
0609 module_exit(asus_nb_wmi_exit);