diff options
Diffstat (limited to 'drivers/platform/x86/asus-nb-wmi.c')
| -rw-r--r-- | drivers/platform/x86/asus-nb-wmi.c | 108 | 
1 files changed, 105 insertions, 3 deletions
diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c index 99a30b51313..6b0ebdeae91 100644 --- a/drivers/platform/x86/asus-nb-wmi.c +++ b/drivers/platform/x86/asus-nb-wmi.c @@ -26,6 +26,7 @@  #include <linux/input.h>  #include <linux/input/sparse-keymap.h>  #include <linux/fb.h> +#include <linux/dmi.h>  #include "asus-wmi.h" @@ -48,18 +49,115 @@ MODULE_ALIAS("wmi:"ASUS_NB_WMI_EVENT_GUID);   *  1  | Hardware  | Software   *  4  | Software  | Software   */ -static uint wapf; +static int wapf = -1;  module_param(wapf, uint, 0444);  MODULE_PARM_DESC(wapf, "WAPF value"); +static struct quirk_entry *quirks; +  static struct quirk_entry quirk_asus_unknown = { +	.wapf = 0, +}; + +static struct quirk_entry quirk_asus_x401u = { +	.wapf = 4, +}; + +static int dmi_matched(const struct dmi_system_id *dmi) +{ +	quirks = dmi->driver_data; +	return 1; +} + +static struct dmi_system_id asus_quirks[] = { +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X401U", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X401U"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X401A1", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X401A1"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X501U", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X501U"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X501A1", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X501A1"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X55A", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X55A"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X55C", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X55C"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X55U", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X55U"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{ +		.callback = dmi_matched, +		.ident = "ASUSTeK COMPUTER INC. X55VD", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_PRODUCT_NAME, "X55VD"), +		}, +		.driver_data = &quirk_asus_x401u, +	}, +	{},  };  static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)  { -	driver->quirks = &quirk_asus_unknown; -	driver->quirks->wapf = wapf; +	quirks = &quirk_asus_unknown; +	dmi_check_system(asus_quirks); + +	driver->quirks = quirks;  	driver->panel_power = FB_BLANK_UNBLANK; + +	/* overwrite the wapf setting if the wapf paramater is specified */ +	if (wapf != -1) +		quirks->wapf = wapf; +	else +		wapf = quirks->wapf;  }  static const struct key_entry asus_nb_wmi_keymap[] = { @@ -94,6 +192,10 @@ static const struct key_entry asus_nb_wmi_keymap[] = {  	{ KE_KEY, 0x8A, { KEY_PROG1 } },  	{ KE_KEY, 0x95, { KEY_MEDIA } },  	{ KE_KEY, 0x99, { KEY_PHONE } }, +	{ KE_KEY, 0xA0, { KEY_SWITCHVIDEOMODE } }, /* SDSP HDMI only */ +	{ KE_KEY, 0xA1, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + HDMI */ +	{ KE_KEY, 0xA2, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + HDMI */ +	{ KE_KEY, 0xA3, { KEY_SWITCHVIDEOMODE } }, /* SDSP TV + HDMI */  	{ KE_KEY, 0xb5, { KEY_CALC } },  	{ KE_KEY, 0xc4, { KEY_KBDILLUMUP } },  	{ KE_KEY, 0xc5, { KEY_KBDILLUMDOWN } },  |