162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci#ifndef _I8042_ACPIPNPIO_H 362306a36Sopenharmony_ci#define _I8042_ACPIPNPIO_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/acpi.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifdef CONFIG_X86 862306a36Sopenharmony_ci#include <asm/x86_init.h> 962306a36Sopenharmony_ci#endif 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* 1262306a36Sopenharmony_ci * Names. 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define I8042_KBD_PHYS_DESC "isa0060/serio0" 1662306a36Sopenharmony_ci#define I8042_AUX_PHYS_DESC "isa0060/serio1" 1762306a36Sopenharmony_ci#define I8042_MUX_PHYS_DESC "isa0060/serio%d" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * IRQs. 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#if defined(__ia64__) 2462306a36Sopenharmony_ci# define I8042_MAP_IRQ(x) isa_irq_to_vector((x)) 2562306a36Sopenharmony_ci#else 2662306a36Sopenharmony_ci# define I8042_MAP_IRQ(x) (x) 2762306a36Sopenharmony_ci#endif 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define I8042_KBD_IRQ i8042_kbd_irq 3062306a36Sopenharmony_ci#define I8042_AUX_IRQ i8042_aux_irq 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic int i8042_kbd_irq; 3362306a36Sopenharmony_cistatic int i8042_aux_irq; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * Register numbers. 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define I8042_COMMAND_REG i8042_command_reg 4062306a36Sopenharmony_ci#define I8042_STATUS_REG i8042_command_reg 4162306a36Sopenharmony_ci#define I8042_DATA_REG i8042_data_reg 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic int i8042_command_reg = 0x64; 4462306a36Sopenharmony_cistatic int i8042_data_reg = 0x60; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic inline int i8042_read_data(void) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci return inb(I8042_DATA_REG); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic inline int i8042_read_status(void) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci return inb(I8042_STATUS_REG); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline void i8042_write_data(int val) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci outb(val, I8042_DATA_REG); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic inline void i8042_write_command(int val) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci outb(val, I8042_COMMAND_REG); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#ifdef CONFIG_X86 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#include <linux/dmi.h> 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#define SERIO_QUIRK_NOKBD BIT(0) 7262306a36Sopenharmony_ci#define SERIO_QUIRK_NOAUX BIT(1) 7362306a36Sopenharmony_ci#define SERIO_QUIRK_NOMUX BIT(2) 7462306a36Sopenharmony_ci#define SERIO_QUIRK_FORCEMUX BIT(3) 7562306a36Sopenharmony_ci#define SERIO_QUIRK_UNLOCK BIT(4) 7662306a36Sopenharmony_ci#define SERIO_QUIRK_PROBE_DEFER BIT(5) 7762306a36Sopenharmony_ci#define SERIO_QUIRK_RESET_ALWAYS BIT(6) 7862306a36Sopenharmony_ci#define SERIO_QUIRK_RESET_NEVER BIT(7) 7962306a36Sopenharmony_ci#define SERIO_QUIRK_DIECT BIT(8) 8062306a36Sopenharmony_ci#define SERIO_QUIRK_DUMBKBD BIT(9) 8162306a36Sopenharmony_ci#define SERIO_QUIRK_NOLOOP BIT(10) 8262306a36Sopenharmony_ci#define SERIO_QUIRK_NOTIMEOUT BIT(11) 8362306a36Sopenharmony_ci#define SERIO_QUIRK_KBDRESET BIT(12) 8462306a36Sopenharmony_ci#define SERIO_QUIRK_DRITEK BIT(13) 8562306a36Sopenharmony_ci#define SERIO_QUIRK_NOPNP BIT(14) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* Quirk table for different mainboards. Options similar or identical to i8042 8862306a36Sopenharmony_ci * module parameters. 8962306a36Sopenharmony_ci * ORDERING IS IMPORTANT! The first match will be apllied and the rest ignored. 9062306a36Sopenharmony_ci * This allows entries to overwrite vendor wide quirks on a per device basis. 9162306a36Sopenharmony_ci * Where this is irrelevant, entries are sorted case sensitive by DMI_SYS_VENDOR 9262306a36Sopenharmony_ci * and/or DMI_BOARD_VENDOR to make it easier to avoid dublicate entries. 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_cistatic const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = { 9562306a36Sopenharmony_ci { 9662306a36Sopenharmony_ci .matches = { 9762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), 9862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), 9962306a36Sopenharmony_ci }, 10062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 10162306a36Sopenharmony_ci }, 10262306a36Sopenharmony_ci { 10362306a36Sopenharmony_ci .matches = { 10462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 10562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"), 10662306a36Sopenharmony_ci }, 10762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 10862306a36Sopenharmony_ci }, 10962306a36Sopenharmony_ci { 11062306a36Sopenharmony_ci /* Asus X450LCP */ 11162306a36Sopenharmony_ci .matches = { 11262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 11362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"), 11462306a36Sopenharmony_ci }, 11562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER) 11662306a36Sopenharmony_ci }, 11762306a36Sopenharmony_ci { 11862306a36Sopenharmony_ci /* ASUS ZenBook UX425UA/QA */ 11962306a36Sopenharmony_ci .matches = { 12062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 12162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425"), 12262306a36Sopenharmony_ci }, 12362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER) 12462306a36Sopenharmony_ci }, 12562306a36Sopenharmony_ci { 12662306a36Sopenharmony_ci /* ASUS ZenBook UM325UA/QA */ 12762306a36Sopenharmony_ci .matches = { 12862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 12962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325"), 13062306a36Sopenharmony_ci }, 13162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER) 13262306a36Sopenharmony_ci }, 13362306a36Sopenharmony_ci /* 13462306a36Sopenharmony_ci * On some Asus laptops, just running self tests cause problems. 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_ci { 13762306a36Sopenharmony_ci .matches = { 13862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 13962306a36Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ 14062306a36Sopenharmony_ci }, 14162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER) 14262306a36Sopenharmony_ci }, 14362306a36Sopenharmony_ci { 14462306a36Sopenharmony_ci .matches = { 14562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 14662306a36Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */ 14762306a36Sopenharmony_ci }, 14862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER) 14962306a36Sopenharmony_ci }, 15062306a36Sopenharmony_ci { 15162306a36Sopenharmony_ci /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */ 15262306a36Sopenharmony_ci .matches = { 15362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), 15462306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"), 15562306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"), 15662306a36Sopenharmony_ci }, 15762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 15862306a36Sopenharmony_ci }, 15962306a36Sopenharmony_ci { 16062306a36Sopenharmony_ci /* ASUS G1S */ 16162306a36Sopenharmony_ci .matches = { 16262306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."), 16362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "G1S"), 16462306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "1.0"), 16562306a36Sopenharmony_ci }, 16662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 16762306a36Sopenharmony_ci }, 16862306a36Sopenharmony_ci { 16962306a36Sopenharmony_ci .matches = { 17062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 17162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), 17262306a36Sopenharmony_ci }, 17362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 17462306a36Sopenharmony_ci }, 17562306a36Sopenharmony_ci { 17662306a36Sopenharmony_ci /* Acer Aspire 5710 */ 17762306a36Sopenharmony_ci .matches = { 17862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 17962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"), 18062306a36Sopenharmony_ci }, 18162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 18262306a36Sopenharmony_ci }, 18362306a36Sopenharmony_ci { 18462306a36Sopenharmony_ci /* Acer Aspire 7738 */ 18562306a36Sopenharmony_ci .matches = { 18662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 18762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"), 18862306a36Sopenharmony_ci }, 18962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 19062306a36Sopenharmony_ci }, 19162306a36Sopenharmony_ci { 19262306a36Sopenharmony_ci /* Acer Aspire 5536 */ 19362306a36Sopenharmony_ci .matches = { 19462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 19562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), 19662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), 19762306a36Sopenharmony_ci }, 19862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 19962306a36Sopenharmony_ci }, 20062306a36Sopenharmony_ci { 20162306a36Sopenharmony_ci /* 20262306a36Sopenharmony_ci * Acer Aspire 5738z 20362306a36Sopenharmony_ci * Touchpad stops working in mux mode when dis- + re-enabled 20462306a36Sopenharmony_ci * with the touchpad enable/disable toggle hotkey 20562306a36Sopenharmony_ci */ 20662306a36Sopenharmony_ci .matches = { 20762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 20862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"), 20962306a36Sopenharmony_ci }, 21062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 21162306a36Sopenharmony_ci }, 21262306a36Sopenharmony_ci { 21362306a36Sopenharmony_ci /* Acer Aspire One 150 */ 21462306a36Sopenharmony_ci .matches = { 21562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 21662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"), 21762306a36Sopenharmony_ci }, 21862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 21962306a36Sopenharmony_ci }, 22062306a36Sopenharmony_ci { 22162306a36Sopenharmony_ci /* Acer Aspire One 532h */ 22262306a36Sopenharmony_ci .matches = { 22362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 22462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AO532h"), 22562306a36Sopenharmony_ci }, 22662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 22762306a36Sopenharmony_ci }, 22862306a36Sopenharmony_ci { 22962306a36Sopenharmony_ci .matches = { 23062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 23162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"), 23262306a36Sopenharmony_ci }, 23362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 23462306a36Sopenharmony_ci }, 23562306a36Sopenharmony_ci { 23662306a36Sopenharmony_ci .matches = { 23762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 23862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"), 23962306a36Sopenharmony_ci }, 24062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 24162306a36Sopenharmony_ci }, 24262306a36Sopenharmony_ci { 24362306a36Sopenharmony_ci .matches = { 24462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 24562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"), 24662306a36Sopenharmony_ci }, 24762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 24862306a36Sopenharmony_ci }, 24962306a36Sopenharmony_ci { 25062306a36Sopenharmony_ci .matches = { 25162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 25262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"), 25362306a36Sopenharmony_ci }, 25462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 25562306a36Sopenharmony_ci }, 25662306a36Sopenharmony_ci { 25762306a36Sopenharmony_ci .matches = { 25862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 25962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"), 26062306a36Sopenharmony_ci }, 26162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 26262306a36Sopenharmony_ci }, 26362306a36Sopenharmony_ci { 26462306a36Sopenharmony_ci .matches = { 26562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 26662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"), 26762306a36Sopenharmony_ci }, 26862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 26962306a36Sopenharmony_ci }, 27062306a36Sopenharmony_ci { 27162306a36Sopenharmony_ci .matches = { 27262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 27362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"), 27462306a36Sopenharmony_ci }, 27562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 27662306a36Sopenharmony_ci }, 27762306a36Sopenharmony_ci /* 27862306a36Sopenharmony_ci * Some Wistron based laptops need us to explicitly enable the 'Dritek 27962306a36Sopenharmony_ci * keyboard extension' to make their extra keys start generating scancodes. 28062306a36Sopenharmony_ci * Originally, this was just confined to older laptops, but a few Acer laptops 28162306a36Sopenharmony_ci * have turned up in 2007 that also need this again. 28262306a36Sopenharmony_ci */ 28362306a36Sopenharmony_ci { 28462306a36Sopenharmony_ci /* Acer Aspire 5100 */ 28562306a36Sopenharmony_ci .matches = { 28662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 28762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), 28862306a36Sopenharmony_ci }, 28962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 29062306a36Sopenharmony_ci }, 29162306a36Sopenharmony_ci { 29262306a36Sopenharmony_ci /* Acer Aspire 5610 */ 29362306a36Sopenharmony_ci .matches = { 29462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 29562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), 29662306a36Sopenharmony_ci }, 29762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 29862306a36Sopenharmony_ci }, 29962306a36Sopenharmony_ci { 30062306a36Sopenharmony_ci /* Acer Aspire 5630 */ 30162306a36Sopenharmony_ci .matches = { 30262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 30362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"), 30462306a36Sopenharmony_ci }, 30562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 30662306a36Sopenharmony_ci }, 30762306a36Sopenharmony_ci { 30862306a36Sopenharmony_ci /* Acer Aspire 5650 */ 30962306a36Sopenharmony_ci .matches = { 31062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 31162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"), 31262306a36Sopenharmony_ci }, 31362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 31462306a36Sopenharmony_ci }, 31562306a36Sopenharmony_ci { 31662306a36Sopenharmony_ci /* Acer Aspire 5680 */ 31762306a36Sopenharmony_ci .matches = { 31862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 31962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"), 32062306a36Sopenharmony_ci }, 32162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 32262306a36Sopenharmony_ci }, 32362306a36Sopenharmony_ci { 32462306a36Sopenharmony_ci /* Acer Aspire 5720 */ 32562306a36Sopenharmony_ci .matches = { 32662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 32762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), 32862306a36Sopenharmony_ci }, 32962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 33062306a36Sopenharmony_ci }, 33162306a36Sopenharmony_ci { 33262306a36Sopenharmony_ci /* Acer Aspire 9110 */ 33362306a36Sopenharmony_ci .matches = { 33462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 33562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"), 33662306a36Sopenharmony_ci }, 33762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 33862306a36Sopenharmony_ci }, 33962306a36Sopenharmony_ci { 34062306a36Sopenharmony_ci /* Acer TravelMate 660 */ 34162306a36Sopenharmony_ci .matches = { 34262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 34362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), 34462306a36Sopenharmony_ci }, 34562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 34662306a36Sopenharmony_ci }, 34762306a36Sopenharmony_ci { 34862306a36Sopenharmony_ci /* Acer TravelMate 2490 */ 34962306a36Sopenharmony_ci .matches = { 35062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 35162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), 35262306a36Sopenharmony_ci }, 35362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 35462306a36Sopenharmony_ci }, 35562306a36Sopenharmony_ci { 35662306a36Sopenharmony_ci /* Acer TravelMate 4280 */ 35762306a36Sopenharmony_ci .matches = { 35862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 35962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), 36062306a36Sopenharmony_ci }, 36162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_DRITEK) 36262306a36Sopenharmony_ci }, 36362306a36Sopenharmony_ci { 36462306a36Sopenharmony_ci /* Acer TravelMate P459-G2-M */ 36562306a36Sopenharmony_ci .matches = { 36662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 36762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate P459-G2-M"), 36862306a36Sopenharmony_ci }, 36962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 37062306a36Sopenharmony_ci }, 37162306a36Sopenharmony_ci { 37262306a36Sopenharmony_ci /* Amoi M636/A737 */ 37362306a36Sopenharmony_ci .matches = { 37462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), 37562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), 37662306a36Sopenharmony_ci }, 37762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 37862306a36Sopenharmony_ci }, 37962306a36Sopenharmony_ci { 38062306a36Sopenharmony_ci .matches = { 38162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"), 38262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"), 38362306a36Sopenharmony_ci }, 38462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 38562306a36Sopenharmony_ci }, 38662306a36Sopenharmony_ci { 38762306a36Sopenharmony_ci /* Compal HEL80I */ 38862306a36Sopenharmony_ci .matches = { 38962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), 39062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), 39162306a36Sopenharmony_ci }, 39262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 39362306a36Sopenharmony_ci }, 39462306a36Sopenharmony_ci { 39562306a36Sopenharmony_ci .matches = { 39662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 39762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"), 39862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "8500"), 39962306a36Sopenharmony_ci }, 40062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 40162306a36Sopenharmony_ci }, 40262306a36Sopenharmony_ci { 40362306a36Sopenharmony_ci .matches = { 40462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 40562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"), 40662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"), 40762306a36Sopenharmony_ci }, 40862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 40962306a36Sopenharmony_ci }, 41062306a36Sopenharmony_ci { 41162306a36Sopenharmony_ci /* Advent 4211 */ 41262306a36Sopenharmony_ci .matches = { 41362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"), 41462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"), 41562306a36Sopenharmony_ci }, 41662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 41762306a36Sopenharmony_ci }, 41862306a36Sopenharmony_ci { 41962306a36Sopenharmony_ci /* Dell Embedded Box PC 3000 */ 42062306a36Sopenharmony_ci .matches = { 42162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 42262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"), 42362306a36Sopenharmony_ci }, 42462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 42562306a36Sopenharmony_ci }, 42662306a36Sopenharmony_ci { 42762306a36Sopenharmony_ci /* Dell XPS M1530 */ 42862306a36Sopenharmony_ci .matches = { 42962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 43062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), 43162306a36Sopenharmony_ci }, 43262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 43362306a36Sopenharmony_ci }, 43462306a36Sopenharmony_ci { 43562306a36Sopenharmony_ci /* Dell Vostro 1510 */ 43662306a36Sopenharmony_ci .matches = { 43762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 43862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), 43962306a36Sopenharmony_ci }, 44062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 44162306a36Sopenharmony_ci }, 44262306a36Sopenharmony_ci { 44362306a36Sopenharmony_ci /* Dell Vostro V13 */ 44462306a36Sopenharmony_ci .matches = { 44562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 44662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), 44762306a36Sopenharmony_ci }, 44862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT) 44962306a36Sopenharmony_ci }, 45062306a36Sopenharmony_ci { 45162306a36Sopenharmony_ci /* Dell Vostro 1320 */ 45262306a36Sopenharmony_ci .matches = { 45362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 45462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"), 45562306a36Sopenharmony_ci }, 45662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 45762306a36Sopenharmony_ci }, 45862306a36Sopenharmony_ci { 45962306a36Sopenharmony_ci /* Dell Vostro 1520 */ 46062306a36Sopenharmony_ci .matches = { 46162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 46262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"), 46362306a36Sopenharmony_ci }, 46462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 46562306a36Sopenharmony_ci }, 46662306a36Sopenharmony_ci { 46762306a36Sopenharmony_ci /* Dell Vostro 1720 */ 46862306a36Sopenharmony_ci .matches = { 46962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 47062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), 47162306a36Sopenharmony_ci }, 47262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 47362306a36Sopenharmony_ci }, 47462306a36Sopenharmony_ci { 47562306a36Sopenharmony_ci /* Entroware Proteus */ 47662306a36Sopenharmony_ci .matches = { 47762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Entroware"), 47862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"), 47962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"), 48062306a36Sopenharmony_ci }, 48162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS) 48262306a36Sopenharmony_ci }, 48362306a36Sopenharmony_ci /* 48462306a36Sopenharmony_ci * Some Fujitsu notebooks are having trouble with touchpads if 48562306a36Sopenharmony_ci * active multiplexing mode is activated. Luckily they don't have 48662306a36Sopenharmony_ci * external PS/2 ports so we can safely disable it. 48762306a36Sopenharmony_ci * ... apparently some Toshibas don't like MUX mode either and 48862306a36Sopenharmony_ci * die horrible death on reboot. 48962306a36Sopenharmony_ci */ 49062306a36Sopenharmony_ci { 49162306a36Sopenharmony_ci /* Fujitsu Lifebook P7010/P7010D */ 49262306a36Sopenharmony_ci .matches = { 49362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 49462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), 49562306a36Sopenharmony_ci }, 49662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 49762306a36Sopenharmony_ci }, 49862306a36Sopenharmony_ci { 49962306a36Sopenharmony_ci /* Fujitsu Lifebook P5020D */ 50062306a36Sopenharmony_ci .matches = { 50162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 50262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), 50362306a36Sopenharmony_ci }, 50462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 50562306a36Sopenharmony_ci }, 50662306a36Sopenharmony_ci { 50762306a36Sopenharmony_ci /* Fujitsu Lifebook S2000 */ 50862306a36Sopenharmony_ci .matches = { 50962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 51062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), 51162306a36Sopenharmony_ci }, 51262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 51362306a36Sopenharmony_ci }, 51462306a36Sopenharmony_ci { 51562306a36Sopenharmony_ci /* Fujitsu Lifebook S6230 */ 51662306a36Sopenharmony_ci .matches = { 51762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 51862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), 51962306a36Sopenharmony_ci }, 52062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 52162306a36Sopenharmony_ci }, 52262306a36Sopenharmony_ci { 52362306a36Sopenharmony_ci /* Fujitsu Lifebook T725 laptop */ 52462306a36Sopenharmony_ci .matches = { 52562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 52662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"), 52762306a36Sopenharmony_ci }, 52862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT) 52962306a36Sopenharmony_ci }, 53062306a36Sopenharmony_ci { 53162306a36Sopenharmony_ci /* Fujitsu Lifebook U745 */ 53262306a36Sopenharmony_ci .matches = { 53362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 53462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"), 53562306a36Sopenharmony_ci }, 53662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 53762306a36Sopenharmony_ci }, 53862306a36Sopenharmony_ci { 53962306a36Sopenharmony_ci /* Fujitsu T70H */ 54062306a36Sopenharmony_ci .matches = { 54162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 54262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), 54362306a36Sopenharmony_ci }, 54462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 54562306a36Sopenharmony_ci }, 54662306a36Sopenharmony_ci { 54762306a36Sopenharmony_ci /* Fujitsu A544 laptop */ 54862306a36Sopenharmony_ci /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ 54962306a36Sopenharmony_ci .matches = { 55062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 55162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"), 55262306a36Sopenharmony_ci }, 55362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 55462306a36Sopenharmony_ci }, 55562306a36Sopenharmony_ci { 55662306a36Sopenharmony_ci /* Fujitsu AH544 laptop */ 55762306a36Sopenharmony_ci /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ 55862306a36Sopenharmony_ci .matches = { 55962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 56062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), 56162306a36Sopenharmony_ci }, 56262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 56362306a36Sopenharmony_ci }, 56462306a36Sopenharmony_ci { 56562306a36Sopenharmony_ci /* Fujitsu U574 laptop */ 56662306a36Sopenharmony_ci /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ 56762306a36Sopenharmony_ci .matches = { 56862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 56962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"), 57062306a36Sopenharmony_ci }, 57162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 57262306a36Sopenharmony_ci }, 57362306a36Sopenharmony_ci { 57462306a36Sopenharmony_ci /* Fujitsu UH554 laptop */ 57562306a36Sopenharmony_ci .matches = { 57662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 57762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"), 57862306a36Sopenharmony_ci }, 57962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT) 58062306a36Sopenharmony_ci }, 58162306a36Sopenharmony_ci { 58262306a36Sopenharmony_ci /* Fujitsu Lifebook P7010 */ 58362306a36Sopenharmony_ci .matches = { 58462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 58562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), 58662306a36Sopenharmony_ci }, 58762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 58862306a36Sopenharmony_ci }, 58962306a36Sopenharmony_ci { 59062306a36Sopenharmony_ci /* Fujitsu-Siemens Lifebook T3010 */ 59162306a36Sopenharmony_ci .matches = { 59262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 59362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), 59462306a36Sopenharmony_ci }, 59562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 59662306a36Sopenharmony_ci }, 59762306a36Sopenharmony_ci { 59862306a36Sopenharmony_ci /* Fujitsu-Siemens Lifebook E4010 */ 59962306a36Sopenharmony_ci .matches = { 60062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 60162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), 60262306a36Sopenharmony_ci }, 60362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 60462306a36Sopenharmony_ci }, 60562306a36Sopenharmony_ci { 60662306a36Sopenharmony_ci /* Fujitsu-Siemens Amilo Pro 2010 */ 60762306a36Sopenharmony_ci .matches = { 60862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 60962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), 61062306a36Sopenharmony_ci }, 61162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 61262306a36Sopenharmony_ci }, 61362306a36Sopenharmony_ci { 61462306a36Sopenharmony_ci /* Fujitsu-Siemens Amilo Pro 2030 */ 61562306a36Sopenharmony_ci .matches = { 61662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 61762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), 61862306a36Sopenharmony_ci }, 61962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 62062306a36Sopenharmony_ci }, 62162306a36Sopenharmony_ci { 62262306a36Sopenharmony_ci /* Fujitsu Lifebook A574/H */ 62362306a36Sopenharmony_ci .matches = { 62462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 62562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "FMVA0501PZ"), 62662306a36Sopenharmony_ci }, 62762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 62862306a36Sopenharmony_ci }, 62962306a36Sopenharmony_ci { 63062306a36Sopenharmony_ci /* Fujitsu Lifebook E5411 */ 63162306a36Sopenharmony_ci .matches = { 63262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU CLIENT COMPUTING LIMITED"), 63362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E5411"), 63462306a36Sopenharmony_ci }, 63562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 63662306a36Sopenharmony_ci }, 63762306a36Sopenharmony_ci { 63862306a36Sopenharmony_ci /* Fujitsu Lifebook U728 */ 63962306a36Sopenharmony_ci .matches = { 64062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 64162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U728"), 64262306a36Sopenharmony_ci }, 64362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 64462306a36Sopenharmony_ci }, 64562306a36Sopenharmony_ci { 64662306a36Sopenharmony_ci /* Gigabyte M912 */ 64762306a36Sopenharmony_ci .matches = { 64862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 64962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "M912"), 65062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "01"), 65162306a36Sopenharmony_ci }, 65262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 65362306a36Sopenharmony_ci }, 65462306a36Sopenharmony_ci { 65562306a36Sopenharmony_ci /* Gigabyte Spring Peak - defines wrong chassis type */ 65662306a36Sopenharmony_ci .matches = { 65762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 65862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"), 65962306a36Sopenharmony_ci }, 66062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 66162306a36Sopenharmony_ci }, 66262306a36Sopenharmony_ci { 66362306a36Sopenharmony_ci /* Gigabyte T1005 - defines wrong chassis type ("Other") */ 66462306a36Sopenharmony_ci .matches = { 66562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 66662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "T1005"), 66762306a36Sopenharmony_ci }, 66862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 66962306a36Sopenharmony_ci }, 67062306a36Sopenharmony_ci { 67162306a36Sopenharmony_ci /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */ 67262306a36Sopenharmony_ci .matches = { 67362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 67462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"), 67562306a36Sopenharmony_ci }, 67662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 67762306a36Sopenharmony_ci }, 67862306a36Sopenharmony_ci /* 67962306a36Sopenharmony_ci * Some laptops need keyboard reset before probing for the trackpad to get 68062306a36Sopenharmony_ci * it detected, initialised & finally work. 68162306a36Sopenharmony_ci */ 68262306a36Sopenharmony_ci { 68362306a36Sopenharmony_ci /* Gigabyte P35 v2 - Elantech touchpad */ 68462306a36Sopenharmony_ci .matches = { 68562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 68662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), 68762306a36Sopenharmony_ci }, 68862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 68962306a36Sopenharmony_ci }, 69062306a36Sopenharmony_ci { 69162306a36Sopenharmony_ci /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ 69262306a36Sopenharmony_ci .matches = { 69362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 69462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "X3"), 69562306a36Sopenharmony_ci }, 69662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 69762306a36Sopenharmony_ci }, 69862306a36Sopenharmony_ci { 69962306a36Sopenharmony_ci /* Gigabyte P34 - Elantech touchpad */ 70062306a36Sopenharmony_ci .matches = { 70162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 70262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P34"), 70362306a36Sopenharmony_ci }, 70462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 70562306a36Sopenharmony_ci }, 70662306a36Sopenharmony_ci { 70762306a36Sopenharmony_ci /* Gigabyte P57 - Elantech touchpad */ 70862306a36Sopenharmony_ci .matches = { 70962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 71062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P57"), 71162306a36Sopenharmony_ci }, 71262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 71362306a36Sopenharmony_ci }, 71462306a36Sopenharmony_ci { 71562306a36Sopenharmony_ci /* Gericom Bellagio */ 71662306a36Sopenharmony_ci .matches = { 71762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), 71862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), 71962306a36Sopenharmony_ci }, 72062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 72162306a36Sopenharmony_ci }, 72262306a36Sopenharmony_ci { 72362306a36Sopenharmony_ci /* Gigabyte M1022M netbook */ 72462306a36Sopenharmony_ci .matches = { 72562306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."), 72662306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "M1022E"), 72762306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "1.02"), 72862306a36Sopenharmony_ci }, 72962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 73062306a36Sopenharmony_ci }, 73162306a36Sopenharmony_ci { 73262306a36Sopenharmony_ci .matches = { 73362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 73462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), 73562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), 73662306a36Sopenharmony_ci }, 73762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 73862306a36Sopenharmony_ci }, 73962306a36Sopenharmony_ci { 74062306a36Sopenharmony_ci /* 74162306a36Sopenharmony_ci * HP Pavilion DV4017EA - 74262306a36Sopenharmony_ci * errors on MUX ports are reported without raising AUXDATA 74362306a36Sopenharmony_ci * causing "spurious NAK" messages. 74462306a36Sopenharmony_ci */ 74562306a36Sopenharmony_ci .matches = { 74662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 74762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), 74862306a36Sopenharmony_ci }, 74962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 75062306a36Sopenharmony_ci }, 75162306a36Sopenharmony_ci { 75262306a36Sopenharmony_ci /* 75362306a36Sopenharmony_ci * HP Pavilion ZT1000 - 75462306a36Sopenharmony_ci * like DV4017EA does not raise AUXERR for errors on MUX ports. 75562306a36Sopenharmony_ci */ 75662306a36Sopenharmony_ci .matches = { 75762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 75862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), 75962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), 76062306a36Sopenharmony_ci }, 76162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 76262306a36Sopenharmony_ci }, 76362306a36Sopenharmony_ci { 76462306a36Sopenharmony_ci /* 76562306a36Sopenharmony_ci * HP Pavilion DV4270ca - 76662306a36Sopenharmony_ci * like DV4017EA does not raise AUXERR for errors on MUX ports. 76762306a36Sopenharmony_ci */ 76862306a36Sopenharmony_ci .matches = { 76962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 77062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), 77162306a36Sopenharmony_ci }, 77262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 77362306a36Sopenharmony_ci }, 77462306a36Sopenharmony_ci { 77562306a36Sopenharmony_ci /* Newer HP Pavilion dv4 models */ 77662306a36Sopenharmony_ci .matches = { 77762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 77862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), 77962306a36Sopenharmony_ci }, 78062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT) 78162306a36Sopenharmony_ci }, 78262306a36Sopenharmony_ci { 78362306a36Sopenharmony_ci /* IBM 2656 */ 78462306a36Sopenharmony_ci .matches = { 78562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "IBM"), 78662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "2656"), 78762306a36Sopenharmony_ci }, 78862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 78962306a36Sopenharmony_ci }, 79062306a36Sopenharmony_ci { 79162306a36Sopenharmony_ci /* Avatar AVIU-145A6 */ 79262306a36Sopenharmony_ci .matches = { 79362306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Intel"), 79462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), 79562306a36Sopenharmony_ci }, 79662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 79762306a36Sopenharmony_ci }, 79862306a36Sopenharmony_ci { 79962306a36Sopenharmony_ci /* Intel MBO Desktop D845PESV */ 80062306a36Sopenharmony_ci .matches = { 80162306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), 80262306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "D845PESV"), 80362306a36Sopenharmony_ci }, 80462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOPNP) 80562306a36Sopenharmony_ci }, 80662306a36Sopenharmony_ci { 80762306a36Sopenharmony_ci /* 80862306a36Sopenharmony_ci * Intel NUC D54250WYK - does not have i8042 controller but 80962306a36Sopenharmony_ci * declares PS/2 devices in DSDT. 81062306a36Sopenharmony_ci */ 81162306a36Sopenharmony_ci .matches = { 81262306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), 81362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"), 81462306a36Sopenharmony_ci }, 81562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOPNP) 81662306a36Sopenharmony_ci }, 81762306a36Sopenharmony_ci { 81862306a36Sopenharmony_ci /* Lenovo 3000 n100 */ 81962306a36Sopenharmony_ci .matches = { 82062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 82162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), 82262306a36Sopenharmony_ci }, 82362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 82462306a36Sopenharmony_ci }, 82562306a36Sopenharmony_ci { 82662306a36Sopenharmony_ci /* Lenovo XiaoXin Air 12 */ 82762306a36Sopenharmony_ci .matches = { 82862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 82962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "80UN"), 83062306a36Sopenharmony_ci }, 83162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 83262306a36Sopenharmony_ci }, 83362306a36Sopenharmony_ci { 83462306a36Sopenharmony_ci /* Lenovo LaVie Z */ 83562306a36Sopenharmony_ci .matches = { 83662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 83762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"), 83862306a36Sopenharmony_ci }, 83962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 84062306a36Sopenharmony_ci }, 84162306a36Sopenharmony_ci { 84262306a36Sopenharmony_ci /* Lenovo Ideapad U455 */ 84362306a36Sopenharmony_ci .matches = { 84462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 84562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "20046"), 84662306a36Sopenharmony_ci }, 84762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 84862306a36Sopenharmony_ci }, 84962306a36Sopenharmony_ci { 85062306a36Sopenharmony_ci /* Lenovo ThinkPad L460 */ 85162306a36Sopenharmony_ci .matches = { 85262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 85362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"), 85462306a36Sopenharmony_ci }, 85562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 85662306a36Sopenharmony_ci }, 85762306a36Sopenharmony_ci { 85862306a36Sopenharmony_ci /* Lenovo ThinkPad Twist S230u */ 85962306a36Sopenharmony_ci .matches = { 86062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 86162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"), 86262306a36Sopenharmony_ci }, 86362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 86462306a36Sopenharmony_ci }, 86562306a36Sopenharmony_ci { 86662306a36Sopenharmony_ci /* LG Electronics X110 */ 86762306a36Sopenharmony_ci .matches = { 86862306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."), 86962306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "X110"), 87062306a36Sopenharmony_ci }, 87162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 87262306a36Sopenharmony_ci }, 87362306a36Sopenharmony_ci { 87462306a36Sopenharmony_ci /* Medion Akoya Mini E1210 */ 87562306a36Sopenharmony_ci .matches = { 87662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), 87762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "E1210"), 87862306a36Sopenharmony_ci }, 87962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 88062306a36Sopenharmony_ci }, 88162306a36Sopenharmony_ci { 88262306a36Sopenharmony_ci /* Medion Akoya E1222 */ 88362306a36Sopenharmony_ci .matches = { 88462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), 88562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), 88662306a36Sopenharmony_ci }, 88762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 88862306a36Sopenharmony_ci }, 88962306a36Sopenharmony_ci { 89062306a36Sopenharmony_ci /* MSI Wind U-100 */ 89162306a36Sopenharmony_ci .matches = { 89262306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), 89362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "U-100"), 89462306a36Sopenharmony_ci }, 89562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOPNP) 89662306a36Sopenharmony_ci }, 89762306a36Sopenharmony_ci { 89862306a36Sopenharmony_ci /* 89962306a36Sopenharmony_ci * No data is coming from the touchscreen unless KBC 90062306a36Sopenharmony_ci * is in legacy mode. 90162306a36Sopenharmony_ci */ 90262306a36Sopenharmony_ci /* Panasonic CF-29 */ 90362306a36Sopenharmony_ci .matches = { 90462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), 90562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), 90662306a36Sopenharmony_ci }, 90762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 90862306a36Sopenharmony_ci }, 90962306a36Sopenharmony_ci { 91062306a36Sopenharmony_ci /* Medion Akoya E7225 */ 91162306a36Sopenharmony_ci .matches = { 91262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Medion"), 91362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"), 91462306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"), 91562306a36Sopenharmony_ci }, 91662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 91762306a36Sopenharmony_ci }, 91862306a36Sopenharmony_ci { 91962306a36Sopenharmony_ci /* Microsoft Virtual Machine */ 92062306a36Sopenharmony_ci .matches = { 92162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), 92262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), 92362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), 92462306a36Sopenharmony_ci }, 92562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 92662306a36Sopenharmony_ci }, 92762306a36Sopenharmony_ci { 92862306a36Sopenharmony_ci /* Medion MAM 2070 */ 92962306a36Sopenharmony_ci .matches = { 93062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 93162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"), 93262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 93362306a36Sopenharmony_ci }, 93462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 93562306a36Sopenharmony_ci }, 93662306a36Sopenharmony_ci { 93762306a36Sopenharmony_ci /* TUXEDO BU1406 */ 93862306a36Sopenharmony_ci .matches = { 93962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 94062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), 94162306a36Sopenharmony_ci }, 94262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 94362306a36Sopenharmony_ci }, 94462306a36Sopenharmony_ci { 94562306a36Sopenharmony_ci /* OQO Model 01 */ 94662306a36Sopenharmony_ci .matches = { 94762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "OQO"), 94862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), 94962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "00"), 95062306a36Sopenharmony_ci }, 95162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 95262306a36Sopenharmony_ci }, 95362306a36Sopenharmony_ci { 95462306a36Sopenharmony_ci .matches = { 95562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"), 95662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "C15B"), 95762306a36Sopenharmony_ci }, 95862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 95962306a36Sopenharmony_ci }, 96062306a36Sopenharmony_ci { 96162306a36Sopenharmony_ci /* Acer Aspire 5 A515 */ 96262306a36Sopenharmony_ci .matches = { 96362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "PK"), 96462306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"), 96562306a36Sopenharmony_ci }, 96662306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOPNP) 96762306a36Sopenharmony_ci }, 96862306a36Sopenharmony_ci { 96962306a36Sopenharmony_ci /* ULI EV4873 - AUX LOOP does not work properly */ 97062306a36Sopenharmony_ci .matches = { 97162306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "ULI"), 97262306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"), 97362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 97462306a36Sopenharmony_ci }, 97562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 97662306a36Sopenharmony_ci }, 97762306a36Sopenharmony_ci { 97862306a36Sopenharmony_ci /* 97962306a36Sopenharmony_ci * Arima-Rioworks HDAMB - 98062306a36Sopenharmony_ci * AUX LOOP command does not raise AUX IRQ 98162306a36Sopenharmony_ci */ 98262306a36Sopenharmony_ci .matches = { 98362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"), 98462306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "HDAMB"), 98562306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VERSION, "Rev E"), 98662306a36Sopenharmony_ci }, 98762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 98862306a36Sopenharmony_ci }, 98962306a36Sopenharmony_ci { 99062306a36Sopenharmony_ci /* Sharp Actius MM20 */ 99162306a36Sopenharmony_ci .matches = { 99262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), 99362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), 99462306a36Sopenharmony_ci }, 99562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 99662306a36Sopenharmony_ci }, 99762306a36Sopenharmony_ci { 99862306a36Sopenharmony_ci /* 99962306a36Sopenharmony_ci * Sony Vaio FZ-240E - 100062306a36Sopenharmony_ci * reset and GET ID commands issued via KBD port are 100162306a36Sopenharmony_ci * sometimes being delivered to AUX3. 100262306a36Sopenharmony_ci */ 100362306a36Sopenharmony_ci .matches = { 100462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 100562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), 100662306a36Sopenharmony_ci }, 100762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 100862306a36Sopenharmony_ci }, 100962306a36Sopenharmony_ci { 101062306a36Sopenharmony_ci /* 101162306a36Sopenharmony_ci * Most (all?) VAIOs do not have external PS/2 ports nor 101262306a36Sopenharmony_ci * they implement active multiplexing properly, and 101362306a36Sopenharmony_ci * MUX discovery usually messes up keyboard/touchpad. 101462306a36Sopenharmony_ci */ 101562306a36Sopenharmony_ci .matches = { 101662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 101762306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "VAIO"), 101862306a36Sopenharmony_ci }, 101962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 102062306a36Sopenharmony_ci }, 102162306a36Sopenharmony_ci { 102262306a36Sopenharmony_ci /* Sony Vaio FS-115b */ 102362306a36Sopenharmony_ci .matches = { 102462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 102562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), 102662306a36Sopenharmony_ci }, 102762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 102862306a36Sopenharmony_ci }, 102962306a36Sopenharmony_ci { 103062306a36Sopenharmony_ci /* 103162306a36Sopenharmony_ci * Sony Vaio VGN-CS series require MUX or the touch sensor 103262306a36Sopenharmony_ci * buttons will disturb touchpad operation 103362306a36Sopenharmony_ci */ 103462306a36Sopenharmony_ci .matches = { 103562306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 103662306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"), 103762306a36Sopenharmony_ci }, 103862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_FORCEMUX) 103962306a36Sopenharmony_ci }, 104062306a36Sopenharmony_ci { 104162306a36Sopenharmony_ci .matches = { 104262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 104362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), 104462306a36Sopenharmony_ci }, 104562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 104662306a36Sopenharmony_ci }, 104762306a36Sopenharmony_ci { 104862306a36Sopenharmony_ci .matches = { 104962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 105062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), 105162306a36Sopenharmony_ci }, 105262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 105362306a36Sopenharmony_ci }, 105462306a36Sopenharmony_ci { 105562306a36Sopenharmony_ci .matches = { 105662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 105762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), 105862306a36Sopenharmony_ci }, 105962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX) 106062306a36Sopenharmony_ci }, 106162306a36Sopenharmony_ci /* 106262306a36Sopenharmony_ci * A lot of modern Clevo barebones have touchpad and/or keyboard issues 106362306a36Sopenharmony_ci * after suspend fixable with nomux + reset + noloop + nopnp. Luckily, 106462306a36Sopenharmony_ci * none of them have an external PS/2 port so this can safely be set for 106562306a36Sopenharmony_ci * all of them. These two are based on a Clevo design, but have the 106662306a36Sopenharmony_ci * board_name changed. 106762306a36Sopenharmony_ci */ 106862306a36Sopenharmony_ci { 106962306a36Sopenharmony_ci .matches = { 107062306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"), 107162306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "AURA1501"), 107262306a36Sopenharmony_ci }, 107362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 107462306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 107562306a36Sopenharmony_ci }, 107662306a36Sopenharmony_ci { 107762306a36Sopenharmony_ci .matches = { 107862306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"), 107962306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"), 108062306a36Sopenharmony_ci }, 108162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 108262306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 108362306a36Sopenharmony_ci }, 108462306a36Sopenharmony_ci { 108562306a36Sopenharmony_ci /* Mivvy M310 */ 108662306a36Sopenharmony_ci .matches = { 108762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), 108862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "N10"), 108962306a36Sopenharmony_ci }, 109062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS) 109162306a36Sopenharmony_ci }, 109262306a36Sopenharmony_ci /* 109362306a36Sopenharmony_ci * Some laptops need keyboard reset before probing for the trackpad to get 109462306a36Sopenharmony_ci * it detected, initialised & finally work. 109562306a36Sopenharmony_ci */ 109662306a36Sopenharmony_ci { 109762306a36Sopenharmony_ci /* Schenker XMG C504 - Elantech touchpad */ 109862306a36Sopenharmony_ci .matches = { 109962306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "XMG"), 110062306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "C504"), 110162306a36Sopenharmony_ci }, 110262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_KBDRESET) 110362306a36Sopenharmony_ci }, 110462306a36Sopenharmony_ci { 110562306a36Sopenharmony_ci /* Blue FB5601 */ 110662306a36Sopenharmony_ci .matches = { 110762306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "blue"), 110862306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"), 110962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), 111062306a36Sopenharmony_ci }, 111162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOLOOP) 111262306a36Sopenharmony_ci }, 111362306a36Sopenharmony_ci /* 111462306a36Sopenharmony_ci * A lot of modern Clevo barebones have touchpad and/or keyboard issues 111562306a36Sopenharmony_ci * after suspend fixable with nomux + reset + noloop + nopnp. Luckily, 111662306a36Sopenharmony_ci * none of them have an external PS/2 port so this can safely be set for 111762306a36Sopenharmony_ci * all of them. 111862306a36Sopenharmony_ci * Clevo barebones come with board_vendor and/or system_vendor set to 111962306a36Sopenharmony_ci * either the very generic string "Notebook" and/or a different value 112062306a36Sopenharmony_ci * for each individual reseller. The only somewhat universal way to 112162306a36Sopenharmony_ci * identify them is by board_name. 112262306a36Sopenharmony_ci */ 112362306a36Sopenharmony_ci { 112462306a36Sopenharmony_ci .matches = { 112562306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"), 112662306a36Sopenharmony_ci }, 112762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 112862306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 112962306a36Sopenharmony_ci }, 113062306a36Sopenharmony_ci { 113162306a36Sopenharmony_ci .matches = { 113262306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"), 113362306a36Sopenharmony_ci }, 113462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 113562306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 113662306a36Sopenharmony_ci }, 113762306a36Sopenharmony_ci { 113862306a36Sopenharmony_ci .matches = { 113962306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "N140CU"), 114062306a36Sopenharmony_ci }, 114162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 114262306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 114362306a36Sopenharmony_ci }, 114462306a36Sopenharmony_ci { 114562306a36Sopenharmony_ci .matches = { 114662306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "N141CU"), 114762306a36Sopenharmony_ci }, 114862306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 114962306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 115062306a36Sopenharmony_ci }, 115162306a36Sopenharmony_ci { 115262306a36Sopenharmony_ci /* 115362306a36Sopenharmony_ci * Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes 115462306a36Sopenharmony_ci * the keyboard very laggy for ~5 seconds after boot and 115562306a36Sopenharmony_ci * sometimes also after resume. 115662306a36Sopenharmony_ci * However both are required for the keyboard to not fail 115762306a36Sopenharmony_ci * completely sometimes after boot or resume. 115862306a36Sopenharmony_ci */ 115962306a36Sopenharmony_ci .matches = { 116062306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "N150CU"), 116162306a36Sopenharmony_ci }, 116262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 116362306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 116462306a36Sopenharmony_ci }, 116562306a36Sopenharmony_ci { 116662306a36Sopenharmony_ci .matches = { 116762306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"), 116862306a36Sopenharmony_ci }, 116962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 117062306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 117162306a36Sopenharmony_ci }, 117262306a36Sopenharmony_ci { 117362306a36Sopenharmony_ci /* 117462306a36Sopenharmony_ci * Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes 117562306a36Sopenharmony_ci * the keyboard very laggy for ~5 seconds after boot and 117662306a36Sopenharmony_ci * sometimes also after resume. 117762306a36Sopenharmony_ci * However both are required for the keyboard to not fail 117862306a36Sopenharmony_ci * completely sometimes after boot or resume. 117962306a36Sopenharmony_ci */ 118062306a36Sopenharmony_ci .matches = { 118162306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NHxxRZQ"), 118262306a36Sopenharmony_ci }, 118362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 118462306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 118562306a36Sopenharmony_ci }, 118662306a36Sopenharmony_ci { 118762306a36Sopenharmony_ci .matches = { 118862306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"), 118962306a36Sopenharmony_ci }, 119062306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 119162306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 119262306a36Sopenharmony_ci }, 119362306a36Sopenharmony_ci /* 119462306a36Sopenharmony_ci * At least one modern Clevo barebone has the touchpad connected both 119562306a36Sopenharmony_ci * via PS/2 and i2c interface. This causes a race condition between the 119662306a36Sopenharmony_ci * psmouse and i2c-hid driver. Since the full capability of the touchpad 119762306a36Sopenharmony_ci * is available via the i2c interface and the device has no external 119862306a36Sopenharmony_ci * PS/2 port, it is safe to just ignore all ps2 mouses here to avoid 119962306a36Sopenharmony_ci * this issue. The known affected device is the 120062306a36Sopenharmony_ci * TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU which comes with one of 120162306a36Sopenharmony_ci * the two different dmi strings below. NS50MU is not a typo! 120262306a36Sopenharmony_ci */ 120362306a36Sopenharmony_ci { 120462306a36Sopenharmony_ci .matches = { 120562306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NS50MU"), 120662306a36Sopenharmony_ci }, 120762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX | 120862306a36Sopenharmony_ci SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | 120962306a36Sopenharmony_ci SERIO_QUIRK_NOPNP) 121062306a36Sopenharmony_ci }, 121162306a36Sopenharmony_ci { 121262306a36Sopenharmony_ci .matches = { 121362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"), 121462306a36Sopenharmony_ci }, 121562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX | 121662306a36Sopenharmony_ci SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | 121762306a36Sopenharmony_ci SERIO_QUIRK_NOPNP) 121862306a36Sopenharmony_ci }, 121962306a36Sopenharmony_ci { 122062306a36Sopenharmony_ci .matches = { 122162306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NS5x_7xPU"), 122262306a36Sopenharmony_ci }, 122362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 122462306a36Sopenharmony_ci }, 122562306a36Sopenharmony_ci { 122662306a36Sopenharmony_ci .matches = { 122762306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"), 122862306a36Sopenharmony_ci }, 122962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 123062306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 123162306a36Sopenharmony_ci }, 123262306a36Sopenharmony_ci { 123362306a36Sopenharmony_ci /* 123462306a36Sopenharmony_ci * This is only a partial board_name and might be followed by 123562306a36Sopenharmony_ci * another letter or number. DMI_MATCH however does do partial 123662306a36Sopenharmony_ci * matching. 123762306a36Sopenharmony_ci */ 123862306a36Sopenharmony_ci .matches = { 123962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P65xH"), 124062306a36Sopenharmony_ci }, 124162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 124262306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 124362306a36Sopenharmony_ci }, 124462306a36Sopenharmony_ci { 124562306a36Sopenharmony_ci /* Clevo P650RS, 650RP6, Sager NP8152-S, and others */ 124662306a36Sopenharmony_ci .matches = { 124762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"), 124862306a36Sopenharmony_ci }, 124962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 125062306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 125162306a36Sopenharmony_ci }, 125262306a36Sopenharmony_ci { 125362306a36Sopenharmony_ci /* 125462306a36Sopenharmony_ci * This is only a partial board_name and might be followed by 125562306a36Sopenharmony_ci * another letter or number. DMI_MATCH however does do partial 125662306a36Sopenharmony_ci * matching. 125762306a36Sopenharmony_ci */ 125862306a36Sopenharmony_ci .matches = { 125962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P65_P67H"), 126062306a36Sopenharmony_ci }, 126162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 126262306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 126362306a36Sopenharmony_ci }, 126462306a36Sopenharmony_ci { 126562306a36Sopenharmony_ci /* 126662306a36Sopenharmony_ci * This is only a partial board_name and might be followed by 126762306a36Sopenharmony_ci * another letter or number. DMI_MATCH however does do partial 126862306a36Sopenharmony_ci * matching. 126962306a36Sopenharmony_ci */ 127062306a36Sopenharmony_ci .matches = { 127162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RP"), 127262306a36Sopenharmony_ci }, 127362306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 127462306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 127562306a36Sopenharmony_ci }, 127662306a36Sopenharmony_ci { 127762306a36Sopenharmony_ci /* 127862306a36Sopenharmony_ci * This is only a partial board_name and might be followed by 127962306a36Sopenharmony_ci * another letter or number. DMI_MATCH however does do partial 128062306a36Sopenharmony_ci * matching. 128162306a36Sopenharmony_ci */ 128262306a36Sopenharmony_ci .matches = { 128362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RS"), 128462306a36Sopenharmony_ci }, 128562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 128662306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 128762306a36Sopenharmony_ci }, 128862306a36Sopenharmony_ci { 128962306a36Sopenharmony_ci /* 129062306a36Sopenharmony_ci * This is only a partial board_name and might be followed by 129162306a36Sopenharmony_ci * another letter or number. DMI_MATCH however does do partial 129262306a36Sopenharmony_ci * matching. 129362306a36Sopenharmony_ci */ 129462306a36Sopenharmony_ci .matches = { 129562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "P67xRP"), 129662306a36Sopenharmony_ci }, 129762306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 129862306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 129962306a36Sopenharmony_ci }, 130062306a36Sopenharmony_ci { 130162306a36Sopenharmony_ci .matches = { 130262306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"), 130362306a36Sopenharmony_ci }, 130462306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 130562306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 130662306a36Sopenharmony_ci }, 130762306a36Sopenharmony_ci { 130862306a36Sopenharmony_ci .matches = { 130962306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "PCX0DX"), 131062306a36Sopenharmony_ci }, 131162306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 131262306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 131362306a36Sopenharmony_ci }, 131462306a36Sopenharmony_ci /* See comment on TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU above */ 131562306a36Sopenharmony_ci { 131662306a36Sopenharmony_ci .matches = { 131762306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "PD5x_7xPNP_PNR_PNN_PNT"), 131862306a36Sopenharmony_ci }, 131962306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOAUX) 132062306a36Sopenharmony_ci }, 132162306a36Sopenharmony_ci { 132262306a36Sopenharmony_ci .matches = { 132362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "X170SM"), 132462306a36Sopenharmony_ci }, 132562306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 132662306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 132762306a36Sopenharmony_ci }, 132862306a36Sopenharmony_ci { 132962306a36Sopenharmony_ci .matches = { 133062306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"), 133162306a36Sopenharmony_ci }, 133262306a36Sopenharmony_ci .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | 133362306a36Sopenharmony_ci SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) 133462306a36Sopenharmony_ci }, 133562306a36Sopenharmony_ci { } 133662306a36Sopenharmony_ci}; 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci#ifdef CONFIG_PNP 133962306a36Sopenharmony_cistatic const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = { 134062306a36Sopenharmony_ci { 134162306a36Sopenharmony_ci .matches = { 134262306a36Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ 134362306a36Sopenharmony_ci }, 134462306a36Sopenharmony_ci }, 134562306a36Sopenharmony_ci { 134662306a36Sopenharmony_ci .matches = { 134762306a36Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */ 134862306a36Sopenharmony_ci }, 134962306a36Sopenharmony_ci }, 135062306a36Sopenharmony_ci { 135162306a36Sopenharmony_ci .matches = { 135262306a36Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ 135362306a36Sopenharmony_ci }, 135462306a36Sopenharmony_ci }, 135562306a36Sopenharmony_ci { 135662306a36Sopenharmony_ci .matches = { 135762306a36Sopenharmony_ci DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */ 135862306a36Sopenharmony_ci }, 135962306a36Sopenharmony_ci }, 136062306a36Sopenharmony_ci { } 136162306a36Sopenharmony_ci}; 136262306a36Sopenharmony_ci#endif 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci#endif /* CONFIG_X86 */ 136562306a36Sopenharmony_ci 136662306a36Sopenharmony_ci#ifdef CONFIG_PNP 136762306a36Sopenharmony_ci#include <linux/pnp.h> 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_cistatic bool i8042_pnp_kbd_registered; 137062306a36Sopenharmony_cistatic unsigned int i8042_pnp_kbd_devices; 137162306a36Sopenharmony_cistatic bool i8042_pnp_aux_registered; 137262306a36Sopenharmony_cistatic unsigned int i8042_pnp_aux_devices; 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_cistatic int i8042_pnp_command_reg; 137562306a36Sopenharmony_cistatic int i8042_pnp_data_reg; 137662306a36Sopenharmony_cistatic int i8042_pnp_kbd_irq; 137762306a36Sopenharmony_cistatic int i8042_pnp_aux_irq; 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_cistatic char i8042_pnp_kbd_name[32]; 138062306a36Sopenharmony_cistatic char i8042_pnp_aux_name[32]; 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_cistatic void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size) 138362306a36Sopenharmony_ci{ 138462306a36Sopenharmony_ci strscpy(dst, "PNP:", dst_size); 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci while (id) { 138762306a36Sopenharmony_ci strlcat(dst, " ", dst_size); 138862306a36Sopenharmony_ci strlcat(dst, id->id, dst_size); 138962306a36Sopenharmony_ci id = id->next; 139062306a36Sopenharmony_ci } 139162306a36Sopenharmony_ci} 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_cistatic int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 139462306a36Sopenharmony_ci{ 139562306a36Sopenharmony_ci if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 139662306a36Sopenharmony_ci i8042_pnp_data_reg = pnp_port_start(dev,0); 139762306a36Sopenharmony_ci 139862306a36Sopenharmony_ci if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 139962306a36Sopenharmony_ci i8042_pnp_command_reg = pnp_port_start(dev, 1); 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci if (pnp_irq_valid(dev,0)) 140262306a36Sopenharmony_ci i8042_pnp_kbd_irq = pnp_irq(dev, 0); 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci strscpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name)); 140562306a36Sopenharmony_ci if (strlen(pnp_dev_name(dev))) { 140662306a36Sopenharmony_ci strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); 140762306a36Sopenharmony_ci strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); 140862306a36Sopenharmony_ci } 140962306a36Sopenharmony_ci i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id, 141062306a36Sopenharmony_ci sizeof(i8042_kbd_firmware_id)); 141162306a36Sopenharmony_ci i8042_kbd_fwnode = dev_fwnode(&dev->dev); 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci /* Keyboard ports are always supposed to be wakeup-enabled */ 141462306a36Sopenharmony_ci device_set_wakeup_enable(&dev->dev, true); 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci i8042_pnp_kbd_devices++; 141762306a36Sopenharmony_ci return 0; 141862306a36Sopenharmony_ci} 141962306a36Sopenharmony_ci 142062306a36Sopenharmony_cistatic int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 142162306a36Sopenharmony_ci{ 142262306a36Sopenharmony_ci if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 142362306a36Sopenharmony_ci i8042_pnp_data_reg = pnp_port_start(dev,0); 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 142662306a36Sopenharmony_ci i8042_pnp_command_reg = pnp_port_start(dev, 1); 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci if (pnp_irq_valid(dev, 0)) 142962306a36Sopenharmony_ci i8042_pnp_aux_irq = pnp_irq(dev, 0); 143062306a36Sopenharmony_ci 143162306a36Sopenharmony_ci strscpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name)); 143262306a36Sopenharmony_ci if (strlen(pnp_dev_name(dev))) { 143362306a36Sopenharmony_ci strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); 143462306a36Sopenharmony_ci strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); 143562306a36Sopenharmony_ci } 143662306a36Sopenharmony_ci i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id, 143762306a36Sopenharmony_ci sizeof(i8042_aux_firmware_id)); 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_ci i8042_pnp_aux_devices++; 144062306a36Sopenharmony_ci return 0; 144162306a36Sopenharmony_ci} 144262306a36Sopenharmony_ci 144362306a36Sopenharmony_cistatic const struct pnp_device_id pnp_kbd_devids[] = { 144462306a36Sopenharmony_ci { .id = "PNP0300", .driver_data = 0 }, 144562306a36Sopenharmony_ci { .id = "PNP0301", .driver_data = 0 }, 144662306a36Sopenharmony_ci { .id = "PNP0302", .driver_data = 0 }, 144762306a36Sopenharmony_ci { .id = "PNP0303", .driver_data = 0 }, 144862306a36Sopenharmony_ci { .id = "PNP0304", .driver_data = 0 }, 144962306a36Sopenharmony_ci { .id = "PNP0305", .driver_data = 0 }, 145062306a36Sopenharmony_ci { .id = "PNP0306", .driver_data = 0 }, 145162306a36Sopenharmony_ci { .id = "PNP0309", .driver_data = 0 }, 145262306a36Sopenharmony_ci { .id = "PNP030a", .driver_data = 0 }, 145362306a36Sopenharmony_ci { .id = "PNP030b", .driver_data = 0 }, 145462306a36Sopenharmony_ci { .id = "PNP0320", .driver_data = 0 }, 145562306a36Sopenharmony_ci { .id = "PNP0343", .driver_data = 0 }, 145662306a36Sopenharmony_ci { .id = "PNP0344", .driver_data = 0 }, 145762306a36Sopenharmony_ci { .id = "PNP0345", .driver_data = 0 }, 145862306a36Sopenharmony_ci { .id = "CPQA0D7", .driver_data = 0 }, 145962306a36Sopenharmony_ci { .id = "", }, 146062306a36Sopenharmony_ci}; 146162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(pnp, pnp_kbd_devids); 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_cistatic struct pnp_driver i8042_pnp_kbd_driver = { 146462306a36Sopenharmony_ci .name = "i8042 kbd", 146562306a36Sopenharmony_ci .id_table = pnp_kbd_devids, 146662306a36Sopenharmony_ci .probe = i8042_pnp_kbd_probe, 146762306a36Sopenharmony_ci .driver = { 146862306a36Sopenharmony_ci .probe_type = PROBE_FORCE_SYNCHRONOUS, 146962306a36Sopenharmony_ci .suppress_bind_attrs = true, 147062306a36Sopenharmony_ci }, 147162306a36Sopenharmony_ci}; 147262306a36Sopenharmony_ci 147362306a36Sopenharmony_cistatic const struct pnp_device_id pnp_aux_devids[] = { 147462306a36Sopenharmony_ci { .id = "AUI0200", .driver_data = 0 }, 147562306a36Sopenharmony_ci { .id = "FJC6000", .driver_data = 0 }, 147662306a36Sopenharmony_ci { .id = "FJC6001", .driver_data = 0 }, 147762306a36Sopenharmony_ci { .id = "PNP0f03", .driver_data = 0 }, 147862306a36Sopenharmony_ci { .id = "PNP0f0b", .driver_data = 0 }, 147962306a36Sopenharmony_ci { .id = "PNP0f0e", .driver_data = 0 }, 148062306a36Sopenharmony_ci { .id = "PNP0f12", .driver_data = 0 }, 148162306a36Sopenharmony_ci { .id = "PNP0f13", .driver_data = 0 }, 148262306a36Sopenharmony_ci { .id = "PNP0f19", .driver_data = 0 }, 148362306a36Sopenharmony_ci { .id = "PNP0f1c", .driver_data = 0 }, 148462306a36Sopenharmony_ci { .id = "SYN0801", .driver_data = 0 }, 148562306a36Sopenharmony_ci { .id = "", }, 148662306a36Sopenharmony_ci}; 148762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(pnp, pnp_aux_devids); 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_cistatic struct pnp_driver i8042_pnp_aux_driver = { 149062306a36Sopenharmony_ci .name = "i8042 aux", 149162306a36Sopenharmony_ci .id_table = pnp_aux_devids, 149262306a36Sopenharmony_ci .probe = i8042_pnp_aux_probe, 149362306a36Sopenharmony_ci .driver = { 149462306a36Sopenharmony_ci .probe_type = PROBE_FORCE_SYNCHRONOUS, 149562306a36Sopenharmony_ci .suppress_bind_attrs = true, 149662306a36Sopenharmony_ci }, 149762306a36Sopenharmony_ci}; 149862306a36Sopenharmony_ci 149962306a36Sopenharmony_cistatic void i8042_pnp_exit(void) 150062306a36Sopenharmony_ci{ 150162306a36Sopenharmony_ci if (i8042_pnp_kbd_registered) { 150262306a36Sopenharmony_ci i8042_pnp_kbd_registered = false; 150362306a36Sopenharmony_ci pnp_unregister_driver(&i8042_pnp_kbd_driver); 150462306a36Sopenharmony_ci } 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_ci if (i8042_pnp_aux_registered) { 150762306a36Sopenharmony_ci i8042_pnp_aux_registered = false; 150862306a36Sopenharmony_ci pnp_unregister_driver(&i8042_pnp_aux_driver); 150962306a36Sopenharmony_ci } 151062306a36Sopenharmony_ci} 151162306a36Sopenharmony_ci 151262306a36Sopenharmony_cistatic int __init i8042_pnp_init(void) 151362306a36Sopenharmony_ci{ 151462306a36Sopenharmony_ci char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; 151562306a36Sopenharmony_ci bool pnp_data_busted = false; 151662306a36Sopenharmony_ci int err; 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci if (i8042_nopnp) { 151962306a36Sopenharmony_ci pr_info("PNP detection disabled\n"); 152062306a36Sopenharmony_ci return 0; 152162306a36Sopenharmony_ci } 152262306a36Sopenharmony_ci 152362306a36Sopenharmony_ci err = pnp_register_driver(&i8042_pnp_kbd_driver); 152462306a36Sopenharmony_ci if (!err) 152562306a36Sopenharmony_ci i8042_pnp_kbd_registered = true; 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_ci err = pnp_register_driver(&i8042_pnp_aux_driver); 152862306a36Sopenharmony_ci if (!err) 152962306a36Sopenharmony_ci i8042_pnp_aux_registered = true; 153062306a36Sopenharmony_ci 153162306a36Sopenharmony_ci if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { 153262306a36Sopenharmony_ci i8042_pnp_exit(); 153362306a36Sopenharmony_ci#if defined(__ia64__) 153462306a36Sopenharmony_ci return -ENODEV; 153562306a36Sopenharmony_ci#else 153662306a36Sopenharmony_ci pr_info("PNP: No PS/2 controller found.\n"); 153762306a36Sopenharmony_ci#if defined(__loongarch__) 153862306a36Sopenharmony_ci if (acpi_disabled == 0) 153962306a36Sopenharmony_ci return -ENODEV; 154062306a36Sopenharmony_ci#else 154162306a36Sopenharmony_ci if (x86_platform.legacy.i8042 != 154262306a36Sopenharmony_ci X86_LEGACY_I8042_EXPECTED_PRESENT) 154362306a36Sopenharmony_ci return -ENODEV; 154462306a36Sopenharmony_ci#endif 154562306a36Sopenharmony_ci pr_info("Probing ports directly.\n"); 154662306a36Sopenharmony_ci return 0; 154762306a36Sopenharmony_ci#endif 154862306a36Sopenharmony_ci } 154962306a36Sopenharmony_ci 155062306a36Sopenharmony_ci if (i8042_pnp_kbd_devices) 155162306a36Sopenharmony_ci snprintf(kbd_irq_str, sizeof(kbd_irq_str), 155262306a36Sopenharmony_ci "%d", i8042_pnp_kbd_irq); 155362306a36Sopenharmony_ci if (i8042_pnp_aux_devices) 155462306a36Sopenharmony_ci snprintf(aux_irq_str, sizeof(aux_irq_str), 155562306a36Sopenharmony_ci "%d", i8042_pnp_aux_irq); 155662306a36Sopenharmony_ci 155762306a36Sopenharmony_ci pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", 155862306a36Sopenharmony_ci i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 155962306a36Sopenharmony_ci i8042_pnp_aux_name, 156062306a36Sopenharmony_ci i8042_pnp_data_reg, i8042_pnp_command_reg, 156162306a36Sopenharmony_ci kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 156262306a36Sopenharmony_ci aux_irq_str); 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_ci#if defined(__ia64__) 156562306a36Sopenharmony_ci if (!i8042_pnp_kbd_devices) 156662306a36Sopenharmony_ci i8042_nokbd = true; 156762306a36Sopenharmony_ci if (!i8042_pnp_aux_devices) 156862306a36Sopenharmony_ci i8042_noaux = true; 156962306a36Sopenharmony_ci#endif 157062306a36Sopenharmony_ci 157162306a36Sopenharmony_ci if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && 157262306a36Sopenharmony_ci i8042_pnp_data_reg != i8042_data_reg) || 157362306a36Sopenharmony_ci !i8042_pnp_data_reg) { 157462306a36Sopenharmony_ci pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n", 157562306a36Sopenharmony_ci i8042_pnp_data_reg, i8042_data_reg); 157662306a36Sopenharmony_ci i8042_pnp_data_reg = i8042_data_reg; 157762306a36Sopenharmony_ci pnp_data_busted = true; 157862306a36Sopenharmony_ci } 157962306a36Sopenharmony_ci 158062306a36Sopenharmony_ci if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) && 158162306a36Sopenharmony_ci i8042_pnp_command_reg != i8042_command_reg) || 158262306a36Sopenharmony_ci !i8042_pnp_command_reg) { 158362306a36Sopenharmony_ci pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n", 158462306a36Sopenharmony_ci i8042_pnp_command_reg, i8042_command_reg); 158562306a36Sopenharmony_ci i8042_pnp_command_reg = i8042_command_reg; 158662306a36Sopenharmony_ci pnp_data_busted = true; 158762306a36Sopenharmony_ci } 158862306a36Sopenharmony_ci 158962306a36Sopenharmony_ci if (!i8042_nokbd && !i8042_pnp_kbd_irq) { 159062306a36Sopenharmony_ci pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n", 159162306a36Sopenharmony_ci i8042_kbd_irq); 159262306a36Sopenharmony_ci i8042_pnp_kbd_irq = i8042_kbd_irq; 159362306a36Sopenharmony_ci pnp_data_busted = true; 159462306a36Sopenharmony_ci } 159562306a36Sopenharmony_ci 159662306a36Sopenharmony_ci if (!i8042_noaux && !i8042_pnp_aux_irq) { 159762306a36Sopenharmony_ci if (!pnp_data_busted && i8042_pnp_kbd_irq) { 159862306a36Sopenharmony_ci pr_warn("PNP: PS/2 appears to have AUX port disabled, " 159962306a36Sopenharmony_ci "if this is incorrect please boot with i8042.nopnp\n"); 160062306a36Sopenharmony_ci i8042_noaux = true; 160162306a36Sopenharmony_ci } else { 160262306a36Sopenharmony_ci pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n", 160362306a36Sopenharmony_ci i8042_aux_irq); 160462306a36Sopenharmony_ci i8042_pnp_aux_irq = i8042_aux_irq; 160562306a36Sopenharmony_ci } 160662306a36Sopenharmony_ci } 160762306a36Sopenharmony_ci 160862306a36Sopenharmony_ci i8042_data_reg = i8042_pnp_data_reg; 160962306a36Sopenharmony_ci i8042_command_reg = i8042_pnp_command_reg; 161062306a36Sopenharmony_ci i8042_kbd_irq = i8042_pnp_kbd_irq; 161162306a36Sopenharmony_ci i8042_aux_irq = i8042_pnp_aux_irq; 161262306a36Sopenharmony_ci 161362306a36Sopenharmony_ci#ifdef CONFIG_X86 161462306a36Sopenharmony_ci i8042_bypass_aux_irq_test = !pnp_data_busted && 161562306a36Sopenharmony_ci dmi_check_system(i8042_dmi_laptop_table); 161662306a36Sopenharmony_ci#endif 161762306a36Sopenharmony_ci 161862306a36Sopenharmony_ci return 0; 161962306a36Sopenharmony_ci} 162062306a36Sopenharmony_ci 162162306a36Sopenharmony_ci#else /* !CONFIG_PNP */ 162262306a36Sopenharmony_cistatic inline int i8042_pnp_init(void) { return 0; } 162362306a36Sopenharmony_cistatic inline void i8042_pnp_exit(void) { } 162462306a36Sopenharmony_ci#endif /* CONFIG_PNP */ 162562306a36Sopenharmony_ci 162662306a36Sopenharmony_ci 162762306a36Sopenharmony_ci#ifdef CONFIG_X86 162862306a36Sopenharmony_cistatic void __init i8042_check_quirks(void) 162962306a36Sopenharmony_ci{ 163062306a36Sopenharmony_ci const struct dmi_system_id *device_quirk_info; 163162306a36Sopenharmony_ci uintptr_t quirks; 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_ci device_quirk_info = dmi_first_match(i8042_dmi_quirk_table); 163462306a36Sopenharmony_ci if (!device_quirk_info) 163562306a36Sopenharmony_ci return; 163662306a36Sopenharmony_ci 163762306a36Sopenharmony_ci quirks = (uintptr_t)device_quirk_info->driver_data; 163862306a36Sopenharmony_ci 163962306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_NOKBD) 164062306a36Sopenharmony_ci i8042_nokbd = true; 164162306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_NOAUX) 164262306a36Sopenharmony_ci i8042_noaux = true; 164362306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_NOMUX) 164462306a36Sopenharmony_ci i8042_nomux = true; 164562306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_FORCEMUX) 164662306a36Sopenharmony_ci i8042_nomux = false; 164762306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_UNLOCK) 164862306a36Sopenharmony_ci i8042_unlock = true; 164962306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_PROBE_DEFER) 165062306a36Sopenharmony_ci i8042_probe_defer = true; 165162306a36Sopenharmony_ci /* Honor module parameter when value is not default */ 165262306a36Sopenharmony_ci if (i8042_reset == I8042_RESET_DEFAULT) { 165362306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_RESET_ALWAYS) 165462306a36Sopenharmony_ci i8042_reset = I8042_RESET_ALWAYS; 165562306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_RESET_NEVER) 165662306a36Sopenharmony_ci i8042_reset = I8042_RESET_NEVER; 165762306a36Sopenharmony_ci } 165862306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_DIECT) 165962306a36Sopenharmony_ci i8042_direct = true; 166062306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_DUMBKBD) 166162306a36Sopenharmony_ci i8042_dumbkbd = true; 166262306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_NOLOOP) 166362306a36Sopenharmony_ci i8042_noloop = true; 166462306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_NOTIMEOUT) 166562306a36Sopenharmony_ci i8042_notimeout = true; 166662306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_KBDRESET) 166762306a36Sopenharmony_ci i8042_kbdreset = true; 166862306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_DRITEK) 166962306a36Sopenharmony_ci i8042_dritek = true; 167062306a36Sopenharmony_ci#ifdef CONFIG_PNP 167162306a36Sopenharmony_ci if (quirks & SERIO_QUIRK_NOPNP) 167262306a36Sopenharmony_ci i8042_nopnp = true; 167362306a36Sopenharmony_ci#endif 167462306a36Sopenharmony_ci} 167562306a36Sopenharmony_ci#else 167662306a36Sopenharmony_cistatic inline void i8042_check_quirks(void) {} 167762306a36Sopenharmony_ci#endif 167862306a36Sopenharmony_ci 167962306a36Sopenharmony_cistatic int __init i8042_platform_init(void) 168062306a36Sopenharmony_ci{ 168162306a36Sopenharmony_ci int retval; 168262306a36Sopenharmony_ci 168362306a36Sopenharmony_ci#ifdef CONFIG_X86 168462306a36Sopenharmony_ci u8 a20_on = 0xdf; 168562306a36Sopenharmony_ci /* Just return if platform does not have i8042 controller */ 168662306a36Sopenharmony_ci if (x86_platform.legacy.i8042 == X86_LEGACY_I8042_PLATFORM_ABSENT) 168762306a36Sopenharmony_ci return -ENODEV; 168862306a36Sopenharmony_ci#endif 168962306a36Sopenharmony_ci 169062306a36Sopenharmony_ci/* 169162306a36Sopenharmony_ci * On ix86 platforms touching the i8042 data register region can do really 169262306a36Sopenharmony_ci * bad things. Because of this the region is always reserved on ix86 boxes. 169362306a36Sopenharmony_ci * 169462306a36Sopenharmony_ci * if (!request_region(I8042_DATA_REG, 16, "i8042")) 169562306a36Sopenharmony_ci * return -EBUSY; 169662306a36Sopenharmony_ci */ 169762306a36Sopenharmony_ci 169862306a36Sopenharmony_ci i8042_kbd_irq = I8042_MAP_IRQ(1); 169962306a36Sopenharmony_ci i8042_aux_irq = I8042_MAP_IRQ(12); 170062306a36Sopenharmony_ci 170162306a36Sopenharmony_ci#if defined(__ia64__) 170262306a36Sopenharmony_ci i8042_reset = I8042_RESET_ALWAYS; 170362306a36Sopenharmony_ci#endif 170462306a36Sopenharmony_ci 170562306a36Sopenharmony_ci i8042_check_quirks(); 170662306a36Sopenharmony_ci 170762306a36Sopenharmony_ci pr_debug("Active quirks (empty means none):%s%s%s%s%s%s%s%s%s%s%s%s%s\n", 170862306a36Sopenharmony_ci i8042_nokbd ? " nokbd" : "", 170962306a36Sopenharmony_ci i8042_noaux ? " noaux" : "", 171062306a36Sopenharmony_ci i8042_nomux ? " nomux" : "", 171162306a36Sopenharmony_ci i8042_unlock ? " unlock" : "", 171262306a36Sopenharmony_ci i8042_probe_defer ? "probe_defer" : "", 171362306a36Sopenharmony_ci i8042_reset == I8042_RESET_DEFAULT ? 171462306a36Sopenharmony_ci "" : i8042_reset == I8042_RESET_ALWAYS ? 171562306a36Sopenharmony_ci " reset_always" : " reset_never", 171662306a36Sopenharmony_ci i8042_direct ? " direct" : "", 171762306a36Sopenharmony_ci i8042_dumbkbd ? " dumbkbd" : "", 171862306a36Sopenharmony_ci i8042_noloop ? " noloop" : "", 171962306a36Sopenharmony_ci i8042_notimeout ? " notimeout" : "", 172062306a36Sopenharmony_ci i8042_kbdreset ? " kbdreset" : "", 172162306a36Sopenharmony_ci#ifdef CONFIG_X86 172262306a36Sopenharmony_ci i8042_dritek ? " dritek" : "", 172362306a36Sopenharmony_ci#else 172462306a36Sopenharmony_ci "", 172562306a36Sopenharmony_ci#endif 172662306a36Sopenharmony_ci#ifdef CONFIG_PNP 172762306a36Sopenharmony_ci i8042_nopnp ? " nopnp" : ""); 172862306a36Sopenharmony_ci#else 172962306a36Sopenharmony_ci ""); 173062306a36Sopenharmony_ci#endif 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_ci retval = i8042_pnp_init(); 173362306a36Sopenharmony_ci if (retval) 173462306a36Sopenharmony_ci return retval; 173562306a36Sopenharmony_ci 173662306a36Sopenharmony_ci#ifdef CONFIG_X86 173762306a36Sopenharmony_ci /* 173862306a36Sopenharmony_ci * A20 was already enabled during early kernel init. But some buggy 173962306a36Sopenharmony_ci * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to 174062306a36Sopenharmony_ci * resume from S3. So we do it here and hope that nothing breaks. 174162306a36Sopenharmony_ci */ 174262306a36Sopenharmony_ci i8042_command(&a20_on, 0x10d1); 174362306a36Sopenharmony_ci i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */ 174462306a36Sopenharmony_ci#endif /* CONFIG_X86 */ 174562306a36Sopenharmony_ci 174662306a36Sopenharmony_ci return retval; 174762306a36Sopenharmony_ci} 174862306a36Sopenharmony_ci 174962306a36Sopenharmony_cistatic inline void i8042_platform_exit(void) 175062306a36Sopenharmony_ci{ 175162306a36Sopenharmony_ci i8042_pnp_exit(); 175262306a36Sopenharmony_ci} 175362306a36Sopenharmony_ci 175462306a36Sopenharmony_ci#endif /* _I8042_ACPIPNPIO_H */ 1755