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