^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Eee PC WMI hotkey driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright(C) 2010 Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright(C) 2010-2011 Corentin Chary <corentin.chary@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Portions based on wistron_btns.c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/input/sparse-keymap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/fb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "asus-wmi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define EEEPC_WMI_FILE "eeepc-wmi"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) MODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) MODULE_DESCRIPTION("Eee PC WMI Hotkey Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define EEEPC_ACPI_HID "ASUS010" /* old _HID used in eeepc-laptop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define EEEPC_WMI_EVENT_GUID "ABBC0F72-8EA1-11D1-00A0-C90629100000"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) MODULE_ALIAS("wmi:"EEEPC_WMI_EVENT_GUID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static bool hotplug_wireless;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) module_param(hotplug_wireless, bool, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) MODULE_PARM_DESC(hotplug_wireless,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) "Enable hotplug for wireless device. "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) "If your laptop needs that, please report to "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) "acpi4asus-user@lists.sourceforge.net.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* Values for T101MT "Home" key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define HOME_PRESS 0xe4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define HOME_HOLD 0xea
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define HOME_RELEASE 0xe5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static const struct key_entry eeepc_wmi_keymap[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { KE_KEY, ASUS_WMI_BRN_DOWN, { KEY_BRIGHTNESSDOWN } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { KE_KEY, ASUS_WMI_BRN_UP, { KEY_BRIGHTNESSUP } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /* Sleep already handled via generic ACPI code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { KE_KEY, 0x30, { KEY_VOLUMEUP } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { KE_KEY, 0x31, { KEY_VOLUMEDOWN } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { KE_KEY, 0x32, { KEY_MUTE } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) { KE_KEY, 0x5c, { KEY_F15 } }, /* Power Gear key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) { KE_KEY, 0x5d, { KEY_WLAN } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) { KE_KEY, 0x6b, { KEY_TOUCHPAD_TOGGLE } }, /* Toggle Touchpad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) { KE_KEY, 0x82, { KEY_CAMERA } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { KE_KEY, 0x83, { KEY_CAMERA_ZOOMIN } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { KE_KEY, 0x88, { KEY_WLAN } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) { KE_KEY, 0xbd, { KEY_CAMERA } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) { KE_KEY, 0xcc, { KEY_SWITCHVIDEOMODE } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) { KE_KEY, 0xe0, { KEY_PROG1 } }, /* Task Manager */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { KE_KEY, 0xe1, { KEY_F14 } }, /* Change Resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { KE_KEY, HOME_PRESS, { KEY_CONFIG } }, /* Home/Express gate key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { KE_KEY, 0xe8, { KEY_SCREENLOCK } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { KE_KEY, 0xe9, { KEY_DISPLAYTOGGLE } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { KE_KEY, 0xeb, { KEY_CAMERA_ZOOMOUT } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { KE_KEY, 0xec, { KEY_CAMERA_UP } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) { KE_KEY, 0xed, { KEY_CAMERA_DOWN } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { KE_KEY, 0xee, { KEY_CAMERA_LEFT } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { KE_KEY, 0xef, { KEY_CAMERA_RIGHT } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { KE_KEY, 0xf3, { KEY_MENU } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { KE_KEY, 0xf5, { KEY_HOMEPAGE } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) { KE_KEY, 0xf6, { KEY_ESC } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { KE_END, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static struct quirk_entry quirk_asus_unknown = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static struct quirk_entry quirk_asus_1000h = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .hotplug_wireless = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static struct quirk_entry quirk_asus_et2012_type1 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .store_backlight_power = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static struct quirk_entry quirk_asus_et2012_type3 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .scalar_panel_brightness = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .store_backlight_power = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) static struct quirk_entry quirk_asus_x101ch = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* We need this when ACPI function doesn't do this well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .wmi_backlight_power = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static struct quirk_entry *quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static void et2012_quirks(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) const struct dmi_device *dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) char oemstring[30];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (sscanf(dev->name, "AEMS%24c", oemstring) == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (oemstring[18] == '1')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) quirks = &quirk_asus_et2012_type1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) else if (oemstring[18] == '3')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) quirks = &quirk_asus_et2012_type3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static int dmi_matched(const struct dmi_system_id *dmi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) char *model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) quirks = dmi->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) model = (char *)dmi->matches[1].substr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (unlikely(strncmp(model, "ET2012", 6) == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) et2012_quirks();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static const struct dmi_system_id asus_quirks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .ident = "ASUSTeK Computer INC. 1000H",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) DMI_MATCH(DMI_PRODUCT_NAME, "1000H"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .driver_data = &quirk_asus_1000h,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) .ident = "ASUSTeK Computer INC. ET2012E/I",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) DMI_MATCH(DMI_PRODUCT_NAME, "ET2012"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .driver_data = &quirk_asus_unknown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .ident = "ASUSTeK Computer INC. X101CH",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) DMI_MATCH(DMI_PRODUCT_NAME, "X101CH"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .driver_data = &quirk_asus_x101ch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) .callback = dmi_matched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .ident = "ASUSTeK Computer INC. 1015CX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) DMI_MATCH(DMI_PRODUCT_NAME, "1015CX"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .driver_data = &quirk_asus_x101ch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static void eeepc_wmi_key_filter(struct asus_wmi_driver *asus_wmi, int *code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) unsigned int *value, bool *autorelease)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) switch (*code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) case HOME_PRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) *value = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) *autorelease = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) case HOME_HOLD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) *code = ASUS_WMI_KEY_IGNORE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) case HOME_RELEASE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) *code = HOME_PRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) *value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) *autorelease = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static int eeepc_wmi_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) if (acpi_dev_found(EEEPC_ACPI_HID)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) pr_warn("Found legacy ATKD device (%s)\n", EEEPC_ACPI_HID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) pr_warn("WMI device present, but legacy ATKD device is also "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) "present and enabled\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) pr_warn("You probably booted with acpi_osi=\"Linux\" or "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) "acpi_osi=\"!Windows 2009\"\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) pr_warn("Can't load eeepc-wmi, use default acpi_osi "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) "(preferred) or eeepc-laptop\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) static void eeepc_wmi_quirks(struct asus_wmi_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) quirks = &quirk_asus_unknown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) quirks->hotplug_wireless = hotplug_wireless;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dmi_check_system(asus_quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) driver->quirks = quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) driver->quirks->wapf = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) driver->panel_power = FB_BLANK_UNBLANK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) static struct asus_wmi_driver asus_wmi_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) .name = EEEPC_WMI_FILE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .event_guid = EEEPC_WMI_EVENT_GUID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .keymap = eeepc_wmi_keymap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .input_name = "Eee PC WMI hotkeys",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .input_phys = EEEPC_WMI_FILE "/input0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) .key_filter = eeepc_wmi_key_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) .probe = eeepc_wmi_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) .detect_quirks = eeepc_wmi_quirks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) static int __init eeepc_wmi_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return asus_wmi_register_driver(&asus_wmi_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static void __exit eeepc_wmi_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) asus_wmi_unregister_driver(&asus_wmi_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) module_init(eeepc_wmi_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) module_exit(eeepc_wmi_exit);