18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Asus Notebooks WMI hotkey driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright(C) 2010 Corentin Chary <corentin.chary@gmail.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/kernel.h>
118c2ecf20Sopenharmony_ci#include <linux/module.h>
128c2ecf20Sopenharmony_ci#include <linux/init.h>
138c2ecf20Sopenharmony_ci#include <linux/input.h>
148c2ecf20Sopenharmony_ci#include <linux/input/sparse-keymap.h>
158c2ecf20Sopenharmony_ci#include <linux/fb.h>
168c2ecf20Sopenharmony_ci#include <linux/dmi.h>
178c2ecf20Sopenharmony_ci#include <linux/i8042.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include "asus-wmi.h"
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define	ASUS_NB_WMI_FILE	"asus-nb-wmi"
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciMODULE_AUTHOR("Corentin Chary <corentin.chary@gmail.com>");
248c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Asus Notebooks WMI Hotkey Driver");
258c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#define ASUS_NB_WMI_EVENT_GUID	"0B3CBB35-E3C2-45ED-91C2-4C5A6D195D1C"
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciMODULE_ALIAS("wmi:"ASUS_NB_WMI_EVENT_GUID);
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/*
328c2ecf20Sopenharmony_ci * WAPF defines the behavior of the Fn+Fx wlan key
338c2ecf20Sopenharmony_ci * The significance of values is yet to be found, but
348c2ecf20Sopenharmony_ci * most of the time:
358c2ecf20Sopenharmony_ci * Bit | Bluetooth | WLAN
368c2ecf20Sopenharmony_ci *  0  | Hardware  | Hardware
378c2ecf20Sopenharmony_ci *  1  | Hardware  | Software
388c2ecf20Sopenharmony_ci *  4  | Software  | Software
398c2ecf20Sopenharmony_ci */
408c2ecf20Sopenharmony_cistatic int wapf = -1;
418c2ecf20Sopenharmony_cimodule_param(wapf, uint, 0444);
428c2ecf20Sopenharmony_ciMODULE_PARM_DESC(wapf, "WAPF value");
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic int tablet_mode_sw = -1;
458c2ecf20Sopenharmony_cimodule_param(tablet_mode_sw, uint, 0444);
468c2ecf20Sopenharmony_ciMODULE_PARM_DESC(tablet_mode_sw, "Tablet mode detect: -1:auto 0:disable 1:kbd-dock 2:lid-flip");
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cistatic struct quirk_entry *quirks;
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic bool asus_q500a_i8042_filter(unsigned char data, unsigned char str,
518c2ecf20Sopenharmony_ci			      struct serio *port)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	static bool extended;
548c2ecf20Sopenharmony_ci	bool ret = false;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	if (str & I8042_STR_AUXDATA)
578c2ecf20Sopenharmony_ci		return false;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	if (unlikely(data == 0xe1)) {
608c2ecf20Sopenharmony_ci		extended = true;
618c2ecf20Sopenharmony_ci		ret = true;
628c2ecf20Sopenharmony_ci	} else if (unlikely(extended)) {
638c2ecf20Sopenharmony_ci		extended = false;
648c2ecf20Sopenharmony_ci		ret = true;
658c2ecf20Sopenharmony_ci	}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	return ret;
688c2ecf20Sopenharmony_ci}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_unknown = {
718c2ecf20Sopenharmony_ci	.wapf = 0,
728c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_q500a = {
768c2ecf20Sopenharmony_ci	.i8042_filter = asus_q500a_i8042_filter,
778c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
788c2ecf20Sopenharmony_ci};
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci/*
818c2ecf20Sopenharmony_ci * For those machines that need software to control bt/wifi status
828c2ecf20Sopenharmony_ci * and can't adjust brightness through ACPI interface
838c2ecf20Sopenharmony_ci * and have duplicate events(ACPI and WMI) for display toggle
848c2ecf20Sopenharmony_ci */
858c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_x55u = {
868c2ecf20Sopenharmony_ci	.wapf = 4,
878c2ecf20Sopenharmony_ci	.wmi_backlight_power = true,
888c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
898c2ecf20Sopenharmony_ci	.no_display_toggle = true,
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_wapf4 = {
938c2ecf20Sopenharmony_ci	.wapf = 4,
948c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_x200ca = {
988c2ecf20Sopenharmony_ci	.wapf = 2,
998c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
1008c2ecf20Sopenharmony_ci};
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_ux303ub = {
1038c2ecf20Sopenharmony_ci	.wmi_backlight_native = true,
1048c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
1058c2ecf20Sopenharmony_ci};
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_x550lb = {
1088c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
1098c2ecf20Sopenharmony_ci	.xusb2pr = 0x01D9,
1108c2ecf20Sopenharmony_ci};
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_forceals = {
1138c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
1148c2ecf20Sopenharmony_ci	.wmi_force_als_set = true,
1158c2ecf20Sopenharmony_ci};
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_use_kbd_dock_devid = {
1188c2ecf20Sopenharmony_ci	.tablet_switch_mode = asus_wmi_kbd_dock_devid,
1198c2ecf20Sopenharmony_ci};
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_use_lid_flip_devid = {
1228c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
1238c2ecf20Sopenharmony_ci	.tablet_switch_mode = asus_wmi_lid_flip_devid,
1248c2ecf20Sopenharmony_ci};
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_cistatic struct quirk_entry quirk_asus_tablet_mode = {
1278c2ecf20Sopenharmony_ci	.wmi_backlight_set_devstate = true,
1288c2ecf20Sopenharmony_ci	.tablet_switch_mode = asus_wmi_lid_flip_rog_devid,
1298c2ecf20Sopenharmony_ci};
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_cistatic int dmi_matched(const struct dmi_system_id *dmi)
1328c2ecf20Sopenharmony_ci{
1338c2ecf20Sopenharmony_ci	pr_info("Identified laptop model '%s'\n", dmi->ident);
1348c2ecf20Sopenharmony_ci	quirks = dmi->driver_data;
1358c2ecf20Sopenharmony_ci	return 1;
1368c2ecf20Sopenharmony_ci}
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_cistatic const struct dmi_system_id asus_quirks[] = {
1398c2ecf20Sopenharmony_ci	{
1408c2ecf20Sopenharmony_ci		.callback = dmi_matched,
1418c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. Q500A",
1428c2ecf20Sopenharmony_ci		.matches = {
1438c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1448c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "Q500A"),
1458c2ecf20Sopenharmony_ci		},
1468c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_q500a,
1478c2ecf20Sopenharmony_ci	},
1488c2ecf20Sopenharmony_ci	{
1498c2ecf20Sopenharmony_ci		.callback = dmi_matched,
1508c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. U32U",
1518c2ecf20Sopenharmony_ci		.matches = {
1528c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
1538c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "U32U"),
1548c2ecf20Sopenharmony_ci		},
1558c2ecf20Sopenharmony_ci		/*
1568c2ecf20Sopenharmony_ci		 * Note this machine has a Brazos APU, and most Brazos Asus
1578c2ecf20Sopenharmony_ci		 * machines need quirk_asus_x55u / wmi_backlight_power but
1588c2ecf20Sopenharmony_ci		 * here acpi-video seems to work fine for backlight control.
1598c2ecf20Sopenharmony_ci		 */
1608c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
1618c2ecf20Sopenharmony_ci	},
1628c2ecf20Sopenharmony_ci	{
1638c2ecf20Sopenharmony_ci		.callback = dmi_matched,
1648c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X302UA",
1658c2ecf20Sopenharmony_ci		.matches = {
1668c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1678c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X302UA"),
1688c2ecf20Sopenharmony_ci		},
1698c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
1708c2ecf20Sopenharmony_ci	},
1718c2ecf20Sopenharmony_ci	{
1728c2ecf20Sopenharmony_ci		.callback = dmi_matched,
1738c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X401U",
1748c2ecf20Sopenharmony_ci		.matches = {
1758c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1768c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X401U"),
1778c2ecf20Sopenharmony_ci		},
1788c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_x55u,
1798c2ecf20Sopenharmony_ci	},
1808c2ecf20Sopenharmony_ci	{
1818c2ecf20Sopenharmony_ci		.callback = dmi_matched,
1828c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X401A",
1838c2ecf20Sopenharmony_ci		.matches = {
1848c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1858c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X401A"),
1868c2ecf20Sopenharmony_ci		},
1878c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
1888c2ecf20Sopenharmony_ci	},
1898c2ecf20Sopenharmony_ci	{
1908c2ecf20Sopenharmony_ci		.callback = dmi_matched,
1918c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X401A1",
1928c2ecf20Sopenharmony_ci		.matches = {
1938c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1948c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X401A1"),
1958c2ecf20Sopenharmony_ci		},
1968c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
1978c2ecf20Sopenharmony_ci	},
1988c2ecf20Sopenharmony_ci	{
1998c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2008c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X45U",
2018c2ecf20Sopenharmony_ci		.matches = {
2028c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2038c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X45U"),
2048c2ecf20Sopenharmony_ci		},
2058c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2068c2ecf20Sopenharmony_ci	},
2078c2ecf20Sopenharmony_ci	{
2088c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2098c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X456UA",
2108c2ecf20Sopenharmony_ci		.matches = {
2118c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2128c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X456UA"),
2138c2ecf20Sopenharmony_ci		},
2148c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2158c2ecf20Sopenharmony_ci	},
2168c2ecf20Sopenharmony_ci	{
2178c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2188c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X456UF",
2198c2ecf20Sopenharmony_ci		.matches = {
2208c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2218c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X456UF"),
2228c2ecf20Sopenharmony_ci		},
2238c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2248c2ecf20Sopenharmony_ci	},
2258c2ecf20Sopenharmony_ci	{
2268c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2278c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X501U",
2288c2ecf20Sopenharmony_ci		.matches = {
2298c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2308c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X501U"),
2318c2ecf20Sopenharmony_ci		},
2328c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_x55u,
2338c2ecf20Sopenharmony_ci	},
2348c2ecf20Sopenharmony_ci	{
2358c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2368c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X501A",
2378c2ecf20Sopenharmony_ci		.matches = {
2388c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2398c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X501A"),
2408c2ecf20Sopenharmony_ci		},
2418c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2428c2ecf20Sopenharmony_ci	},
2438c2ecf20Sopenharmony_ci	{
2448c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2458c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X501A1",
2468c2ecf20Sopenharmony_ci		.matches = {
2478c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2488c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X501A1"),
2498c2ecf20Sopenharmony_ci		},
2508c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2518c2ecf20Sopenharmony_ci	},
2528c2ecf20Sopenharmony_ci	{
2538c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2548c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X550CA",
2558c2ecf20Sopenharmony_ci		.matches = {
2568c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2578c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X550CA"),
2588c2ecf20Sopenharmony_ci		},
2598c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2608c2ecf20Sopenharmony_ci	},
2618c2ecf20Sopenharmony_ci	{
2628c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2638c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X550CC",
2648c2ecf20Sopenharmony_ci		.matches = {
2658c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2668c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X550CC"),
2678c2ecf20Sopenharmony_ci		},
2688c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2698c2ecf20Sopenharmony_ci	},
2708c2ecf20Sopenharmony_ci	{
2718c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2728c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X550CL",
2738c2ecf20Sopenharmony_ci		.matches = {
2748c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2758c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X550CL"),
2768c2ecf20Sopenharmony_ci		},
2778c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2788c2ecf20Sopenharmony_ci	},
2798c2ecf20Sopenharmony_ci	{
2808c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2818c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X550VB",
2828c2ecf20Sopenharmony_ci		.matches = {
2838c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2848c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X550VB"),
2858c2ecf20Sopenharmony_ci		},
2868c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2878c2ecf20Sopenharmony_ci	},
2888c2ecf20Sopenharmony_ci	{
2898c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2908c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X551CA",
2918c2ecf20Sopenharmony_ci		.matches = {
2928c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
2938c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X551CA"),
2948c2ecf20Sopenharmony_ci		},
2958c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
2968c2ecf20Sopenharmony_ci	},
2978c2ecf20Sopenharmony_ci	{
2988c2ecf20Sopenharmony_ci		.callback = dmi_matched,
2998c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X55A",
3008c2ecf20Sopenharmony_ci		.matches = {
3018c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3028c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X55A"),
3038c2ecf20Sopenharmony_ci		},
3048c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3058c2ecf20Sopenharmony_ci	},
3068c2ecf20Sopenharmony_ci	{
3078c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3088c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X55C",
3098c2ecf20Sopenharmony_ci		.matches = {
3108c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3118c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X55C"),
3128c2ecf20Sopenharmony_ci		},
3138c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3148c2ecf20Sopenharmony_ci	},
3158c2ecf20Sopenharmony_ci	{
3168c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3178c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X55U",
3188c2ecf20Sopenharmony_ci		.matches = {
3198c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3208c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X55U"),
3218c2ecf20Sopenharmony_ci		},
3228c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_x55u,
3238c2ecf20Sopenharmony_ci	},
3248c2ecf20Sopenharmony_ci	{
3258c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3268c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X55VD",
3278c2ecf20Sopenharmony_ci		.matches = {
3288c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3298c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X55VD"),
3308c2ecf20Sopenharmony_ci		},
3318c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3328c2ecf20Sopenharmony_ci	},
3338c2ecf20Sopenharmony_ci	{
3348c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3358c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X75A",
3368c2ecf20Sopenharmony_ci		.matches = {
3378c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3388c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X75A"),
3398c2ecf20Sopenharmony_ci		},
3408c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3418c2ecf20Sopenharmony_ci	},
3428c2ecf20Sopenharmony_ci	{
3438c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3448c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X75VBP",
3458c2ecf20Sopenharmony_ci		.matches = {
3468c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3478c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X75VBP"),
3488c2ecf20Sopenharmony_ci		},
3498c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3508c2ecf20Sopenharmony_ci	},
3518c2ecf20Sopenharmony_ci	{
3528c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3538c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X75VD",
3548c2ecf20Sopenharmony_ci		.matches = {
3558c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3568c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X75VD"),
3578c2ecf20Sopenharmony_ci		},
3588c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3598c2ecf20Sopenharmony_ci	},
3608c2ecf20Sopenharmony_ci	{
3618c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3628c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. 1015E",
3638c2ecf20Sopenharmony_ci		.matches = {
3648c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3658c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "1015E"),
3668c2ecf20Sopenharmony_ci		},
3678c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3688c2ecf20Sopenharmony_ci	},
3698c2ecf20Sopenharmony_ci	{
3708c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3718c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. 1015U",
3728c2ecf20Sopenharmony_ci		.matches = {
3738c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3748c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "1015U"),
3758c2ecf20Sopenharmony_ci		},
3768c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_wapf4,
3778c2ecf20Sopenharmony_ci	},
3788c2ecf20Sopenharmony_ci	{
3798c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3808c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X200CA",
3818c2ecf20Sopenharmony_ci		.matches = {
3828c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3838c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X200CA"),
3848c2ecf20Sopenharmony_ci		},
3858c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_x200ca,
3868c2ecf20Sopenharmony_ci	},
3878c2ecf20Sopenharmony_ci	{
3888c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3898c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. UX303UB",
3908c2ecf20Sopenharmony_ci		.matches = {
3918c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
3928c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "UX303UB"),
3938c2ecf20Sopenharmony_ci		},
3948c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_ux303ub,
3958c2ecf20Sopenharmony_ci	},
3968c2ecf20Sopenharmony_ci	{
3978c2ecf20Sopenharmony_ci		.callback = dmi_matched,
3988c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. UX330UAK",
3998c2ecf20Sopenharmony_ci		.matches = {
4008c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4018c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "UX330UAK"),
4028c2ecf20Sopenharmony_ci		},
4038c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_forceals,
4048c2ecf20Sopenharmony_ci	},
4058c2ecf20Sopenharmony_ci	{
4068c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4078c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. X550LB",
4088c2ecf20Sopenharmony_ci		.matches = {
4098c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4108c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "X550LB"),
4118c2ecf20Sopenharmony_ci		},
4128c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_x550lb,
4138c2ecf20Sopenharmony_ci	},
4148c2ecf20Sopenharmony_ci	{
4158c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4168c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. UX430UQ",
4178c2ecf20Sopenharmony_ci		.matches = {
4188c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4198c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "UX430UQ"),
4208c2ecf20Sopenharmony_ci		},
4218c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_forceals,
4228c2ecf20Sopenharmony_ci	},
4238c2ecf20Sopenharmony_ci	{
4248c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4258c2ecf20Sopenharmony_ci		.ident = "ASUSTeK COMPUTER INC. UX430UNR",
4268c2ecf20Sopenharmony_ci		.matches = {
4278c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4288c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "UX430UNR"),
4298c2ecf20Sopenharmony_ci		},
4308c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_forceals,
4318c2ecf20Sopenharmony_ci	},
4328c2ecf20Sopenharmony_ci	{
4338c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4348c2ecf20Sopenharmony_ci		.ident = "Asus Transformer T100TA / T100HA / T100CHI",
4358c2ecf20Sopenharmony_ci		.matches = {
4368c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4378c2ecf20Sopenharmony_ci			/* Match *T100* */
4388c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "T100"),
4398c2ecf20Sopenharmony_ci		},
4408c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_use_kbd_dock_devid,
4418c2ecf20Sopenharmony_ci	},
4428c2ecf20Sopenharmony_ci	{
4438c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4448c2ecf20Sopenharmony_ci		.ident = "Asus Transformer T101HA",
4458c2ecf20Sopenharmony_ci		.matches = {
4468c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4478c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "T101HA"),
4488c2ecf20Sopenharmony_ci		},
4498c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_use_kbd_dock_devid,
4508c2ecf20Sopenharmony_ci	},
4518c2ecf20Sopenharmony_ci	{
4528c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4538c2ecf20Sopenharmony_ci		.ident = "Asus Transformer T200TA",
4548c2ecf20Sopenharmony_ci		.matches = {
4558c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4568c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "T200TA"),
4578c2ecf20Sopenharmony_ci		},
4588c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_use_kbd_dock_devid,
4598c2ecf20Sopenharmony_ci	},
4608c2ecf20Sopenharmony_ci	{
4618c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4628c2ecf20Sopenharmony_ci		.ident = "ASUS ZenBook Flip UX360",
4638c2ecf20Sopenharmony_ci		.matches = {
4648c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4658c2ecf20Sopenharmony_ci			/* Match UX360* */
4668c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "UX360"),
4678c2ecf20Sopenharmony_ci		},
4688c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_use_lid_flip_devid,
4698c2ecf20Sopenharmony_ci	},
4708c2ecf20Sopenharmony_ci	{
4718c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4728c2ecf20Sopenharmony_ci		.ident = "ASUS TP200s / E205SA",
4738c2ecf20Sopenharmony_ci		.matches = {
4748c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4758c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "E205SA"),
4768c2ecf20Sopenharmony_ci		},
4778c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_use_lid_flip_devid,
4788c2ecf20Sopenharmony_ci	},
4798c2ecf20Sopenharmony_ci	{
4808c2ecf20Sopenharmony_ci		.callback = dmi_matched,
4818c2ecf20Sopenharmony_ci		.ident = "ASUS ROG FLOW X13",
4828c2ecf20Sopenharmony_ci		.matches = {
4838c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
4848c2ecf20Sopenharmony_ci			DMI_MATCH(DMI_PRODUCT_NAME, "GV301Q"),
4858c2ecf20Sopenharmony_ci		},
4868c2ecf20Sopenharmony_ci		.driver_data = &quirk_asus_tablet_mode,
4878c2ecf20Sopenharmony_ci	},
4888c2ecf20Sopenharmony_ci	{},
4898c2ecf20Sopenharmony_ci};
4908c2ecf20Sopenharmony_ci
4918c2ecf20Sopenharmony_cistatic void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
4928c2ecf20Sopenharmony_ci{
4938c2ecf20Sopenharmony_ci	quirks = &quirk_asus_unknown;
4948c2ecf20Sopenharmony_ci	dmi_check_system(asus_quirks);
4958c2ecf20Sopenharmony_ci
4968c2ecf20Sopenharmony_ci	driver->quirks = quirks;
4978c2ecf20Sopenharmony_ci	driver->panel_power = FB_BLANK_UNBLANK;
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_ci	/* overwrite the wapf setting if the wapf paramater is specified */
5008c2ecf20Sopenharmony_ci	if (wapf != -1)
5018c2ecf20Sopenharmony_ci		quirks->wapf = wapf;
5028c2ecf20Sopenharmony_ci	else
5038c2ecf20Sopenharmony_ci		wapf = quirks->wapf;
5048c2ecf20Sopenharmony_ci
5058c2ecf20Sopenharmony_ci	if (tablet_mode_sw != -1)
5068c2ecf20Sopenharmony_ci		quirks->tablet_switch_mode = tablet_mode_sw;
5078c2ecf20Sopenharmony_ci}
5088c2ecf20Sopenharmony_ci
5098c2ecf20Sopenharmony_cistatic const struct key_entry asus_nb_wmi_keymap[] = {
5108c2ecf20Sopenharmony_ci	{ KE_KEY, ASUS_WMI_BRN_DOWN, { KEY_BRIGHTNESSDOWN } },
5118c2ecf20Sopenharmony_ci	{ KE_KEY, ASUS_WMI_BRN_UP, { KEY_BRIGHTNESSUP } },
5128c2ecf20Sopenharmony_ci	{ KE_KEY, 0x2a, { KEY_SELECTIVE_SCREENSHOT } },
5138c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x2b, }, /* PrintScreen (also send via PS/2) on newer models */
5148c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x2c, }, /* CapsLock (also send via PS/2) on newer models */
5158c2ecf20Sopenharmony_ci	{ KE_KEY, 0x30, { KEY_VOLUMEUP } },
5168c2ecf20Sopenharmony_ci	{ KE_KEY, 0x31, { KEY_VOLUMEDOWN } },
5178c2ecf20Sopenharmony_ci	{ KE_KEY, 0x32, { KEY_MUTE } },
5188c2ecf20Sopenharmony_ci	{ KE_KEY, 0x33, { KEY_SCREENLOCK } },
5198c2ecf20Sopenharmony_ci	{ KE_KEY, 0x35, { KEY_SCREENLOCK } },
5208c2ecf20Sopenharmony_ci	{ KE_KEY, 0x40, { KEY_PREVIOUSSONG } },
5218c2ecf20Sopenharmony_ci	{ KE_KEY, 0x41, { KEY_NEXTSONG } },
5228c2ecf20Sopenharmony_ci	{ KE_KEY, 0x43, { KEY_STOPCD } }, /* Stop/Eject */
5238c2ecf20Sopenharmony_ci	{ KE_KEY, 0x45, { KEY_PLAYPAUSE } },
5248c2ecf20Sopenharmony_ci	{ KE_KEY, 0x4c, { KEY_MEDIA } }, /* WMP Key */
5258c2ecf20Sopenharmony_ci	{ KE_KEY, 0x50, { KEY_EMAIL } },
5268c2ecf20Sopenharmony_ci	{ KE_KEY, 0x51, { KEY_WWW } },
5278c2ecf20Sopenharmony_ci	{ KE_KEY, 0x55, { KEY_CALC } },
5288c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x57, },  /* Battery mode */
5298c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x58, },  /* AC mode */
5308c2ecf20Sopenharmony_ci	{ KE_KEY, 0x5C, { KEY_F15 } },  /* Power Gear key */
5318c2ecf20Sopenharmony_ci	{ KE_KEY, 0x5D, { KEY_WLAN } }, /* Wireless console Toggle */
5328c2ecf20Sopenharmony_ci	{ KE_KEY, 0x5E, { KEY_WLAN } }, /* Wireless console Enable */
5338c2ecf20Sopenharmony_ci	{ KE_KEY, 0x5F, { KEY_WLAN } }, /* Wireless console Disable */
5348c2ecf20Sopenharmony_ci	{ KE_KEY, 0x60, { KEY_TOUCHPAD_ON } },
5358c2ecf20Sopenharmony_ci	{ KE_KEY, 0x61, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD only */
5368c2ecf20Sopenharmony_ci	{ KE_KEY, 0x62, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT only */
5378c2ecf20Sopenharmony_ci	{ KE_KEY, 0x63, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + CRT */
5388c2ecf20Sopenharmony_ci	{ KE_KEY, 0x64, { KEY_SWITCHVIDEOMODE } }, /* SDSP TV */
5398c2ecf20Sopenharmony_ci	{ KE_KEY, 0x65, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + TV */
5408c2ecf20Sopenharmony_ci	{ KE_KEY, 0x66, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + TV */
5418c2ecf20Sopenharmony_ci	{ KE_KEY, 0x67, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + CRT + TV */
5428c2ecf20Sopenharmony_ci	{ KE_KEY, 0x6B, { KEY_TOUCHPAD_TOGGLE } },
5438c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x6E, },  /* Low Battery notification */
5448c2ecf20Sopenharmony_ci	{ KE_KEY, 0x71, { KEY_F13 } }, /* General-purpose button */
5458c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x79, },  /* Charger type dectection notification */
5468c2ecf20Sopenharmony_ci	{ KE_KEY, 0x7a, { KEY_ALS_TOGGLE } }, /* Ambient Light Sensor Toggle */
5478c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0x7B, }, /* Charger connect/disconnect notification */
5488c2ecf20Sopenharmony_ci	{ KE_KEY, 0x7c, { KEY_MICMUTE } },
5498c2ecf20Sopenharmony_ci	{ KE_KEY, 0x7D, { KEY_BLUETOOTH } }, /* Bluetooth Enable */
5508c2ecf20Sopenharmony_ci	{ KE_KEY, 0x7E, { KEY_BLUETOOTH } }, /* Bluetooth Disable */
5518c2ecf20Sopenharmony_ci	{ KE_KEY, 0x82, { KEY_CAMERA } },
5528c2ecf20Sopenharmony_ci	{ KE_KEY, 0x88, { KEY_RFKILL  } }, /* Radio Toggle Key */
5538c2ecf20Sopenharmony_ci	{ KE_KEY, 0x8A, { KEY_PROG1 } }, /* Color enhancement mode */
5548c2ecf20Sopenharmony_ci	{ KE_KEY, 0x8C, { KEY_SWITCHVIDEOMODE } }, /* SDSP DVI only */
5558c2ecf20Sopenharmony_ci	{ KE_KEY, 0x8D, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + DVI */
5568c2ecf20Sopenharmony_ci	{ KE_KEY, 0x8E, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + DVI */
5578c2ecf20Sopenharmony_ci	{ KE_KEY, 0x8F, { KEY_SWITCHVIDEOMODE } }, /* SDSP TV + DVI */
5588c2ecf20Sopenharmony_ci	{ KE_KEY, 0x90, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + CRT + DVI */
5598c2ecf20Sopenharmony_ci	{ KE_KEY, 0x91, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + TV + DVI */
5608c2ecf20Sopenharmony_ci	{ KE_KEY, 0x92, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + TV + DVI */
5618c2ecf20Sopenharmony_ci	{ KE_KEY, 0x93, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + CRT + TV + DVI */
5628c2ecf20Sopenharmony_ci	{ KE_KEY, 0x95, { KEY_MEDIA } },
5638c2ecf20Sopenharmony_ci	{ KE_KEY, 0x99, { KEY_PHONE } }, /* Conflicts with fan mode switch */
5648c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA0, { KEY_SWITCHVIDEOMODE } }, /* SDSP HDMI only */
5658c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA1, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + HDMI */
5668c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA2, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + HDMI */
5678c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA3, { KEY_SWITCHVIDEOMODE } }, /* SDSP TV + HDMI */
5688c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA4, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + CRT + HDMI */
5698c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA5, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + TV + HDMI */
5708c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA6, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + TV + HDMI */
5718c2ecf20Sopenharmony_ci	{ KE_KEY, 0xA7, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + CRT + TV + HDMI */
5728c2ecf20Sopenharmony_ci	{ KE_KEY, 0xB5, { KEY_CALC } },
5738c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0xC0, }, /* External display connect/disconnect notification */
5748c2ecf20Sopenharmony_ci	{ KE_KEY, 0xC4, { KEY_KBDILLUMUP } },
5758c2ecf20Sopenharmony_ci	{ KE_KEY, 0xC5, { KEY_KBDILLUMDOWN } },
5768c2ecf20Sopenharmony_ci	{ KE_IGNORE, 0xC6, },  /* Ambient Light Sensor notification */
5778c2ecf20Sopenharmony_ci	{ KE_KEY, 0xFA, { KEY_PROG2 } },           /* Lid flip action */
5788c2ecf20Sopenharmony_ci	{ KE_KEY, 0xBD, { KEY_PROG2 } },           /* Lid flip action on ROG xflow laptops */
5798c2ecf20Sopenharmony_ci	{ KE_END, 0},
5808c2ecf20Sopenharmony_ci};
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_cistatic struct asus_wmi_driver asus_nb_wmi_driver = {
5838c2ecf20Sopenharmony_ci	.name = ASUS_NB_WMI_FILE,
5848c2ecf20Sopenharmony_ci	.owner = THIS_MODULE,
5858c2ecf20Sopenharmony_ci	.event_guid = ASUS_NB_WMI_EVENT_GUID,
5868c2ecf20Sopenharmony_ci	.keymap = asus_nb_wmi_keymap,
5878c2ecf20Sopenharmony_ci	.input_name = "Asus WMI hotkeys",
5888c2ecf20Sopenharmony_ci	.input_phys = ASUS_NB_WMI_FILE "/input0",
5898c2ecf20Sopenharmony_ci	.detect_quirks = asus_nb_wmi_quirks,
5908c2ecf20Sopenharmony_ci};
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_ci
5938c2ecf20Sopenharmony_cistatic int __init asus_nb_wmi_init(void)
5948c2ecf20Sopenharmony_ci{
5958c2ecf20Sopenharmony_ci	return asus_wmi_register_driver(&asus_nb_wmi_driver);
5968c2ecf20Sopenharmony_ci}
5978c2ecf20Sopenharmony_ci
5988c2ecf20Sopenharmony_cistatic void __exit asus_nb_wmi_exit(void)
5998c2ecf20Sopenharmony_ci{
6008c2ecf20Sopenharmony_ci	asus_wmi_unregister_driver(&asus_nb_wmi_driver);
6018c2ecf20Sopenharmony_ci}
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_cimodule_init(asus_nb_wmi_init);
6048c2ecf20Sopenharmony_cimodule_exit(asus_nb_wmi_exit);
605