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