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 
478761b9b5SHuacai Chen static inline int i8042_read_data(void)
488761b9b5SHuacai Chen {
498761b9b5SHuacai Chen 	return inb(I8042_DATA_REG);
508761b9b5SHuacai Chen }
518761b9b5SHuacai Chen 
528761b9b5SHuacai Chen static inline int i8042_read_status(void)
538761b9b5SHuacai Chen {
548761b9b5SHuacai Chen 	return inb(I8042_STATUS_REG);
558761b9b5SHuacai Chen }
568761b9b5SHuacai Chen 
578761b9b5SHuacai Chen static inline void i8042_write_data(int val)
588761b9b5SHuacai Chen {
598761b9b5SHuacai Chen 	outb(val, I8042_DATA_REG);
608761b9b5SHuacai Chen }
618761b9b5SHuacai Chen 
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 	{
3648761b9b5SHuacai Chen 		/* Amoi M636/A737 */
3658761b9b5SHuacai Chen 		.matches = {
3668761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
3678761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
3688761b9b5SHuacai Chen 		},
3698761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
3708761b9b5SHuacai Chen 	},
3718761b9b5SHuacai Chen 	{
3728761b9b5SHuacai Chen 		.matches = {
3738761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
3748761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
3758761b9b5SHuacai Chen 		},
3768761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
3778761b9b5SHuacai Chen 	},
3788761b9b5SHuacai Chen 	{
3798761b9b5SHuacai Chen 		/* Compal HEL80I */
3808761b9b5SHuacai Chen 		.matches = {
3818761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
3828761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
3838761b9b5SHuacai Chen 		},
3848761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
3858761b9b5SHuacai Chen 	},
3868761b9b5SHuacai Chen 	{
3878761b9b5SHuacai Chen 		.matches = {
3888761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
3898761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"),
3908761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
3918761b9b5SHuacai Chen 		},
3928761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
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, "DL760"),
3998761b9b5SHuacai Chen 		},
4008761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
4018761b9b5SHuacai Chen 	},
4028761b9b5SHuacai Chen 	{
4038761b9b5SHuacai Chen 		/* Advent 4211 */
4048761b9b5SHuacai Chen 		.matches = {
4058761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
4068761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
4078761b9b5SHuacai Chen 		},
4088761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4098761b9b5SHuacai Chen 	},
4108761b9b5SHuacai Chen 	{
4118761b9b5SHuacai Chen 		/* Dell Embedded Box PC 3000 */
4128761b9b5SHuacai Chen 		.matches = {
4138761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4148761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
4158761b9b5SHuacai Chen 		},
4168761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
4178761b9b5SHuacai Chen 	},
4188761b9b5SHuacai Chen 	{
4198761b9b5SHuacai Chen 		/* Dell XPS M1530 */
4208761b9b5SHuacai Chen 		.matches = {
4218761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4228761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
4238761b9b5SHuacai Chen 		},
4248761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4258761b9b5SHuacai Chen 	},
4268761b9b5SHuacai Chen 	{
4278761b9b5SHuacai Chen 		/* Dell Vostro 1510 */
4288761b9b5SHuacai Chen 		.matches = {
4298761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4308761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
4318761b9b5SHuacai Chen 		},
4328761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4338761b9b5SHuacai Chen 	},
4348761b9b5SHuacai Chen 	{
4358761b9b5SHuacai Chen 		/* Dell Vostro V13 */
4368761b9b5SHuacai Chen 		.matches = {
4378761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4388761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
4398761b9b5SHuacai Chen 		},
4408761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
4418761b9b5SHuacai Chen 	},
4428761b9b5SHuacai Chen 	{
4438761b9b5SHuacai Chen 		/* Dell Vostro 1320 */
4448761b9b5SHuacai Chen 		.matches = {
4458761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4468761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
4478761b9b5SHuacai Chen 		},
4488761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4498761b9b5SHuacai Chen 	},
4508761b9b5SHuacai Chen 	{
4518761b9b5SHuacai Chen 		/* Dell Vostro 1520 */
4528761b9b5SHuacai Chen 		.matches = {
4538761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4548761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
4558761b9b5SHuacai Chen 		},
4568761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4578761b9b5SHuacai Chen 	},
4588761b9b5SHuacai Chen 	{
4598761b9b5SHuacai Chen 		/* Dell Vostro 1720 */
4608761b9b5SHuacai Chen 		.matches = {
4618761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4628761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
4638761b9b5SHuacai Chen 		},
4648761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
4658761b9b5SHuacai Chen 	},
4668761b9b5SHuacai Chen 	{
4678761b9b5SHuacai Chen 		/* Entroware Proteus */
4688761b9b5SHuacai Chen 		.matches = {
4698761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
4708761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
4718761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
4728761b9b5SHuacai Chen 		},
4738761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS)
4748761b9b5SHuacai Chen 	},
4758761b9b5SHuacai Chen 	/*
4768761b9b5SHuacai Chen 	 * Some Fujitsu notebooks are having trouble with touchpads if
4778761b9b5SHuacai Chen 	 * active multiplexing mode is activated. Luckily they don't have
4788761b9b5SHuacai Chen 	 * external PS/2 ports so we can safely disable it.
4798761b9b5SHuacai Chen 	 * ... apparently some Toshibas don't like MUX mode either and
4808761b9b5SHuacai Chen 	 * die horrible death on reboot.
4818761b9b5SHuacai Chen 	 */
4828761b9b5SHuacai Chen 	{
4838761b9b5SHuacai Chen 		/* Fujitsu Lifebook P7010/P7010D */
4848761b9b5SHuacai Chen 		.matches = {
4858761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
4868761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
4878761b9b5SHuacai Chen 		},
4888761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4898761b9b5SHuacai Chen 	},
4908761b9b5SHuacai Chen 	{
4918761b9b5SHuacai Chen 		/* Fujitsu Lifebook P5020D */
4928761b9b5SHuacai Chen 		.matches = {
4938761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
4948761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
4958761b9b5SHuacai Chen 		},
4968761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
4978761b9b5SHuacai Chen 	},
4988761b9b5SHuacai Chen 	{
4998761b9b5SHuacai Chen 		/* Fujitsu Lifebook S2000 */
5008761b9b5SHuacai Chen 		.matches = {
5018761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5028761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
5038761b9b5SHuacai Chen 		},
5048761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5058761b9b5SHuacai Chen 	},
5068761b9b5SHuacai Chen 	{
5078761b9b5SHuacai Chen 		/* Fujitsu Lifebook S6230 */
5088761b9b5SHuacai Chen 		.matches = {
5098761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5108761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
5118761b9b5SHuacai Chen 		},
5128761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5138761b9b5SHuacai Chen 	},
5148761b9b5SHuacai Chen 	{
5158761b9b5SHuacai Chen 		/* Fujitsu Lifebook T725 laptop */
5168761b9b5SHuacai Chen 		.matches = {
5178761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5188761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
5198761b9b5SHuacai Chen 		},
5208761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
5218761b9b5SHuacai Chen 	},
5228761b9b5SHuacai Chen 	{
5238761b9b5SHuacai Chen 		/* Fujitsu Lifebook U745 */
5248761b9b5SHuacai Chen 		.matches = {
5258761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5268761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
5278761b9b5SHuacai Chen 		},
5288761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5298761b9b5SHuacai Chen 	},
5308761b9b5SHuacai Chen 	{
5318761b9b5SHuacai Chen 		/* Fujitsu T70H */
5328761b9b5SHuacai Chen 		.matches = {
5338761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5348761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
5358761b9b5SHuacai Chen 		},
5368761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5378761b9b5SHuacai Chen 	},
5388761b9b5SHuacai Chen 	{
5398761b9b5SHuacai Chen 		/* Fujitsu A544 laptop */
5408761b9b5SHuacai Chen 		/* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
5418761b9b5SHuacai Chen 		.matches = {
5428761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5438761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
5448761b9b5SHuacai Chen 		},
5458761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5468761b9b5SHuacai Chen 	},
5478761b9b5SHuacai Chen 	{
5488761b9b5SHuacai Chen 		/* Fujitsu AH544 laptop */
5498761b9b5SHuacai Chen 		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
5508761b9b5SHuacai Chen 		.matches = {
5518761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5528761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
5538761b9b5SHuacai Chen 		},
5548761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5558761b9b5SHuacai Chen 	},
5568761b9b5SHuacai Chen 	{
5578761b9b5SHuacai Chen 		/* Fujitsu U574 laptop */
5588761b9b5SHuacai Chen 		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
5598761b9b5SHuacai Chen 		.matches = {
5608761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5618761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
5628761b9b5SHuacai Chen 		},
5638761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5648761b9b5SHuacai Chen 	},
5658761b9b5SHuacai Chen 	{
5668761b9b5SHuacai Chen 		/* Fujitsu UH554 laptop */
5678761b9b5SHuacai Chen 		.matches = {
5688761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
5698761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"),
5708761b9b5SHuacai Chen 		},
5718761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
5728761b9b5SHuacai Chen 	},
5738761b9b5SHuacai Chen 	{
5748761b9b5SHuacai Chen 		/* Fujitsu Lifebook P7010 */
5758761b9b5SHuacai Chen 		.matches = {
5768761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
5778761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
5788761b9b5SHuacai Chen 		},
5798761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5808761b9b5SHuacai Chen 	},
5818761b9b5SHuacai Chen 	{
5828761b9b5SHuacai Chen 		/* Fujitsu-Siemens Lifebook T3010 */
5838761b9b5SHuacai Chen 		.matches = {
5848761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
5858761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
5868761b9b5SHuacai Chen 		},
5878761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5888761b9b5SHuacai Chen 	},
5898761b9b5SHuacai Chen 	{
5908761b9b5SHuacai Chen 		/* Fujitsu-Siemens Lifebook E4010 */
5918761b9b5SHuacai Chen 		.matches = {
5928761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
5938761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
5948761b9b5SHuacai Chen 		},
5958761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
5968761b9b5SHuacai Chen 	},
5978761b9b5SHuacai Chen 	{
5988761b9b5SHuacai Chen 		/* Fujitsu-Siemens Amilo Pro 2010 */
5998761b9b5SHuacai Chen 		.matches = {
6008761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
6018761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
6028761b9b5SHuacai Chen 		},
6038761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
6048761b9b5SHuacai Chen 	},
6058761b9b5SHuacai Chen 	{
6068761b9b5SHuacai Chen 		/* Fujitsu-Siemens Amilo Pro 2030 */
6078761b9b5SHuacai Chen 		.matches = {
6088761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
6098761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
6108761b9b5SHuacai Chen 		},
6118761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
6128761b9b5SHuacai Chen 	},
6138761b9b5SHuacai Chen 	{
614f5bad62fSJonathan Denose 		/* Fujitsu Lifebook A574/H */
615f5bad62fSJonathan Denose 		.matches = {
616f5bad62fSJonathan Denose 			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
617f5bad62fSJonathan Denose 			DMI_MATCH(DMI_PRODUCT_NAME, "FMVA0501PZ"),
618f5bad62fSJonathan Denose 		},
619f5bad62fSJonathan Denose 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
620f5bad62fSJonathan Denose 	},
621f5bad62fSJonathan Denose 	{
6228761b9b5SHuacai Chen 		/* Gigabyte M912 */
6238761b9b5SHuacai Chen 		.matches = {
6248761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6258761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
6268761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
6278761b9b5SHuacai Chen 		},
6288761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6298761b9b5SHuacai Chen 	},
6308761b9b5SHuacai Chen 	{
6318761b9b5SHuacai Chen 		/* Gigabyte Spring Peak - defines wrong chassis type */
6328761b9b5SHuacai Chen 		.matches = {
6338761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6348761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
6358761b9b5SHuacai Chen 		},
6368761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6378761b9b5SHuacai Chen 	},
6388761b9b5SHuacai Chen 	{
6398761b9b5SHuacai Chen 		/* Gigabyte T1005 - defines wrong chassis type ("Other") */
6408761b9b5SHuacai Chen 		.matches = {
6418761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6428761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
6438761b9b5SHuacai Chen 		},
6448761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6458761b9b5SHuacai Chen 	},
6468761b9b5SHuacai Chen 	{
6478761b9b5SHuacai Chen 		/* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
6488761b9b5SHuacai Chen 		.matches = {
6498761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6508761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
6518761b9b5SHuacai Chen 		},
6528761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
6538761b9b5SHuacai Chen 	},
6548761b9b5SHuacai Chen 	/*
6558761b9b5SHuacai Chen 	 * Some laptops need keyboard reset before probing for the trackpad to get
6568761b9b5SHuacai Chen 	 * it detected, initialised & finally work.
6578761b9b5SHuacai Chen 	 */
6588761b9b5SHuacai Chen 	{
6598761b9b5SHuacai Chen 		/* Gigabyte P35 v2 - Elantech touchpad */
6608761b9b5SHuacai Chen 		.matches = {
6618761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6628761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
6638761b9b5SHuacai Chen 		},
6648761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
6658761b9b5SHuacai Chen 	},
6668761b9b5SHuacai Chen 		{
6678761b9b5SHuacai Chen 		/* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
6688761b9b5SHuacai Chen 		.matches = {
6698761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6708761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
6718761b9b5SHuacai Chen 		},
6728761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
6738761b9b5SHuacai Chen 	},
6748761b9b5SHuacai Chen 	{
6758761b9b5SHuacai Chen 		/* Gigabyte P34 - Elantech touchpad */
6768761b9b5SHuacai Chen 		.matches = {
6778761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6788761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
6798761b9b5SHuacai Chen 		},
6808761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
6818761b9b5SHuacai Chen 	},
6828761b9b5SHuacai Chen 	{
6838761b9b5SHuacai Chen 		/* Gigabyte P57 - Elantech touchpad */
6848761b9b5SHuacai Chen 		.matches = {
6858761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
6868761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
6878761b9b5SHuacai Chen 		},
6888761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
6898761b9b5SHuacai Chen 	},
6908761b9b5SHuacai Chen 	{
6918761b9b5SHuacai Chen 		/* Gericom Bellagio */
6928761b9b5SHuacai Chen 		.matches = {
6938761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
6948761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
6958761b9b5SHuacai Chen 		},
6968761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
6978761b9b5SHuacai Chen 	},
6988761b9b5SHuacai Chen 	{
6998761b9b5SHuacai Chen 		/* Gigabyte M1022M netbook */
7008761b9b5SHuacai Chen 		.matches = {
7018761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
7028761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
7038761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
7048761b9b5SHuacai Chen 		},
7058761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
7068761b9b5SHuacai Chen 	},
7078761b9b5SHuacai Chen 	{
7088761b9b5SHuacai Chen 		.matches = {
7098761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7108761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
7118761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
7128761b9b5SHuacai Chen 		},
7138761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
7148761b9b5SHuacai Chen 	},
7158761b9b5SHuacai Chen 	{
7168761b9b5SHuacai Chen 		/*
7178761b9b5SHuacai Chen 		 * HP Pavilion DV4017EA -
7188761b9b5SHuacai Chen 		 * errors on MUX ports are reported without raising AUXDATA
7198761b9b5SHuacai Chen 		 * causing "spurious NAK" messages.
7208761b9b5SHuacai Chen 		 */
7218761b9b5SHuacai Chen 		.matches = {
7228761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7238761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
7248761b9b5SHuacai Chen 		},
7258761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7268761b9b5SHuacai Chen 	},
7278761b9b5SHuacai Chen 	{
7288761b9b5SHuacai Chen 		/*
7298761b9b5SHuacai Chen 		 * HP Pavilion ZT1000 -
7308761b9b5SHuacai Chen 		 * like DV4017EA does not raise AUXERR for errors on MUX ports.
7318761b9b5SHuacai Chen 		 */
7328761b9b5SHuacai Chen 		.matches = {
7338761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7348761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
7358761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
7368761b9b5SHuacai Chen 		},
7378761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7388761b9b5SHuacai Chen 	},
7398761b9b5SHuacai Chen 	{
7408761b9b5SHuacai Chen 		/*
7418761b9b5SHuacai Chen 		 * HP Pavilion DV4270ca -
7428761b9b5SHuacai Chen 		 * like DV4017EA does not raise AUXERR for errors on MUX ports.
7438761b9b5SHuacai Chen 		 */
7448761b9b5SHuacai Chen 		.matches = {
7458761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7468761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
7478761b9b5SHuacai Chen 		},
7488761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7498761b9b5SHuacai Chen 	},
7508761b9b5SHuacai Chen 	{
7518761b9b5SHuacai Chen 		/* Newer HP Pavilion dv4 models */
7528761b9b5SHuacai Chen 		.matches = {
7538761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7548761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
7558761b9b5SHuacai Chen 		},
7568761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
7578761b9b5SHuacai Chen 	},
7588761b9b5SHuacai Chen 	{
7598761b9b5SHuacai Chen 		/* IBM 2656 */
7608761b9b5SHuacai Chen 		.matches = {
7618761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
7628761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
7638761b9b5SHuacai Chen 		},
7648761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7658761b9b5SHuacai Chen 	},
7668761b9b5SHuacai Chen 	{
7678761b9b5SHuacai Chen 		/* Avatar AVIU-145A6 */
7688761b9b5SHuacai Chen 		.matches = {
7698761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
7708761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
7718761b9b5SHuacai Chen 		},
7728761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
7738761b9b5SHuacai Chen 	},
7748761b9b5SHuacai Chen 	{
7758761b9b5SHuacai Chen 		/* Intel MBO Desktop D845PESV */
7768761b9b5SHuacai Chen 		.matches = {
7778761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
7788761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
7798761b9b5SHuacai Chen 		},
7808761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOPNP)
7818761b9b5SHuacai Chen 	},
7828761b9b5SHuacai Chen 	{
7838761b9b5SHuacai Chen 		/*
7848761b9b5SHuacai Chen 		 * Intel NUC D54250WYK - does not have i8042 controller but
7858761b9b5SHuacai Chen 		 * declares PS/2 devices in DSDT.
7868761b9b5SHuacai Chen 		 */
7878761b9b5SHuacai Chen 		.matches = {
7888761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
7898761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"),
7908761b9b5SHuacai Chen 		},
7918761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOPNP)
7928761b9b5SHuacai Chen 	},
7938761b9b5SHuacai Chen 	{
7948761b9b5SHuacai Chen 		/* Lenovo 3000 n100 */
7958761b9b5SHuacai Chen 		.matches = {
7968761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
7978761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
7988761b9b5SHuacai Chen 		},
7998761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8008761b9b5SHuacai Chen 	},
8018761b9b5SHuacai Chen 	{
8028761b9b5SHuacai Chen 		/* Lenovo XiaoXin Air 12 */
8038761b9b5SHuacai Chen 		.matches = {
8048761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8058761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "80UN"),
8068761b9b5SHuacai Chen 		},
8078761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8088761b9b5SHuacai Chen 	},
8098761b9b5SHuacai Chen 	{
8108761b9b5SHuacai Chen 		/* Lenovo LaVie Z */
8118761b9b5SHuacai Chen 		.matches = {
8128761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8138761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"),
8148761b9b5SHuacai Chen 		},
8158761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8168761b9b5SHuacai Chen 	},
8178761b9b5SHuacai Chen 	{
8188761b9b5SHuacai Chen 		/* Lenovo Ideapad U455 */
8198761b9b5SHuacai Chen 		.matches = {
8208761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8218761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
8228761b9b5SHuacai Chen 		},
8238761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8248761b9b5SHuacai Chen 	},
8258761b9b5SHuacai Chen 	{
8268761b9b5SHuacai Chen 		/* Lenovo ThinkPad L460 */
8278761b9b5SHuacai Chen 		.matches = {
8288761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8298761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"),
8308761b9b5SHuacai Chen 		},
8318761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8328761b9b5SHuacai Chen 	},
8338761b9b5SHuacai Chen 	{
8348761b9b5SHuacai Chen 		/* Lenovo ThinkPad Twist S230u */
8358761b9b5SHuacai Chen 		.matches = {
8368761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
8378761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
8388761b9b5SHuacai Chen 		},
8398761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8408761b9b5SHuacai Chen 	},
8418761b9b5SHuacai Chen 	{
8428761b9b5SHuacai Chen 		/* LG Electronics X110 */
8438761b9b5SHuacai Chen 		.matches = {
8448761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
8458761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "X110"),
8468761b9b5SHuacai Chen 		},
8478761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8488761b9b5SHuacai Chen 	},
8498761b9b5SHuacai Chen 	{
8508761b9b5SHuacai Chen 		/* Medion Akoya Mini E1210 */
8518761b9b5SHuacai Chen 		.matches = {
8528761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
8538761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
8548761b9b5SHuacai Chen 		},
8558761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8568761b9b5SHuacai Chen 	},
8578761b9b5SHuacai Chen 	{
8588761b9b5SHuacai Chen 		/* Medion Akoya E1222 */
8598761b9b5SHuacai Chen 		.matches = {
8608761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
8618761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
8628761b9b5SHuacai Chen 		},
8638761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
8648761b9b5SHuacai Chen 	},
8658761b9b5SHuacai Chen 	{
8668761b9b5SHuacai Chen 		/* MSI Wind U-100 */
8678761b9b5SHuacai Chen 		.matches = {
8688761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
8698761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "U-100"),
8708761b9b5SHuacai Chen 		},
8718761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOPNP)
8728761b9b5SHuacai Chen 	},
8738761b9b5SHuacai Chen 	{
8748761b9b5SHuacai Chen 		/*
8758761b9b5SHuacai Chen 		 * No data is coming from the touchscreen unless KBC
8768761b9b5SHuacai Chen 		 * is in legacy mode.
8778761b9b5SHuacai Chen 		 */
8788761b9b5SHuacai Chen 		/* Panasonic CF-29 */
8798761b9b5SHuacai Chen 		.matches = {
8808761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
8818761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
8828761b9b5SHuacai Chen 		},
8838761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
8848761b9b5SHuacai Chen 	},
8858761b9b5SHuacai Chen 	{
8868761b9b5SHuacai Chen 		/* Medion Akoya E7225 */
8878761b9b5SHuacai Chen 		.matches = {
8888761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
8898761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
8908761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
8918761b9b5SHuacai Chen 		},
8928761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
8938761b9b5SHuacai Chen 	},
8948761b9b5SHuacai Chen 	{
8958761b9b5SHuacai Chen 		/* Microsoft Virtual Machine */
8968761b9b5SHuacai Chen 		.matches = {
8978761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
8988761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
8998761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
9008761b9b5SHuacai Chen 		},
9018761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9028761b9b5SHuacai Chen 	},
9038761b9b5SHuacai Chen 	{
9048761b9b5SHuacai Chen 		/* Medion MAM 2070 */
9058761b9b5SHuacai Chen 		.matches = {
9068761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
9078761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
9088761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
9098761b9b5SHuacai Chen 		},
9108761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9118761b9b5SHuacai Chen 	},
9128761b9b5SHuacai Chen 	{
9138761b9b5SHuacai Chen 		/* TUXEDO BU1406 */
9148761b9b5SHuacai Chen 		.matches = {
9158761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
9168761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"),
9178761b9b5SHuacai Chen 		},
9188761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9198761b9b5SHuacai Chen 	},
9208761b9b5SHuacai Chen 	{
9218761b9b5SHuacai Chen 		/* OQO Model 01 */
9228761b9b5SHuacai Chen 		.matches = {
9238761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
9248761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
9258761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
9268761b9b5SHuacai Chen 		},
9278761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9288761b9b5SHuacai Chen 	},
9298761b9b5SHuacai Chen 	{
9308761b9b5SHuacai Chen 		.matches = {
9318761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
9328761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
9338761b9b5SHuacai Chen 		},
9348761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9358761b9b5SHuacai Chen 	},
9368761b9b5SHuacai Chen 	{
9378761b9b5SHuacai Chen 		/* Acer Aspire 5 A515 */
9388761b9b5SHuacai Chen 		.matches = {
9398761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "PK"),
9408761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"),
9418761b9b5SHuacai Chen 		},
9428761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOPNP)
9438761b9b5SHuacai Chen 	},
9448761b9b5SHuacai Chen 	{
9458761b9b5SHuacai Chen 		/* ULI EV4873 - AUX LOOP does not work properly */
9468761b9b5SHuacai Chen 		.matches = {
9478761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
9488761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
9498761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
9508761b9b5SHuacai Chen 		},
9518761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9528761b9b5SHuacai Chen 	},
9538761b9b5SHuacai Chen 	{
9548761b9b5SHuacai Chen 		/*
9558761b9b5SHuacai Chen 		 * Arima-Rioworks HDAMB -
9568761b9b5SHuacai Chen 		 * AUX LOOP command does not raise AUX IRQ
9578761b9b5SHuacai Chen 		 */
9588761b9b5SHuacai Chen 		.matches = {
9598761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
9608761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
9618761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
9628761b9b5SHuacai Chen 		},
9638761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
9648761b9b5SHuacai Chen 	},
9658761b9b5SHuacai Chen 	{
9668761b9b5SHuacai Chen 		/* Sharp Actius MM20 */
9678761b9b5SHuacai Chen 		.matches = {
9688761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
9698761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
9708761b9b5SHuacai Chen 		},
9718761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9728761b9b5SHuacai Chen 	},
9738761b9b5SHuacai Chen 	{
9748761b9b5SHuacai Chen 		/*
9758761b9b5SHuacai Chen 		 * Sony Vaio FZ-240E -
9768761b9b5SHuacai Chen 		 * reset and GET ID commands issued via KBD port are
9778761b9b5SHuacai Chen 		 * sometimes being delivered to AUX3.
9788761b9b5SHuacai Chen 		 */
9798761b9b5SHuacai Chen 		.matches = {
9808761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
9818761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
9828761b9b5SHuacai Chen 		},
9838761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9848761b9b5SHuacai Chen 	},
9858761b9b5SHuacai Chen 	{
9868761b9b5SHuacai Chen 		/*
9878761b9b5SHuacai Chen 		 * Most (all?) VAIOs do not have external PS/2 ports nor
9888761b9b5SHuacai Chen 		 * they implement active multiplexing properly, and
9898761b9b5SHuacai Chen 		 * MUX discovery usually messes up keyboard/touchpad.
9908761b9b5SHuacai Chen 		 */
9918761b9b5SHuacai Chen 		.matches = {
9928761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
9938761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
9948761b9b5SHuacai Chen 		},
9958761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
9968761b9b5SHuacai Chen 	},
9978761b9b5SHuacai Chen 	{
9988761b9b5SHuacai Chen 		/* Sony Vaio FS-115b */
9998761b9b5SHuacai Chen 		.matches = {
10008761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
10018761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
10028761b9b5SHuacai Chen 		},
10038761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10048761b9b5SHuacai Chen 	},
10058761b9b5SHuacai Chen 	{
10068761b9b5SHuacai Chen 		/*
10078761b9b5SHuacai Chen 		 * Sony Vaio VGN-CS series require MUX or the touch sensor
10088761b9b5SHuacai Chen 		 * buttons will disturb touchpad operation
10098761b9b5SHuacai Chen 		 */
10108761b9b5SHuacai Chen 		.matches = {
10118761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
10128761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"),
10138761b9b5SHuacai Chen 		},
10148761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_FORCEMUX)
10158761b9b5SHuacai Chen 	},
10168761b9b5SHuacai Chen 	{
10178761b9b5SHuacai Chen 		.matches = {
10188761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
10198761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
10208761b9b5SHuacai Chen 		},
10218761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10228761b9b5SHuacai Chen 	},
10238761b9b5SHuacai Chen 	{
10248761b9b5SHuacai Chen 		.matches = {
10258761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
10268761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
10278761b9b5SHuacai Chen 		},
10288761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10298761b9b5SHuacai Chen 	},
10308761b9b5SHuacai Chen 	{
10318761b9b5SHuacai Chen 		.matches = {
10328761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
10338761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
10348761b9b5SHuacai Chen 		},
10358761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX)
10368761b9b5SHuacai Chen 	},
10378761b9b5SHuacai Chen 	/*
10388761b9b5SHuacai Chen 	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
10398761b9b5SHuacai Chen 	 * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
10408761b9b5SHuacai Chen 	 * none of them have an external PS/2 port so this can safely be set for
10418761b9b5SHuacai Chen 	 * all of them. These two are based on a Clevo design, but have the
10428761b9b5SHuacai Chen 	 * board_name changed.
10438761b9b5SHuacai Chen 	 */
10448761b9b5SHuacai Chen 	{
10458761b9b5SHuacai Chen 		.matches = {
10468761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
10478761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "AURA1501"),
10488761b9b5SHuacai Chen 		},
10498761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
10508761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
10518761b9b5SHuacai Chen 	},
10528761b9b5SHuacai Chen 	{
10538761b9b5SHuacai Chen 		.matches = {
10548761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
10558761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"),
10568761b9b5SHuacai Chen 		},
10578761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
10588761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
10598761b9b5SHuacai Chen 	},
10608761b9b5SHuacai Chen 	{
10618761b9b5SHuacai Chen 		/* Mivvy M310 */
10628761b9b5SHuacai Chen 		.matches = {
10638761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
10648761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
10658761b9b5SHuacai Chen 		},
10668761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
10678761b9b5SHuacai Chen 	},
10688761b9b5SHuacai Chen 	/*
10698761b9b5SHuacai Chen 	 * Some laptops need keyboard reset before probing for the trackpad to get
10708761b9b5SHuacai Chen 	 * it detected, initialised & finally work.
10718761b9b5SHuacai Chen 	 */
10728761b9b5SHuacai Chen 	{
10738761b9b5SHuacai Chen 		/* Schenker XMG C504 - Elantech touchpad */
10748761b9b5SHuacai Chen 		.matches = {
10758761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "XMG"),
10768761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "C504"),
10778761b9b5SHuacai Chen 		},
10788761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_KBDRESET)
10798761b9b5SHuacai Chen 	},
10808761b9b5SHuacai Chen 	{
10818761b9b5SHuacai Chen 		/* Blue FB5601 */
10828761b9b5SHuacai Chen 		.matches = {
10838761b9b5SHuacai Chen 			DMI_MATCH(DMI_SYS_VENDOR, "blue"),
10848761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
10858761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
10868761b9b5SHuacai Chen 		},
10878761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
10888761b9b5SHuacai Chen 	},
10898761b9b5SHuacai Chen 	/*
10908761b9b5SHuacai Chen 	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
10918761b9b5SHuacai Chen 	 * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
10928761b9b5SHuacai Chen 	 * none of them have an external PS/2 port so this can safely be set for
10938761b9b5SHuacai Chen 	 * all of them.
10948761b9b5SHuacai Chen 	 * Clevo barebones come with board_vendor and/or system_vendor set to
10958761b9b5SHuacai Chen 	 * either the very generic string "Notebook" and/or a different value
10968761b9b5SHuacai Chen 	 * for each individual reseller. The only somewhat universal way to
10978761b9b5SHuacai Chen 	 * identify them is by board_name.
10988761b9b5SHuacai Chen 	 */
10998761b9b5SHuacai Chen 	{
11008761b9b5SHuacai Chen 		.matches = {
11018761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"),
11028761b9b5SHuacai Chen 		},
11038761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11048761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11058761b9b5SHuacai Chen 	},
11068761b9b5SHuacai Chen 	{
11078761b9b5SHuacai Chen 		.matches = {
11088761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"),
11098761b9b5SHuacai Chen 		},
11108761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11118761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11128761b9b5SHuacai Chen 	},
11138761b9b5SHuacai Chen 	{
11148761b9b5SHuacai Chen 		.matches = {
11158761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "N140CU"),
11168761b9b5SHuacai Chen 		},
11178761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11188761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11198761b9b5SHuacai Chen 	},
11208761b9b5SHuacai Chen 	{
11218761b9b5SHuacai Chen 		.matches = {
11228761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "N141CU"),
11238761b9b5SHuacai Chen 		},
11248761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11258761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11268761b9b5SHuacai Chen 	},
11278761b9b5SHuacai Chen 	{
1128cbedf1a3SWerner Sembach 		/*
1129cbedf1a3SWerner Sembach 		 * Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes
1130cbedf1a3SWerner Sembach 		 * the keyboard very laggy for ~5 seconds after boot and
1131cbedf1a3SWerner Sembach 		 * sometimes also after resume.
1132cbedf1a3SWerner Sembach 		 * However both are required for the keyboard to not fail
1133cbedf1a3SWerner Sembach 		 * completely sometimes after boot or resume.
1134cbedf1a3SWerner Sembach 		 */
1135cbedf1a3SWerner Sembach 		.matches = {
1136cbedf1a3SWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "N150CU"),
1137cbedf1a3SWerner Sembach 		},
1138cbedf1a3SWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
1139cbedf1a3SWerner Sembach 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
1140cbedf1a3SWerner Sembach 	},
1141cbedf1a3SWerner Sembach 	{
11428761b9b5SHuacai Chen 		.matches = {
11438761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"),
11448761b9b5SHuacai Chen 		},
11458761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11468761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11478761b9b5SHuacai Chen 	},
11488761b9b5SHuacai Chen 	{
1149cbedf1a3SWerner Sembach 		/*
1150cbedf1a3SWerner Sembach 		 * Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes
1151cbedf1a3SWerner Sembach 		 * the keyboard very laggy for ~5 seconds after boot and
1152cbedf1a3SWerner Sembach 		 * sometimes also after resume.
1153cbedf1a3SWerner Sembach 		 * However both are required for the keyboard to not fail
1154cbedf1a3SWerner Sembach 		 * completely sometimes after boot or resume.
1155cbedf1a3SWerner Sembach 		 */
1156cbedf1a3SWerner Sembach 		.matches = {
1157cbedf1a3SWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "NHxxRZQ"),
1158cbedf1a3SWerner Sembach 		},
1159cbedf1a3SWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
1160cbedf1a3SWerner Sembach 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
1161cbedf1a3SWerner Sembach 	},
1162cbedf1a3SWerner Sembach 	{
11638761b9b5SHuacai Chen 		.matches = {
11648761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"),
11658761b9b5SHuacai Chen 		},
11668761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
11678761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
11688761b9b5SHuacai Chen 	},
11698761b9b5SHuacai Chen 	/*
11708761b9b5SHuacai Chen 	 * At least one modern Clevo barebone has the touchpad connected both
11718761b9b5SHuacai Chen 	 * via PS/2 and i2c interface. This causes a race condition between the
11728761b9b5SHuacai Chen 	 * psmouse and i2c-hid driver. Since the full capability of the touchpad
11738761b9b5SHuacai Chen 	 * is available via the i2c interface and the device has no external
11748761b9b5SHuacai Chen 	 * PS/2 port, it is safe to just ignore all ps2 mouses here to avoid
11758761b9b5SHuacai Chen 	 * this issue. The known affected device is the
11768761b9b5SHuacai Chen 	 * TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU which comes with one of
11778761b9b5SHuacai Chen 	 * the two different dmi strings below. NS50MU is not a typo!
11788761b9b5SHuacai Chen 	 */
11798761b9b5SHuacai Chen 	{
11808761b9b5SHuacai Chen 		.matches = {
11818761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NS50MU"),
11828761b9b5SHuacai Chen 		},
11838761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
11848761b9b5SHuacai Chen 					SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
11858761b9b5SHuacai Chen 					SERIO_QUIRK_NOPNP)
11868761b9b5SHuacai Chen 	},
11878761b9b5SHuacai Chen 	{
11888761b9b5SHuacai Chen 		.matches = {
11898761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"),
11908761b9b5SHuacai Chen 		},
11918761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
11928761b9b5SHuacai Chen 					SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
11938761b9b5SHuacai Chen 					SERIO_QUIRK_NOPNP)
11948761b9b5SHuacai Chen 	},
11958761b9b5SHuacai Chen 	{
11968761b9b5SHuacai Chen 		.matches = {
11978761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"),
11988761b9b5SHuacai Chen 		},
11998761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12008761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12018761b9b5SHuacai Chen 	},
12028761b9b5SHuacai Chen 	{
12038761b9b5SHuacai Chen 		/*
12048761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12058761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12068761b9b5SHuacai Chen 		 * matching.
12078761b9b5SHuacai Chen 		 */
12088761b9b5SHuacai Chen 		.matches = {
12098761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65xH"),
12108761b9b5SHuacai Chen 		},
12118761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12128761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12138761b9b5SHuacai Chen 	},
12148761b9b5SHuacai Chen 	{
12158761b9b5SHuacai Chen 		/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
12168761b9b5SHuacai Chen 		.matches = {
12178761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
12188761b9b5SHuacai Chen 		},
12198761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12208761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12218761b9b5SHuacai Chen 	},
12228761b9b5SHuacai Chen 	{
12238761b9b5SHuacai Chen 		/*
12248761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12258761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12268761b9b5SHuacai Chen 		 * matching.
12278761b9b5SHuacai Chen 		 */
12288761b9b5SHuacai Chen 		.matches = {
12298761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65_P67H"),
12308761b9b5SHuacai Chen 		},
12318761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12328761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12338761b9b5SHuacai Chen 	},
12348761b9b5SHuacai Chen 	{
12358761b9b5SHuacai Chen 		/*
12368761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12378761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12388761b9b5SHuacai Chen 		 * matching.
12398761b9b5SHuacai Chen 		 */
12408761b9b5SHuacai Chen 		.matches = {
12418761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RP"),
12428761b9b5SHuacai Chen 		},
12438761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12448761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12458761b9b5SHuacai Chen 	},
12468761b9b5SHuacai Chen 	{
12478761b9b5SHuacai Chen 		/*
12488761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12498761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12508761b9b5SHuacai Chen 		 * matching.
12518761b9b5SHuacai Chen 		 */
12528761b9b5SHuacai Chen 		.matches = {
12538761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RS"),
12548761b9b5SHuacai Chen 		},
12558761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12568761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12578761b9b5SHuacai Chen 	},
12588761b9b5SHuacai Chen 	{
12598761b9b5SHuacai Chen 		/*
12608761b9b5SHuacai Chen 		 * This is only a partial board_name and might be followed by
12618761b9b5SHuacai Chen 		 * another letter or number. DMI_MATCH however does do partial
12628761b9b5SHuacai Chen 		 * matching.
12638761b9b5SHuacai Chen 		 */
12648761b9b5SHuacai Chen 		.matches = {
12658761b9b5SHuacai Chen 			DMI_MATCH(DMI_PRODUCT_NAME, "P67xRP"),
12668761b9b5SHuacai Chen 		},
12678761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12688761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12698761b9b5SHuacai Chen 	},
12708761b9b5SHuacai Chen 	{
12718761b9b5SHuacai Chen 		.matches = {
12728761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"),
12738761b9b5SHuacai Chen 		},
12748761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12758761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12768761b9b5SHuacai Chen 	},
12778761b9b5SHuacai Chen 	{
12788761b9b5SHuacai Chen 		.matches = {
12799c445d26SWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "PCX0DX"),
12809c445d26SWerner Sembach 		},
12819c445d26SWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12829c445d26SWerner Sembach 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12839c445d26SWerner Sembach 	},
1284*eb09074bSWerner Sembach 	/* See comment on TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU above */
1285*eb09074bSWerner Sembach 	{
1286*eb09074bSWerner Sembach 		.matches = {
1287*eb09074bSWerner Sembach 			DMI_MATCH(DMI_BOARD_NAME, "PD5x_7xPNP_PNR_PNN_PNT"),
1288*eb09074bSWerner Sembach 		},
1289*eb09074bSWerner Sembach 		.driver_data = (void *)(SERIO_QUIRK_NOAUX)
1290*eb09074bSWerner Sembach 	},
12919c445d26SWerner Sembach 	{
12929c445d26SWerner Sembach 		.matches = {
12938761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "X170SM"),
12948761b9b5SHuacai Chen 		},
12958761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
12968761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
12978761b9b5SHuacai Chen 	},
12988761b9b5SHuacai Chen 	{
12998761b9b5SHuacai Chen 		.matches = {
13008761b9b5SHuacai Chen 			DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"),
13018761b9b5SHuacai Chen 		},
13028761b9b5SHuacai Chen 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
13038761b9b5SHuacai Chen 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
13048761b9b5SHuacai Chen 	},
13058761b9b5SHuacai Chen 	{ }
13068761b9b5SHuacai Chen };
13078761b9b5SHuacai Chen 
13088761b9b5SHuacai Chen #ifdef CONFIG_PNP
13098761b9b5SHuacai Chen static const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = {
13108761b9b5SHuacai Chen 	{
13118761b9b5SHuacai Chen 		.matches = {
13128761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
13138761b9b5SHuacai Chen 		},
13148761b9b5SHuacai Chen 	},
13158761b9b5SHuacai Chen 	{
13168761b9b5SHuacai Chen 		.matches = {
13178761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
13188761b9b5SHuacai Chen 		},
13198761b9b5SHuacai Chen 	},
13208761b9b5SHuacai Chen 	{
13218761b9b5SHuacai Chen 		.matches = {
13228761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
13238761b9b5SHuacai Chen 		},
13248761b9b5SHuacai Chen 	},
13258761b9b5SHuacai Chen 	{
13268761b9b5SHuacai Chen 		.matches = {
13278761b9b5SHuacai Chen 			DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
13288761b9b5SHuacai Chen 		},
13298761b9b5SHuacai Chen 	},
13308761b9b5SHuacai Chen 	{ }
13318761b9b5SHuacai Chen };
13328761b9b5SHuacai Chen #endif
13338761b9b5SHuacai Chen 
13348761b9b5SHuacai Chen #endif /* CONFIG_X86 */
13358761b9b5SHuacai Chen 
13368761b9b5SHuacai Chen #ifdef CONFIG_PNP
13378761b9b5SHuacai Chen #include <linux/pnp.h>
13388761b9b5SHuacai Chen 
13398761b9b5SHuacai Chen static bool i8042_pnp_kbd_registered;
13408761b9b5SHuacai Chen static unsigned int i8042_pnp_kbd_devices;
13418761b9b5SHuacai Chen static bool i8042_pnp_aux_registered;
13428761b9b5SHuacai Chen static unsigned int i8042_pnp_aux_devices;
13438761b9b5SHuacai Chen 
13448761b9b5SHuacai Chen static int i8042_pnp_command_reg;
13458761b9b5SHuacai Chen static int i8042_pnp_data_reg;
13468761b9b5SHuacai Chen static int i8042_pnp_kbd_irq;
13478761b9b5SHuacai Chen static int i8042_pnp_aux_irq;
13488761b9b5SHuacai Chen 
13498761b9b5SHuacai Chen static char i8042_pnp_kbd_name[32];
13508761b9b5SHuacai Chen static char i8042_pnp_aux_name[32];
13518761b9b5SHuacai Chen 
13528761b9b5SHuacai Chen static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size)
13538761b9b5SHuacai Chen {
13548761b9b5SHuacai Chen 	strscpy(dst, "PNP:", dst_size);
13558761b9b5SHuacai Chen 
13568761b9b5SHuacai Chen 	while (id) {
13578761b9b5SHuacai Chen 		strlcat(dst, " ", dst_size);
13588761b9b5SHuacai Chen 		strlcat(dst, id->id, dst_size);
13598761b9b5SHuacai Chen 		id = id->next;
13608761b9b5SHuacai Chen 	}
13618761b9b5SHuacai Chen }
13628761b9b5SHuacai Chen 
13638761b9b5SHuacai Chen static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
13648761b9b5SHuacai Chen {
13658761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
13668761b9b5SHuacai Chen 		i8042_pnp_data_reg = pnp_port_start(dev,0);
13678761b9b5SHuacai Chen 
13688761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
13698761b9b5SHuacai Chen 		i8042_pnp_command_reg = pnp_port_start(dev, 1);
13708761b9b5SHuacai Chen 
13718761b9b5SHuacai Chen 	if (pnp_irq_valid(dev,0))
13728761b9b5SHuacai Chen 		i8042_pnp_kbd_irq = pnp_irq(dev, 0);
13738761b9b5SHuacai Chen 
13748761b9b5SHuacai Chen 	strscpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name));
13758761b9b5SHuacai Chen 	if (strlen(pnp_dev_name(dev))) {
13768761b9b5SHuacai Chen 		strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name));
13778761b9b5SHuacai Chen 		strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name));
13788761b9b5SHuacai Chen 	}
13798761b9b5SHuacai Chen 	i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id,
13808761b9b5SHuacai Chen 			       sizeof(i8042_kbd_firmware_id));
13818761b9b5SHuacai Chen 	i8042_kbd_fwnode = dev_fwnode(&dev->dev);
13828761b9b5SHuacai Chen 
13838761b9b5SHuacai Chen 	/* Keyboard ports are always supposed to be wakeup-enabled */
13848761b9b5SHuacai Chen 	device_set_wakeup_enable(&dev->dev, true);
13858761b9b5SHuacai Chen 
13868761b9b5SHuacai Chen 	i8042_pnp_kbd_devices++;
13878761b9b5SHuacai Chen 	return 0;
13888761b9b5SHuacai Chen }
13898761b9b5SHuacai Chen 
13908761b9b5SHuacai Chen static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
13918761b9b5SHuacai Chen {
13928761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
13938761b9b5SHuacai Chen 		i8042_pnp_data_reg = pnp_port_start(dev,0);
13948761b9b5SHuacai Chen 
13958761b9b5SHuacai Chen 	if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
13968761b9b5SHuacai Chen 		i8042_pnp_command_reg = pnp_port_start(dev, 1);
13978761b9b5SHuacai Chen 
13988761b9b5SHuacai Chen 	if (pnp_irq_valid(dev, 0))
13998761b9b5SHuacai Chen 		i8042_pnp_aux_irq = pnp_irq(dev, 0);
14008761b9b5SHuacai Chen 
14018761b9b5SHuacai Chen 	strscpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name));
14028761b9b5SHuacai Chen 	if (strlen(pnp_dev_name(dev))) {
14038761b9b5SHuacai Chen 		strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name));
14048761b9b5SHuacai Chen 		strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name));
14058761b9b5SHuacai Chen 	}
14068761b9b5SHuacai Chen 	i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id,
14078761b9b5SHuacai Chen 			       sizeof(i8042_aux_firmware_id));
14088761b9b5SHuacai Chen 
14098761b9b5SHuacai Chen 	i8042_pnp_aux_devices++;
14108761b9b5SHuacai Chen 	return 0;
14118761b9b5SHuacai Chen }
14128761b9b5SHuacai Chen 
14138761b9b5SHuacai Chen static const struct pnp_device_id pnp_kbd_devids[] = {
14148761b9b5SHuacai Chen 	{ .id = "PNP0300", .driver_data = 0 },
14158761b9b5SHuacai Chen 	{ .id = "PNP0301", .driver_data = 0 },
14168761b9b5SHuacai Chen 	{ .id = "PNP0302", .driver_data = 0 },
14178761b9b5SHuacai Chen 	{ .id = "PNP0303", .driver_data = 0 },
14188761b9b5SHuacai Chen 	{ .id = "PNP0304", .driver_data = 0 },
14198761b9b5SHuacai Chen 	{ .id = "PNP0305", .driver_data = 0 },
14208761b9b5SHuacai Chen 	{ .id = "PNP0306", .driver_data = 0 },
14218761b9b5SHuacai Chen 	{ .id = "PNP0309", .driver_data = 0 },
14228761b9b5SHuacai Chen 	{ .id = "PNP030a", .driver_data = 0 },
14238761b9b5SHuacai Chen 	{ .id = "PNP030b", .driver_data = 0 },
14248761b9b5SHuacai Chen 	{ .id = "PNP0320", .driver_data = 0 },
14258761b9b5SHuacai Chen 	{ .id = "PNP0343", .driver_data = 0 },
14268761b9b5SHuacai Chen 	{ .id = "PNP0344", .driver_data = 0 },
14278761b9b5SHuacai Chen 	{ .id = "PNP0345", .driver_data = 0 },
14288761b9b5SHuacai Chen 	{ .id = "CPQA0D7", .driver_data = 0 },
14298761b9b5SHuacai Chen 	{ .id = "", },
14308761b9b5SHuacai Chen };
14318761b9b5SHuacai Chen MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids);
14328761b9b5SHuacai Chen 
14338761b9b5SHuacai Chen static struct pnp_driver i8042_pnp_kbd_driver = {
14348761b9b5SHuacai Chen 	.name           = "i8042 kbd",
14358761b9b5SHuacai Chen 	.id_table       = pnp_kbd_devids,
14368761b9b5SHuacai Chen 	.probe          = i8042_pnp_kbd_probe,
14378761b9b5SHuacai Chen 	.driver         = {
14388761b9b5SHuacai Chen 		.probe_type = PROBE_FORCE_SYNCHRONOUS,
14398761b9b5SHuacai Chen 		.suppress_bind_attrs = true,
14408761b9b5SHuacai Chen 	},
14418761b9b5SHuacai Chen };
14428761b9b5SHuacai Chen 
14438761b9b5SHuacai Chen static const struct pnp_device_id pnp_aux_devids[] = {
14448761b9b5SHuacai Chen 	{ .id = "AUI0200", .driver_data = 0 },
14458761b9b5SHuacai Chen 	{ .id = "FJC6000", .driver_data = 0 },
14468761b9b5SHuacai Chen 	{ .id = "FJC6001", .driver_data = 0 },
14478761b9b5SHuacai Chen 	{ .id = "PNP0f03", .driver_data = 0 },
14488761b9b5SHuacai Chen 	{ .id = "PNP0f0b", .driver_data = 0 },
14498761b9b5SHuacai Chen 	{ .id = "PNP0f0e", .driver_data = 0 },
14508761b9b5SHuacai Chen 	{ .id = "PNP0f12", .driver_data = 0 },
14518761b9b5SHuacai Chen 	{ .id = "PNP0f13", .driver_data = 0 },
14528761b9b5SHuacai Chen 	{ .id = "PNP0f19", .driver_data = 0 },
14538761b9b5SHuacai Chen 	{ .id = "PNP0f1c", .driver_data = 0 },
14548761b9b5SHuacai Chen 	{ .id = "SYN0801", .driver_data = 0 },
14558761b9b5SHuacai Chen 	{ .id = "", },
14568761b9b5SHuacai Chen };
14578761b9b5SHuacai Chen MODULE_DEVICE_TABLE(pnp, pnp_aux_devids);
14588761b9b5SHuacai Chen 
14598761b9b5SHuacai Chen static struct pnp_driver i8042_pnp_aux_driver = {
14608761b9b5SHuacai Chen 	.name           = "i8042 aux",
14618761b9b5SHuacai Chen 	.id_table       = pnp_aux_devids,
14628761b9b5SHuacai Chen 	.probe          = i8042_pnp_aux_probe,
14638761b9b5SHuacai Chen 	.driver         = {
14648761b9b5SHuacai Chen 		.probe_type = PROBE_FORCE_SYNCHRONOUS,
14658761b9b5SHuacai Chen 		.suppress_bind_attrs = true,
14668761b9b5SHuacai Chen 	},
14678761b9b5SHuacai Chen };
14688761b9b5SHuacai Chen 
14698761b9b5SHuacai Chen static void i8042_pnp_exit(void)
14708761b9b5SHuacai Chen {
14718761b9b5SHuacai Chen 	if (i8042_pnp_kbd_registered) {
14728761b9b5SHuacai Chen 		i8042_pnp_kbd_registered = false;
14738761b9b5SHuacai Chen 		pnp_unregister_driver(&i8042_pnp_kbd_driver);
14748761b9b5SHuacai Chen 	}
14758761b9b5SHuacai Chen 
14768761b9b5SHuacai Chen 	if (i8042_pnp_aux_registered) {
14778761b9b5SHuacai Chen 		i8042_pnp_aux_registered = false;
14788761b9b5SHuacai Chen 		pnp_unregister_driver(&i8042_pnp_aux_driver);
14798761b9b5SHuacai Chen 	}
14808761b9b5SHuacai Chen }
14818761b9b5SHuacai Chen 
14828761b9b5SHuacai Chen static int __init i8042_pnp_init(void)
14838761b9b5SHuacai Chen {
14848761b9b5SHuacai Chen 	char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };
14858761b9b5SHuacai Chen 	bool pnp_data_busted = false;
14868761b9b5SHuacai Chen 	int err;
14878761b9b5SHuacai Chen 
14888761b9b5SHuacai Chen 	if (i8042_nopnp) {
14898761b9b5SHuacai Chen 		pr_info("PNP detection disabled\n");
14908761b9b5SHuacai Chen 		return 0;
14918761b9b5SHuacai Chen 	}
14928761b9b5SHuacai Chen 
14938761b9b5SHuacai Chen 	err = pnp_register_driver(&i8042_pnp_kbd_driver);
14948761b9b5SHuacai Chen 	if (!err)
14958761b9b5SHuacai Chen 		i8042_pnp_kbd_registered = true;
14968761b9b5SHuacai Chen 
14978761b9b5SHuacai Chen 	err = pnp_register_driver(&i8042_pnp_aux_driver);
14988761b9b5SHuacai Chen 	if (!err)
14998761b9b5SHuacai Chen 		i8042_pnp_aux_registered = true;
15008761b9b5SHuacai Chen 
15018761b9b5SHuacai Chen 	if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) {
15028761b9b5SHuacai Chen 		i8042_pnp_exit();
15038761b9b5SHuacai Chen #if defined(__ia64__)
15048761b9b5SHuacai Chen 		return -ENODEV;
15058761b9b5SHuacai Chen #else
15068761b9b5SHuacai Chen 		pr_info("PNP: No PS/2 controller found.\n");
1507fdd7c961SHuacai Chen #if defined(__loongarch__)
1508fdd7c961SHuacai Chen 		if (acpi_disabled == 0)
1509fdd7c961SHuacai Chen 			return -ENODEV;
1510fdd7c961SHuacai Chen #else
15118761b9b5SHuacai Chen 		if (x86_platform.legacy.i8042 !=
15128761b9b5SHuacai Chen 				X86_LEGACY_I8042_EXPECTED_PRESENT)
15138761b9b5SHuacai Chen 			return -ENODEV;
1514fdd7c961SHuacai Chen #endif
15158761b9b5SHuacai Chen 		pr_info("Probing ports directly.\n");
15168761b9b5SHuacai Chen 		return 0;
15178761b9b5SHuacai Chen #endif
15188761b9b5SHuacai Chen 	}
15198761b9b5SHuacai Chen 
15208761b9b5SHuacai Chen 	if (i8042_pnp_kbd_devices)
15218761b9b5SHuacai Chen 		snprintf(kbd_irq_str, sizeof(kbd_irq_str),
15228761b9b5SHuacai Chen 			"%d", i8042_pnp_kbd_irq);
15238761b9b5SHuacai Chen 	if (i8042_pnp_aux_devices)
15248761b9b5SHuacai Chen 		snprintf(aux_irq_str, sizeof(aux_irq_str),
15258761b9b5SHuacai Chen 			"%d", i8042_pnp_aux_irq);
15268761b9b5SHuacai Chen 
15278761b9b5SHuacai Chen 	pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n",
15288761b9b5SHuacai Chen 		i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
15298761b9b5SHuacai Chen 		i8042_pnp_aux_name,
15308761b9b5SHuacai Chen 		i8042_pnp_data_reg, i8042_pnp_command_reg,
15318761b9b5SHuacai Chen 		kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
15328761b9b5SHuacai Chen 		aux_irq_str);
15338761b9b5SHuacai Chen 
15348761b9b5SHuacai Chen #if defined(__ia64__)
15358761b9b5SHuacai Chen 	if (!i8042_pnp_kbd_devices)
15368761b9b5SHuacai Chen 		i8042_nokbd = true;
15378761b9b5SHuacai Chen 	if (!i8042_pnp_aux_devices)
15388761b9b5SHuacai Chen 		i8042_noaux = true;
15398761b9b5SHuacai Chen #endif
15408761b9b5SHuacai Chen 
15418761b9b5SHuacai Chen 	if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&
15428761b9b5SHuacai Chen 	      i8042_pnp_data_reg != i8042_data_reg) ||
15438761b9b5SHuacai Chen 	    !i8042_pnp_data_reg) {
15448761b9b5SHuacai Chen 		pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n",
15458761b9b5SHuacai Chen 			i8042_pnp_data_reg, i8042_data_reg);
15468761b9b5SHuacai Chen 		i8042_pnp_data_reg = i8042_data_reg;
15478761b9b5SHuacai Chen 		pnp_data_busted = true;
15488761b9b5SHuacai Chen 	}
15498761b9b5SHuacai Chen 
15508761b9b5SHuacai Chen 	if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) &&
15518761b9b5SHuacai Chen 	      i8042_pnp_command_reg != i8042_command_reg) ||
15528761b9b5SHuacai Chen 	    !i8042_pnp_command_reg) {
15538761b9b5SHuacai Chen 		pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n",
15548761b9b5SHuacai Chen 			i8042_pnp_command_reg, i8042_command_reg);
15558761b9b5SHuacai Chen 		i8042_pnp_command_reg = i8042_command_reg;
15568761b9b5SHuacai Chen 		pnp_data_busted = true;
15578761b9b5SHuacai Chen 	}
15588761b9b5SHuacai Chen 
15598761b9b5SHuacai Chen 	if (!i8042_nokbd && !i8042_pnp_kbd_irq) {
15608761b9b5SHuacai Chen 		pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n",
15618761b9b5SHuacai Chen 			i8042_kbd_irq);
15628761b9b5SHuacai Chen 		i8042_pnp_kbd_irq = i8042_kbd_irq;
15638761b9b5SHuacai Chen 		pnp_data_busted = true;
15648761b9b5SHuacai Chen 	}
15658761b9b5SHuacai Chen 
15668761b9b5SHuacai Chen 	if (!i8042_noaux && !i8042_pnp_aux_irq) {
15678761b9b5SHuacai Chen 		if (!pnp_data_busted && i8042_pnp_kbd_irq) {
15688761b9b5SHuacai Chen 			pr_warn("PNP: PS/2 appears to have AUX port disabled, "
15698761b9b5SHuacai Chen 				"if this is incorrect please boot with i8042.nopnp\n");
15708761b9b5SHuacai Chen 			i8042_noaux = true;
15718761b9b5SHuacai Chen 		} else {
15728761b9b5SHuacai Chen 			pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n",
15738761b9b5SHuacai Chen 				i8042_aux_irq);
15748761b9b5SHuacai Chen 			i8042_pnp_aux_irq = i8042_aux_irq;
15758761b9b5SHuacai Chen 		}
15768761b9b5SHuacai Chen 	}
15778761b9b5SHuacai Chen 
15788761b9b5SHuacai Chen 	i8042_data_reg = i8042_pnp_data_reg;
15798761b9b5SHuacai Chen 	i8042_command_reg = i8042_pnp_command_reg;
15808761b9b5SHuacai Chen 	i8042_kbd_irq = i8042_pnp_kbd_irq;
15818761b9b5SHuacai Chen 	i8042_aux_irq = i8042_pnp_aux_irq;
15828761b9b5SHuacai Chen 
15838761b9b5SHuacai Chen #ifdef CONFIG_X86
15848761b9b5SHuacai Chen 	i8042_bypass_aux_irq_test = !pnp_data_busted &&
15858761b9b5SHuacai Chen 				    dmi_check_system(i8042_dmi_laptop_table);
15868761b9b5SHuacai Chen #endif
15878761b9b5SHuacai Chen 
15888761b9b5SHuacai Chen 	return 0;
15898761b9b5SHuacai Chen }
15908761b9b5SHuacai Chen 
15918761b9b5SHuacai Chen #else  /* !CONFIG_PNP */
15928761b9b5SHuacai Chen static inline int i8042_pnp_init(void) { return 0; }
15938761b9b5SHuacai Chen static inline void i8042_pnp_exit(void) { }
15948761b9b5SHuacai Chen #endif /* CONFIG_PNP */
15958761b9b5SHuacai Chen 
15968761b9b5SHuacai Chen 
15978761b9b5SHuacai Chen #ifdef CONFIG_X86
15988761b9b5SHuacai Chen static void __init i8042_check_quirks(void)
15998761b9b5SHuacai Chen {
16008761b9b5SHuacai Chen 	const struct dmi_system_id *device_quirk_info;
16018761b9b5SHuacai Chen 	uintptr_t quirks;
16028761b9b5SHuacai Chen 
16038761b9b5SHuacai Chen 	device_quirk_info = dmi_first_match(i8042_dmi_quirk_table);
16048761b9b5SHuacai Chen 	if (!device_quirk_info)
16058761b9b5SHuacai Chen 		return;
16068761b9b5SHuacai Chen 
16078761b9b5SHuacai Chen 	quirks = (uintptr_t)device_quirk_info->driver_data;
16088761b9b5SHuacai Chen 
16098761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOKBD)
16108761b9b5SHuacai Chen 		i8042_nokbd = true;
16118761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOAUX)
16128761b9b5SHuacai Chen 		i8042_noaux = true;
16138761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOMUX)
16148761b9b5SHuacai Chen 		i8042_nomux = true;
16158761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_FORCEMUX)
16168761b9b5SHuacai Chen 		i8042_nomux = false;
16178761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_UNLOCK)
16188761b9b5SHuacai Chen 		i8042_unlock = true;
16198761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_PROBE_DEFER)
16208761b9b5SHuacai Chen 		i8042_probe_defer = true;
16218761b9b5SHuacai Chen 	/* Honor module parameter when value is not default */
16228761b9b5SHuacai Chen 	if (i8042_reset == I8042_RESET_DEFAULT) {
16238761b9b5SHuacai Chen 		if (quirks & SERIO_QUIRK_RESET_ALWAYS)
16248761b9b5SHuacai Chen 			i8042_reset = I8042_RESET_ALWAYS;
16258761b9b5SHuacai Chen 		if (quirks & SERIO_QUIRK_RESET_NEVER)
16268761b9b5SHuacai Chen 			i8042_reset = I8042_RESET_NEVER;
16278761b9b5SHuacai Chen 	}
16288761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_DIECT)
16298761b9b5SHuacai Chen 		i8042_direct = true;
16308761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_DUMBKBD)
16318761b9b5SHuacai Chen 		i8042_dumbkbd = true;
16328761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOLOOP)
16338761b9b5SHuacai Chen 		i8042_noloop = true;
16348761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOTIMEOUT)
16358761b9b5SHuacai Chen 		i8042_notimeout = true;
16368761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_KBDRESET)
16378761b9b5SHuacai Chen 		i8042_kbdreset = true;
16388761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_DRITEK)
16398761b9b5SHuacai Chen 		i8042_dritek = true;
16408761b9b5SHuacai Chen #ifdef CONFIG_PNP
16418761b9b5SHuacai Chen 	if (quirks & SERIO_QUIRK_NOPNP)
16428761b9b5SHuacai Chen 		i8042_nopnp = true;
16438761b9b5SHuacai Chen #endif
16448761b9b5SHuacai Chen }
16458761b9b5SHuacai Chen #else
16468761b9b5SHuacai Chen static inline void i8042_check_quirks(void) {}
16478761b9b5SHuacai Chen #endif
16488761b9b5SHuacai Chen 
16498761b9b5SHuacai Chen static int __init i8042_platform_init(void)
16508761b9b5SHuacai Chen {
16518761b9b5SHuacai Chen 	int retval;
16528761b9b5SHuacai Chen 
16538761b9b5SHuacai Chen #ifdef CONFIG_X86
16548761b9b5SHuacai Chen 	u8 a20_on = 0xdf;
16558761b9b5SHuacai Chen 	/* Just return if platform does not have i8042 controller */
16568761b9b5SHuacai Chen 	if (x86_platform.legacy.i8042 == X86_LEGACY_I8042_PLATFORM_ABSENT)
16578761b9b5SHuacai Chen 		return -ENODEV;
16588761b9b5SHuacai Chen #endif
16598761b9b5SHuacai Chen 
16608761b9b5SHuacai Chen /*
16618761b9b5SHuacai Chen  * On ix86 platforms touching the i8042 data register region can do really
16628761b9b5SHuacai Chen  * bad things. Because of this the region is always reserved on ix86 boxes.
16638761b9b5SHuacai Chen  *
16648761b9b5SHuacai Chen  *	if (!request_region(I8042_DATA_REG, 16, "i8042"))
16658761b9b5SHuacai Chen  *		return -EBUSY;
16668761b9b5SHuacai Chen  */
16678761b9b5SHuacai Chen 
16688761b9b5SHuacai Chen 	i8042_kbd_irq = I8042_MAP_IRQ(1);
16698761b9b5SHuacai Chen 	i8042_aux_irq = I8042_MAP_IRQ(12);
16708761b9b5SHuacai Chen 
16718761b9b5SHuacai Chen #if defined(__ia64__)
16728761b9b5SHuacai Chen 	i8042_reset = I8042_RESET_ALWAYS;
16738761b9b5SHuacai Chen #endif
16748761b9b5SHuacai Chen 
16758761b9b5SHuacai Chen 	i8042_check_quirks();
16768761b9b5SHuacai Chen 
16778761b9b5SHuacai Chen 	pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
16788761b9b5SHuacai Chen 		i8042_nokbd ? " nokbd" : "",
16798761b9b5SHuacai Chen 		i8042_noaux ? " noaux" : "",
16808761b9b5SHuacai Chen 		i8042_nomux ? " nomux" : "",
16818761b9b5SHuacai Chen 		i8042_unlock ? " unlock" : "",
16828761b9b5SHuacai Chen 		i8042_probe_defer ? "probe_defer" : "",
16838761b9b5SHuacai Chen 		i8042_reset == I8042_RESET_DEFAULT ?
16848761b9b5SHuacai Chen 			"" : i8042_reset == I8042_RESET_ALWAYS ?
16858761b9b5SHuacai Chen 				" reset_always" : " reset_never",
16868761b9b5SHuacai Chen 		i8042_direct ? " direct" : "",
16878761b9b5SHuacai Chen 		i8042_dumbkbd ? " dumbkbd" : "",
16888761b9b5SHuacai Chen 		i8042_noloop ? " noloop" : "",
16898761b9b5SHuacai Chen 		i8042_notimeout ? " notimeout" : "",
16908761b9b5SHuacai Chen 		i8042_kbdreset ? " kbdreset" : "",
16918761b9b5SHuacai Chen #ifdef CONFIG_X86
16928761b9b5SHuacai Chen 		i8042_dritek ? " dritek" : "",
16938761b9b5SHuacai Chen #else
16948761b9b5SHuacai Chen 		"",
16958761b9b5SHuacai Chen #endif
16968761b9b5SHuacai Chen #ifdef CONFIG_PNP
16978761b9b5SHuacai Chen 		i8042_nopnp ? " nopnp" : "");
16988761b9b5SHuacai Chen #else
16998761b9b5SHuacai Chen 		"");
17008761b9b5SHuacai Chen #endif
17018761b9b5SHuacai Chen 
17028761b9b5SHuacai Chen 	retval = i8042_pnp_init();
17038761b9b5SHuacai Chen 	if (retval)
17048761b9b5SHuacai Chen 		return retval;
17058761b9b5SHuacai Chen 
17068761b9b5SHuacai Chen #ifdef CONFIG_X86
17078761b9b5SHuacai Chen 	/*
17088761b9b5SHuacai Chen 	 * A20 was already enabled during early kernel init. But some buggy
17098761b9b5SHuacai Chen 	 * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
17108761b9b5SHuacai Chen 	 * resume from S3. So we do it here and hope that nothing breaks.
17118761b9b5SHuacai Chen 	 */
17128761b9b5SHuacai Chen 	i8042_command(&a20_on, 0x10d1);
17138761b9b5SHuacai Chen 	i8042_command(NULL, 0x00ff);	/* Null command for SMM firmware */
17148761b9b5SHuacai Chen #endif /* CONFIG_X86 */
17158761b9b5SHuacai Chen 
17168761b9b5SHuacai Chen 	return retval;
17178761b9b5SHuacai Chen }
17188761b9b5SHuacai Chen 
17198761b9b5SHuacai Chen static inline void i8042_platform_exit(void)
17208761b9b5SHuacai Chen {
17218761b9b5SHuacai Chen 	i8042_pnp_exit();
17228761b9b5SHuacai Chen }
17238761b9b5SHuacai Chen 
17248761b9b5SHuacai Chen #endif /* _I8042_ACPIPNPIO_H */
1725