18761b9b5SHuacai Chen /* SPDX-License-Identifier: GPL-2.0-only */
28761b9b5SHuacai Chen #ifndef _I8042_ACPIPNPIO_H
38761b9b5SHuacai Chen #define _I8042_ACPIPNPIO_H
48761b9b5SHuacai Chen 
5fdd7c961SHuacai Chen #include <linux/acpi.h>
68761b9b5SHuacai Chen 
78761b9b5SHuacai Chen #ifdef CONFIG_X86
88761b9b5SHuacai Chen #include <asm/x86_init.h>
98761b9b5SHuacai Chen #endif
108761b9b5SHuacai Chen 
118761b9b5SHuacai Chen /*
128761b9b5SHuacai Chen  * Names.
138761b9b5SHuacai Chen  */
148761b9b5SHuacai Chen 
158761b9b5SHuacai Chen #define I8042_KBD_PHYS_DESC "isa0060/serio0"
168761b9b5SHuacai Chen #define I8042_AUX_PHYS_DESC "isa0060/serio1"
178761b9b5SHuacai Chen #define I8042_MUX_PHYS_DESC "isa0060/serio%d"
188761b9b5SHuacai Chen 
198761b9b5SHuacai Chen /*
208761b9b5SHuacai Chen  * IRQs.
218761b9b5SHuacai Chen  */
228761b9b5SHuacai Chen 
238761b9b5SHuacai Chen #if defined(__ia64__)
248761b9b5SHuacai Chen # define I8042_MAP_IRQ(x)	isa_irq_to_vector((x))
258761b9b5SHuacai Chen #else
268761b9b5SHuacai Chen # define I8042_MAP_IRQ(x)	(x)
278761b9b5SHuacai Chen #endif
288761b9b5SHuacai Chen 
298761b9b5SHuacai Chen #define I8042_KBD_IRQ	i8042_kbd_irq
308761b9b5SHuacai Chen #define I8042_AUX_IRQ	i8042_aux_irq
318761b9b5SHuacai Chen 
328761b9b5SHuacai Chen static int i8042_kbd_irq;
338761b9b5SHuacai Chen static int i8042_aux_irq;
348761b9b5SHuacai Chen 
358761b9b5SHuacai Chen /*
368761b9b5SHuacai Chen  * Register numbers.
378761b9b5SHuacai Chen  */
388761b9b5SHuacai Chen 
398761b9b5SHuacai Chen #define I8042_COMMAND_REG	i8042_command_reg
408761b9b5SHuacai Chen #define I8042_STATUS_REG	i8042_command_reg
418761b9b5SHuacai Chen #define I8042_DATA_REG		i8042_data_reg
428761b9b5SHuacai Chen 
438761b9b5SHuacai Chen static int i8042_command_reg = 0x64;
448761b9b5SHuacai Chen static int i8042_data_reg = 0x60;
458761b9b5SHuacai Chen 
468761b9b5SHuacai Chen 
i8042_read_data(void)478761b9b5SHuacai Chen static inline int i8042_read_data(void)
488761b9b5SHuacai Chen {
498761b9b5SHuacai Chen 	return inb(I8042_DATA_REG);
508761b9b5SHuacai Chen }
518761b9b5SHuacai Chen 
i8042_read_status(void)528761b9b5SHuacai Chen static inline int i8042_read_status(void)
538761b9b5SHuacai Chen {
548761b9b5SHuacai Chen 	return inb(I8042_STATUS_REG);
558761b9b5SHuacai Chen }
568761b9b5SHuacai Chen 
i8042_write_data(int val)578761b9b5SHuacai Chen static inline void i8042_write_data(int val)
588761b9b5SHuacai Chen {
598761b9b5SHuacai Chen 	outb(val, I8042_DATA_REG);
608761b9b5SHuacai Chen }
618761b9b5SHuacai Chen 
i8042_write_command(int val)628761b9b5SHuacai Chen static inline void i8042_write_command(int val)
638761b9b5SHuacai Chen {
648761b9b5SHuacai Chen 	outb(val, I8042_COMMAND_REG);
658761b9b5SHuacai Chen }
668761b9b5SHuacai Chen 
678761b9b5SHuacai Chen #ifdef CONFIG_X86
688761b9b5SHuacai Chen 
698761b9b5SHuacai Chen #include <linux/dmi.h>
708761b9b5SHuacai Chen 
718761b9b5SHuacai Chen #define SERIO_QUIRK_NOKBD		BIT(0)
728761b9b5SHuacai Chen #define SERIO_QUIRK_NOAUX		BIT(1)
738761b9b5SHuacai Chen #define SERIO_QUIRK_NOMUX		BIT(2)
748761b9b5SHuacai Chen #define SERIO_QUIRK_FORCEMUX		BIT(3)
758761b9b5SHuacai Chen #define SERIO_QUIRK_UNLOCK		BIT(4)
768761b9b5SHuacai Chen #define SERIO_QUIRK_PROBE_DEFER		BIT(5)
778761b9b5SHuacai Chen #define SERIO_QUIRK_RESET_ALWAYS	BIT(6)
788761b9b5SHuacai Chen #define SERIO_QUIRK_RESET_NEVER		BIT(7)
798761b9b5SHuacai Chen #define SERIO_QUIRK_DIECT		BIT(8)
808761b9b5SHuacai Chen #define SERIO_QUIRK_DUMBKBD		BIT(9)
818761b9b5SHuacai Chen #define SERIO_QUIRK_NOLOOP		BIT(10)
828761b9b5SHuacai Chen #define SERIO_QUIRK_NOTIMEOUT		BIT(11)
838761b9b5SHuacai Chen #define SERIO_QUIRK_KBDRESET		BIT(12)
848761b9b5SHuacai Chen #define SERIO_QUIRK_DRITEK		BIT(13)
858761b9b5SHuacai Chen #define SERIO_QUIRK_NOPNP		BIT(14)
868761b9b5SHuacai Chen 
878761b9b5SHuacai Chen /* Quirk table for different mainboards. Options similar or identical to i8042
888761b9b5SHuacai Chen  * module parameters.
898761b9b5SHuacai Chen  * ORDERING IS IMPORTANT! The first match will be apllied and the rest ignored.
908761b9b5SHuacai Chen  * This allows entries to overwrite vendor wide quirks on a per device basis.
918761b9b5SHuacai Chen  * Where this is irrelevant, entries are sorted case sensitive by DMI_SYS_VENDOR
928761b9b5SHuacai Chen  * and/or DMI_BOARD_VENDOR to make it easier to avoid dublicate entries.
938761b9b5SHuacai Chen  */
948761b9b5SHuacai Chen static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
958761b9b5SHuacai Chen 	{
968761b9b5SHuacai Chen 		.matches = {
978761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
988761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
998761b9b5SHuacai Chen 		},
1008761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
1018761b9b5SHuacai Chen 	},
1028761b9b5SHuacai Chen 	{
1038761b9b5SHuacai Chen 		.matches = {
1048761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1058761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"),
1068761b9b5SHuacai Chen 		},
1078761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
1088761b9b5SHuacai Chen 	},
1098761b9b5SHuacai Chen 	{
1108761b9b5SHuacai Chen 		/* Asus X450LCP */
1118761b9b5SHuacai Chen 		.matches = {
1128761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1138761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"),
1148761b9b5SHuacai Chen 		},
1158761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER)
1168761b9b5SHuacai Chen 	},
1178761b9b5SHuacai Chen 	{
11826c263bfSTakashi Iwai 		/* ASUS ZenBook UX425UA/QA */
1198761b9b5SHuacai Chen 		.matches = {
1208761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
12126c263bfSTakashi Iwai 			DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425"),
1228761b9b5SHuacai Chen 		},
1238761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
1248761b9b5SHuacai Chen 	},
1258761b9b5SHuacai Chen 	{
12626c263bfSTakashi Iwai 		/* ASUS ZenBook UM325UA/QA */
1278761b9b5SHuacai Chen 		.matches = {
1288761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
12926c263bfSTakashi Iwai 			DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325"),
1308761b9b5SHuacai Chen 		},
1318761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
1328761b9b5SHuacai Chen 	},
1338761b9b5SHuacai Chen 	/*
1348761b9b5SHuacai Chen 	 * On some Asus laptops, just running self tests cause problems.
1358761b9b5SHuacai Chen 	 */
1368761b9b5SHuacai Chen 	{
1378761b9b5SHuacai Chen 		.matches = {
1388761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1398761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
1408761b9b5SHuacai Chen 		},
1418761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_NEVER)
1428761b9b5SHuacai Chen 	},
1438761b9b5SHuacai Chen 	{
1448761b9b5SHuacai Chen 		.matches = {
1458761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1468761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */
1478761b9b5SHuacai Chen 		},
1488761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_NEVER)
1498761b9b5SHuacai Chen 	},
1508761b9b5SHuacai Chen 	{
1518761b9b5SHuacai Chen 		/* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */
1528761b9b5SHuacai Chen 		.matches = {
1538761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1548761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),
1558761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),
1568761b9b5SHuacai Chen 		},
1578761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
1588761b9b5SHuacai Chen 	},
1598761b9b5SHuacai Chen 	{
1608761b9b5SHuacai Chen 		/* ASUS G1S */
1618761b9b5SHuacai Chen 		.matches = {
1628761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
1638761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "G1S"),
1648761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
1658761b9b5SHuacai Chen 		},
1668761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
1678761b9b5SHuacai Chen 	},
1688761b9b5SHuacai Chen 	{
1698761b9b5SHuacai Chen 		.matches = {
1708761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1718761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
1728761b9b5SHuacai Chen 		},
1738761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
1748761b9b5SHuacai Chen 	},
1758761b9b5SHuacai Chen 	{
1768761b9b5SHuacai Chen 		/* Acer Aspire 5710 */
1778761b9b5SHuacai Chen 		.matches = {
1788761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1798761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"),
1808761b9b5SHuacai Chen 		},
1818761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
1828761b9b5SHuacai Chen 	},
1838761b9b5SHuacai Chen 	{
1848761b9b5SHuacai Chen 		/* Acer Aspire 7738 */
1858761b9b5SHuacai Chen 		.matches = {
1868761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1878761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"),
1888761b9b5SHuacai Chen 		},
1898761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
1908761b9b5SHuacai Chen 	},
1918761b9b5SHuacai Chen 	{
1928761b9b5SHuacai Chen 		/* Acer Aspire 5536 */
1938761b9b5SHuacai Chen 		.matches = {
1948761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1958761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),
1968761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
1978761b9b5SHuacai Chen 		},
1988761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
1998761b9b5SHuacai Chen 	},
2008761b9b5SHuacai Chen 	{
2018761b9b5SHuacai Chen 		/*
2028761b9b5SHuacai Chen 		 * Acer Aspire 5738z
2038761b9b5SHuacai Chen 		 * Touchpad stops working in mux mode when dis- + re-enabled
2048761b9b5SHuacai Chen 		 * with the touchpad enable/disable toggle hotkey
2058761b9b5SHuacai Chen 		 */
2068761b9b5SHuacai Chen 		.matches = {
2078761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2088761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
2098761b9b5SHuacai Chen 		},
2108761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
2118761b9b5SHuacai Chen 	},
2128761b9b5SHuacai Chen 	{
2138761b9b5SHuacai Chen 		/* Acer Aspire One 150 */
2148761b9b5SHuacai Chen 		.matches = {
2158761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2168761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
2178761b9b5SHuacai Chen 		},
2188761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2198761b9b5SHuacai Chen 	},
2208761b9b5SHuacai Chen 	{
2218761b9b5SHuacai Chen 		/* Acer Aspire One 532h */
2228761b9b5SHuacai Chen 		.matches = {
2238761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2248761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "AO532h"),
2258761b9b5SHuacai Chen 		},
2268761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
2278761b9b5SHuacai Chen 	},
2288761b9b5SHuacai Chen 	{
2298761b9b5SHuacai Chen 		.matches = {
2308761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2318761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"),
2328761b9b5SHuacai Chen 		},
2338761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2348761b9b5SHuacai Chen 	},
2358761b9b5SHuacai Chen 	{
2368761b9b5SHuacai Chen 		.matches = {
2378761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2388761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"),
2398761b9b5SHuacai Chen 		},
2408761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2418761b9b5SHuacai Chen 	},
2428761b9b5SHuacai Chen 	{
2438761b9b5SHuacai Chen 		.matches = {
2448761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2458761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"),
2468761b9b5SHuacai Chen 		},
2478761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2488761b9b5SHuacai Chen 	},
2498761b9b5SHuacai Chen 	{
2508761b9b5SHuacai Chen 		.matches = {
2518761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2528761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"),
2538761b9b5SHuacai Chen 		},
2548761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2558761b9b5SHuacai Chen 	},
2568761b9b5SHuacai Chen 	{
2578761b9b5SHuacai Chen 		.matches = {
2588761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2598761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"),
2608761b9b5SHuacai Chen 		},
2618761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2628761b9b5SHuacai Chen 	},
2638761b9b5SHuacai Chen 	{
2648761b9b5SHuacai Chen 		.matches = {
2658761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2668761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"),
2678761b9b5SHuacai Chen 		},
2688761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2698761b9b5SHuacai Chen 	},
2708761b9b5SHuacai Chen 	{
2718761b9b5SHuacai Chen 		.matches = {
2728761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2738761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"),
2748761b9b5SHuacai Chen 		},
2758761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
2768761b9b5SHuacai Chen 	},
2778761b9b5SHuacai Chen 	/*
2788761b9b5SHuacai Chen 	 * Some Wistron based laptops need us to explicitly enable the 'Dritek
2798761b9b5SHuacai Chen 	 * keyboard extension' to make their extra keys start generating scancodes.
2808761b9b5SHuacai Chen 	 * Originally, this was just confined to older laptops, but a few Acer laptops
2818761b9b5SHuacai Chen 	 * have turned up in 2007 that also need this again.
2828761b9b5SHuacai Chen 	 */
2838761b9b5SHuacai Chen 	{
2848761b9b5SHuacai Chen 		/* Acer Aspire 5100 */
2858761b9b5SHuacai Chen 		.matches = {
2868761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2878761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
2888761b9b5SHuacai Chen 		},
2898761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
2908761b9b5SHuacai Chen 	},
2918761b9b5SHuacai Chen 	{
2928761b9b5SHuacai Chen 		/* Acer Aspire 5610 */
2938761b9b5SHuacai Chen 		.matches = {
2948761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
2958761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
2968761b9b5SHuacai Chen 		},
2978761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
2988761b9b5SHuacai Chen 	},
2998761b9b5SHuacai Chen 	{
3008761b9b5SHuacai Chen 		/* Acer Aspire 5630 */
3018761b9b5SHuacai Chen 		.matches = {
3028761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3038761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
3048761b9b5SHuacai Chen 		},
3058761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3068761b9b5SHuacai Chen 	},
3078761b9b5SHuacai Chen 	{
3088761b9b5SHuacai Chen 		/* Acer Aspire 5650 */
3098761b9b5SHuacai Chen 		.matches = {
3108761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3118761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
3128761b9b5SHuacai Chen 		},
3138761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3148761b9b5SHuacai Chen 	},
3158761b9b5SHuacai Chen 	{
3168761b9b5SHuacai Chen 		/* Acer Aspire 5680 */
3178761b9b5SHuacai Chen 		.matches = {
3188761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3198761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
3208761b9b5SHuacai Chen 		},
3218761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3228761b9b5SHuacai Chen 	},
3238761b9b5SHuacai Chen 	{
3248761b9b5SHuacai Chen 		/* Acer Aspire 5720 */
3258761b9b5SHuacai Chen 		.matches = {
3268761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3278761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
3288761b9b5SHuacai Chen 		},
3298761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3308761b9b5SHuacai Chen 	},
3318761b9b5SHuacai Chen 	{
3328761b9b5SHuacai Chen 		/* Acer Aspire 9110 */
3338761b9b5SHuacai Chen 		.matches = {
3348761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3358761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
3368761b9b5SHuacai Chen 		},
3378761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3388761b9b5SHuacai Chen 	},
3398761b9b5SHuacai Chen 	{
3408761b9b5SHuacai Chen 		/* Acer TravelMate 660 */
3418761b9b5SHuacai Chen 		.matches = {
3428761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3438761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),
3448761b9b5SHuacai Chen 		},
3458761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3468761b9b5SHuacai Chen 	},
3478761b9b5SHuacai Chen 	{
3488761b9b5SHuacai Chen 		/* Acer TravelMate 2490 */
3498761b9b5SHuacai Chen 		.matches = {
3508761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3518761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
3528761b9b5SHuacai Chen 		},
3538761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3548761b9b5SHuacai Chen 	},
3558761b9b5SHuacai Chen 	{
3568761b9b5SHuacai Chen 		/* Acer TravelMate 4280 */
3578761b9b5SHuacai Chen 		.matches = {
3588761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3598761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
3608761b9b5SHuacai Chen 		},
3618761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_DRITEK)
3628761b9b5SHuacai Chen 	},
3638761b9b5SHuacai Chen 	{
3640a4a682bSEsther Shimanovich 		/* Acer TravelMate P459-G2-M */
3650a4a682bSEsther Shimanovich 		.matches = {
3660a4a682bSEsther Shimanovich 			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
3670a4a682bSEsther Shimanovich 			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate P459-G2-M"),
3680a4a682bSEsther Shimanovich 		},
3690a4a682bSEsther Shimanovich 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
3700a4a682bSEsther Shimanovich 	},
3710a4a682bSEsther Shimanovich 	{
3728761b9b5SHuacai Chen 		/* Amoi M636/A737 */
3738761b9b5SHuacai Chen 		.matches = {
3748761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
3758761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
3768761b9b5SHuacai Chen 		},
3778761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
3788761b9b5SHuacai Chen 	},
3798761b9b5SHuacai Chen 	{
3808761b9b5SHuacai Chen 		.matches = {
3818761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
3828761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
3838761b9b5SHuacai Chen 		},
3848761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
3858761b9b5SHuacai Chen 	},
3868761b9b5SHuacai Chen 	{
3878761b9b5SHuacai Chen 		/* Compal HEL80I */
3888761b9b5SHuacai Chen 		.matches = {
3898761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
3908761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
3918761b9b5SHuacai Chen 		},
3928761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
3938761b9b5SHuacai Chen 	},
3948761b9b5SHuacai Chen 	{
3958761b9b5SHuacai Chen 		.matches = {
3968761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
3978761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"),
3988761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
3998761b9b5SHuacai Chen 		},
4008761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
4018761b9b5SHuacai Chen 	},
4028761b9b5SHuacai Chen 	{
4038761b9b5SHuacai Chen 		.matches = {
4048761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
4058761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"),
4068761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
4078761b9b5SHuacai Chen 		},
4088761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
4098761b9b5SHuacai Chen 	},
4108761b9b5SHuacai Chen 	{
4118761b9b5SHuacai Chen 		/* Advent 4211 */
4128761b9b5SHuacai Chen 		.matches = {
4138761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
4148761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
4158761b9b5SHuacai Chen 		},
4168761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4178761b9b5SHuacai Chen 	},
4188761b9b5SHuacai Chen 	{
4198761b9b5SHuacai Chen 		/* Dell Embedded Box PC 3000 */
4208761b9b5SHuacai Chen 		.matches = {
4218761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4228761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
4238761b9b5SHuacai Chen 		},
4248761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
4258761b9b5SHuacai Chen 	},
4268761b9b5SHuacai Chen 	{
4278761b9b5SHuacai Chen 		/* Dell XPS M1530 */
4288761b9b5SHuacai Chen 		.matches = {
4298761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4308761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
4318761b9b5SHuacai Chen 		},
4328761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4338761b9b5SHuacai Chen 	},
4348761b9b5SHuacai Chen 	{
4358761b9b5SHuacai Chen 		/* Dell Vostro 1510 */
4368761b9b5SHuacai Chen 		.matches = {
4378761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4388761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
4398761b9b5SHuacai Chen 		},
4408761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4418761b9b5SHuacai Chen 	},
4428761b9b5SHuacai Chen 	{
4438761b9b5SHuacai Chen 		/* Dell Vostro V13 */
4448761b9b5SHuacai Chen 		.matches = {
4458761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4468761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
4478761b9b5SHuacai Chen 		},
4488761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
4498761b9b5SHuacai Chen 	},
4508761b9b5SHuacai Chen 	{
4518761b9b5SHuacai Chen 		/* Dell Vostro 1320 */
4528761b9b5SHuacai Chen 		.matches = {
4538761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4548761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
4558761b9b5SHuacai Chen 		},
4568761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4578761b9b5SHuacai Chen 	},
4588761b9b5SHuacai Chen 	{
4598761b9b5SHuacai Chen 		/* Dell Vostro 1520 */
4608761b9b5SHuacai Chen 		.matches = {
4618761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4628761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
4638761b9b5SHuacai Chen 		},
4648761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4658761b9b5SHuacai Chen 	},
4668761b9b5SHuacai Chen 	{
4678761b9b5SHuacai Chen 		/* Dell Vostro 1720 */
4688761b9b5SHuacai Chen 		.matches = {
4698761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4708761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
4718761b9b5SHuacai Chen 		},
4728761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4738761b9b5SHuacai Chen 	},
4748761b9b5SHuacai Chen 	{
4758761b9b5SHuacai Chen 		/* Entroware Proteus */
4768761b9b5SHuacai Chen 		.matches = {
4778761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
4788761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
4798761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
4808761b9b5SHuacai Chen 		},
4818761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS)
4828761b9b5SHuacai Chen 	},
4838761b9b5SHuacai Chen 	/*
4848761b9b5SHuacai Chen 	 * Some Fujitsu notebooks are having trouble with touchpads if
4858761b9b5SHuacai Chen 	 * active multiplexing mode is activated. Luckily they don't have
4868761b9b5SHuacai Chen 	 * external PS/2 ports so we can safely disable it.
4878761b9b5SHuacai Chen 	 * ... apparently some Toshibas don't like MUX mode either and
4888761b9b5SHuacai Chen 	 * die horrible death on reboot.
4898761b9b5SHuacai Chen 	 */
4908761b9b5SHuacai Chen 	{
4918761b9b5SHuacai Chen 		/* Fujitsu Lifebook P7010/P7010D */
4928761b9b5SHuacai Chen 		.matches = {
4938761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
4948761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
4958761b9b5SHuacai Chen 		},
4968761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4978761b9b5SHuacai Chen 	},
4988761b9b5SHuacai Chen 	{
4998761b9b5SHuacai Chen 		/* Fujitsu Lifebook P5020D */
5008761b9b5SHuacai Chen 		.matches = {
5018761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5028761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
5038761b9b5SHuacai Chen 		},
5048761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5058761b9b5SHuacai Chen 	},
5068761b9b5SHuacai Chen 	{
5078761b9b5SHuacai Chen 		/* Fujitsu Lifebook S2000 */
5088761b9b5SHuacai Chen 		.matches = {
5098761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5108761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
5118761b9b5SHuacai Chen 		},
5128761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5138761b9b5SHuacai Chen 	},
5148761b9b5SHuacai Chen 	{
5158761b9b5SHuacai Chen 		/* Fujitsu Lifebook S6230 */
5168761b9b5SHuacai Chen 		.matches = {
5178761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5188761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
5198761b9b5SHuacai Chen 		},
5208761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5218761b9b5SHuacai Chen 	},
5228761b9b5SHuacai Chen 	{
5238761b9b5SHuacai Chen 		/* Fujitsu Lifebook T725 laptop */
5248761b9b5SHuacai Chen 		.matches = {
5258761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5268761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
5278761b9b5SHuacai Chen 		},
5288761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
5298761b9b5SHuacai Chen 	},
5308761b9b5SHuacai Chen 	{
5318761b9b5SHuacai Chen 		/* Fujitsu Lifebook U745 */
5328761b9b5SHuacai Chen 		.matches = {
5338761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5348761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
5358761b9b5SHuacai Chen 		},
5368761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5378761b9b5SHuacai Chen 	},
5388761b9b5SHuacai Chen 	{
5398761b9b5SHuacai Chen 		/* Fujitsu T70H */
5408761b9b5SHuacai Chen 		.matches = {
5418761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5428761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
5438761b9b5SHuacai Chen 		},
5448761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5458761b9b5SHuacai Chen 	},
5468761b9b5SHuacai Chen 	{
5478761b9b5SHuacai Chen 		/* Fujitsu A544 laptop */
5488761b9b5SHuacai Chen 		/* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
5498761b9b5SHuacai Chen 		.matches = {
5508761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5518761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
5528761b9b5SHuacai Chen 		},
5538761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5548761b9b5SHuacai Chen 	},
5558761b9b5SHuacai Chen 	{
5568761b9b5SHuacai Chen 		/* Fujitsu AH544 laptop */
5578761b9b5SHuacai Chen 		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
5588761b9b5SHuacai Chen 		.matches = {
5598761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5608761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
5618761b9b5SHuacai Chen 		},
5628761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5638761b9b5SHuacai Chen 	},
5648761b9b5SHuacai Chen 	{
5658761b9b5SHuacai Chen 		/* Fujitsu U574 laptop */
5668761b9b5SHuacai Chen 		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
5678761b9b5SHuacai Chen 		.matches = {
5688761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5698761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
5708761b9b5SHuacai Chen 		},
5718761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5728761b9b5SHuacai Chen 	},
5738761b9b5SHuacai Chen 	{
5748761b9b5SHuacai Chen 		/* Fujitsu UH554 laptop */
5758761b9b5SHuacai Chen 		.matches = {
5768761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5778761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"),
5788761b9b5SHuacai Chen 		},
5798761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5808761b9b5SHuacai Chen 	},
5818761b9b5SHuacai Chen 	{
5828761b9b5SHuacai Chen 		/* Fujitsu Lifebook P7010 */
5838761b9b5SHuacai Chen 		.matches = {
5848761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
5858761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
5868761b9b5SHuacai Chen 		},
5878761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5888761b9b5SHuacai Chen 	},
5898761b9b5SHuacai Chen 	{
5908761b9b5SHuacai Chen 		/* Fujitsu-Siemens Lifebook T3010 */
5918761b9b5SHuacai Chen 		.matches = {
5928761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
5938761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
5948761b9b5SHuacai Chen 		},
5958761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5968761b9b5SHuacai Chen 	},
5978761b9b5SHuacai Chen 	{
5988761b9b5SHuacai Chen 		/* Fujitsu-Siemens Lifebook E4010 */
5998761b9b5SHuacai Chen 		.matches = {
6008761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
6018761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
6028761b9b5SHuacai Chen 		},
6038761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
6048761b9b5SHuacai Chen 	},
6058761b9b5SHuacai Chen 	{
6068761b9b5SHuacai Chen 		/* Fujitsu-Siemens Amilo Pro 2010 */
6078761b9b5SHuacai Chen 		.matches = {
6088761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
6098761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
6108761b9b5SHuacai Chen 		},
6118761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
6128761b9b5SHuacai Chen 	},
6138761b9b5SHuacai Chen 	{
6148761b9b5SHuacai Chen 		/* Fujitsu-Siemens Amilo Pro 2030 */
6158761b9b5SHuacai Chen 		.matches = {
6168761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
6178761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
6188761b9b5SHuacai Chen 		},
6198761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
6208761b9b5SHuacai Chen 	},
6218761b9b5SHuacai Chen 	{
622f5bad62fSJonathan Denose 		/* Fujitsu Lifebook A574/H */
623f5bad62fSJonathan Denose 		.matches = {
624f5bad62fSJonathan Denose 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
625f5bad62fSJonathan Denose 			DMI_MATCH(DMI_PRODUCT_NAME, "FMVA0501PZ"),
626f5bad62fSJonathan Denose 		},
627f5bad62fSJonathan Denose 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
628f5bad62fSJonathan Denose 	},
629f5bad62fSJonathan Denose 	{
63080f39e1cSSzilard Fabian 		/* Fujitsu Lifebook E5411 */
63180f39e1cSSzilard Fabian 		.matches = {
63280f39e1cSSzilard Fabian 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU CLIENT COMPUTING LIMITED"),
63380f39e1cSSzilard Fabian 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E5411"),
63480f39e1cSSzilard Fabian 		},
63580f39e1cSSzilard Fabian 		.driver_data = (void *)(SERIO_QUIRK_NOAUX)
63680f39e1cSSzilard Fabian 	},
63780f39e1cSSzilard Fabian 	{
638*4390f74dSSzilard Fabian 		/* Fujitsu Lifebook U728 */
639*4390f74dSSzilard Fabian 		.matches = {
640*4390f74dSSzilard Fabian 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
641*4390f74dSSzilard Fabian 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U728"),
642*4390f74dSSzilard Fabian 		},
643*4390f74dSSzilard Fabian 		.driver_data = (void *)(SERIO_QUIRK_NOAUX)
644*4390f74dSSzilard Fabian 	},
645*4390f74dSSzilard Fabian 	{
6468761b9b5SHuacai Chen 		/* Gigabyte M912 */
6478761b9b5SHuacai Chen 		.matches = {
6488761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6498761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
6508761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
6518761b9b5SHuacai Chen 		},
6528761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6538761b9b5SHuacai Chen 	},
6548761b9b5SHuacai Chen 	{
6558761b9b5SHuacai Chen 		/* Gigabyte Spring Peak - defines wrong chassis type */
6568761b9b5SHuacai Chen 		.matches = {
6578761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6588761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
6598761b9b5SHuacai Chen 		},
6608761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6618761b9b5SHuacai Chen 	},
6628761b9b5SHuacai Chen 	{
6638761b9b5SHuacai Chen 		/* Gigabyte T1005 - defines wrong chassis type ("Other") */
6648761b9b5SHuacai Chen 		.matches = {
6658761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6668761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
6678761b9b5SHuacai Chen 		},
6688761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6698761b9b5SHuacai Chen 	},
6708761b9b5SHuacai Chen 	{
6718761b9b5SHuacai Chen 		/* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
6728761b9b5SHuacai Chen 		.matches = {
6738761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6748761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
6758761b9b5SHuacai Chen 		},
6768761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6778761b9b5SHuacai Chen 	},
6788761b9b5SHuacai Chen 	/*
6798761b9b5SHuacai Chen 	 * Some laptops need keyboard reset before probing for the trackpad to get
6808761b9b5SHuacai Chen 	 * it detected, initialised & finally work.
6818761b9b5SHuacai Chen 	 */
6828761b9b5SHuacai Chen 	{
6838761b9b5SHuacai Chen 		/* Gigabyte P35 v2 - Elantech touchpad */
6848761b9b5SHuacai Chen 		.matches = {
6858761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6868761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
6878761b9b5SHuacai Chen 		},
6888761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
6898761b9b5SHuacai Chen 	},
6908761b9b5SHuacai Chen 		{
6918761b9b5SHuacai Chen 		/* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
6928761b9b5SHuacai Chen 		.matches = {
6938761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6948761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
6958761b9b5SHuacai Chen 		},
6968761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
6978761b9b5SHuacai Chen 	},
6988761b9b5SHuacai Chen 	{
6998761b9b5SHuacai Chen 		/* Gigabyte P34 - Elantech touchpad */
7008761b9b5SHuacai Chen 		.matches = {
7018761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
7028761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
7038761b9b5SHuacai Chen 		},
7048761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
7058761b9b5SHuacai Chen 	},
7068761b9b5SHuacai Chen 	{
7078761b9b5SHuacai Chen 		/* Gigabyte P57 - Elantech touchpad */
7088761b9b5SHuacai Chen 		.matches = {
7098761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
7108761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
7118761b9b5SHuacai Chen 		},
7128761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
7138761b9b5SHuacai Chen 	},
7148761b9b5SHuacai Chen 	{
7158761b9b5SHuacai Chen 		/* Gericom Bellagio */
7168761b9b5SHuacai Chen 		.matches = {
7178761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
7188761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
7198761b9b5SHuacai Chen 		},
7208761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7218761b9b5SHuacai Chen 	},
7228761b9b5SHuacai Chen 	{
7238761b9b5SHuacai Chen 		/* Gigabyte M1022M netbook */
7248761b9b5SHuacai Chen 		.matches = {
7258761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
7268761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
7278761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
7288761b9b5SHuacai Chen 		},
7298761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
7308761b9b5SHuacai Chen 	},
7318761b9b5SHuacai Chen 	{
7328761b9b5SHuacai Chen 		.matches = {
7338761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7348761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
7358761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
7368761b9b5SHuacai Chen 		},
7378761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
7388761b9b5SHuacai Chen 	},
7398761b9b5SHuacai Chen 	{
7408761b9b5SHuacai Chen 		/*
7418761b9b5SHuacai Chen 		 * HP Pavilion DV4017EA -
7428761b9b5SHuacai Chen 		 * errors on MUX ports are reported without raising AUXDATA
7438761b9b5SHuacai Chen 		 * causing "spurious NAK" messages.
7448761b9b5SHuacai Chen 		 */
7458761b9b5SHuacai Chen 		.matches = {
7468761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7478761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
7488761b9b5SHuacai Chen 		},
7498761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7508761b9b5SHuacai Chen 	},
7518761b9b5SHuacai Chen 	{
7528761b9b5SHuacai Chen 		/*
7538761b9b5SHuacai Chen 		 * HP Pavilion ZT1000 -
7548761b9b5SHuacai Chen 		 * like DV4017EA does not raise AUXERR for errors on MUX ports.
7558761b9b5SHuacai Chen 		 */
7568761b9b5SHuacai Chen 		.matches = {
7578761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7588761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
7598761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
7608761b9b5SHuacai Chen 		},
7618761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7628761b9b5SHuacai Chen 	},
7638761b9b5SHuacai Chen 	{
7648761b9b5SHuacai Chen 		/*
7658761b9b5SHuacai Chen 		 * HP Pavilion DV4270ca -
7668761b9b5SHuacai Chen 		 * like DV4017EA does not raise AUXERR for errors on MUX ports.
7678761b9b5SHuacai Chen 		 */
7688761b9b5SHuacai Chen 		.matches = {
7698761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7708761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
7718761b9b5SHuacai Chen 		},
7728761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7738761b9b5SHuacai Chen 	},
7748761b9b5SHuacai Chen 	{
7758761b9b5SHuacai Chen 		/* Newer HP Pavilion dv4 models */
7768761b9b5SHuacai Chen 		.matches = {
7778761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7788761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
7798761b9b5SHuacai Chen 		},
7808761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
7818761b9b5SHuacai Chen 	},
7828761b9b5SHuacai Chen 	{
7838761b9b5SHuacai Chen 		/* IBM 2656 */
7848761b9b5SHuacai Chen 		.matches = {
7858761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
7868761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
7878761b9b5SHuacai Chen 		},
7888761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7898761b9b5SHuacai Chen 	},
7908761b9b5SHuacai Chen 	{
7918761b9b5SHuacai Chen 		/* Avatar AVIU-145A6 */
7928761b9b5SHuacai Chen 		.matches = {
7938761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
7948761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
7958761b9b5SHuacai Chen 		},
7968761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7978761b9b5SHuacai Chen 	},
7988761b9b5SHuacai Chen 	{
7998761b9b5SHuacai Chen 		/* Intel MBO Desktop D845PESV */
8008761b9b5SHuacai Chen 		.matches = {
8018761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
8028761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
8038761b9b5SHuacai Chen 		},
8048761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOPNP)
8058761b9b5SHuacai Chen 	},
8068761b9b5SHuacai Chen 	{
8078761b9b5SHuacai Chen 		/*
8088761b9b5SHuacai Chen 		 * Intel NUC D54250WYK - does not have i8042 controller but
8098761b9b5SHuacai Chen 		 * declares PS/2 devices in DSDT.
8108761b9b5SHuacai Chen 		 */
8118761b9b5SHuacai Chen 		.matches = {
8128761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
8138761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"),
8148761b9b5SHuacai Chen 		},
8158761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOPNP)
8168761b9b5SHuacai Chen 	},
8178761b9b5SHuacai Chen 	{
8188761b9b5SHuacai Chen 		/* Lenovo 3000 n100 */
8198761b9b5SHuacai Chen 		.matches = {
8208761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8218761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
8228761b9b5SHuacai Chen 		},
8238761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8248761b9b5SHuacai Chen 	},
8258761b9b5SHuacai Chen 	{
8268761b9b5SHuacai Chen 		/* Lenovo XiaoXin Air 12 */
8278761b9b5SHuacai Chen 		.matches = {
8288761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8298761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "80UN"),
8308761b9b5SHuacai Chen 		},
8318761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8328761b9b5SHuacai Chen 	},
8338761b9b5SHuacai Chen 	{
8348761b9b5SHuacai Chen 		/* Lenovo LaVie Z */
8358761b9b5SHuacai Chen 		.matches = {
8368761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8378761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"),
8388761b9b5SHuacai Chen 		},
8398761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8408761b9b5SHuacai Chen 	},
8418761b9b5SHuacai Chen 	{
8428761b9b5SHuacai Chen 		/* Lenovo Ideapad U455 */
8438761b9b5SHuacai Chen 		.matches = {
8448761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8458761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
8468761b9b5SHuacai Chen 		},
8478761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8488761b9b5SHuacai Chen 	},
8498761b9b5SHuacai Chen 	{
8508761b9b5SHuacai Chen 		/* Lenovo ThinkPad L460 */
8518761b9b5SHuacai Chen 		.matches = {
8528761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8538761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"),
8548761b9b5SHuacai Chen 		},
8558761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8568761b9b5SHuacai Chen 	},
8578761b9b5SHuacai Chen 	{
8588761b9b5SHuacai Chen 		/* Lenovo ThinkPad Twist S230u */
8598761b9b5SHuacai Chen 		.matches = {
8608761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8618761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
8628761b9b5SHuacai Chen 		},
8638761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8648761b9b5SHuacai Chen 	},
8658761b9b5SHuacai Chen 	{
8668761b9b5SHuacai Chen 		/* LG Electronics X110 */
8678761b9b5SHuacai Chen 		.matches = {
8688761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
8698761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "X110"),
8708761b9b5SHuacai Chen 		},
8718761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8728761b9b5SHuacai Chen 	},
8738761b9b5SHuacai Chen 	{
8748761b9b5SHuacai Chen 		/* Medion Akoya Mini E1210 */
8758761b9b5SHuacai Chen 		.matches = {
8768761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
8778761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
8788761b9b5SHuacai Chen 		},
8798761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8808761b9b5SHuacai Chen 	},
8818761b9b5SHuacai Chen 	{
8828761b9b5SHuacai Chen 		/* Medion Akoya E1222 */
8838761b9b5SHuacai Chen 		.matches = {
8848761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
8858761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
8868761b9b5SHuacai Chen 		},
8878761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8888761b9b5SHuacai Chen 	},
8898761b9b5SHuacai Chen 	{
8908761b9b5SHuacai Chen 		/* MSI Wind U-100 */
8918761b9b5SHuacai Chen 		.matches = {
8928761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
8938761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "U-100"),
8948761b9b5SHuacai Chen 		},
8958761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOPNP)
8968761b9b5SHuacai Chen 	},
8978761b9b5SHuacai Chen 	{
8988761b9b5SHuacai Chen 		/*
8998761b9b5SHuacai Chen 		 * No data is coming from the touchscreen unless KBC
9008761b9b5SHuacai Chen 		 * is in legacy mode.
9018761b9b5SHuacai Chen 		 */
9028761b9b5SHuacai Chen 		/* Panasonic CF-29 */
9038761b9b5SHuacai Chen 		.matches = {
9048761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
9058761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
9068761b9b5SHuacai Chen 		},
9078761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9088761b9b5SHuacai Chen 	},
9098761b9b5SHuacai Chen 	{
9108761b9b5SHuacai Chen 		/* Medion Akoya E7225 */
9118761b9b5SHuacai Chen 		.matches = {
9128761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
9138761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
9148761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
9158761b9b5SHuacai Chen 		},
9168761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9178761b9b5SHuacai Chen 	},
9188761b9b5SHuacai Chen 	{
9198761b9b5SHuacai Chen 		/* Microsoft Virtual Machine */
9208761b9b5SHuacai Chen 		.matches = {
9218761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
9228761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
9238761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
9248761b9b5SHuacai Chen 		},
9258761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9268761b9b5SHuacai Chen 	},
9278761b9b5SHuacai Chen 	{
9288761b9b5SHuacai Chen 		/* Medion MAM 2070 */
9298761b9b5SHuacai Chen 		.matches = {
9308761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
9318761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
9328761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
9338761b9b5SHuacai Chen 		},
9348761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9358761b9b5SHuacai Chen 	},
9368761b9b5SHuacai Chen 	{
9378761b9b5SHuacai Chen 		/* TUXEDO BU1406 */
9388761b9b5SHuacai Chen 		.matches = {
9398761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
9408761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"),
9418761b9b5SHuacai Chen 		},
9428761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9438761b9b5SHuacai Chen 	},
9448761b9b5SHuacai Chen 	{
9458761b9b5SHuacai Chen 		/* OQO Model 01 */
9468761b9b5SHuacai Chen 		.matches = {
9478761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
9488761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
9498761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
9508761b9b5SHuacai Chen 		},
9518761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9528761b9b5SHuacai Chen 	},
9538761b9b5SHuacai Chen 	{
9548761b9b5SHuacai Chen 		.matches = {
9558761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
9568761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
9578761b9b5SHuacai Chen 		},
9588761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9598761b9b5SHuacai Chen 	},
9608761b9b5SHuacai Chen 	{
9618761b9b5SHuacai Chen 		/* Acer Aspire 5 A515 */
9628761b9b5SHuacai Chen 		.matches = {
9638761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "PK"),
9648761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"),
9658761b9b5SHuacai Chen 		},
9668761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOPNP)
9678761b9b5SHuacai Chen 	},
9688761b9b5SHuacai Chen 	{
9698761b9b5SHuacai Chen 		/* ULI EV4873 - AUX LOOP does not work properly */
9708761b9b5SHuacai Chen 		.matches = {
9718761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
9728761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
9738761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
9748761b9b5SHuacai Chen 		},
9758761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9768761b9b5SHuacai Chen 	},
9778761b9b5SHuacai Chen 	{
9788761b9b5SHuacai Chen 		/*
9798761b9b5SHuacai Chen 		 * Arima-Rioworks HDAMB -
9808761b9b5SHuacai Chen 		 * AUX LOOP command does not raise AUX IRQ
9818761b9b5SHuacai Chen 		 */
9828761b9b5SHuacai Chen 		.matches = {
9838761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
9848761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
9858761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
9868761b9b5SHuacai Chen 		},
9878761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9888761b9b5SHuacai Chen 	},
9898761b9b5SHuacai Chen 	{
9908761b9b5SHuacai Chen 		/* Sharp Actius MM20 */
9918761b9b5SHuacai Chen 		.matches = {
9928761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
9938761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
9948761b9b5SHuacai Chen 		},
9958761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9968761b9b5SHuacai Chen 	},
9978761b9b5SHuacai Chen 	{
9988761b9b5SHuacai Chen 		/*
9998761b9b5SHuacai Chen 		 * Sony Vaio FZ-240E -
10008761b9b5SHuacai Chen 		 * reset and GET ID commands issued via KBD port are
10018761b9b5SHuacai Chen 		 * sometimes being delivered to AUX3.
10028761b9b5SHuacai Chen 		 */
10038761b9b5SHuacai Chen 		.matches = {
10048761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
10058761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
10068761b9b5SHuacai Chen 		},
10078761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10088761b9b5SHuacai Chen 	},
10098761b9b5SHuacai Chen 	{
10108761b9b5SHuacai Chen 		/*
10118761b9b5SHuacai Chen 		 * Most (all?) VAIOs do not have external PS/2 ports nor
10128761b9b5SHuacai Chen 		 * they implement active multiplexing properly, and
10138761b9b5SHuacai Chen 		 * MUX discovery usually messes up keyboard/touchpad.
10148761b9b5SHuacai Chen 		 */
10158761b9b5SHuacai Chen 		.matches = {
10168761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
10178761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
10188761b9b5SHuacai Chen 		},
10198761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10208761b9b5SHuacai Chen 	},
10218761b9b5SHuacai Chen 	{
10228761b9b5SHuacai Chen 		/* Sony Vaio FS-115b */
10238761b9b5SHuacai Chen 		.matches = {
10248761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
10258761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
10268761b9b5SHuacai Chen 		},
10278761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10288761b9b5SHuacai Chen 	},
10298761b9b5SHuacai Chen 	{
10308761b9b5SHuacai Chen 		/*
10318761b9b5SHuacai Chen 		 * Sony Vaio VGN-CS series require MUX or the touch sensor
10328761b9b5SHuacai Chen 		 * buttons will disturb touchpad operation
10338761b9b5SHuacai Chen 		 */
10348761b9b5SHuacai Chen 		.matches = {
10358761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
10368761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"),
10378761b9b5SHuacai Chen 		},
10388761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_FORCEMUX)
10398761b9b5SHuacai Chen 	},
10408761b9b5SHuacai Chen 	{
10418761b9b5SHuacai Chen 		.matches = {
10428761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
10438761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
10448761b9b5SHuacai Chen 		},
10458761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10468761b9b5SHuacai Chen 	},
10478761b9b5SHuacai Chen 	{
10488761b9b5SHuacai Chen 		.matches = {
10498761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
10508761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
10518761b9b5SHuacai Chen 		},
10528761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10538761b9b5SHuacai Chen 	},
10548761b9b5SHuacai Chen 	{
10558761b9b5SHuacai Chen 		.matches = {
10568761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
10578761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
10588761b9b5SHuacai Chen 		},
10598761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10608761b9b5SHuacai Chen 	},
10618761b9b5SHuacai Chen 	/*
10628761b9b5SHuacai Chen 	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
10638761b9b5SHuacai Chen 	 * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
10648761b9b5SHuacai Chen 	 * none of them have an external PS/2 port so this can safely be set for
10658761b9b5SHuacai Chen 	 * all of them. These two are based on a Clevo design, but have the
10668761b9b5SHuacai Chen 	 * board_name changed.
10678761b9b5SHuacai Chen 	 */
10688761b9b5SHuacai Chen 	{
10698761b9b5SHuacai Chen 		.matches = {
10708761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
10718761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "AURA1501"),
10728761b9b5SHuacai Chen 		},
10738761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
10748761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
10758761b9b5SHuacai Chen 	},
10768761b9b5SHuacai Chen 	{
10778761b9b5SHuacai Chen 		.matches = {
10788761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
10798761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"),
10808761b9b5SHuacai Chen 		},
10818761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
10828761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
10838761b9b5SHuacai Chen 	},
10848761b9b5SHuacai Chen 	{
10858761b9b5SHuacai Chen 		/* Mivvy M310 */
10868761b9b5SHuacai Chen 		.matches = {
10878761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
10888761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
10898761b9b5SHuacai Chen 		},
10908761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
10918761b9b5SHuacai Chen 	},
10928761b9b5SHuacai Chen 	/*
10938761b9b5SHuacai Chen 	 * Some laptops need keyboard reset before probing for the trackpad to get
10948761b9b5SHuacai Chen 	 * it detected, initialised & finally work.
10958761b9b5SHuacai Chen 	 */
10968761b9b5SHuacai Chen 	{
10978761b9b5SHuacai Chen 		/* Schenker XMG C504 - Elantech touchpad */
10988761b9b5SHuacai Chen 		.matches = {
10998761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "XMG"),
11008761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "C504"),
11018761b9b5SHuacai Chen 		},
11028761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
11038761b9b5SHuacai Chen 	},
11048761b9b5SHuacai Chen 	{
11058761b9b5SHuacai Chen 		/* Blue FB5601 */
11068761b9b5SHuacai Chen 		.matches = {
11078761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "blue"),
11088761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
11098761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
11108761b9b5SHuacai Chen 		},
11118761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
11128761b9b5SHuacai Chen 	},
11138761b9b5SHuacai Chen 	/*
11148761b9b5SHuacai Chen 	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
11158761b9b5SHuacai Chen 	 * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
11168761b9b5SHuacai Chen 	 * none of them have an external PS/2 port so this can safely be set for
11178761b9b5SHuacai Chen 	 * all of them.
11188761b9b5SHuacai Chen 	 * Clevo barebones come with board_vendor and/or system_vendor set to
11198761b9b5SHuacai Chen 	 * either the very generic string "Notebook" and/or a different value
11208761b9b5SHuacai Chen 	 * for each individual reseller. The only somewhat universal way to
11218761b9b5SHuacai Chen 	 * identify them is by board_name.
11228761b9b5SHuacai Chen 	 */
11238761b9b5SHuacai Chen 	{
11248761b9b5SHuacai Chen 		.matches = {
11258761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"),
11268761b9b5SHuacai Chen 		},
11278761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11288761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11298761b9b5SHuacai Chen 	},
11308761b9b5SHuacai Chen 	{
11318761b9b5SHuacai Chen 		.matches = {
11328761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"),
11338761b9b5SHuacai Chen 		},
11348761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11358761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11368761b9b5SHuacai Chen 	},
11378761b9b5SHuacai Chen 	{
11388761b9b5SHuacai Chen 		.matches = {
11398761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "N140CU"),
11408761b9b5SHuacai Chen 		},
11418761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11428761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11438761b9b5SHuacai Chen 	},
11448761b9b5SHuacai Chen 	{
11458761b9b5SHuacai Chen 		.matches = {
11468761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "N141CU"),
11478761b9b5SHuacai Chen 		},
11488761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11498761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11508761b9b5SHuacai Chen 	},
11518761b9b5SHuacai Chen 	{
1152cbedf1a3SWerner Sembach 		/*
1153cbedf1a3SWerner Sembach 		 * Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes
1154cbedf1a3SWerner Sembach 		 * the keyboard very laggy for ~5 seconds after boot and
1155cbedf1a3SWerner Sembach 		 * sometimes also after resume.
1156cbedf1a3SWerner Sembach 		 * However both are required for the keyboard to not fail
1157cbedf1a3SWerner Sembach 		 * completely sometimes after boot or resume.
1158cbedf1a3SWerner Sembach 		 */
1159cbedf1a3SWerner Sembach 		.matches = {
1160cbedf1a3SWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "N150CU"),
1161cbedf1a3SWerner Sembach 		},
1162cbedf1a3SWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
1163cbedf1a3SWerner Sembach 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
1164cbedf1a3SWerner Sembach 	},
1165cbedf1a3SWerner Sembach 	{
11668761b9b5SHuacai Chen 		.matches = {
11678761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"),
11688761b9b5SHuacai Chen 		},
11698761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11708761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11718761b9b5SHuacai Chen 	},
11728761b9b5SHuacai Chen 	{
1173cbedf1a3SWerner Sembach 		/*
1174cbedf1a3SWerner Sembach 		 * Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes
1175cbedf1a3SWerner Sembach 		 * the keyboard very laggy for ~5 seconds after boot and
1176cbedf1a3SWerner Sembach 		 * sometimes also after resume.
1177cbedf1a3SWerner Sembach 		 * However both are required for the keyboard to not fail
1178cbedf1a3SWerner Sembach 		 * completely sometimes after boot or resume.
1179cbedf1a3SWerner Sembach 		 */
1180cbedf1a3SWerner Sembach 		.matches = {
1181cbedf1a3SWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "NHxxRZQ"),
1182cbedf1a3SWerner Sembach 		},
1183cbedf1a3SWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
1184cbedf1a3SWerner Sembach 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
1185cbedf1a3SWerner Sembach 	},
1186cbedf1a3SWerner Sembach 	{
11878761b9b5SHuacai Chen 		.matches = {
11888761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"),
11898761b9b5SHuacai Chen 		},
11908761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11918761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11928761b9b5SHuacai Chen 	},
11938761b9b5SHuacai Chen 	/*
11948761b9b5SHuacai Chen 	 * At least one modern Clevo barebone has the touchpad connected both
11958761b9b5SHuacai Chen 	 * via PS/2 and i2c interface. This causes a race condition between the
11968761b9b5SHuacai Chen 	 * psmouse and i2c-hid driver. Since the full capability of the touchpad
11978761b9b5SHuacai Chen 	 * is available via the i2c interface and the device has no external
11988761b9b5SHuacai Chen 	 * PS/2 port, it is safe to just ignore all ps2 mouses here to avoid
11998761b9b5SHuacai Chen 	 * this issue. The known affected device is the
12008761b9b5SHuacai Chen 	 * TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU which comes with one of
12018761b9b5SHuacai Chen 	 * the two different dmi strings below. NS50MU is not a typo!
12028761b9b5SHuacai Chen 	 */
12038761b9b5SHuacai Chen 	{
12048761b9b5SHuacai Chen 		.matches = {
12058761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NS50MU"),
12068761b9b5SHuacai Chen 		},
12078761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
12088761b9b5SHuacai Chen 					SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
12098761b9b5SHuacai Chen 					SERIO_QUIRK_NOPNP)
12108761b9b5SHuacai Chen 	},
12118761b9b5SHuacai Chen 	{
12128761b9b5SHuacai Chen 		.matches = {
12138761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"),
12148761b9b5SHuacai Chen 		},
12158761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
12168761b9b5SHuacai Chen 					SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
12178761b9b5SHuacai Chen 					SERIO_QUIRK_NOPNP)
12188761b9b5SHuacai Chen 	},
12198761b9b5SHuacai Chen 	{
12208761b9b5SHuacai Chen 		.matches = {
122138d4dfebSWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "NS5x_7xPU"),
122238d4dfebSWerner Sembach 		},
122338d4dfebSWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOAUX)
122438d4dfebSWerner Sembach 	},
122538d4dfebSWerner Sembach 	{
122638d4dfebSWerner Sembach 		.matches = {
12278761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"),
12288761b9b5SHuacai Chen 		},
12298761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12308761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12318761b9b5SHuacai Chen 	},
12328761b9b5SHuacai Chen 	{
12338761b9b5SHuacai Chen 		/*
12348761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12358761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12368761b9b5SHuacai Chen 		 * matching.
12378761b9b5SHuacai Chen 		 */
12388761b9b5SHuacai Chen 		.matches = {
12398761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65xH"),
12408761b9b5SHuacai Chen 		},
12418761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12428761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12438761b9b5SHuacai Chen 	},
12448761b9b5SHuacai Chen 	{
12458761b9b5SHuacai Chen 		/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
12468761b9b5SHuacai Chen 		.matches = {
12478761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
12488761b9b5SHuacai Chen 		},
12498761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12508761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12518761b9b5SHuacai Chen 	},
12528761b9b5SHuacai Chen 	{
12538761b9b5SHuacai Chen 		/*
12548761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12558761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12568761b9b5SHuacai Chen 		 * matching.
12578761b9b5SHuacai Chen 		 */
12588761b9b5SHuacai Chen 		.matches = {
12598761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65_P67H"),
12608761b9b5SHuacai Chen 		},
12618761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12628761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12638761b9b5SHuacai Chen 	},
12648761b9b5SHuacai Chen 	{
12658761b9b5SHuacai Chen 		/*
12668761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12678761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12688761b9b5SHuacai Chen 		 * matching.
12698761b9b5SHuacai Chen 		 */
12708761b9b5SHuacai Chen 		.matches = {
12718761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RP"),
12728761b9b5SHuacai Chen 		},
12738761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12748761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12758761b9b5SHuacai Chen 	},
12768761b9b5SHuacai Chen 	{
12778761b9b5SHuacai Chen 		/*
12788761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12798761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12808761b9b5SHuacai Chen 		 * matching.
12818761b9b5SHuacai Chen 		 */
12828761b9b5SHuacai Chen 		.matches = {
12838761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RS"),
12848761b9b5SHuacai Chen 		},
12858761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12868761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12878761b9b5SHuacai Chen 	},
12888761b9b5SHuacai Chen 	{
12898761b9b5SHuacai Chen 		/*
12908761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12918761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12928761b9b5SHuacai Chen 		 * matching.
12938761b9b5SHuacai Chen 		 */
12948761b9b5SHuacai Chen 		.matches = {
12958761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P67xRP"),
12968761b9b5SHuacai Chen 		},
12978761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12988761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12998761b9b5SHuacai Chen 	},
13008761b9b5SHuacai Chen 	{
13018761b9b5SHuacai Chen 		.matches = {
13028761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"),
13038761b9b5SHuacai Chen 		},
13048761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
13058761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
13068761b9b5SHuacai Chen 	},
13078761b9b5SHuacai Chen 	{
13088761b9b5SHuacai Chen 		.matches = {
13099c445d26SWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "PCX0DX"),
13109c445d26SWerner Sembach 		},
13119c445d26SWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
13129c445d26SWerner Sembach 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
13139c445d26SWerner Sembach 	},
1314eb09074bSWerner Sembach 	/* See comment on TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU above */
1315eb09074bSWerner Sembach 	{
1316eb09074bSWerner Sembach 		.matches = {
1317eb09074bSWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "PD5x_7xPNP_PNR_PNN_PNT"),
1318eb09074bSWerner Sembach 		},
1319eb09074bSWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOAUX)
1320eb09074bSWerner Sembach 	},
13219c445d26SWerner Sembach 	{
13229c445d26SWerner Sembach 		.matches = {
13238761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "X170SM"),
13248761b9b5SHuacai Chen 		},
13258761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
13268761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
13278761b9b5SHuacai Chen 	},
13288761b9b5SHuacai Chen 	{
13298761b9b5SHuacai Chen 		.matches = {
13308761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"),
13318761b9b5SHuacai Chen 		},
13328761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
13338761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
13348761b9b5SHuacai Chen 	},
13358761b9b5SHuacai Chen 	{ }
13368761b9b5SHuacai Chen };
13378761b9b5SHuacai Chen 
13388761b9b5SHuacai Chen #ifdef CONFIG_PNP
13398761b9b5SHuacai Chen static const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = {
13408761b9b5SHuacai Chen 	{
13418761b9b5SHuacai Chen 		.matches = {
13428761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
13438761b9b5SHuacai Chen 		},
13448761b9b5SHuacai Chen 	},
13458761b9b5SHuacai Chen 	{
13468761b9b5SHuacai Chen 		.matches = {
13478761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
13488761b9b5SHuacai Chen 		},
13498761b9b5SHuacai Chen 	},
13508761b9b5SHuacai Chen 	{
13518761b9b5SHuacai Chen 		.matches = {
13528761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
13538761b9b5SHuacai Chen 		},
13548761b9b5SHuacai Chen 	},
13558761b9b5SHuacai Chen 	{
13568761b9b5SHuacai Chen 		.matches = {
13578761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
13588761b9b5SHuacai Chen 		},
13598761b9b5SHuacai Chen 	},
13608761b9b5SHuacai Chen 	{ }
13618761b9b5SHuacai Chen };
13628761b9b5SHuacai Chen #endif
13638761b9b5SHuacai Chen 
13648761b9b5SHuacai Chen #endif /* CONFIG_X86 */
13658761b9b5SHuacai Chen 
13668761b9b5SHuacai Chen #ifdef CONFIG_PNP
13678761b9b5SHuacai Chen #include <linux/pnp.h>
13688761b9b5SHuacai Chen 
13698761b9b5SHuacai Chen static bool i8042_pnp_kbd_registered;
13708761b9b5SHuacai Chen static unsigned int i8042_pnp_kbd_devices;
13718761b9b5SHuacai Chen static bool i8042_pnp_aux_registered;
13728761b9b5SHuacai Chen static unsigned int i8042_pnp_aux_devices;
13738761b9b5SHuacai Chen 
13748761b9b5SHuacai Chen static int i8042_pnp_command_reg;
13758761b9b5SHuacai Chen static int i8042_pnp_data_reg;
13768761b9b5SHuacai Chen static int i8042_pnp_kbd_irq;
13778761b9b5SHuacai Chen static int i8042_pnp_aux_irq;
13788761b9b5SHuacai Chen 
13798761b9b5SHuacai Chen static char i8042_pnp_kbd_name[32];
13808761b9b5SHuacai Chen static char i8042_pnp_aux_name[32];
13818761b9b5SHuacai Chen 
i8042_pnp_id_to_string(struct pnp_id * id,char * dst,int dst_size)13828761b9b5SHuacai Chen static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size)
13838761b9b5SHuacai Chen {
13848761b9b5SHuacai Chen 	strscpy(dst, "PNP:", dst_size);
13858761b9b5SHuacai Chen 
13868761b9b5SHuacai Chen 	while (id) {
13878761b9b5SHuacai Chen 		strlcat(dst, " ", dst_size);
13888761b9b5SHuacai Chen 		strlcat(dst, id->id, dst_size);
13898761b9b5SHuacai Chen 		id = id->next;
13908761b9b5SHuacai Chen 	}
13918761b9b5SHuacai Chen }
13928761b9b5SHuacai Chen 
i8042_pnp_kbd_probe(struct pnp_dev * dev,const struct pnp_device_id * did)13938761b9b5SHuacai Chen static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
13948761b9b5SHuacai Chen {
13958761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
13968761b9b5SHuacai Chen 		i8042_pnp_data_reg = pnp_port_start(dev,0);
13978761b9b5SHuacai Chen 
13988761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
13998761b9b5SHuacai Chen 		i8042_pnp_command_reg = pnp_port_start(dev, 1);
14008761b9b5SHuacai Chen 
14018761b9b5SHuacai Chen 	if (pnp_irq_valid(dev,0))
14028761b9b5SHuacai Chen 		i8042_pnp_kbd_irq = pnp_irq(dev, 0);
14038761b9b5SHuacai Chen 
14048761b9b5SHuacai Chen 	strscpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name));
14058761b9b5SHuacai Chen 	if (strlen(pnp_dev_name(dev))) {
14068761b9b5SHuacai Chen 		strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name));
14078761b9b5SHuacai Chen 		strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name));
14088761b9b5SHuacai Chen 	}
14098761b9b5SHuacai Chen 	i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id,
14108761b9b5SHuacai Chen 			       sizeof(i8042_kbd_firmware_id));
14118761b9b5SHuacai Chen 	i8042_kbd_fwnode = dev_fwnode(&dev->dev);
14128761b9b5SHuacai Chen 
14138761b9b5SHuacai Chen 	/* Keyboard ports are always supposed to be wakeup-enabled */
14148761b9b5SHuacai Chen 	device_set_wakeup_enable(&dev->dev, true);
14158761b9b5SHuacai Chen 
14168761b9b5SHuacai Chen 	i8042_pnp_kbd_devices++;
14178761b9b5SHuacai Chen 	return 0;
14188761b9b5SHuacai Chen }
14198761b9b5SHuacai Chen 
i8042_pnp_aux_probe(struct pnp_dev * dev,const struct pnp_device_id * did)14208761b9b5SHuacai Chen static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
14218761b9b5SHuacai Chen {
14228761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
14238761b9b5SHuacai Chen 		i8042_pnp_data_reg = pnp_port_start(dev,0);
14248761b9b5SHuacai Chen 
14258761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
14268761b9b5SHuacai Chen 		i8042_pnp_command_reg = pnp_port_start(dev, 1);
14278761b9b5SHuacai Chen 
14288761b9b5SHuacai Chen 	if (pnp_irq_valid(dev, 0))
14298761b9b5SHuacai Chen 		i8042_pnp_aux_irq = pnp_irq(dev, 0);
14308761b9b5SHuacai Chen 
14318761b9b5SHuacai Chen 	strscpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name));
14328761b9b5SHuacai Chen 	if (strlen(pnp_dev_name(dev))) {
14338761b9b5SHuacai Chen 		strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name));
14348761b9b5SHuacai Chen 		strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name));
14358761b9b5SHuacai Chen 	}
14368761b9b5SHuacai Chen 	i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id,
14378761b9b5SHuacai Chen 			       sizeof(i8042_aux_firmware_id));
14388761b9b5SHuacai Chen 
14398761b9b5SHuacai Chen 	i8042_pnp_aux_devices++;
14408761b9b5SHuacai Chen 	return 0;
14418761b9b5SHuacai Chen }
14428761b9b5SHuacai Chen 
14438761b9b5SHuacai Chen static const struct pnp_device_id pnp_kbd_devids[] = {
14448761b9b5SHuacai Chen 	{ .id = "PNP0300", .driver_data = 0 },
14458761b9b5SHuacai Chen 	{ .id = "PNP0301", .driver_data = 0 },
14468761b9b5SHuacai Chen 	{ .id = "PNP0302", .driver_data = 0 },
14478761b9b5SHuacai Chen 	{ .id = "PNP0303", .driver_data = 0 },
14488761b9b5SHuacai Chen 	{ .id = "PNP0304", .driver_data = 0 },
14498761b9b5SHuacai Chen 	{ .id = "PNP0305", .driver_data = 0 },
14508761b9b5SHuacai Chen 	{ .id = "PNP0306", .driver_data = 0 },
14518761b9b5SHuacai Chen 	{ .id = "PNP0309", .driver_data = 0 },
14528761b9b5SHuacai Chen 	{ .id = "PNP030a", .driver_data = 0 },
14538761b9b5SHuacai Chen 	{ .id = "PNP030b", .driver_data = 0 },
14548761b9b5SHuacai Chen 	{ .id = "PNP0320", .driver_data = 0 },
14558761b9b5SHuacai Chen 	{ .id = "PNP0343", .driver_data = 0 },
14568761b9b5SHuacai Chen 	{ .id = "PNP0344", .driver_data = 0 },
14578761b9b5SHuacai Chen 	{ .id = "PNP0345", .driver_data = 0 },
14588761b9b5SHuacai Chen 	{ .id = "CPQA0D7", .driver_data = 0 },
14598761b9b5SHuacai Chen 	{ .id = "", },
14608761b9b5SHuacai Chen };
14618761b9b5SHuacai Chen MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids);
14628761b9b5SHuacai Chen 
14638761b9b5SHuacai Chen static struct pnp_driver i8042_pnp_kbd_driver = {
14648761b9b5SHuacai Chen 	.name           = "i8042 kbd",
14658761b9b5SHuacai Chen 	.id_table       = pnp_kbd_devids,
14668761b9b5SHuacai Chen 	.probe          = i8042_pnp_kbd_probe,
14678761b9b5SHuacai Chen 	.driver         = {
14688761b9b5SHuacai Chen 		.probe_type = PROBE_FORCE_SYNCHRONOUS,
14698761b9b5SHuacai Chen 		.suppress_bind_attrs = true,
14708761b9b5SHuacai Chen 	},
14718761b9b5SHuacai Chen };
14728761b9b5SHuacai Chen 
14738761b9b5SHuacai Chen static const struct pnp_device_id pnp_aux_devids[] = {
14748761b9b5SHuacai Chen 	{ .id = "AUI0200", .driver_data = 0 },
14758761b9b5SHuacai Chen 	{ .id = "FJC6000", .driver_data = 0 },
14768761b9b5SHuacai Chen 	{ .id = "FJC6001", .driver_data = 0 },
14778761b9b5SHuacai Chen 	{ .id = "PNP0f03", .driver_data = 0 },
14788761b9b5SHuacai Chen 	{ .id = "PNP0f0b", .driver_data = 0 },
14798761b9b5SHuacai Chen 	{ .id = "PNP0f0e", .driver_data = 0 },
14808761b9b5SHuacai Chen 	{ .id = "PNP0f12", .driver_data = 0 },
14818761b9b5SHuacai Chen 	{ .id = "PNP0f13", .driver_data = 0 },
14828761b9b5SHuacai Chen 	{ .id = "PNP0f19", .driver_data = 0 },
14838761b9b5SHuacai Chen 	{ .id = "PNP0f1c", .driver_data = 0 },
14848761b9b5SHuacai Chen 	{ .id = "SYN0801", .driver_data = 0 },
14858761b9b5SHuacai Chen 	{ .id = "", },
14868761b9b5SHuacai Chen };
14878761b9b5SHuacai Chen MODULE_DEVICE_TABLE(pnp, pnp_aux_devids);
14888761b9b5SHuacai Chen 
14898761b9b5SHuacai Chen static struct pnp_driver i8042_pnp_aux_driver = {
14908761b9b5SHuacai Chen 	.name           = "i8042 aux",
14918761b9b5SHuacai Chen 	.id_table       = pnp_aux_devids,
14928761b9b5SHuacai Chen 	.probe          = i8042_pnp_aux_probe,
14938761b9b5SHuacai Chen 	.driver         = {
14948761b9b5SHuacai Chen 		.probe_type = PROBE_FORCE_SYNCHRONOUS,
14958761b9b5SHuacai Chen 		.suppress_bind_attrs = true,
14968761b9b5SHuacai Chen 	},
14978761b9b5SHuacai Chen };
14988761b9b5SHuacai Chen 
i8042_pnp_exit(void)14998761b9b5SHuacai Chen static void i8042_pnp_exit(void)
15008761b9b5SHuacai Chen {
15018761b9b5SHuacai Chen 	if (i8042_pnp_kbd_registered) {
15028761b9b5SHuacai Chen 		i8042_pnp_kbd_registered = false;
15038761b9b5SHuacai Chen 		pnp_unregister_driver(&i8042_pnp_kbd_driver);
15048761b9b5SHuacai Chen 	}
15058761b9b5SHuacai Chen 
15068761b9b5SHuacai Chen 	if (i8042_pnp_aux_registered) {
15078761b9b5SHuacai Chen 		i8042_pnp_aux_registered = false;
15088761b9b5SHuacai Chen 		pnp_unregister_driver(&i8042_pnp_aux_driver);
15098761b9b5SHuacai Chen 	}
15108761b9b5SHuacai Chen }
15118761b9b5SHuacai Chen 
i8042_pnp_init(void)15128761b9b5SHuacai Chen static int __init i8042_pnp_init(void)
15138761b9b5SHuacai Chen {
15148761b9b5SHuacai Chen 	char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };
15158761b9b5SHuacai Chen 	bool pnp_data_busted = false;
15168761b9b5SHuacai Chen 	int err;
15178761b9b5SHuacai Chen 
15188761b9b5SHuacai Chen 	if (i8042_nopnp) {
15198761b9b5SHuacai Chen 		pr_info("PNP detection disabled\n");
15208761b9b5SHuacai Chen 		return 0;
15218761b9b5SHuacai Chen 	}
15228761b9b5SHuacai Chen 
15238761b9b5SHuacai Chen 	err = pnp_register_driver(&i8042_pnp_kbd_driver);
15248761b9b5SHuacai Chen 	if (!err)
15258761b9b5SHuacai Chen 		i8042_pnp_kbd_registered = true;
15268761b9b5SHuacai Chen 
15278761b9b5SHuacai Chen 	err = pnp_register_driver(&i8042_pnp_aux_driver);
15288761b9b5SHuacai Chen 	if (!err)
15298761b9b5SHuacai Chen 		i8042_pnp_aux_registered = true;
15308761b9b5SHuacai Chen 
15318761b9b5SHuacai Chen 	if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) {
15328761b9b5SHuacai Chen 		i8042_pnp_exit();
15338761b9b5SHuacai Chen #if defined(__ia64__)
15348761b9b5SHuacai Chen 		return -ENODEV;
15358761b9b5SHuacai Chen #else
15368761b9b5SHuacai Chen 		pr_info("PNP: No PS/2 controller found.\n");
1537fdd7c961SHuacai Chen #if defined(__loongarch__)
1538fdd7c961SHuacai Chen 		if (acpi_disabled == 0)
1539fdd7c961SHuacai Chen 			return -ENODEV;
1540fdd7c961SHuacai Chen #else
15418761b9b5SHuacai Chen 		if (x86_platform.legacy.i8042 !=
15428761b9b5SHuacai Chen 				X86_LEGACY_I8042_EXPECTED_PRESENT)
15438761b9b5SHuacai Chen 			return -ENODEV;
1544fdd7c961SHuacai Chen #endif
15458761b9b5SHuacai Chen 		pr_info("Probing ports directly.\n");
15468761b9b5SHuacai Chen 		return 0;
15478761b9b5SHuacai Chen #endif
15488761b9b5SHuacai Chen 	}
15498761b9b5SHuacai Chen 
15508761b9b5SHuacai Chen 	if (i8042_pnp_kbd_devices)
15518761b9b5SHuacai Chen 		snprintf(kbd_irq_str, sizeof(kbd_irq_str),
15528761b9b5SHuacai Chen 			"%d", i8042_pnp_kbd_irq);
15538761b9b5SHuacai Chen 	if (i8042_pnp_aux_devices)
15548761b9b5SHuacai Chen 		snprintf(aux_irq_str, sizeof(aux_irq_str),
15558761b9b5SHuacai Chen 			"%d", i8042_pnp_aux_irq);
15568761b9b5SHuacai Chen 
15578761b9b5SHuacai Chen 	pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n",
15588761b9b5SHuacai Chen 		i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
15598761b9b5SHuacai Chen 		i8042_pnp_aux_name,
15608761b9b5SHuacai Chen 		i8042_pnp_data_reg, i8042_pnp_command_reg,
15618761b9b5SHuacai Chen 		kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
15628761b9b5SHuacai Chen 		aux_irq_str);
15638761b9b5SHuacai Chen 
15648761b9b5SHuacai Chen #if defined(__ia64__)
15658761b9b5SHuacai Chen 	if (!i8042_pnp_kbd_devices)
15668761b9b5SHuacai Chen 		i8042_nokbd = true;
15678761b9b5SHuacai Chen 	if (!i8042_pnp_aux_devices)
15688761b9b5SHuacai Chen 		i8042_noaux = true;
15698761b9b5SHuacai Chen #endif
15708761b9b5SHuacai Chen 
15718761b9b5SHuacai Chen 	if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&
15728761b9b5SHuacai Chen 	      i8042_pnp_data_reg != i8042_data_reg) ||
15738761b9b5SHuacai Chen 	    !i8042_pnp_data_reg) {
15748761b9b5SHuacai Chen 		pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n",
15758761b9b5SHuacai Chen 			i8042_pnp_data_reg, i8042_data_reg);
15768761b9b5SHuacai Chen 		i8042_pnp_data_reg = i8042_data_reg;
15778761b9b5SHuacai Chen 		pnp_data_busted = true;
15788761b9b5SHuacai Chen 	}
15798761b9b5SHuacai Chen 
15808761b9b5SHuacai Chen 	if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) &&
15818761b9b5SHuacai Chen 	      i8042_pnp_command_reg != i8042_command_reg) ||
15828761b9b5SHuacai Chen 	    !i8042_pnp_command_reg) {
15838761b9b5SHuacai Chen 		pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n",
15848761b9b5SHuacai Chen 			i8042_pnp_command_reg, i8042_command_reg);
15858761b9b5SHuacai Chen 		i8042_pnp_command_reg = i8042_command_reg;
15868761b9b5SHuacai Chen 		pnp_data_busted = true;
15878761b9b5SHuacai Chen 	}
15888761b9b5SHuacai Chen 
15898761b9b5SHuacai Chen 	if (!i8042_nokbd && !i8042_pnp_kbd_irq) {
15908761b9b5SHuacai Chen 		pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n",
15918761b9b5SHuacai Chen 			i8042_kbd_irq);
15928761b9b5SHuacai Chen 		i8042_pnp_kbd_irq = i8042_kbd_irq;
15938761b9b5SHuacai Chen 		pnp_data_busted = true;
15948761b9b5SHuacai Chen 	}
15958761b9b5SHuacai Chen 
15968761b9b5SHuacai Chen 	if (!i8042_noaux && !i8042_pnp_aux_irq) {
15978761b9b5SHuacai Chen 		if (!pnp_data_busted && i8042_pnp_kbd_irq) {
15988761b9b5SHuacai Chen 			pr_warn("PNP: PS/2 appears to have AUX port disabled, "
15998761b9b5SHuacai Chen 				"if this is incorrect please boot with i8042.nopnp\n");
16008761b9b5SHuacai Chen 			i8042_noaux = true;
16018761b9b5SHuacai Chen 		} else {
16028761b9b5SHuacai Chen 			pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n",
16038761b9b5SHuacai Chen 				i8042_aux_irq);
16048761b9b5SHuacai Chen 			i8042_pnp_aux_irq = i8042_aux_irq;
16058761b9b5SHuacai Chen 		}
16068761b9b5SHuacai Chen 	}
16078761b9b5SHuacai Chen 
16088761b9b5SHuacai Chen 	i8042_data_reg = i8042_pnp_data_reg;
16098761b9b5SHuacai Chen 	i8042_command_reg = i8042_pnp_command_reg;
16108761b9b5SHuacai Chen 	i8042_kbd_irq = i8042_pnp_kbd_irq;
16118761b9b5SHuacai Chen 	i8042_aux_irq = i8042_pnp_aux_irq;
16128761b9b5SHuacai Chen 
16138761b9b5SHuacai Chen #ifdef CONFIG_X86
16148761b9b5SHuacai Chen 	i8042_bypass_aux_irq_test = !pnp_data_busted &&
16158761b9b5SHuacai Chen 				    dmi_check_system(i8042_dmi_laptop_table);
16168761b9b5SHuacai Chen #endif
16178761b9b5SHuacai Chen 
16188761b9b5SHuacai Chen 	return 0;
16198761b9b5SHuacai Chen }
16208761b9b5SHuacai Chen 
16218761b9b5SHuacai Chen #else  /* !CONFIG_PNP */
i8042_pnp_init(void)16228761b9b5SHuacai Chen static inline int i8042_pnp_init(void) { return 0; }
i8042_pnp_exit(void)16238761b9b5SHuacai Chen static inline void i8042_pnp_exit(void) { }
16248761b9b5SHuacai Chen #endif /* CONFIG_PNP */
16258761b9b5SHuacai Chen 
16268761b9b5SHuacai Chen 
16278761b9b5SHuacai Chen #ifdef CONFIG_X86
i8042_check_quirks(void)16288761b9b5SHuacai Chen static void __init i8042_check_quirks(void)
16298761b9b5SHuacai Chen {
16308761b9b5SHuacai Chen 	const struct dmi_system_id *device_quirk_info;
16318761b9b5SHuacai Chen 	uintptr_t quirks;
16328761b9b5SHuacai Chen 
16338761b9b5SHuacai Chen 	device_quirk_info = dmi_first_match(i8042_dmi_quirk_table);
16348761b9b5SHuacai Chen 	if (!device_quirk_info)
16358761b9b5SHuacai Chen 		return;
16368761b9b5SHuacai Chen 
16378761b9b5SHuacai Chen 	quirks = (uintptr_t)device_quirk_info->driver_data;
16388761b9b5SHuacai Chen 
16398761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOKBD)
16408761b9b5SHuacai Chen 		i8042_nokbd = true;
16418761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOAUX)
16428761b9b5SHuacai Chen 		i8042_noaux = true;
16438761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOMUX)
16448761b9b5SHuacai Chen 		i8042_nomux = true;
16458761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_FORCEMUX)
16468761b9b5SHuacai Chen 		i8042_nomux = false;
16478761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_UNLOCK)
16488761b9b5SHuacai Chen 		i8042_unlock = true;
16498761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_PROBE_DEFER)
16508761b9b5SHuacai Chen 		i8042_probe_defer = true;
16518761b9b5SHuacai Chen 	/* Honor module parameter when value is not default */
16528761b9b5SHuacai Chen 	if (i8042_reset == I8042_RESET_DEFAULT) {
16538761b9b5SHuacai Chen 		if (quirks & SERIO_QUIRK_RESET_ALWAYS)
16548761b9b5SHuacai Chen 			i8042_reset = I8042_RESET_ALWAYS;
16558761b9b5SHuacai Chen 		if (quirks & SERIO_QUIRK_RESET_NEVER)
16568761b9b5SHuacai Chen 			i8042_reset = I8042_RESET_NEVER;
16578761b9b5SHuacai Chen 	}
16588761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_DIECT)
16598761b9b5SHuacai Chen 		i8042_direct = true;
16608761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_DUMBKBD)
16618761b9b5SHuacai Chen 		i8042_dumbkbd = true;
16628761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOLOOP)
16638761b9b5SHuacai Chen 		i8042_noloop = true;
16648761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOTIMEOUT)
16658761b9b5SHuacai Chen 		i8042_notimeout = true;
16668761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_KBDRESET)
16678761b9b5SHuacai Chen 		i8042_kbdreset = true;
16688761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_DRITEK)
16698761b9b5SHuacai Chen 		i8042_dritek = true;
16708761b9b5SHuacai Chen #ifdef CONFIG_PNP
16718761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOPNP)
16728761b9b5SHuacai Chen 		i8042_nopnp = true;
16738761b9b5SHuacai Chen #endif
16748761b9b5SHuacai Chen }
16758761b9b5SHuacai Chen #else
i8042_check_quirks(void)16768761b9b5SHuacai Chen static inline void i8042_check_quirks(void) {}
16778761b9b5SHuacai Chen #endif
16788761b9b5SHuacai Chen 
i8042_platform_init(void)16798761b9b5SHuacai Chen static int __init i8042_platform_init(void)
16808761b9b5SHuacai Chen {
16818761b9b5SHuacai Chen 	int retval;
16828761b9b5SHuacai Chen 
16838761b9b5SHuacai Chen #ifdef CONFIG_X86
16848761b9b5SHuacai Chen 	u8 a20_on = 0xdf;
16858761b9b5SHuacai Chen 	/* Just return if platform does not have i8042 controller */
16868761b9b5SHuacai Chen 	if (x86_platform.legacy.i8042 == X86_LEGACY_I8042_PLATFORM_ABSENT)
16878761b9b5SHuacai Chen 		return -ENODEV;
16888761b9b5SHuacai Chen #endif
16898761b9b5SHuacai Chen 
16908761b9b5SHuacai Chen /*
16918761b9b5SHuacai Chen  * On ix86 platforms touching the i8042 data register region can do really
16928761b9b5SHuacai Chen  * bad things. Because of this the region is always reserved on ix86 boxes.
16938761b9b5SHuacai Chen  *
16948761b9b5SHuacai Chen  *	if (!request_region(I8042_DATA_REG, 16, "i8042"))
16958761b9b5SHuacai Chen  *		return -EBUSY;
16968761b9b5SHuacai Chen  */
16978761b9b5SHuacai Chen 
16988761b9b5SHuacai Chen 	i8042_kbd_irq = I8042_MAP_IRQ(1);
16998761b9b5SHuacai Chen 	i8042_aux_irq = I8042_MAP_IRQ(12);
17008761b9b5SHuacai Chen 
17018761b9b5SHuacai Chen #if defined(__ia64__)
17028761b9b5SHuacai Chen 	i8042_reset = I8042_RESET_ALWAYS;
17038761b9b5SHuacai Chen #endif
17048761b9b5SHuacai Chen 
17058761b9b5SHuacai Chen 	i8042_check_quirks();
17068761b9b5SHuacai Chen 
17078761b9b5SHuacai Chen 	pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
17088761b9b5SHuacai Chen 		i8042_nokbd ? " nokbd" : "",
17098761b9b5SHuacai Chen 		i8042_noaux ? " noaux" : "",
17108761b9b5SHuacai Chen 		i8042_nomux ? " nomux" : "",
17118761b9b5SHuacai Chen 		i8042_unlock ? " unlock" : "",
17128761b9b5SHuacai Chen 		i8042_probe_defer ? "probe_defer" : "",
17138761b9b5SHuacai Chen 		i8042_reset == I8042_RESET_DEFAULT ?
17148761b9b5SHuacai Chen 			"" : i8042_reset == I8042_RESET_ALWAYS ?
17158761b9b5SHuacai Chen 				" reset_always" : " reset_never",
17168761b9b5SHuacai Chen 		i8042_direct ? " direct" : "",
17178761b9b5SHuacai Chen 		i8042_dumbkbd ? " dumbkbd" : "",
17188761b9b5SHuacai Chen 		i8042_noloop ? " noloop" : "",
17198761b9b5SHuacai Chen 		i8042_notimeout ? " notimeout" : "",
17208761b9b5SHuacai Chen 		i8042_kbdreset ? " kbdreset" : "",
17218761b9b5SHuacai Chen #ifdef CONFIG_X86
17228761b9b5SHuacai Chen 		i8042_dritek ? " dritek" : "",
17238761b9b5SHuacai Chen #else
17248761b9b5SHuacai Chen 		"",
17258761b9b5SHuacai Chen #endif
17268761b9b5SHuacai Chen #ifdef CONFIG_PNP
17278761b9b5SHuacai Chen 		i8042_nopnp ? " nopnp" : "");
17288761b9b5SHuacai Chen #else
17298761b9b5SHuacai Chen 		"");
17308761b9b5SHuacai Chen #endif
17318761b9b5SHuacai Chen 
17328761b9b5SHuacai Chen 	retval = i8042_pnp_init();
17338761b9b5SHuacai Chen 	if (retval)
17348761b9b5SHuacai Chen 		return retval;
17358761b9b5SHuacai Chen 
17368761b9b5SHuacai Chen #ifdef CONFIG_X86
17378761b9b5SHuacai Chen 	/*
17388761b9b5SHuacai Chen 	 * A20 was already enabled during early kernel init. But some buggy
17398761b9b5SHuacai Chen 	 * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
17408761b9b5SHuacai Chen 	 * resume from S3. So we do it here and hope that nothing breaks.
17418761b9b5SHuacai Chen 	 */
17428761b9b5SHuacai Chen 	i8042_command(&a20_on, 0x10d1);
17438761b9b5SHuacai Chen 	i8042_command(NULL, 0x00ff);	/* Null command for SMM firmware */
17448761b9b5SHuacai Chen #endif /* CONFIG_X86 */
17458761b9b5SHuacai Chen 
17468761b9b5SHuacai Chen 	return retval;
17478761b9b5SHuacai Chen }
17488761b9b5SHuacai Chen 
i8042_platform_exit(void)17498761b9b5SHuacai Chen static inline void i8042_platform_exit(void)
17508761b9b5SHuacai Chen {
17518761b9b5SHuacai Chen 	i8042_pnp_exit();
17528761b9b5SHuacai Chen }
17538761b9b5SHuacai Chen 
17548761b9b5SHuacai Chen #endif /* _I8042_ACPIPNPIO_H */
1755