18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci#ifndef _I8042_ACPIPNPIO_H 38c2ecf20Sopenharmony_ci#define _I8042_ACPIPNPIO_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifdef CONFIG_X86 78c2ecf20Sopenharmony_ci#include <asm/x86_init.h> 88c2ecf20Sopenharmony_ci#endif 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* 118c2ecf20Sopenharmony_ci * Names. 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define I8042_KBD_PHYS_DESC "isa0060/serio0" 158c2ecf20Sopenharmony_ci#define I8042_AUX_PHYS_DESC "isa0060/serio1" 168c2ecf20Sopenharmony_ci#define I8042_MUX_PHYS_DESC "isa0060/serio%d" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* 198c2ecf20Sopenharmony_ci * IRQs. 208c2ecf20Sopenharmony_ci */ 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#if defined(__ia64__) 238c2ecf20Sopenharmony_ci# define I8042_MAP_IRQ(x) isa_irq_to_vector((x)) 248c2ecf20Sopenharmony_ci#else 258c2ecf20Sopenharmony_ci# define I8042_MAP_IRQ(x) (x) 268c2ecf20Sopenharmony_ci#endif 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define I8042_KBD_IRQ i8042_kbd_irq 298c2ecf20Sopenharmony_ci#define I8042_AUX_IRQ i8042_aux_irq 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic int i8042_kbd_irq; 328c2ecf20Sopenharmony_cistatic int i8042_aux_irq; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* 358c2ecf20Sopenharmony_ci * Register numbers. 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define I8042_COMMAND_REG i8042_command_reg 398c2ecf20Sopenharmony_ci#define I8042_STATUS_REG i8042_command_reg 408c2ecf20Sopenharmony_ci#define I8042_DATA_REG i8042_data_reg 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cistatic int i8042_command_reg = 0x64; 438c2ecf20Sopenharmony_cistatic int i8042_data_reg = 0x60; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic inline int i8042_read_data(void) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci return inb(I8042_DATA_REG); 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic inline int i8042_read_status(void) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci return inb(I8042_STATUS_REG); 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistatic inline void i8042_write_data(int val) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci outb(val, I8042_DATA_REG); 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistatic inline void i8042_write_command(int val) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci outb(val, I8042_COMMAND_REG); 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#ifdef CONFIG_X86 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci#include <linux/dmi.h> 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci#define SERIO_QUIRK_NOKBD BIT(0) 718c2ecf20Sopenharmony_ci#define SERIO_QUIRK_NOAUX BIT(1) 728c2ecf20Sopenharmony_ci#define SERIO_QUIRK_NOMUX BIT(2) 738c2ecf20Sopenharmony_ci#define SERIO_QUIRK_FORCEMUX BIT(3) 748c2ecf20Sopenharmony_ci#define SERIO_QUIRK_UNLOCK BIT(4) 758c2ecf20Sopenharmony_ci#define SERIO_QUIRK_PROBE_DEFER BIT(5) 768c2ecf20Sopenharmony_ci#define SERIO_QUIRK_RESET_ALWAYS BIT(6) 778c2ecf20Sopenharmony_ci#define SERIO_QUIRK_RESET_NEVER BIT(7) 788c2ecf20Sopenharmony_ci#define SERIO_QUIRK_DIECT BIT(8) 798c2ecf20Sopenharmony_ci#define SERIO_QUIRK_DUMBKBD BIT(9) 808c2ecf20Sopenharmony_ci#define SERIO_QUIRK_NOLOOP BIT(10) 818c2ecf20Sopenharmony_ci#define SERIO_QUIRK_NOTIMEOUT BIT(11) 828c2ecf20Sopenharmony_ci#define SERIO_QUIRK_KBDRESET BIT(12) 838c2ecf20Sopenharmony_ci#define SERIO_QUIRK_DRITEK BIT(13) 848c2ecf20Sopenharmony_ci#define SERIO_QUIRK_NOPNP BIT(14) 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci/* Quirk table for different mainboards. Options similar or identical to i8042 878c2ecf20Sopenharmony_ci * module parameters. 888c2ecf20Sopenharmony_ci * ORDERING IS IMPORTANT! The first match will be apllied and the rest ignored. 898c2ecf20Sopenharmony_ci * This allows entries to overwrite vendor wide quirks on a per device basis. 908c2ecf20Sopenharmony_ci * Where this is irrelevant, entries are sorted case sensitive by DMI_SYS_VENDOR 918c2ecf20Sopenharmony_ci * and/or DMI_BOARD_VENDOR to make it easier to avoid dublicate entries. 928c2ecf20Sopenharmony_ci */ 938c2ecf20Sopenharmony_cistatic const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { 948c2ecf20Sopenharmony_ci { 958c2ecf20Sopenharmony_ci .matches = { 968c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), 978c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), 988c2ecf20Sopenharmony_ci }, 998c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 1008c2ecf20Sopenharmony_ci }, 1018c2ecf20Sopenharmony_ci { 1028c2ecf20Sopenharmony_ci .matches = { 1038c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 1048c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"), 1058c2ecf20Sopenharmony_ci }, 1068c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 1078c2ecf20Sopenharmony_ci }, 1088c2ecf20Sopenharmony_ci { 1098c2ecf20Sopenharmony_ci /* Asus X450LCP */ 1108c2ecf20Sopenharmony_ci .matches = { 1118c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 1128c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"), 1138c2ecf20Sopenharmony_ci }, 1148c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER) 1158c2ecf20Sopenharmony_ci }, 1168c2ecf20Sopenharmony_ci { 1178c2ecf20Sopenharmony_ci /* ASUS ZenBook UX425UA */ 1188c2ecf20Sopenharmony_ci .matches = { 1198c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 1208c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"), 1218c2ecf20Sopenharmony_ci }, 1228c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER) 1238c2ecf20Sopenharmony_ci }, 1248c2ecf20Sopenharmony_ci { 1258c2ecf20Sopenharmony_ci /* ASUS ZenBook UM325UA */ 1268c2ecf20Sopenharmony_ci .matches = { 1278c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 1288c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"), 1298c2ecf20Sopenharmony_ci }, 1308c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER) 1318c2ecf20Sopenharmony_ci }, 1328c2ecf20Sopenharmony_ci /* 1338c2ecf20Sopenharmony_ci * On some Asus laptops, just running self tests cause problems. 1348c2ecf20Sopenharmony_ci */ 1358c2ecf20Sopenharmony_ci { 1368c2ecf20Sopenharmony_ci .matches = { 1378c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 1388c2ecf20Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ 1398c2ecf20Sopenharmony_ci }, 1408c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER) 1418c2ecf20Sopenharmony_ci }, 1428c2ecf20Sopenharmony_ci { 1438c2ecf20Sopenharmony_ci .matches = { 1448c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 1458c2ecf20Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */ 1468c2ecf20Sopenharmony_ci }, 1478c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER) 1488c2ecf20Sopenharmony_ci }, 1498c2ecf20Sopenharmony_ci { 1508c2ecf20Sopenharmony_ci /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */ 1518c2ecf20Sopenharmony_ci .matches = { 1528c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), 1538c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"), 1548c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"), 1558c2ecf20Sopenharmony_ci }, 1568c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 1578c2ecf20Sopenharmony_ci }, 1588c2ecf20Sopenharmony_ci { 1598c2ecf20Sopenharmony_ci /* ASUS G1S */ 1608c2ecf20Sopenharmony_ci .matches = { 1618c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."), 1628c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "G1S"), 1638c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "1.0"), 1648c2ecf20Sopenharmony_ci }, 1658c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 1668c2ecf20Sopenharmony_ci }, 1678c2ecf20Sopenharmony_ci { 1688c2ecf20Sopenharmony_ci .matches = { 1698c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 1708c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), 1718c2ecf20Sopenharmony_ci }, 1728c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 1738c2ecf20Sopenharmony_ci }, 1748c2ecf20Sopenharmony_ci { 1758c2ecf20Sopenharmony_ci /* Acer Aspire 5710 */ 1768c2ecf20Sopenharmony_ci .matches = { 1778c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 1788c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"), 1798c2ecf20Sopenharmony_ci }, 1808c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 1818c2ecf20Sopenharmony_ci }, 1828c2ecf20Sopenharmony_ci { 1838c2ecf20Sopenharmony_ci /* Acer Aspire 7738 */ 1848c2ecf20Sopenharmony_ci .matches = { 1858c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 1868c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"), 1878c2ecf20Sopenharmony_ci }, 1888c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 1898c2ecf20Sopenharmony_ci }, 1908c2ecf20Sopenharmony_ci { 1918c2ecf20Sopenharmony_ci /* Acer Aspire 5536 */ 1928c2ecf20Sopenharmony_ci .matches = { 1938c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 1948c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), 1958c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), 1968c2ecf20Sopenharmony_ci }, 1978c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 1988c2ecf20Sopenharmony_ci }, 1998c2ecf20Sopenharmony_ci { 2008c2ecf20Sopenharmony_ci /* 2018c2ecf20Sopenharmony_ci * Acer Aspire 5738z 2028c2ecf20Sopenharmony_ci * Touchpad stops working in mux mode when dis- + re-enabled 2038c2ecf20Sopenharmony_ci * with the touchpad enable/disable toggle hotkey 2048c2ecf20Sopenharmony_ci */ 2058c2ecf20Sopenharmony_ci .matches = { 2068c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2078c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"), 2088c2ecf20Sopenharmony_ci }, 2098c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 2108c2ecf20Sopenharmony_ci }, 2118c2ecf20Sopenharmony_ci { 2128c2ecf20Sopenharmony_ci /* Acer Aspire One 150 */ 2138c2ecf20Sopenharmony_ci .matches = { 2148c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2158c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"), 2168c2ecf20Sopenharmony_ci }, 2178c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2188c2ecf20Sopenharmony_ci }, 2198c2ecf20Sopenharmony_ci { 2208c2ecf20Sopenharmony_ci .matches = { 2218c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2228c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"), 2238c2ecf20Sopenharmony_ci }, 2248c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2258c2ecf20Sopenharmony_ci }, 2268c2ecf20Sopenharmony_ci { 2278c2ecf20Sopenharmony_ci .matches = { 2288c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2298c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"), 2308c2ecf20Sopenharmony_ci }, 2318c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2328c2ecf20Sopenharmony_ci }, 2338c2ecf20Sopenharmony_ci { 2348c2ecf20Sopenharmony_ci .matches = { 2358c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2368c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"), 2378c2ecf20Sopenharmony_ci }, 2388c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2398c2ecf20Sopenharmony_ci }, 2408c2ecf20Sopenharmony_ci { 2418c2ecf20Sopenharmony_ci .matches = { 2428c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2438c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"), 2448c2ecf20Sopenharmony_ci }, 2458c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2468c2ecf20Sopenharmony_ci }, 2478c2ecf20Sopenharmony_ci { 2488c2ecf20Sopenharmony_ci .matches = { 2498c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2508c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"), 2518c2ecf20Sopenharmony_ci }, 2528c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2538c2ecf20Sopenharmony_ci }, 2548c2ecf20Sopenharmony_ci { 2558c2ecf20Sopenharmony_ci .matches = { 2568c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2578c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"), 2588c2ecf20Sopenharmony_ci }, 2598c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2608c2ecf20Sopenharmony_ci }, 2618c2ecf20Sopenharmony_ci { 2628c2ecf20Sopenharmony_ci .matches = { 2638c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2648c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"), 2658c2ecf20Sopenharmony_ci }, 2668c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 2678c2ecf20Sopenharmony_ci }, 2688c2ecf20Sopenharmony_ci /* 2698c2ecf20Sopenharmony_ci * Some Wistron based laptops need us to explicitly enable the 'Dritek 2708c2ecf20Sopenharmony_ci * keyboard extension' to make their extra keys start generating scancodes. 2718c2ecf20Sopenharmony_ci * Originally, this was just confined to older laptops, but a few Acer laptops 2728c2ecf20Sopenharmony_ci * have turned up in 2007 that also need this again. 2738c2ecf20Sopenharmony_ci */ 2748c2ecf20Sopenharmony_ci { 2758c2ecf20Sopenharmony_ci /* Acer Aspire 5100 */ 2768c2ecf20Sopenharmony_ci .matches = { 2778c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2788c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), 2798c2ecf20Sopenharmony_ci }, 2808c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 2818c2ecf20Sopenharmony_ci }, 2828c2ecf20Sopenharmony_ci { 2838c2ecf20Sopenharmony_ci /* Acer Aspire 5610 */ 2848c2ecf20Sopenharmony_ci .matches = { 2858c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2868c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), 2878c2ecf20Sopenharmony_ci }, 2888c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 2898c2ecf20Sopenharmony_ci }, 2908c2ecf20Sopenharmony_ci { 2918c2ecf20Sopenharmony_ci /* Acer Aspire 5630 */ 2928c2ecf20Sopenharmony_ci .matches = { 2938c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 2948c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"), 2958c2ecf20Sopenharmony_ci }, 2968c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 2978c2ecf20Sopenharmony_ci }, 2988c2ecf20Sopenharmony_ci { 2998c2ecf20Sopenharmony_ci /* Acer Aspire 5650 */ 3008c2ecf20Sopenharmony_ci .matches = { 3018c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3028c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"), 3038c2ecf20Sopenharmony_ci }, 3048c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3058c2ecf20Sopenharmony_ci }, 3068c2ecf20Sopenharmony_ci { 3078c2ecf20Sopenharmony_ci /* Acer Aspire 5680 */ 3088c2ecf20Sopenharmony_ci .matches = { 3098c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3108c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"), 3118c2ecf20Sopenharmony_ci }, 3128c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3138c2ecf20Sopenharmony_ci }, 3148c2ecf20Sopenharmony_ci { 3158c2ecf20Sopenharmony_ci /* Acer Aspire 5720 */ 3168c2ecf20Sopenharmony_ci .matches = { 3178c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3188c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), 3198c2ecf20Sopenharmony_ci }, 3208c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3218c2ecf20Sopenharmony_ci }, 3228c2ecf20Sopenharmony_ci { 3238c2ecf20Sopenharmony_ci /* Acer Aspire 9110 */ 3248c2ecf20Sopenharmony_ci .matches = { 3258c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3268c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"), 3278c2ecf20Sopenharmony_ci }, 3288c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3298c2ecf20Sopenharmony_ci }, 3308c2ecf20Sopenharmony_ci { 3318c2ecf20Sopenharmony_ci /* Acer TravelMate 660 */ 3328c2ecf20Sopenharmony_ci .matches = { 3338c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3348c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), 3358c2ecf20Sopenharmony_ci }, 3368c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3378c2ecf20Sopenharmony_ci }, 3388c2ecf20Sopenharmony_ci { 3398c2ecf20Sopenharmony_ci /* Acer TravelMate 2490 */ 3408c2ecf20Sopenharmony_ci .matches = { 3418c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3428c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), 3438c2ecf20Sopenharmony_ci }, 3448c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3458c2ecf20Sopenharmony_ci }, 3468c2ecf20Sopenharmony_ci { 3478c2ecf20Sopenharmony_ci /* Acer TravelMate 4280 */ 3488c2ecf20Sopenharmony_ci .matches = { 3498c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3508c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), 3518c2ecf20Sopenharmony_ci }, 3528c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 3538c2ecf20Sopenharmony_ci }, 3548c2ecf20Sopenharmony_ci { 3558c2ecf20Sopenharmony_ci /* Acer TravelMate P459-G2-M */ 3568c2ecf20Sopenharmony_ci .matches = { 3578c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 3588c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate P459-G2-M"), 3598c2ecf20Sopenharmony_ci }, 3608c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 3618c2ecf20Sopenharmony_ci }, 3628c2ecf20Sopenharmony_ci { 3638c2ecf20Sopenharmony_ci /* Amoi M636/A737 */ 3648c2ecf20Sopenharmony_ci .matches = { 3658c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), 3668c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), 3678c2ecf20Sopenharmony_ci }, 3688c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 3698c2ecf20Sopenharmony_ci }, 3708c2ecf20Sopenharmony_ci { 3718c2ecf20Sopenharmony_ci .matches = { 3728c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"), 3738c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"), 3748c2ecf20Sopenharmony_ci }, 3758c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 3768c2ecf20Sopenharmony_ci }, 3778c2ecf20Sopenharmony_ci { 3788c2ecf20Sopenharmony_ci /* Compal HEL80I */ 3798c2ecf20Sopenharmony_ci .matches = { 3808c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), 3818c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), 3828c2ecf20Sopenharmony_ci }, 3838c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 3848c2ecf20Sopenharmony_ci }, 3858c2ecf20Sopenharmony_ci { 3868c2ecf20Sopenharmony_ci .matches = { 3878c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 3888c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"), 3898c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "8500"), 3908c2ecf20Sopenharmony_ci }, 3918c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 3928c2ecf20Sopenharmony_ci }, 3938c2ecf20Sopenharmony_ci { 3948c2ecf20Sopenharmony_ci .matches = { 3958c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 3968c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"), 3978c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"), 3988c2ecf20Sopenharmony_ci }, 3998c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 4008c2ecf20Sopenharmony_ci }, 4018c2ecf20Sopenharmony_ci { 4028c2ecf20Sopenharmony_ci /* Advent 4211 */ 4038c2ecf20Sopenharmony_ci .matches = { 4048c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"), 4058c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"), 4068c2ecf20Sopenharmony_ci }, 4078c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 4088c2ecf20Sopenharmony_ci }, 4098c2ecf20Sopenharmony_ci { 4108c2ecf20Sopenharmony_ci /* Dell Embedded Box PC 3000 */ 4118c2ecf20Sopenharmony_ci .matches = { 4128c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4138c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"), 4148c2ecf20Sopenharmony_ci }, 4158c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 4168c2ecf20Sopenharmony_ci }, 4178c2ecf20Sopenharmony_ci { 4188c2ecf20Sopenharmony_ci /* Dell XPS M1530 */ 4198c2ecf20Sopenharmony_ci .matches = { 4208c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4218c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), 4228c2ecf20Sopenharmony_ci }, 4238c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 4248c2ecf20Sopenharmony_ci }, 4258c2ecf20Sopenharmony_ci { 4268c2ecf20Sopenharmony_ci /* Dell Vostro 1510 */ 4278c2ecf20Sopenharmony_ci .matches = { 4288c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4298c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), 4308c2ecf20Sopenharmony_ci }, 4318c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 4328c2ecf20Sopenharmony_ci }, 4338c2ecf20Sopenharmony_ci { 4348c2ecf20Sopenharmony_ci /* Dell Vostro V13 */ 4358c2ecf20Sopenharmony_ci .matches = { 4368c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4378c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), 4388c2ecf20Sopenharmony_ci }, 4398c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT) 4408c2ecf20Sopenharmony_ci }, 4418c2ecf20Sopenharmony_ci { 4428c2ecf20Sopenharmony_ci /* Dell Vostro 1320 */ 4438c2ecf20Sopenharmony_ci .matches = { 4448c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4458c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"), 4468c2ecf20Sopenharmony_ci }, 4478c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 4488c2ecf20Sopenharmony_ci }, 4498c2ecf20Sopenharmony_ci { 4508c2ecf20Sopenharmony_ci /* Dell Vostro 1520 */ 4518c2ecf20Sopenharmony_ci .matches = { 4528c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4538c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"), 4548c2ecf20Sopenharmony_ci }, 4558c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 4568c2ecf20Sopenharmony_ci }, 4578c2ecf20Sopenharmony_ci { 4588c2ecf20Sopenharmony_ci /* Dell Vostro 1720 */ 4598c2ecf20Sopenharmony_ci .matches = { 4608c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 4618c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), 4628c2ecf20Sopenharmony_ci }, 4638c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 4648c2ecf20Sopenharmony_ci }, 4658c2ecf20Sopenharmony_ci { 4668c2ecf20Sopenharmony_ci /* Entroware Proteus */ 4678c2ecf20Sopenharmony_ci .matches = { 4688c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Entroware"), 4698c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"), 4708c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"), 4718c2ecf20Sopenharmony_ci }, 4728c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS) 4738c2ecf20Sopenharmony_ci }, 4748c2ecf20Sopenharmony_ci /* 4758c2ecf20Sopenharmony_ci * Some Fujitsu notebooks are having trouble with touchpads if 4768c2ecf20Sopenharmony_ci * active multiplexing mode is activated. Luckily they don't have 4778c2ecf20Sopenharmony_ci * external PS/2 ports so we can safely disable it. 4788c2ecf20Sopenharmony_ci * ... apparently some Toshibas don't like MUX mode either and 4798c2ecf20Sopenharmony_ci * die horrible death on reboot. 4808c2ecf20Sopenharmony_ci */ 4818c2ecf20Sopenharmony_ci { 4828c2ecf20Sopenharmony_ci /* Fujitsu Lifebook P7010/P7010D */ 4838c2ecf20Sopenharmony_ci .matches = { 4848c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 4858c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), 4868c2ecf20Sopenharmony_ci }, 4878c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 4888c2ecf20Sopenharmony_ci }, 4898c2ecf20Sopenharmony_ci { 4908c2ecf20Sopenharmony_ci /* Fujitsu Lifebook P5020D */ 4918c2ecf20Sopenharmony_ci .matches = { 4928c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 4938c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), 4948c2ecf20Sopenharmony_ci }, 4958c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 4968c2ecf20Sopenharmony_ci }, 4978c2ecf20Sopenharmony_ci { 4988c2ecf20Sopenharmony_ci /* Fujitsu Lifebook S2000 */ 4998c2ecf20Sopenharmony_ci .matches = { 5008c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5018c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), 5028c2ecf20Sopenharmony_ci }, 5038c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5048c2ecf20Sopenharmony_ci }, 5058c2ecf20Sopenharmony_ci { 5068c2ecf20Sopenharmony_ci /* Fujitsu Lifebook S6230 */ 5078c2ecf20Sopenharmony_ci .matches = { 5088c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5098c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), 5108c2ecf20Sopenharmony_ci }, 5118c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5128c2ecf20Sopenharmony_ci }, 5138c2ecf20Sopenharmony_ci { 5148c2ecf20Sopenharmony_ci /* Fujitsu Lifebook T725 laptop */ 5158c2ecf20Sopenharmony_ci .matches = { 5168c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5178c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"), 5188c2ecf20Sopenharmony_ci }, 5198c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT) 5208c2ecf20Sopenharmony_ci }, 5218c2ecf20Sopenharmony_ci { 5228c2ecf20Sopenharmony_ci /* Fujitsu Lifebook U745 */ 5238c2ecf20Sopenharmony_ci .matches = { 5248c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5258c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"), 5268c2ecf20Sopenharmony_ci }, 5278c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5288c2ecf20Sopenharmony_ci }, 5298c2ecf20Sopenharmony_ci { 5308c2ecf20Sopenharmony_ci /* Fujitsu T70H */ 5318c2ecf20Sopenharmony_ci .matches = { 5328c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5338c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), 5348c2ecf20Sopenharmony_ci }, 5358c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5368c2ecf20Sopenharmony_ci }, 5378c2ecf20Sopenharmony_ci { 5388c2ecf20Sopenharmony_ci /* Fujitsu A544 laptop */ 5398c2ecf20Sopenharmony_ci /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ 5408c2ecf20Sopenharmony_ci .matches = { 5418c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5428c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"), 5438c2ecf20Sopenharmony_ci }, 5448c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 5458c2ecf20Sopenharmony_ci }, 5468c2ecf20Sopenharmony_ci { 5478c2ecf20Sopenharmony_ci /* Fujitsu AH544 laptop */ 5488c2ecf20Sopenharmony_ci /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ 5498c2ecf20Sopenharmony_ci .matches = { 5508c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5518c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), 5528c2ecf20Sopenharmony_ci }, 5538c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 5548c2ecf20Sopenharmony_ci }, 5558c2ecf20Sopenharmony_ci { 5568c2ecf20Sopenharmony_ci /* Fujitsu U574 laptop */ 5578c2ecf20Sopenharmony_ci /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ 5588c2ecf20Sopenharmony_ci .matches = { 5598c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5608c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"), 5618c2ecf20Sopenharmony_ci }, 5628c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 5638c2ecf20Sopenharmony_ci }, 5648c2ecf20Sopenharmony_ci { 5658c2ecf20Sopenharmony_ci /* Fujitsu UH554 laptop */ 5668c2ecf20Sopenharmony_ci .matches = { 5678c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 5688c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"), 5698c2ecf20Sopenharmony_ci }, 5708c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 5718c2ecf20Sopenharmony_ci }, 5728c2ecf20Sopenharmony_ci { 5738c2ecf20Sopenharmony_ci /* Fujitsu Lifebook P7010 */ 5748c2ecf20Sopenharmony_ci .matches = { 5758c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 5768c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), 5778c2ecf20Sopenharmony_ci }, 5788c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5798c2ecf20Sopenharmony_ci }, 5808c2ecf20Sopenharmony_ci { 5818c2ecf20Sopenharmony_ci /* Fujitsu-Siemens Lifebook T3010 */ 5828c2ecf20Sopenharmony_ci .matches = { 5838c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 5848c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), 5858c2ecf20Sopenharmony_ci }, 5868c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5878c2ecf20Sopenharmony_ci }, 5888c2ecf20Sopenharmony_ci { 5898c2ecf20Sopenharmony_ci /* Fujitsu-Siemens Lifebook E4010 */ 5908c2ecf20Sopenharmony_ci .matches = { 5918c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 5928c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), 5938c2ecf20Sopenharmony_ci }, 5948c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 5958c2ecf20Sopenharmony_ci }, 5968c2ecf20Sopenharmony_ci { 5978c2ecf20Sopenharmony_ci /* Fujitsu-Siemens Amilo Pro 2010 */ 5988c2ecf20Sopenharmony_ci .matches = { 5998c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 6008c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), 6018c2ecf20Sopenharmony_ci }, 6028c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 6038c2ecf20Sopenharmony_ci }, 6048c2ecf20Sopenharmony_ci { 6058c2ecf20Sopenharmony_ci /* Fujitsu-Siemens Amilo Pro 2030 */ 6068c2ecf20Sopenharmony_ci .matches = { 6078c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 6088c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), 6098c2ecf20Sopenharmony_ci }, 6108c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 6118c2ecf20Sopenharmony_ci }, 6128c2ecf20Sopenharmony_ci { 6138c2ecf20Sopenharmony_ci /* Fujitsu Lifebook A574/H */ 6148c2ecf20Sopenharmony_ci .matches = { 6158c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 6168c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "FMVA0501PZ"), 6178c2ecf20Sopenharmony_ci }, 6188c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 6198c2ecf20Sopenharmony_ci }, 6208c2ecf20Sopenharmony_ci { 6218c2ecf20Sopenharmony_ci /* Fujitsu Lifebook E5411 */ 6228c2ecf20Sopenharmony_ci .matches = { 6238c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU CLIENT COMPUTING LIMITED"), 6248c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E5411"), 6258c2ecf20Sopenharmony_ci }, 6268c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 6278c2ecf20Sopenharmony_ci }, 6288c2ecf20Sopenharmony_ci { 6298c2ecf20Sopenharmony_ci /* Gigabyte M912 */ 6308c2ecf20Sopenharmony_ci .matches = { 6318c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6328c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "M912"), 6338c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "01"), 6348c2ecf20Sopenharmony_ci }, 6358c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 6368c2ecf20Sopenharmony_ci }, 6378c2ecf20Sopenharmony_ci { 6388c2ecf20Sopenharmony_ci /* Gigabyte Spring Peak - defines wrong chassis type */ 6398c2ecf20Sopenharmony_ci .matches = { 6408c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6418c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"), 6428c2ecf20Sopenharmony_ci }, 6438c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 6448c2ecf20Sopenharmony_ci }, 6458c2ecf20Sopenharmony_ci { 6468c2ecf20Sopenharmony_ci /* Gigabyte T1005 - defines wrong chassis type ("Other") */ 6478c2ecf20Sopenharmony_ci .matches = { 6488c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6498c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "T1005"), 6508c2ecf20Sopenharmony_ci }, 6518c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 6528c2ecf20Sopenharmony_ci }, 6538c2ecf20Sopenharmony_ci { 6548c2ecf20Sopenharmony_ci /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */ 6558c2ecf20Sopenharmony_ci .matches = { 6568c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6578c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"), 6588c2ecf20Sopenharmony_ci }, 6598c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 6608c2ecf20Sopenharmony_ci }, 6618c2ecf20Sopenharmony_ci /* 6628c2ecf20Sopenharmony_ci * Some laptops need keyboard reset before probing for the trackpad to get 6638c2ecf20Sopenharmony_ci * it detected, initialised & finally work. 6648c2ecf20Sopenharmony_ci */ 6658c2ecf20Sopenharmony_ci { 6668c2ecf20Sopenharmony_ci /* Gigabyte P35 v2 - Elantech touchpad */ 6678c2ecf20Sopenharmony_ci .matches = { 6688c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6698c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), 6708c2ecf20Sopenharmony_ci }, 6718c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 6728c2ecf20Sopenharmony_ci }, 6738c2ecf20Sopenharmony_ci { 6748c2ecf20Sopenharmony_ci /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ 6758c2ecf20Sopenharmony_ci .matches = { 6768c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6778c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "X3"), 6788c2ecf20Sopenharmony_ci }, 6798c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 6808c2ecf20Sopenharmony_ci }, 6818c2ecf20Sopenharmony_ci { 6828c2ecf20Sopenharmony_ci /* Gigabyte P34 - Elantech touchpad */ 6838c2ecf20Sopenharmony_ci .matches = { 6848c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6858c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P34"), 6868c2ecf20Sopenharmony_ci }, 6878c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 6888c2ecf20Sopenharmony_ci }, 6898c2ecf20Sopenharmony_ci { 6908c2ecf20Sopenharmony_ci /* Gigabyte P57 - Elantech touchpad */ 6918c2ecf20Sopenharmony_ci .matches = { 6928c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 6938c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P57"), 6948c2ecf20Sopenharmony_ci }, 6958c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 6968c2ecf20Sopenharmony_ci }, 6978c2ecf20Sopenharmony_ci { 6988c2ecf20Sopenharmony_ci /* Gericom Bellagio */ 6998c2ecf20Sopenharmony_ci .matches = { 7008c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), 7018c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), 7028c2ecf20Sopenharmony_ci }, 7038c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 7048c2ecf20Sopenharmony_ci }, 7058c2ecf20Sopenharmony_ci { 7068c2ecf20Sopenharmony_ci /* Gigabyte M1022M netbook */ 7078c2ecf20Sopenharmony_ci .matches = { 7088c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."), 7098c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "M1022E"), 7108c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "1.02"), 7118c2ecf20Sopenharmony_ci }, 7128c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 7138c2ecf20Sopenharmony_ci }, 7148c2ecf20Sopenharmony_ci { 7158c2ecf20Sopenharmony_ci .matches = { 7168c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 7178c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), 7188c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), 7198c2ecf20Sopenharmony_ci }, 7208c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 7218c2ecf20Sopenharmony_ci }, 7228c2ecf20Sopenharmony_ci { 7238c2ecf20Sopenharmony_ci /* 7248c2ecf20Sopenharmony_ci * HP Pavilion DV4017EA - 7258c2ecf20Sopenharmony_ci * errors on MUX ports are reported without raising AUXDATA 7268c2ecf20Sopenharmony_ci * causing "spurious NAK" messages. 7278c2ecf20Sopenharmony_ci */ 7288c2ecf20Sopenharmony_ci .matches = { 7298c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 7308c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), 7318c2ecf20Sopenharmony_ci }, 7328c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 7338c2ecf20Sopenharmony_ci }, 7348c2ecf20Sopenharmony_ci { 7358c2ecf20Sopenharmony_ci /* 7368c2ecf20Sopenharmony_ci * HP Pavilion ZT1000 - 7378c2ecf20Sopenharmony_ci * like DV4017EA does not raise AUXERR for errors on MUX ports. 7388c2ecf20Sopenharmony_ci */ 7398c2ecf20Sopenharmony_ci .matches = { 7408c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 7418c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), 7428c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), 7438c2ecf20Sopenharmony_ci }, 7448c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 7458c2ecf20Sopenharmony_ci }, 7468c2ecf20Sopenharmony_ci { 7478c2ecf20Sopenharmony_ci /* 7488c2ecf20Sopenharmony_ci * HP Pavilion DV4270ca - 7498c2ecf20Sopenharmony_ci * like DV4017EA does not raise AUXERR for errors on MUX ports. 7508c2ecf20Sopenharmony_ci */ 7518c2ecf20Sopenharmony_ci .matches = { 7528c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 7538c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), 7548c2ecf20Sopenharmony_ci }, 7558c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 7568c2ecf20Sopenharmony_ci }, 7578c2ecf20Sopenharmony_ci { 7588c2ecf20Sopenharmony_ci /* Newer HP Pavilion dv4 models */ 7598c2ecf20Sopenharmony_ci .matches = { 7608c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 7618c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), 7628c2ecf20Sopenharmony_ci }, 7638c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT) 7648c2ecf20Sopenharmony_ci }, 7658c2ecf20Sopenharmony_ci { 7668c2ecf20Sopenharmony_ci /* IBM 2656 */ 7678c2ecf20Sopenharmony_ci .matches = { 7688c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "IBM"), 7698c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "2656"), 7708c2ecf20Sopenharmony_ci }, 7718c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 7728c2ecf20Sopenharmony_ci }, 7738c2ecf20Sopenharmony_ci { 7748c2ecf20Sopenharmony_ci /* Avatar AVIU-145A6 */ 7758c2ecf20Sopenharmony_ci .matches = { 7768c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Intel"), 7778c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), 7788c2ecf20Sopenharmony_ci }, 7798c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 7808c2ecf20Sopenharmony_ci }, 7818c2ecf20Sopenharmony_ci { 7828c2ecf20Sopenharmony_ci /* Intel MBO Desktop D845PESV */ 7838c2ecf20Sopenharmony_ci .matches = { 7848c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), 7858c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "D845PESV"), 7868c2ecf20Sopenharmony_ci }, 7878c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOPNP) 7888c2ecf20Sopenharmony_ci }, 7898c2ecf20Sopenharmony_ci { 7908c2ecf20Sopenharmony_ci /* 7918c2ecf20Sopenharmony_ci * Intel NUC D54250WYK - does not have i8042 controller but 7928c2ecf20Sopenharmony_ci * declares PS/2 devices in DSDT. 7938c2ecf20Sopenharmony_ci */ 7948c2ecf20Sopenharmony_ci .matches = { 7958c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), 7968c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"), 7978c2ecf20Sopenharmony_ci }, 7988c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOPNP) 7998c2ecf20Sopenharmony_ci }, 8008c2ecf20Sopenharmony_ci { 8018c2ecf20Sopenharmony_ci /* Lenovo 3000 n100 */ 8028c2ecf20Sopenharmony_ci .matches = { 8038c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 8048c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), 8058c2ecf20Sopenharmony_ci }, 8068c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 8078c2ecf20Sopenharmony_ci }, 8088c2ecf20Sopenharmony_ci { 8098c2ecf20Sopenharmony_ci /* Lenovo XiaoXin Air 12 */ 8108c2ecf20Sopenharmony_ci .matches = { 8118c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 8128c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "80UN"), 8138c2ecf20Sopenharmony_ci }, 8148c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 8158c2ecf20Sopenharmony_ci }, 8168c2ecf20Sopenharmony_ci { 8178c2ecf20Sopenharmony_ci /* Lenovo LaVie Z */ 8188c2ecf20Sopenharmony_ci .matches = { 8198c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 8208c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"), 8218c2ecf20Sopenharmony_ci }, 8228c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 8238c2ecf20Sopenharmony_ci }, 8248c2ecf20Sopenharmony_ci { 8258c2ecf20Sopenharmony_ci /* Lenovo Ideapad U455 */ 8268c2ecf20Sopenharmony_ci .matches = { 8278c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 8288c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "20046"), 8298c2ecf20Sopenharmony_ci }, 8308c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 8318c2ecf20Sopenharmony_ci }, 8328c2ecf20Sopenharmony_ci { 8338c2ecf20Sopenharmony_ci /* Lenovo ThinkPad L460 */ 8348c2ecf20Sopenharmony_ci .matches = { 8358c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 8368c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"), 8378c2ecf20Sopenharmony_ci }, 8388c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 8398c2ecf20Sopenharmony_ci }, 8408c2ecf20Sopenharmony_ci { 8418c2ecf20Sopenharmony_ci /* Lenovo ThinkPad Twist S230u */ 8428c2ecf20Sopenharmony_ci .matches = { 8438c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 8448c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"), 8458c2ecf20Sopenharmony_ci }, 8468c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 8478c2ecf20Sopenharmony_ci }, 8488c2ecf20Sopenharmony_ci { 8498c2ecf20Sopenharmony_ci /* LG Electronics X110 */ 8508c2ecf20Sopenharmony_ci .matches = { 8518c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."), 8528c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "X110"), 8538c2ecf20Sopenharmony_ci }, 8548c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 8558c2ecf20Sopenharmony_ci }, 8568c2ecf20Sopenharmony_ci { 8578c2ecf20Sopenharmony_ci /* Medion Akoya Mini E1210 */ 8588c2ecf20Sopenharmony_ci .matches = { 8598c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), 8608c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "E1210"), 8618c2ecf20Sopenharmony_ci }, 8628c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 8638c2ecf20Sopenharmony_ci }, 8648c2ecf20Sopenharmony_ci { 8658c2ecf20Sopenharmony_ci /* Medion Akoya E1222 */ 8668c2ecf20Sopenharmony_ci .matches = { 8678c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), 8688c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), 8698c2ecf20Sopenharmony_ci }, 8708c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 8718c2ecf20Sopenharmony_ci }, 8728c2ecf20Sopenharmony_ci { 8738c2ecf20Sopenharmony_ci /* MSI Wind U-100 */ 8748c2ecf20Sopenharmony_ci .matches = { 8758c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), 8768c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "U-100"), 8778c2ecf20Sopenharmony_ci }, 8788c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOPNP) 8798c2ecf20Sopenharmony_ci }, 8808c2ecf20Sopenharmony_ci { 8818c2ecf20Sopenharmony_ci /* 8828c2ecf20Sopenharmony_ci * No data is coming from the touchscreen unless KBC 8838c2ecf20Sopenharmony_ci * is in legacy mode. 8848c2ecf20Sopenharmony_ci */ 8858c2ecf20Sopenharmony_ci /* Panasonic CF-29 */ 8868c2ecf20Sopenharmony_ci .matches = { 8878c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), 8888c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), 8898c2ecf20Sopenharmony_ci }, 8908c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 8918c2ecf20Sopenharmony_ci }, 8928c2ecf20Sopenharmony_ci { 8938c2ecf20Sopenharmony_ci /* Medion Akoya E7225 */ 8948c2ecf20Sopenharmony_ci .matches = { 8958c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Medion"), 8968c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"), 8978c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"), 8988c2ecf20Sopenharmony_ci }, 8998c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9008c2ecf20Sopenharmony_ci }, 9018c2ecf20Sopenharmony_ci { 9028c2ecf20Sopenharmony_ci /* Microsoft Virtual Machine */ 9038c2ecf20Sopenharmony_ci .matches = { 9048c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), 9058c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), 9068c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), 9078c2ecf20Sopenharmony_ci }, 9088c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9098c2ecf20Sopenharmony_ci }, 9108c2ecf20Sopenharmony_ci { 9118c2ecf20Sopenharmony_ci /* Medion MAM 2070 */ 9128c2ecf20Sopenharmony_ci .matches = { 9138c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 9148c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"), 9158c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 9168c2ecf20Sopenharmony_ci }, 9178c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9188c2ecf20Sopenharmony_ci }, 9198c2ecf20Sopenharmony_ci { 9208c2ecf20Sopenharmony_ci /* TUXEDO BU1406 */ 9218c2ecf20Sopenharmony_ci .matches = { 9228c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 9238c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), 9248c2ecf20Sopenharmony_ci }, 9258c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 9268c2ecf20Sopenharmony_ci }, 9278c2ecf20Sopenharmony_ci { 9288c2ecf20Sopenharmony_ci /* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ 9298c2ecf20Sopenharmony_ci .matches = { 9308c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 9318c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), 9328c2ecf20Sopenharmony_ci }, 9338c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 9348c2ecf20Sopenharmony_ci }, 9358c2ecf20Sopenharmony_ci { 9368c2ecf20Sopenharmony_ci /* OQO Model 01 */ 9378c2ecf20Sopenharmony_ci .matches = { 9388c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "OQO"), 9398c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), 9408c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "00"), 9418c2ecf20Sopenharmony_ci }, 9428c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9438c2ecf20Sopenharmony_ci }, 9448c2ecf20Sopenharmony_ci { 9458c2ecf20Sopenharmony_ci .matches = { 9468c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"), 9478c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "C15B"), 9488c2ecf20Sopenharmony_ci }, 9498c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9508c2ecf20Sopenharmony_ci }, 9518c2ecf20Sopenharmony_ci { 9528c2ecf20Sopenharmony_ci /* Acer Aspire 5 A515 */ 9538c2ecf20Sopenharmony_ci .matches = { 9548c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "PK"), 9558c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"), 9568c2ecf20Sopenharmony_ci }, 9578c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOPNP) 9588c2ecf20Sopenharmony_ci }, 9598c2ecf20Sopenharmony_ci { 9608c2ecf20Sopenharmony_ci /* ULI EV4873 - AUX LOOP does not work properly */ 9618c2ecf20Sopenharmony_ci .matches = { 9628c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ULI"), 9638c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"), 9648c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 9658c2ecf20Sopenharmony_ci }, 9668c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9678c2ecf20Sopenharmony_ci }, 9688c2ecf20Sopenharmony_ci { 9698c2ecf20Sopenharmony_ci /* 9708c2ecf20Sopenharmony_ci * Arima-Rioworks HDAMB - 9718c2ecf20Sopenharmony_ci * AUX LOOP command does not raise AUX IRQ 9728c2ecf20Sopenharmony_ci */ 9738c2ecf20Sopenharmony_ci .matches = { 9748c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"), 9758c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "HDAMB"), 9768c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "Rev E"), 9778c2ecf20Sopenharmony_ci }, 9788c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 9798c2ecf20Sopenharmony_ci }, 9808c2ecf20Sopenharmony_ci { 9818c2ecf20Sopenharmony_ci /* Sharp Actius MM20 */ 9828c2ecf20Sopenharmony_ci .matches = { 9838c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), 9848c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), 9858c2ecf20Sopenharmony_ci }, 9868c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 9878c2ecf20Sopenharmony_ci }, 9888c2ecf20Sopenharmony_ci { 9898c2ecf20Sopenharmony_ci /* 9908c2ecf20Sopenharmony_ci * Sony Vaio FZ-240E - 9918c2ecf20Sopenharmony_ci * reset and GET ID commands issued via KBD port are 9928c2ecf20Sopenharmony_ci * sometimes being delivered to AUX3. 9938c2ecf20Sopenharmony_ci */ 9948c2ecf20Sopenharmony_ci .matches = { 9958c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 9968c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), 9978c2ecf20Sopenharmony_ci }, 9988c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 9998c2ecf20Sopenharmony_ci }, 10008c2ecf20Sopenharmony_ci { 10018c2ecf20Sopenharmony_ci /* 10028c2ecf20Sopenharmony_ci * Most (all?) VAIOs do not have external PS/2 ports nor 10038c2ecf20Sopenharmony_ci * they implement active multiplexing properly, and 10048c2ecf20Sopenharmony_ci * MUX discovery usually messes up keyboard/touchpad. 10058c2ecf20Sopenharmony_ci */ 10068c2ecf20Sopenharmony_ci .matches = { 10078c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 10088c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "VAIO"), 10098c2ecf20Sopenharmony_ci }, 10108c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 10118c2ecf20Sopenharmony_ci }, 10128c2ecf20Sopenharmony_ci { 10138c2ecf20Sopenharmony_ci /* Sony Vaio FS-115b */ 10148c2ecf20Sopenharmony_ci .matches = { 10158c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 10168c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), 10178c2ecf20Sopenharmony_ci }, 10188c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 10198c2ecf20Sopenharmony_ci }, 10208c2ecf20Sopenharmony_ci { 10218c2ecf20Sopenharmony_ci /* 10228c2ecf20Sopenharmony_ci * Sony Vaio VGN-CS series require MUX or the touch sensor 10238c2ecf20Sopenharmony_ci * buttons will disturb touchpad operation 10248c2ecf20Sopenharmony_ci */ 10258c2ecf20Sopenharmony_ci .matches = { 10268c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 10278c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"), 10288c2ecf20Sopenharmony_ci }, 10298c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_FORCEMUX) 10308c2ecf20Sopenharmony_ci }, 10318c2ecf20Sopenharmony_ci { 10328c2ecf20Sopenharmony_ci .matches = { 10338c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 10348c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), 10358c2ecf20Sopenharmony_ci }, 10368c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 10378c2ecf20Sopenharmony_ci }, 10388c2ecf20Sopenharmony_ci { 10398c2ecf20Sopenharmony_ci .matches = { 10408c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 10418c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), 10428c2ecf20Sopenharmony_ci }, 10438c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 10448c2ecf20Sopenharmony_ci }, 10458c2ecf20Sopenharmony_ci { 10468c2ecf20Sopenharmony_ci .matches = { 10478c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 10488c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), 10498c2ecf20Sopenharmony_ci }, 10508c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 10518c2ecf20Sopenharmony_ci }, 10528c2ecf20Sopenharmony_ci /* 10538c2ecf20Sopenharmony_ci * A lot of modern Clevo barebones have touchpad and/or keyboard issues 10548c2ecf20Sopenharmony_ci * after suspend fixable with nomux + reset + noloop + nopnp. Luckily, 10558c2ecf20Sopenharmony_ci * none of them have an external PS/2 port so this can safely be set for 10568c2ecf20Sopenharmony_ci * all of them. These two are based on a Clevo design, but have the 10578c2ecf20Sopenharmony_ci * board_name changed. 10588c2ecf20Sopenharmony_ci */ 10598c2ecf20Sopenharmony_ci { 10608c2ecf20Sopenharmony_ci .matches = { 10618c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"), 10628c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "AURA1501"), 10638c2ecf20Sopenharmony_ci }, 10648c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 10658c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 10668c2ecf20Sopenharmony_ci }, 10678c2ecf20Sopenharmony_ci { 10688c2ecf20Sopenharmony_ci .matches = { 10698c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"), 10708c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"), 10718c2ecf20Sopenharmony_ci }, 10728c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 10738c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 10748c2ecf20Sopenharmony_ci }, 10758c2ecf20Sopenharmony_ci { 10768c2ecf20Sopenharmony_ci /* Mivvy M310 */ 10778c2ecf20Sopenharmony_ci .matches = { 10788c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), 10798c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "N10"), 10808c2ecf20Sopenharmony_ci }, 10818c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 10828c2ecf20Sopenharmony_ci }, 10838c2ecf20Sopenharmony_ci /* 10848c2ecf20Sopenharmony_ci * Some laptops need keyboard reset before probing for the trackpad to get 10858c2ecf20Sopenharmony_ci * it detected, initialised & finally work. 10868c2ecf20Sopenharmony_ci */ 10878c2ecf20Sopenharmony_ci { 10888c2ecf20Sopenharmony_ci /* Schenker XMG C504 - Elantech touchpad */ 10898c2ecf20Sopenharmony_ci .matches = { 10908c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "XMG"), 10918c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "C504"), 10928c2ecf20Sopenharmony_ci }, 10938c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 10948c2ecf20Sopenharmony_ci }, 10958c2ecf20Sopenharmony_ci { 10968c2ecf20Sopenharmony_ci /* Blue FB5601 */ 10978c2ecf20Sopenharmony_ci .matches = { 10988c2ecf20Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "blue"), 10998c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"), 11008c2ecf20Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), 11018c2ecf20Sopenharmony_ci }, 11028c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 11038c2ecf20Sopenharmony_ci }, 11048c2ecf20Sopenharmony_ci /* 11058c2ecf20Sopenharmony_ci * A lot of modern Clevo barebones have touchpad and/or keyboard issues 11068c2ecf20Sopenharmony_ci * after suspend fixable with nomux + reset + noloop + nopnp. Luckily, 11078c2ecf20Sopenharmony_ci * none of them have an external PS/2 port so this can safely be set for 11088c2ecf20Sopenharmony_ci * all of them. 11098c2ecf20Sopenharmony_ci * Clevo barebones come with board_vendor and/or system_vendor set to 11108c2ecf20Sopenharmony_ci * either the very generic string "Notebook" and/or a different value 11118c2ecf20Sopenharmony_ci * for each individual reseller. The only somewhat universal way to 11128c2ecf20Sopenharmony_ci * identify them is by board_name. 11138c2ecf20Sopenharmony_ci */ 11148c2ecf20Sopenharmony_ci { 11158c2ecf20Sopenharmony_ci .matches = { 11168c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"), 11178c2ecf20Sopenharmony_ci }, 11188c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11198c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11208c2ecf20Sopenharmony_ci }, 11218c2ecf20Sopenharmony_ci { 11228c2ecf20Sopenharmony_ci .matches = { 11238c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"), 11248c2ecf20Sopenharmony_ci }, 11258c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11268c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11278c2ecf20Sopenharmony_ci }, 11288c2ecf20Sopenharmony_ci { 11298c2ecf20Sopenharmony_ci .matches = { 11308c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "N140CU"), 11318c2ecf20Sopenharmony_ci }, 11328c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11338c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11348c2ecf20Sopenharmony_ci }, 11358c2ecf20Sopenharmony_ci { 11368c2ecf20Sopenharmony_ci .matches = { 11378c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "N141CU"), 11388c2ecf20Sopenharmony_ci }, 11398c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11408c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11418c2ecf20Sopenharmony_ci }, 11428c2ecf20Sopenharmony_ci { 11438c2ecf20Sopenharmony_ci .matches = { 11448c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"), 11458c2ecf20Sopenharmony_ci }, 11468c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11478c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11488c2ecf20Sopenharmony_ci }, 11498c2ecf20Sopenharmony_ci { 11508c2ecf20Sopenharmony_ci .matches = { 11518c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"), 11528c2ecf20Sopenharmony_ci }, 11538c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11548c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11558c2ecf20Sopenharmony_ci }, 11568c2ecf20Sopenharmony_ci /* 11578c2ecf20Sopenharmony_ci * At least one modern Clevo barebone has the touchpad connected both 11588c2ecf20Sopenharmony_ci * via PS/2 and i2c interface. This causes a race condition between the 11598c2ecf20Sopenharmony_ci * psmouse and i2c-hid driver. Since the full capability of the touchpad 11608c2ecf20Sopenharmony_ci * is available via the i2c interface and the device has no external 11618c2ecf20Sopenharmony_ci * PS/2 port, it is safe to just ignore all ps2 mouses here to avoid 11628c2ecf20Sopenharmony_ci * this issue. The known affected device is the 11638c2ecf20Sopenharmony_ci * TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU which comes with one of 11648c2ecf20Sopenharmony_ci * the two different dmi strings below. NS50MU is not a typo! 11658c2ecf20Sopenharmony_ci */ 11668c2ecf20Sopenharmony_ci { 11678c2ecf20Sopenharmony_ci .matches = { 11688c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NS50MU"), 11698c2ecf20Sopenharmony_ci }, 11708c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX | 11718c2ecf20Sopenharmony_ci SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | 11728c2ecf20Sopenharmony_ci SERIO_QUIRK_NOPNP) 11738c2ecf20Sopenharmony_ci }, 11748c2ecf20Sopenharmony_ci { 11758c2ecf20Sopenharmony_ci .matches = { 11768c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"), 11778c2ecf20Sopenharmony_ci }, 11788c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX | 11798c2ecf20Sopenharmony_ci SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | 11808c2ecf20Sopenharmony_ci SERIO_QUIRK_NOPNP) 11818c2ecf20Sopenharmony_ci }, 11828c2ecf20Sopenharmony_ci { 11838c2ecf20Sopenharmony_ci .matches = { 11848c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NS5x_7xPU"), 11858c2ecf20Sopenharmony_ci }, 11868c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 11878c2ecf20Sopenharmony_ci }, 11888c2ecf20Sopenharmony_ci { 11898c2ecf20Sopenharmony_ci .matches = { 11908c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"), 11918c2ecf20Sopenharmony_ci }, 11928c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 11938c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 11948c2ecf20Sopenharmony_ci }, 11958c2ecf20Sopenharmony_ci { 11968c2ecf20Sopenharmony_ci .matches = { 11978c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"), 11988c2ecf20Sopenharmony_ci }, 11998c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 12008c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 12018c2ecf20Sopenharmony_ci }, 12028c2ecf20Sopenharmony_ci { 12038c2ecf20Sopenharmony_ci .matches = { 12048c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "PCX0DX"), 12058c2ecf20Sopenharmony_ci }, 12068c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 12078c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 12088c2ecf20Sopenharmony_ci }, 12098c2ecf20Sopenharmony_ci /* See comment on TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU above */ 12108c2ecf20Sopenharmony_ci { 12118c2ecf20Sopenharmony_ci .matches = { 12128c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "PD5x_7xPNP_PNR_PNN_PNT"), 12138c2ecf20Sopenharmony_ci }, 12148c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 12158c2ecf20Sopenharmony_ci }, 12168c2ecf20Sopenharmony_ci { 12178c2ecf20Sopenharmony_ci .matches = { 12188c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "X170SM"), 12198c2ecf20Sopenharmony_ci }, 12208c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 12218c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 12228c2ecf20Sopenharmony_ci }, 12238c2ecf20Sopenharmony_ci { 12248c2ecf20Sopenharmony_ci .matches = { 12258c2ecf20Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"), 12268c2ecf20Sopenharmony_ci }, 12278c2ecf20Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 12288c2ecf20Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 12298c2ecf20Sopenharmony_ci }, 12308c2ecf20Sopenharmony_ci { } 12318c2ecf20Sopenharmony_ci}; 12328c2ecf20Sopenharmony_ci 12338c2ecf20Sopenharmony_ci#ifdef CONFIG_PNP 12348c2ecf20Sopenharmony_cistatic const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = { 12358c2ecf20Sopenharmony_ci { 12368c2ecf20Sopenharmony_ci .matches = { 12378c2ecf20Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ 12388c2ecf20Sopenharmony_ci }, 12398c2ecf20Sopenharmony_ci }, 12408c2ecf20Sopenharmony_ci { 12418c2ecf20Sopenharmony_ci .matches = { 12428c2ecf20Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */ 12438c2ecf20Sopenharmony_ci }, 12448c2ecf20Sopenharmony_ci }, 12458c2ecf20Sopenharmony_ci { 12468c2ecf20Sopenharmony_ci .matches = { 12478c2ecf20Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ 12488c2ecf20Sopenharmony_ci }, 12498c2ecf20Sopenharmony_ci }, 12508c2ecf20Sopenharmony_ci { 12518c2ecf20Sopenharmony_ci .matches = { 12528c2ecf20Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */ 12538c2ecf20Sopenharmony_ci }, 12548c2ecf20Sopenharmony_ci }, 12558c2ecf20Sopenharmony_ci { } 12568c2ecf20Sopenharmony_ci}; 12578c2ecf20Sopenharmony_ci#endif 12588c2ecf20Sopenharmony_ci 12598c2ecf20Sopenharmony_ci#endif /* CONFIG_X86 */ 12608c2ecf20Sopenharmony_ci 12618c2ecf20Sopenharmony_ci#ifdef CONFIG_PNP 12628c2ecf20Sopenharmony_ci#include <linux/pnp.h> 12638c2ecf20Sopenharmony_ci 12648c2ecf20Sopenharmony_cistatic bool i8042_pnp_kbd_registered; 12658c2ecf20Sopenharmony_cistatic unsigned int i8042_pnp_kbd_devices; 12668c2ecf20Sopenharmony_cistatic bool i8042_pnp_aux_registered; 12678c2ecf20Sopenharmony_cistatic unsigned int i8042_pnp_aux_devices; 12688c2ecf20Sopenharmony_ci 12698c2ecf20Sopenharmony_cistatic int i8042_pnp_command_reg; 12708c2ecf20Sopenharmony_cistatic int i8042_pnp_data_reg; 12718c2ecf20Sopenharmony_cistatic int i8042_pnp_kbd_irq; 12728c2ecf20Sopenharmony_cistatic int i8042_pnp_aux_irq; 12738c2ecf20Sopenharmony_ci 12748c2ecf20Sopenharmony_cistatic char i8042_pnp_kbd_name[32]; 12758c2ecf20Sopenharmony_cistatic char i8042_pnp_aux_name[32]; 12768c2ecf20Sopenharmony_ci 12778c2ecf20Sopenharmony_cistatic void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size) 12788c2ecf20Sopenharmony_ci{ 12798c2ecf20Sopenharmony_ci strlcpy(dst, "PNP:", dst_size); 12808c2ecf20Sopenharmony_ci 12818c2ecf20Sopenharmony_ci while (id) { 12828c2ecf20Sopenharmony_ci strlcat(dst, " ", dst_size); 12838c2ecf20Sopenharmony_ci strlcat(dst, id->id, dst_size); 12848c2ecf20Sopenharmony_ci id = id->next; 12858c2ecf20Sopenharmony_ci } 12868c2ecf20Sopenharmony_ci} 12878c2ecf20Sopenharmony_ci 12888c2ecf20Sopenharmony_cistatic int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 12898c2ecf20Sopenharmony_ci{ 12908c2ecf20Sopenharmony_ci if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 12918c2ecf20Sopenharmony_ci i8042_pnp_data_reg = pnp_port_start(dev,0); 12928c2ecf20Sopenharmony_ci 12938c2ecf20Sopenharmony_ci if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 12948c2ecf20Sopenharmony_ci i8042_pnp_command_reg = pnp_port_start(dev, 1); 12958c2ecf20Sopenharmony_ci 12968c2ecf20Sopenharmony_ci if (pnp_irq_valid(dev,0)) 12978c2ecf20Sopenharmony_ci i8042_pnp_kbd_irq = pnp_irq(dev, 0); 12988c2ecf20Sopenharmony_ci 12998c2ecf20Sopenharmony_ci strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name)); 13008c2ecf20Sopenharmony_ci if (strlen(pnp_dev_name(dev))) { 13018c2ecf20Sopenharmony_ci strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); 13028c2ecf20Sopenharmony_ci strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); 13038c2ecf20Sopenharmony_ci } 13048c2ecf20Sopenharmony_ci i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id, 13058c2ecf20Sopenharmony_ci sizeof(i8042_kbd_firmware_id)); 13068c2ecf20Sopenharmony_ci i8042_kbd_fwnode = dev_fwnode(&dev->dev); 13078c2ecf20Sopenharmony_ci 13088c2ecf20Sopenharmony_ci /* Keyboard ports are always supposed to be wakeup-enabled */ 13098c2ecf20Sopenharmony_ci device_set_wakeup_enable(&dev->dev, true); 13108c2ecf20Sopenharmony_ci 13118c2ecf20Sopenharmony_ci i8042_pnp_kbd_devices++; 13128c2ecf20Sopenharmony_ci return 0; 13138c2ecf20Sopenharmony_ci} 13148c2ecf20Sopenharmony_ci 13158c2ecf20Sopenharmony_cistatic int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 13168c2ecf20Sopenharmony_ci{ 13178c2ecf20Sopenharmony_ci if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 13188c2ecf20Sopenharmony_ci i8042_pnp_data_reg = pnp_port_start(dev,0); 13198c2ecf20Sopenharmony_ci 13208c2ecf20Sopenharmony_ci if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 13218c2ecf20Sopenharmony_ci i8042_pnp_command_reg = pnp_port_start(dev, 1); 13228c2ecf20Sopenharmony_ci 13238c2ecf20Sopenharmony_ci if (pnp_irq_valid(dev, 0)) 13248c2ecf20Sopenharmony_ci i8042_pnp_aux_irq = pnp_irq(dev, 0); 13258c2ecf20Sopenharmony_ci 13268c2ecf20Sopenharmony_ci strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name)); 13278c2ecf20Sopenharmony_ci if (strlen(pnp_dev_name(dev))) { 13288c2ecf20Sopenharmony_ci strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); 13298c2ecf20Sopenharmony_ci strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); 13308c2ecf20Sopenharmony_ci } 13318c2ecf20Sopenharmony_ci i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id, 13328c2ecf20Sopenharmony_ci sizeof(i8042_aux_firmware_id)); 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_ci i8042_pnp_aux_devices++; 13358c2ecf20Sopenharmony_ci return 0; 13368c2ecf20Sopenharmony_ci} 13378c2ecf20Sopenharmony_ci 13388c2ecf20Sopenharmony_cistatic const struct pnp_device_id pnp_kbd_devids[] = { 13398c2ecf20Sopenharmony_ci { .id = "PNP0300", .driver_data = 0 }, 13408c2ecf20Sopenharmony_ci { .id = "PNP0301", .driver_data = 0 }, 13418c2ecf20Sopenharmony_ci { .id = "PNP0302", .driver_data = 0 }, 13428c2ecf20Sopenharmony_ci { .id = "PNP0303", .driver_data = 0 }, 13438c2ecf20Sopenharmony_ci { .id = "PNP0304", .driver_data = 0 }, 13448c2ecf20Sopenharmony_ci { .id = "PNP0305", .driver_data = 0 }, 13458c2ecf20Sopenharmony_ci { .id = "PNP0306", .driver_data = 0 }, 13468c2ecf20Sopenharmony_ci { .id = "PNP0309", .driver_data = 0 }, 13478c2ecf20Sopenharmony_ci { .id = "PNP030a", .driver_data = 0 }, 13488c2ecf20Sopenharmony_ci { .id = "PNP030b", .driver_data = 0 }, 13498c2ecf20Sopenharmony_ci { .id = "PNP0320", .driver_data = 0 }, 13508c2ecf20Sopenharmony_ci { .id = "PNP0343", .driver_data = 0 }, 13518c2ecf20Sopenharmony_ci { .id = "PNP0344", .driver_data = 0 }, 13528c2ecf20Sopenharmony_ci { .id = "PNP0345", .driver_data = 0 }, 13538c2ecf20Sopenharmony_ci { .id = "CPQA0D7", .driver_data = 0 }, 13548c2ecf20Sopenharmony_ci { .id = "", }, 13558c2ecf20Sopenharmony_ci}; 13568c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pnp, pnp_kbd_devids); 13578c2ecf20Sopenharmony_ci 13588c2ecf20Sopenharmony_cistatic struct pnp_driver i8042_pnp_kbd_driver = { 13598c2ecf20Sopenharmony_ci .name = "i8042 kbd", 13608c2ecf20Sopenharmony_ci .id_table = pnp_kbd_devids, 13618c2ecf20Sopenharmony_ci .probe = i8042_pnp_kbd_probe, 13628c2ecf20Sopenharmony_ci .driver = { 13638c2ecf20Sopenharmony_ci .probe_type = PROBE_FORCE_SYNCHRONOUS, 13648c2ecf20Sopenharmony_ci .suppress_bind_attrs = true, 13658c2ecf20Sopenharmony_ci }, 13668c2ecf20Sopenharmony_ci}; 13678c2ecf20Sopenharmony_ci 13688c2ecf20Sopenharmony_cistatic const struct pnp_device_id pnp_aux_devids[] = { 13698c2ecf20Sopenharmony_ci { .id = "AUI0200", .driver_data = 0 }, 13708c2ecf20Sopenharmony_ci { .id = "FJC6000", .driver_data = 0 }, 13718c2ecf20Sopenharmony_ci { .id = "FJC6001", .driver_data = 0 }, 13728c2ecf20Sopenharmony_ci { .id = "PNP0f03", .driver_data = 0 }, 13738c2ecf20Sopenharmony_ci { .id = "PNP0f0b", .driver_data = 0 }, 13748c2ecf20Sopenharmony_ci { .id = "PNP0f0e", .driver_data = 0 }, 13758c2ecf20Sopenharmony_ci { .id = "PNP0f12", .driver_data = 0 }, 13768c2ecf20Sopenharmony_ci { .id = "PNP0f13", .driver_data = 0 }, 13778c2ecf20Sopenharmony_ci { .id = "PNP0f19", .driver_data = 0 }, 13788c2ecf20Sopenharmony_ci { .id = "PNP0f1c", .driver_data = 0 }, 13798c2ecf20Sopenharmony_ci { .id = "SYN0801", .driver_data = 0 }, 13808c2ecf20Sopenharmony_ci { .id = "", }, 13818c2ecf20Sopenharmony_ci}; 13828c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pnp, pnp_aux_devids); 13838c2ecf20Sopenharmony_ci 13848c2ecf20Sopenharmony_cistatic struct pnp_driver i8042_pnp_aux_driver = { 13858c2ecf20Sopenharmony_ci .name = "i8042 aux", 13868c2ecf20Sopenharmony_ci .id_table = pnp_aux_devids, 13878c2ecf20Sopenharmony_ci .probe = i8042_pnp_aux_probe, 13888c2ecf20Sopenharmony_ci .driver = { 13898c2ecf20Sopenharmony_ci .probe_type = PROBE_FORCE_SYNCHRONOUS, 13908c2ecf20Sopenharmony_ci .suppress_bind_attrs = true, 13918c2ecf20Sopenharmony_ci }, 13928c2ecf20Sopenharmony_ci}; 13938c2ecf20Sopenharmony_ci 13948c2ecf20Sopenharmony_cistatic void i8042_pnp_exit(void) 13958c2ecf20Sopenharmony_ci{ 13968c2ecf20Sopenharmony_ci if (i8042_pnp_kbd_registered) { 13978c2ecf20Sopenharmony_ci i8042_pnp_kbd_registered = false; 13988c2ecf20Sopenharmony_ci pnp_unregister_driver(&i8042_pnp_kbd_driver); 13998c2ecf20Sopenharmony_ci } 14008c2ecf20Sopenharmony_ci 14018c2ecf20Sopenharmony_ci if (i8042_pnp_aux_registered) { 14028c2ecf20Sopenharmony_ci i8042_pnp_aux_registered = false; 14038c2ecf20Sopenharmony_ci pnp_unregister_driver(&i8042_pnp_aux_driver); 14048c2ecf20Sopenharmony_ci } 14058c2ecf20Sopenharmony_ci} 14068c2ecf20Sopenharmony_ci 14078c2ecf20Sopenharmony_cistatic int __init i8042_pnp_init(void) 14088c2ecf20Sopenharmony_ci{ 14098c2ecf20Sopenharmony_ci char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; 14108c2ecf20Sopenharmony_ci bool pnp_data_busted = false; 14118c2ecf20Sopenharmony_ci int err; 14128c2ecf20Sopenharmony_ci 14138c2ecf20Sopenharmony_ci if (i8042_nopnp) { 14148c2ecf20Sopenharmony_ci pr_info("PNP detection disabled\n"); 14158c2ecf20Sopenharmony_ci return 0; 14168c2ecf20Sopenharmony_ci } 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci err = pnp_register_driver(&i8042_pnp_kbd_driver); 14198c2ecf20Sopenharmony_ci if (!err) 14208c2ecf20Sopenharmony_ci i8042_pnp_kbd_registered = true; 14218c2ecf20Sopenharmony_ci 14228c2ecf20Sopenharmony_ci err = pnp_register_driver(&i8042_pnp_aux_driver); 14238c2ecf20Sopenharmony_ci if (!err) 14248c2ecf20Sopenharmony_ci i8042_pnp_aux_registered = true; 14258c2ecf20Sopenharmony_ci 14268c2ecf20Sopenharmony_ci if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { 14278c2ecf20Sopenharmony_ci i8042_pnp_exit(); 14288c2ecf20Sopenharmony_ci#if defined(__ia64__) 14298c2ecf20Sopenharmony_ci return -ENODEV; 14308c2ecf20Sopenharmony_ci#else 14318c2ecf20Sopenharmony_ci pr_info("PNP: No PS/2 controller found.\n"); 14328c2ecf20Sopenharmony_ci if (x86_platform.legacy.i8042 != 14338c2ecf20Sopenharmony_ci X86_LEGACY_I8042_EXPECTED_PRESENT) 14348c2ecf20Sopenharmony_ci return -ENODEV; 14358c2ecf20Sopenharmony_ci pr_info("Probing ports directly.\n"); 14368c2ecf20Sopenharmony_ci return 0; 14378c2ecf20Sopenharmony_ci#endif 14388c2ecf20Sopenharmony_ci } 14398c2ecf20Sopenharmony_ci 14408c2ecf20Sopenharmony_ci if (i8042_pnp_kbd_devices) 14418c2ecf20Sopenharmony_ci snprintf(kbd_irq_str, sizeof(kbd_irq_str), 14428c2ecf20Sopenharmony_ci "%d", i8042_pnp_kbd_irq); 14438c2ecf20Sopenharmony_ci if (i8042_pnp_aux_devices) 14448c2ecf20Sopenharmony_ci snprintf(aux_irq_str, sizeof(aux_irq_str), 14458c2ecf20Sopenharmony_ci "%d", i8042_pnp_aux_irq); 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", 14488c2ecf20Sopenharmony_ci i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 14498c2ecf20Sopenharmony_ci i8042_pnp_aux_name, 14508c2ecf20Sopenharmony_ci i8042_pnp_data_reg, i8042_pnp_command_reg, 14518c2ecf20Sopenharmony_ci kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 14528c2ecf20Sopenharmony_ci aux_irq_str); 14538c2ecf20Sopenharmony_ci 14548c2ecf20Sopenharmony_ci#if defined(__ia64__) 14558c2ecf20Sopenharmony_ci if (!i8042_pnp_kbd_devices) 14568c2ecf20Sopenharmony_ci i8042_nokbd = true; 14578c2ecf20Sopenharmony_ci if (!i8042_pnp_aux_devices) 14588c2ecf20Sopenharmony_ci i8042_noaux = true; 14598c2ecf20Sopenharmony_ci#endif 14608c2ecf20Sopenharmony_ci 14618c2ecf20Sopenharmony_ci if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && 14628c2ecf20Sopenharmony_ci i8042_pnp_data_reg != i8042_data_reg) || 14638c2ecf20Sopenharmony_ci !i8042_pnp_data_reg) { 14648c2ecf20Sopenharmony_ci pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n", 14658c2ecf20Sopenharmony_ci i8042_pnp_data_reg, i8042_data_reg); 14668c2ecf20Sopenharmony_ci i8042_pnp_data_reg = i8042_data_reg; 14678c2ecf20Sopenharmony_ci pnp_data_busted = true; 14688c2ecf20Sopenharmony_ci } 14698c2ecf20Sopenharmony_ci 14708c2ecf20Sopenharmony_ci if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) && 14718c2ecf20Sopenharmony_ci i8042_pnp_command_reg != i8042_command_reg) || 14728c2ecf20Sopenharmony_ci !i8042_pnp_command_reg) { 14738c2ecf20Sopenharmony_ci pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n", 14748c2ecf20Sopenharmony_ci i8042_pnp_command_reg, i8042_command_reg); 14758c2ecf20Sopenharmony_ci i8042_pnp_command_reg = i8042_command_reg; 14768c2ecf20Sopenharmony_ci pnp_data_busted = true; 14778c2ecf20Sopenharmony_ci } 14788c2ecf20Sopenharmony_ci 14798c2ecf20Sopenharmony_ci if (!i8042_nokbd && !i8042_pnp_kbd_irq) { 14808c2ecf20Sopenharmony_ci pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n", 14818c2ecf20Sopenharmony_ci i8042_kbd_irq); 14828c2ecf20Sopenharmony_ci i8042_pnp_kbd_irq = i8042_kbd_irq; 14838c2ecf20Sopenharmony_ci pnp_data_busted = true; 14848c2ecf20Sopenharmony_ci } 14858c2ecf20Sopenharmony_ci 14868c2ecf20Sopenharmony_ci if (!i8042_noaux && !i8042_pnp_aux_irq) { 14878c2ecf20Sopenharmony_ci if (!pnp_data_busted && i8042_pnp_kbd_irq) { 14888c2ecf20Sopenharmony_ci pr_warn("PNP: PS/2 appears to have AUX port disabled, " 14898c2ecf20Sopenharmony_ci "if this is incorrect please boot with i8042.nopnp\n"); 14908c2ecf20Sopenharmony_ci i8042_noaux = true; 14918c2ecf20Sopenharmony_ci } else { 14928c2ecf20Sopenharmony_ci pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n", 14938c2ecf20Sopenharmony_ci i8042_aux_irq); 14948c2ecf20Sopenharmony_ci i8042_pnp_aux_irq = i8042_aux_irq; 14958c2ecf20Sopenharmony_ci } 14968c2ecf20Sopenharmony_ci } 14978c2ecf20Sopenharmony_ci 14988c2ecf20Sopenharmony_ci i8042_data_reg = i8042_pnp_data_reg; 14998c2ecf20Sopenharmony_ci i8042_command_reg = i8042_pnp_command_reg; 15008c2ecf20Sopenharmony_ci i8042_kbd_irq = i8042_pnp_kbd_irq; 15018c2ecf20Sopenharmony_ci i8042_aux_irq = i8042_pnp_aux_irq; 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_ci#ifdef CONFIG_X86 15048c2ecf20Sopenharmony_ci i8042_bypass_aux_irq_test = !pnp_data_busted && 15058c2ecf20Sopenharmony_ci dmi_check_system(i8042_dmi_laptop_table); 15068c2ecf20Sopenharmony_ci#endif 15078c2ecf20Sopenharmony_ci 15088c2ecf20Sopenharmony_ci return 0; 15098c2ecf20Sopenharmony_ci} 15108c2ecf20Sopenharmony_ci 15118c2ecf20Sopenharmony_ci#else /* !CONFIG_PNP */ 15128c2ecf20Sopenharmony_cistatic inline int i8042_pnp_init(void) { return 0; } 15138c2ecf20Sopenharmony_cistatic inline void i8042_pnp_exit(void) { } 15148c2ecf20Sopenharmony_ci#endif /* CONFIG_PNP */ 15158c2ecf20Sopenharmony_ci 15168c2ecf20Sopenharmony_ci 15178c2ecf20Sopenharmony_ci#ifdef CONFIG_X86 15188c2ecf20Sopenharmony_cistatic void __init i8042_check_quirks(void) 15198c2ecf20Sopenharmony_ci{ 15208c2ecf20Sopenharmony_ci const struct dmi_system_id *device_quirk_info; 15218c2ecf20Sopenharmony_ci uintptr_t quirks; 15228c2ecf20Sopenharmony_ci 15238c2ecf20Sopenharmony_ci device_quirk_info = dmi_first_match(i8042_dmi_quirk_table); 15248c2ecf20Sopenharmony_ci if (!device_quirk_info) 15258c2ecf20Sopenharmony_ci return; 15268c2ecf20Sopenharmony_ci 15278c2ecf20Sopenharmony_ci quirks = (uintptr_t)device_quirk_info->driver_data; 15288c2ecf20Sopenharmony_ci 15298c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_NOKBD) 15308c2ecf20Sopenharmony_ci i8042_nokbd = true; 15318c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_NOAUX) 15328c2ecf20Sopenharmony_ci i8042_noaux = true; 15338c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_NOMUX) 15348c2ecf20Sopenharmony_ci i8042_nomux = true; 15358c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_FORCEMUX) 15368c2ecf20Sopenharmony_ci i8042_nomux = false; 15378c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_UNLOCK) 15388c2ecf20Sopenharmony_ci i8042_unlock = true; 15398c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_PROBE_DEFER) 15408c2ecf20Sopenharmony_ci i8042_probe_defer = true; 15418c2ecf20Sopenharmony_ci /* Honor module parameter when value is not default */ 15428c2ecf20Sopenharmony_ci if (i8042_reset == I8042_RESET_DEFAULT) { 15438c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_RESET_ALWAYS) 15448c2ecf20Sopenharmony_ci i8042_reset = I8042_RESET_ALWAYS; 15458c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_RESET_NEVER) 15468c2ecf20Sopenharmony_ci i8042_reset = I8042_RESET_NEVER; 15478c2ecf20Sopenharmony_ci } 15488c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_DIECT) 15498c2ecf20Sopenharmony_ci i8042_direct = true; 15508c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_DUMBKBD) 15518c2ecf20Sopenharmony_ci i8042_dumbkbd = true; 15528c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_NOLOOP) 15538c2ecf20Sopenharmony_ci i8042_noloop = true; 15548c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_NOTIMEOUT) 15558c2ecf20Sopenharmony_ci i8042_notimeout = true; 15568c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_KBDRESET) 15578c2ecf20Sopenharmony_ci i8042_kbdreset = true; 15588c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_DRITEK) 15598c2ecf20Sopenharmony_ci i8042_dritek = true; 15608c2ecf20Sopenharmony_ci#ifdef CONFIG_PNP 15618c2ecf20Sopenharmony_ci if (quirks & SERIO_QUIRK_NOPNP) 15628c2ecf20Sopenharmony_ci i8042_nopnp = true; 15638c2ecf20Sopenharmony_ci#endif 15648c2ecf20Sopenharmony_ci} 15658c2ecf20Sopenharmony_ci#else 15668c2ecf20Sopenharmony_cistatic inline void i8042_check_quirks(void) {} 15678c2ecf20Sopenharmony_ci#endif 15688c2ecf20Sopenharmony_ci 15698c2ecf20Sopenharmony_cistatic int __init i8042_platform_init(void) 15708c2ecf20Sopenharmony_ci{ 15718c2ecf20Sopenharmony_ci int retval; 15728c2ecf20Sopenharmony_ci 15738c2ecf20Sopenharmony_ci#ifdef CONFIG_X86 15748c2ecf20Sopenharmony_ci u8 a20_on = 0xdf; 15758c2ecf20Sopenharmony_ci /* Just return if platform does not have i8042 controller */ 15768c2ecf20Sopenharmony_ci if (x86_platform.legacy.i8042 == X86_LEGACY_I8042_PLATFORM_ABSENT) 15778c2ecf20Sopenharmony_ci return -ENODEV; 15788c2ecf20Sopenharmony_ci#endif 15798c2ecf20Sopenharmony_ci 15808c2ecf20Sopenharmony_ci/* 15818c2ecf20Sopenharmony_ci * On ix86 platforms touching the i8042 data register region can do really 15828c2ecf20Sopenharmony_ci * bad things. Because of this the region is always reserved on ix86 boxes. 15838c2ecf20Sopenharmony_ci * 15848c2ecf20Sopenharmony_ci * if (!request_region(I8042_DATA_REG, 16, "i8042")) 15858c2ecf20Sopenharmony_ci * return -EBUSY; 15868c2ecf20Sopenharmony_ci */ 15878c2ecf20Sopenharmony_ci 15888c2ecf20Sopenharmony_ci i8042_kbd_irq = I8042_MAP_IRQ(1); 15898c2ecf20Sopenharmony_ci i8042_aux_irq = I8042_MAP_IRQ(12); 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ci#if defined(__ia64__) 15928c2ecf20Sopenharmony_ci i8042_reset = I8042_RESET_ALWAYS; 15938c2ecf20Sopenharmony_ci#endif 15948c2ecf20Sopenharmony_ci 15958c2ecf20Sopenharmony_ci i8042_check_quirks(); 15968c2ecf20Sopenharmony_ci 15978c2ecf20Sopenharmony_ci retval = i8042_pnp_init(); 15988c2ecf20Sopenharmony_ci if (retval) 15998c2ecf20Sopenharmony_ci return retval; 16008c2ecf20Sopenharmony_ci 16018c2ecf20Sopenharmony_ci#ifdef CONFIG_X86 16028c2ecf20Sopenharmony_ci /* 16038c2ecf20Sopenharmony_ci * A20 was already enabled during early kernel init. But some buggy 16048c2ecf20Sopenharmony_ci * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to 16058c2ecf20Sopenharmony_ci * resume from S3. So we do it here and hope that nothing breaks. 16068c2ecf20Sopenharmony_ci */ 16078c2ecf20Sopenharmony_ci i8042_command(&a20_on, 0x10d1); 16088c2ecf20Sopenharmony_ci i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */ 16098c2ecf20Sopenharmony_ci#endif /* CONFIG_X86 */ 16108c2ecf20Sopenharmony_ci 16118c2ecf20Sopenharmony_ci return retval; 16128c2ecf20Sopenharmony_ci} 16138c2ecf20Sopenharmony_ci 16148c2ecf20Sopenharmony_cistatic inline void i8042_platform_exit(void) 16158c2ecf20Sopenharmony_ci{ 16168c2ecf20Sopenharmony_ci i8042_pnp_exit(); 16178c2ecf20Sopenharmony_ci} 16188c2ecf20Sopenharmony_ci 16198c2ecf20Sopenharmony_ci#endif /* _I8042_ACPIPNPIO_H */ 1620