]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.10
authorSasha Levin <sashal@kernel.org>
Tue, 7 Feb 2023 03:15:36 +0000 (22:15 -0500)
committerSasha Levin <sashal@kernel.org>
Tue, 7 Feb 2023 03:15:36 +0000 (22:15 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.10/iio-adc-stm32-dfsdm-fill-module-aliases.patch [new file with mode: 0644]
queue-5.10/input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch [new file with mode: 0644]
queue-5.10/input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch [new file with mode: 0644]
queue-5.10/input-i8042-merge-quirk-tables.patch [new file with mode: 0644]
queue-5.10/input-i8042-move-__initconst-to-fix-code-styling-war.patch [new file with mode: 0644]
queue-5.10/series
queue-5.10/usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch [new file with mode: 0644]
queue-5.10/usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch [new file with mode: 0644]
queue-5.10/usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch [new file with mode: 0644]
queue-5.10/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch [new file with mode: 0644]

diff --git a/queue-5.10/iio-adc-stm32-dfsdm-fill-module-aliases.patch b/queue-5.10/iio-adc-stm32-dfsdm-fill-module-aliases.patch
new file mode 100644 (file)
index 0000000..d6e9e28
--- /dev/null
@@ -0,0 +1,37 @@
+From bd115dca7daba75a349a92aedb9bde1367e0e01c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 2 Dec 2022 16:28:48 +0100
+Subject: iio: adc: stm32-dfsdm: fill module aliases
+
+From: Olivier Moysan <olivier.moysan@foss.st.com>
+
+[ Upstream commit cc3304052a89ab6ac887ed9224420a27e3d354e1 ]
+
+When STM32 DFSDM driver is built as module, no modalias information
+is available. This prevents module to be loaded by udev.
+Add MODULE_DEVICE_TABLE() to fill module aliases.
+
+Fixes: e2e6771c6462 ("IIO: ADC: add STM32 DFSDM sigma delta ADC support")
+Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
+Link: https://lore.kernel.org/r/20221202152848.45585-1-olivier.moysan@foss.st.com
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iio/adc/stm32-dfsdm-adc.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
+index 9234f14167b7..171d73efb2f8 100644
+--- a/drivers/iio/adc/stm32-dfsdm-adc.c
++++ b/drivers/iio/adc/stm32-dfsdm-adc.c
+@@ -1521,6 +1521,7 @@ static const struct of_device_id stm32_dfsdm_adc_match[] = {
+       },
+       {}
+ };
++MODULE_DEVICE_TABLE(of, stm32_dfsdm_adc_match);
+ static int stm32_dfsdm_adc_probe(struct platform_device *pdev)
+ {
+-- 
+2.39.0
+
diff --git a/queue-5.10/input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch b/queue-5.10/input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch
new file mode 100644 (file)
index 0000000..6057087
--- /dev/null
@@ -0,0 +1,44 @@
+From 7277b80fef8736edec260c973f9cde5e0a0aa427 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 10 Jan 2023 14:45:24 +0100
+Subject: Input: i8042 - add Clevo PCX0DX to i8042 quirk table
+
+From: Werner Sembach <wse@tuxedocomputers.com>
+
+[ Upstream commit 9c445d2637c938a800fcc8b5f0b10e60c94460c7 ]
+
+The Clevo PCX0DX/TUXEDO XP1511, need quirks for the keyboard to not be
+occasionally unresponsive after resume.
+
+Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
+Cc: stable@vger.kernel.org
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
+Link: https://lore.kernel.org/r/20230110134524.553620-1-wse@tuxedocomputers.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/serio/i8042-x86ia64io.h | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 184d7c30f732..65c0081838e3 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -1169,6 +1169,13 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
+               .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
+                                       SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
+       },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "PCX0DX"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
+       {
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_NAME, "X170SM"),
+-- 
+2.39.0
+
diff --git a/queue-5.10/input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch b/queue-5.10/input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch
new file mode 100644 (file)
index 0000000..1025f76
--- /dev/null
@@ -0,0 +1,187 @@
+From 5091422d42bd12287ad09c863f20149e4830ca50 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Jun 2022 17:38:52 -0700
+Subject: Input: i8042 - add TUXEDO devices to i8042 quirk tables
+
+From: Werner Sembach <wse@tuxedocomputers.com>
+
+[ Upstream commit a6a87c36165e6791eeaed88025cde270536c3198 ]
+
+A lot of modern Clevo barebones have touchpad and/or keyboard issues after
+suspend fixable with nomux + reset + noloop + nopnp. Luckily, none of them
+have an external PS/2 port so this can safely be set for all of them.
+
+I'm not entirely sure if every device listed really needs all four quirks,
+but after testing and production use. No negative effects could be
+observed when setting all four.
+
+The list is quite massive as neither the TUXEDO nor the Clevo dmi strings
+have been very consistent historically. I tried to keep the list as short
+as possible without risking on missing an affected device.
+
+This is revision 3. The Clevo N150CU barebone is still removed as it might
+have problems with the fix and needs further investigations. The
+SchenkerTechnologiesGmbH System-/Board-Vendor string variations are
+added. This is now based in the quirk table refactor. This now also
+includes the additional noaux flag for the NS7xMU.
+
+Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Link: https://lore.kernel.org/r/20220629112725.12922-5-wse@tuxedocomputers.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Stable-dep-of: 9c445d2637c9 ("Input: i8042 - add Clevo PCX0DX to i8042 quirk table")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/serio/i8042-x86ia64io.h | 129 ++++++++++++++++++++++++++
+ 1 file changed, 129 insertions(+)
+
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 1d2b34aac0c7..184d7c30f732 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -1025,6 +1025,29 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
+               },
+               .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
++      /*
++       * A lot of modern Clevo barebones have touchpad and/or keyboard issues
++       * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
++       * none of them have an external PS/2 port so this can safely be set for
++       * all of them. These two are based on a Clevo design, but have the
++       * board_name changed.
++       */
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
++                      DMI_MATCH(DMI_BOARD_NAME, "AURA1501"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
++                      DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
+       {
+               /* Mivvy M310 */
+               .matches = {
+@@ -1054,6 +1077,112 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
+               },
+               .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
++      /*
++       * A lot of modern Clevo barebones have touchpad and/or keyboard issues
++       * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
++       * none of them have an external PS/2 port so this can safely be set for
++       * all of them.
++       * Clevo barebones come with board_vendor and/or system_vendor set to
++       * either the very generic string "Notebook" and/or a different value
++       * for each individual reseller. The only somewhat universal way to
++       * identify them is by board_name.
++       */
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "N140CU"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "N141CU"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      /*
++       * At least one modern Clevo barebone has the touchpad connected both
++       * via PS/2 and i2c interface. This causes a race condition between the
++       * psmouse and i2c-hid driver. Since the full capability of the touchpad
++       * is available via the i2c interface and the device has no external
++       * PS/2 port, it is safe to just ignore all ps2 mouses here to avoid
++       * this issue. The known affected device is the
++       * TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU which comes with one of
++       * the two different dmi strings below. NS50MU is not a typo!
++       */
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "NS50MU"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
++                                      SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
++                                      SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
++                                      SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
++                                      SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "X170SM"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"),
++              },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
++                                      SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
++      },
+       { }
+ };
+-- 
+2.39.0
+
diff --git a/queue-5.10/input-i8042-merge-quirk-tables.patch b/queue-5.10/input-i8042-merge-quirk-tables.patch
new file mode 100644 (file)
index 0000000..11ca557
--- /dev/null
@@ -0,0 +1,1653 @@
+From bb051cc6e2f7a007f176dd52e62e6dc35265f46f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Jun 2022 17:38:07 -0700
+Subject: Input: i8042 - merge quirk tables
+
+From: Werner Sembach <wse@tuxedocomputers.com>
+
+[ Upstream commit ff946268a0813c35b790dfbe07c3bfaa7bfb869c ]
+
+Merge i8042 quirk tables to reduce code duplication for devices that need
+more than one quirk. Before every quirk had its own table with devices
+needing that quirk. If a new quirk needed to be added a new table had to
+be created. When a device needed multiple quirks, it appeared in multiple
+tables. Now only one table called i8042_dmi_quirk_table exists. In it every
+device has one entry and required quirks are coded in the .driver_data
+field of the struct dmi_system_id used by this table. Multiple quirks for
+one device can be applied by bitwise-or of the new SERIO_QUIRK_* defines.
+
+Also align quirkable options with command line parameters and make vendor
+wide quirks per device overwriteable on a per device basis. The first match
+is honored while following matches are ignored. So when a vendor wide quirk
+is defined in the table, a device can inserted before and therefore
+ignoring the vendor wide define.
+
+Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Link: https://lore.kernel.org/r/20220629112725.12922-3-wse@tuxedocomputers.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Stable-dep-of: 9c445d2637c9 ("Input: i8042 - add Clevo PCX0DX to i8042 quirk table")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/serio/i8042-x86ia64io.h | 1100 +++++++++++++------------
+ 1 file changed, 595 insertions(+), 505 deletions(-)
+
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 91c6f24b4837..1d2b34aac0c7 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -67,654 +67,735 @@ static inline void i8042_write_command(int val)
+ #include <linux/dmi.h>
+-static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
++#define SERIO_QUIRK_NOKBD             BIT(0)
++#define SERIO_QUIRK_NOAUX             BIT(1)
++#define SERIO_QUIRK_NOMUX             BIT(2)
++#define SERIO_QUIRK_FORCEMUX          BIT(3)
++#define SERIO_QUIRK_UNLOCK            BIT(4)
++#define SERIO_QUIRK_PROBE_DEFER               BIT(5)
++#define SERIO_QUIRK_RESET_ALWAYS      BIT(6)
++#define SERIO_QUIRK_RESET_NEVER               BIT(7)
++#define SERIO_QUIRK_DIECT             BIT(8)
++#define SERIO_QUIRK_DUMBKBD           BIT(9)
++#define SERIO_QUIRK_NOLOOP            BIT(10)
++#define SERIO_QUIRK_NOTIMEOUT         BIT(11)
++#define SERIO_QUIRK_KBDRESET          BIT(12)
++#define SERIO_QUIRK_DRITEK            BIT(13)
++#define SERIO_QUIRK_NOPNP             BIT(14)
++
++/* Quirk table for different mainboards. Options similar or identical to i8042
++ * module parameters.
++ * ORDERING IS IMPORTANT! The first match will be apllied and the rest ignored.
++ * This allows entries to overwrite vendor wide quirks on a per device basis.
++ * Where this is irrelevant, entries are sorted case sensitive by DMI_SYS_VENDOR
++ * and/or DMI_BOARD_VENDOR to make it easier to avoid dublicate entries.
++ */
++static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
+       {
+-              /*
+-               * Arima-Rioworks HDAMB -
+-               * AUX LOOP command does not raise AUX IRQ
+-               */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
+-                      DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
+-                      DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* ASUS G1S */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
+-                      DMI_MATCH(DMI_BOARD_NAME, "G1S"),
+-                      DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */
++              /* Asus X450LCP */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+-                      DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),
+-                      DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER)
+       },
+       {
++              /* ASUS ZenBook UX425UA */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
+       },
+       {
++              /* ASUS ZenBook UM325UA */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
+       },
++      /*
++       * On some Asus laptops, just running self tests cause problems.
++       */
+       {
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER)
+       },
+       {
+-              /* Dell Embedded Box PC 3000 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_NEVER)
+       },
+       {
+-              /* OQO Model 01 */
++              /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
++                      DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),
++                      DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* ULI EV4873 - AUX LOOP does not work properly */
++              /* ASUS G1S */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
++                      DMI_MATCH(DMI_BOARD_NAME, "G1S"),
++                      DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Microsoft Virtual Machine */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Medion MAM 2070 */
++              /* Acer Aspire 5710 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Medion Akoya E7225 */
++              /* Acer Aspire 7738 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Blue FB5601 */
++              /* Acer Aspire 5536 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "blue"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Gigabyte M912 */
++              /*
++               * Acer Aspire 5738z
++               * Touchpad stops working in mux mode when dis- + re-enabled
++               * with the touchpad enable/disable toggle hotkey
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Gigabyte M1022M netbook */
++              /* Acer Aspire One 150 */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
+-                      DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
+-                      DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /* Gigabyte Spring Peak - defines wrong chassis type */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /* Gigabyte T1005 - defines wrong chassis type ("Other") */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+-      { }
+-};
+-
+-/*
+- * Some Fujitsu notebooks are having trouble with touchpads if
+- * active multiplexing mode is activated. Luckily they don't have
+- * external PS/2 ports so we can safely disable it.
+- * ... apparently some Toshibas don't like MUX mode either and
+- * die horrible death on reboot.
+- */
+-static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
+       {
+-              /* Fujitsu Lifebook P7010/P7010D */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
++      /*
++       * Some Wistron based laptops need us to explicitly enable the 'Dritek
++       * keyboard extension' to make their extra keys start generating scancodes.
++       * Originally, this was just confined to older laptops, but a few Acer laptops
++       * have turned up in 2007 that also need this again.
++       */
+       {
+-              /* Fujitsu Lifebook P7010 */
++              /* Acer Aspire 5100 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu Lifebook P5020D */
++              /* Acer Aspire 5610 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu Lifebook S2000 */
++              /* Acer Aspire 5630 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu Lifebook S6230 */
++              /* Acer Aspire 5650 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu Lifebook T725 laptop */
++              /* Acer Aspire 5680 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu Lifebook U745 */
++              /* Acer Aspire 5720 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu T70H */
++              /* Acer Aspire 9110 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu-Siemens Lifebook T3010 */
++              /* Acer TravelMate 660 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu-Siemens Lifebook E4010 */
++              /* Acer TravelMate 2490 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu-Siemens Amilo Pro 2010 */
++              /* Acer TravelMate 4280 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_DRITEK)
+       },
+       {
+-              /* Fujitsu-Siemens Amilo Pro 2030 */
++              /* Amoi M636/A737 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /*
+-               * No data is coming from the touchscreen unless KBC
+-               * is in legacy mode.
+-               */
+-              /* Panasonic CF-29 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /*
+-               * HP Pavilion DV4017EA -
+-               * errors on MUX ports are reported without raising AUXDATA
+-               * causing "spurious NAK" messages.
+-               */
++              /* Compal HEL80I */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /*
+-               * HP Pavilion ZT1000 -
+-               * like DV4017EA does not raise AUXERR for errors on MUX ports.
+-               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /*
+-               * HP Pavilion DV4270ca -
+-               * like DV4017EA does not raise AUXERR for errors on MUX ports.
+-               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
++              /* Advent 4211 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
++              /* Dell Embedded Box PC 3000 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
++              /* Dell XPS M1530 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /* Dell Vostro 1510 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Sharp Actius MM20 */
++              /* Dell Vostro V13 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Sony Vaio FS-115b */
++              /* Dell Vostro 1320 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /*
+-               * Sony Vaio FZ-240E -
+-               * reset and GET ID commands issued via KBD port are
+-               * sometimes being delivered to AUX3.
+-               */
++              /* Dell Vostro 1520 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /*
+-               * Most (all?) VAIOs do not have external PS/2 ports nor
+-               * they implement active multiplexing properly, and
+-               * MUX discovery usually messes up keyboard/touchpad.
+-               */
++              /* Dell Vostro 1720 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
+-                      DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /* Amoi M636/A737 */
++              /* Entroware Proteus */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS)
+       },
++      /*
++       * Some Fujitsu notebooks are having trouble with touchpads if
++       * active multiplexing mode is activated. Luckily they don't have
++       * external PS/2 ports so we can safely disable it.
++       * ... apparently some Toshibas don't like MUX mode either and
++       * die horrible death on reboot.
++       */
+       {
+-              /* Lenovo 3000 n100 */
++              /* Fujitsu Lifebook P7010/P7010D */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Lenovo XiaoXin Air 12 */
++              /* Fujitsu Lifebook P5020D */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "80UN"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /* Fujitsu Lifebook S2000 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer Aspire 5710 */
++              /* Fujitsu Lifebook S6230 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer Aspire 7738 */
++              /* Fujitsu Lifebook T725 laptop */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Gericom Bellagio */
++              /* Fujitsu Lifebook U745 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* IBM 2656 */
++              /* Fujitsu T70H */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Dell XPS M1530 */
++              /* Fujitsu A544 laptop */
++              /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Compal HEL80I */
++              /* Fujitsu AH544 laptop */
++              /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Dell Vostro 1510 */
++              /* Fujitsu U574 laptop */
++              /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Acer Aspire 5536 */
++              /* Fujitsu UH554 laptop */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Dell Vostro V13 */
++              /* Fujitsu Lifebook P7010 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Newer HP Pavilion dv4 models */
++              /* Fujitsu-Siemens Lifebook T3010 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Asus X450LCP */
++              /* Fujitsu-Siemens Lifebook E4010 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Avatar AVIU-145A6 */
++              /* Fujitsu-Siemens Amilo Pro 2010 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* TUXEDO BU1406 */
++              /* Fujitsu-Siemens Amilo Pro 2030 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Lenovo LaVie Z */
++              /* Gigabyte M912 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /*
+-               * Acer Aspire 5738z
+-               * Touchpad stops working in mux mode when dis- + re-enabled
+-               * with the touchpad enable/disable toggle hotkey
+-               */
++              /* Gigabyte Spring Peak - defines wrong chassis type */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Entroware Proteus */
++              /* Gigabyte T1005 - defines wrong chassis type ("Other") */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+-      { }
+-};
+-
+-static const struct dmi_system_id i8042_dmi_forcemux_table[] __initconst = {
+       {
+-              /*
+-               * Sony Vaio VGN-CS series require MUX or the touch sensor
+-               * buttons will disturb touchpad operation
+-               */
++              /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+-      { }
+-};
+-
+-/*
+- * On some Asus laptops, just running self tests cause problems.
+- */
+-static const struct dmi_system_id i8042_dmi_noselftest_table[] = {
++      /*
++       * Some laptops need keyboard reset before probing for the trackpad to get
++       * it detected, initialised & finally work.
++       */
+       {
++              /* Gigabyte P35 v2 - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+-                      DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
+-              },
+-      }, {
+-              .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+-                      DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_KBDRESET)
+       },
+-      { }
+-};
+-static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
+-      {
+-              /* MSI Wind U-100 */
++              {
++              /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_NAME, "U-100"),
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_KBDRESET)
+       },
+       {
+-              /* LG Electronics X110 */
++              /* Gigabyte P34 - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_NAME, "X110"),
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_KBDRESET)
+       },
+       {
+-              /* Acer Aspire One 150 */
++              /* Gigabyte P57 - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_KBDRESET)
+       },
+       {
++              /* Gericom Bellagio */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /* Gigabyte M1022M netbook */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
++                      DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
++                      DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
++              /*
++               * HP Pavilion DV4017EA -
++               * errors on MUX ports are reported without raising AUXDATA
++               * causing "spurious NAK" messages.
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /*
++               * HP Pavilion ZT1000 -
++               * like DV4017EA does not raise AUXERR for errors on MUX ports.
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /*
++               * HP Pavilion DV4270ca -
++               * like DV4017EA does not raise AUXERR for errors on MUX ports.
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /* Newer HP Pavilion dv4 models */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_NOTIMEOUT)
+       },
+       {
+-              /* Advent 4211 */
++              /* IBM 2656 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Medion Akoya Mini E1210 */
++              /* Avatar AVIU-145A6 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Medion Akoya E1222 */
++              /* Intel MBO Desktop D845PESV */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
++                      DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOPNP)
+       },
+       {
+-              /* Mivvy M310 */
++              /*
++               * Intel NUC D54250WYK - does not have i8042 controller but
++               * declares PS/2 devices in DSDT.
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
++                      DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOPNP)
+       },
+       {
+-              /* Dell Vostro 1320 */
++              /* Lenovo 3000 n100 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Dell Vostro 1520 */
++              /* Lenovo XiaoXin Air 12 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "80UN"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Dell Vostro 1720 */
++              /* Lenovo LaVie Z */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+               /* Lenovo Ideapad U455 */
+@@ -722,6 +803,7 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+               /* Lenovo ThinkPad L460 */
+@@ -729,13 +811,7 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"),
+               },
+-      },
+-      {
+-              /* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
+-              .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
+-              },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+               /* Lenovo ThinkPad Twist S230u */
+@@ -743,275 +819,269 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /* Entroware Proteus */
++              /* LG Electronics X110 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
+-                      DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
++                      DMI_MATCH(DMI_BOARD_NAME, "X110"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+-      { }
+-};
+-
+-#ifdef CONFIG_PNP
+-static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {
+       {
+-              /* Intel MBO Desktop D845PESV */
++              /* Medion Akoya Mini E1210 */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /*
+-               * Intel NUC D54250WYK - does not have i8042 controller but
+-               * declares PS/2 devices in DSDT.
+-               */
++              /* Medion Akoya E1222 */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"),
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+               /* MSI Wind U-100 */
+               .matches = {
+-                      DMI_MATCH(DMI_BOARD_NAME, "U-100"),
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
+-              },
+-      },
+-      {
+-              /* Acer Aspire 5 A515 */
+-              .matches = {
+-                      DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"),
+-                      DMI_MATCH(DMI_BOARD_VENDOR, "PK"),
+-              },
+-      },
+-      { }
+-};
+-
+-static const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = {
+-      {
+-              .matches = {
+-                      DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
+-              },
+-      },
+-      {
+-              .matches = {
+-                      DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
++                      DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
++                      DMI_MATCH(DMI_BOARD_NAME, "U-100"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOPNP)
+       },
+       {
++              /*
++               * No data is coming from the touchscreen unless KBC
++               * is in legacy mode.
++               */
++              /* Panasonic CF-29 */
+               .matches = {
+-                      DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
++                      DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
++              /* Medion Akoya E7225 */
+               .matches = {
+-                      DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
++                      DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+-      { }
+-};
+-#endif
+-
+-static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
+       {
+-              /* Dell Vostro V13 */
++              /* Microsoft Virtual Machine */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Newer HP Pavilion dv4 models */
++              /* Medion MAM 2070 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Fujitsu A544 laptop */
+-              /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
++              /* TUXEDO BU1406 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Fujitsu AH544 laptop */
+-              /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
++              /* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+       {
+-              /* Fujitsu Lifebook T725 laptop */
++              /* OQO Model 01 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Fujitsu U574 laptop */
+-              /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Fujitsu UH554 laptop */
++              /* Acer Aspire 5 A515 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "PK"),
++                      DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOPNP)
+       },
+-      { }
+-};
+-
+-/*
+- * Some Wistron based laptops need us to explicitly enable the 'Dritek
+- * keyboard extension' to make their extra keys start generating scancodes.
+- * Originally, this was just confined to older laptops, but a few Acer laptops
+- * have turned up in 2007 that also need this again.
+- */
+-static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = {
+       {
+-              /* Acer Aspire 5100 */
++              /* ULI EV4873 - AUX LOOP does not work properly */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Acer Aspire 5610 */
++              /*
++               * Arima-Rioworks HDAMB -
++               * AUX LOOP command does not raise AUX IRQ
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
++                      DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
++                      DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
++                      DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
+       {
+-              /* Acer Aspire 5630 */
++              /* Sharp Actius MM20 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer Aspire 5650 */
++              /*
++               * Sony Vaio FZ-240E -
++               * reset and GET ID commands issued via KBD port are
++               * sometimes being delivered to AUX3.
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer Aspire 5680 */
++              /*
++               * Most (all?) VAIOs do not have external PS/2 ports nor
++               * they implement active multiplexing properly, and
++               * MUX discovery usually messes up keyboard/touchpad.
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
++                      DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer Aspire 5720 */
++              /* Sony Vaio FS-115b */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer Aspire 9110 */
++              /*
++               * Sony Vaio VGN-CS series require MUX or the touch sensor
++               * buttons will disturb touchpad operation
++               */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_FORCEMUX)
+       },
+       {
+-              /* Acer TravelMate 660 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer TravelMate 2490 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+       {
+-              /* Acer TravelMate 4280 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOMUX)
+       },
+-      { }
+-};
+-
+-/*
+- * Some laptops need keyboard reset before probing for the trackpad to get
+- * it detected, initialised & finally work.
+- */
+-static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
+       {
+-              /* Gigabyte P35 v2 - Elantech touchpad */
++              /* Mivvy M310 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_RESET_ALWAYS)
+       },
+-              {
+-              /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
++      /*
++       * Some laptops need keyboard reset before probing for the trackpad to get
++       * it detected, initialised & finally work.
++       */
++      {
++              /* Schenker XMG C504 - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "XMG"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "C504"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_KBDRESET)
+       },
+       {
+-              /* Gigabyte P34 - Elantech touchpad */
++              /* Blue FB5601 */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "blue"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
+               },
++              .driver_data = (void *)(SERIO_QUIRK_NOLOOP)
+       },
++      { }
++};
++
++#ifdef CONFIG_PNP
++static const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = {
+       {
+-              /* Gigabyte P57 - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
+               },
+       },
+       {
+-              /* Schenker XMG C504 - Elantech touchpad */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "XMG"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "C504"),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
+               },
+       },
+-      { }
+-};
+-
+-static const struct dmi_system_id i8042_dmi_probe_defer_table[] __initconst = {
+       {
+-              /* ASUS ZenBook UX425UA */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
+               },
+       },
+       {
+-              /* ASUS ZenBook UM325UA */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
+               },
+       },
+       { }
+ };
++#endif
+ #endif /* CONFIG_X86 */
+@@ -1167,11 +1237,6 @@ static int __init i8042_pnp_init(void)
+       bool pnp_data_busted = false;
+       int err;
+-#ifdef CONFIG_X86
+-      if (dmi_check_system(i8042_dmi_nopnp_table))
+-              i8042_nopnp = true;
+-#endif
+-
+       if (i8042_nopnp) {
+               pr_info("PNP detection disabled\n");
+               return 0;
+@@ -1275,6 +1340,59 @@ static inline int i8042_pnp_init(void) { return 0; }
+ static inline void i8042_pnp_exit(void) { }
+ #endif /* CONFIG_PNP */
++
++#ifdef CONFIG_X86
++static void __init i8042_check_quirks(void)
++{
++      const struct dmi_system_id *device_quirk_info;
++      uintptr_t quirks;
++
++      device_quirk_info = dmi_first_match(i8042_dmi_quirk_table);
++      if (!device_quirk_info)
++              return;
++
++      quirks = (uintptr_t)device_quirk_info->driver_data;
++
++      if (quirks & SERIO_QUIRK_NOKBD)
++              i8042_nokbd = true;
++      if (quirks & SERIO_QUIRK_NOAUX)
++              i8042_noaux = true;
++      if (quirks & SERIO_QUIRK_NOMUX)
++              i8042_nomux = true;
++      if (quirks & SERIO_QUIRK_FORCEMUX)
++              i8042_nomux = false;
++      if (quirks & SERIO_QUIRK_UNLOCK)
++              i8042_unlock = true;
++      if (quirks & SERIO_QUIRK_PROBE_DEFER)
++              i8042_probe_defer = true;
++      /* Honor module parameter when value is not default */
++      if (i8042_reset == I8042_RESET_DEFAULT) {
++              if (quirks & SERIO_QUIRK_RESET_ALWAYS)
++                      i8042_reset = I8042_RESET_ALWAYS;
++              if (quirks & SERIO_QUIRK_RESET_NEVER)
++                      i8042_reset = I8042_RESET_NEVER;
++      }
++      if (quirks & SERIO_QUIRK_DIECT)
++              i8042_direct = true;
++      if (quirks & SERIO_QUIRK_DUMBKBD)
++              i8042_dumbkbd = true;
++      if (quirks & SERIO_QUIRK_NOLOOP)
++              i8042_noloop = true;
++      if (quirks & SERIO_QUIRK_NOTIMEOUT)
++              i8042_notimeout = true;
++      if (quirks & SERIO_QUIRK_KBDRESET)
++              i8042_kbdreset = true;
++      if (quirks & SERIO_QUIRK_DRITEK)
++              i8042_dritek = true;
++#ifdef CONFIG_PNP
++      if (quirks & SERIO_QUIRK_NOPNP)
++              i8042_nopnp = true;
++#endif
++}
++#else
++static inline void i8042_check_quirks(void) {}
++#endif
++
+ static int __init i8042_platform_init(void)
+ {
+       int retval;
+@@ -1297,45 +1415,17 @@ static int __init i8042_platform_init(void)
+       i8042_kbd_irq = I8042_MAP_IRQ(1);
+       i8042_aux_irq = I8042_MAP_IRQ(12);
+-      retval = i8042_pnp_init();
+-      if (retval)
+-              return retval;
+-
+ #if defined(__ia64__)
+-        i8042_reset = I8042_RESET_ALWAYS;
++      i8042_reset = I8042_RESET_ALWAYS;
+ #endif
+-#ifdef CONFIG_X86
+-      /* Honor module parameter when value is not default */
+-      if (i8042_reset == I8042_RESET_DEFAULT) {
+-              if (dmi_check_system(i8042_dmi_reset_table))
+-                      i8042_reset = I8042_RESET_ALWAYS;
+-
+-              if (dmi_check_system(i8042_dmi_noselftest_table))
+-                      i8042_reset = I8042_RESET_NEVER;
+-      }
+-
+-      if (dmi_check_system(i8042_dmi_noloop_table))
+-              i8042_noloop = true;
+-
+-      if (dmi_check_system(i8042_dmi_nomux_table))
+-              i8042_nomux = true;
+-
+-      if (dmi_check_system(i8042_dmi_forcemux_table))
+-              i8042_nomux = false;
+-
+-      if (dmi_check_system(i8042_dmi_notimeout_table))
+-              i8042_notimeout = true;
+-
+-      if (dmi_check_system(i8042_dmi_dritek_table))
+-              i8042_dritek = true;
+-
+-      if (dmi_check_system(i8042_dmi_kbdreset_table))
+-              i8042_kbdreset = true;
++      i8042_check_quirks();
+-      if (dmi_check_system(i8042_dmi_probe_defer_table))
+-              i8042_probe_defer = true;
++      retval = i8042_pnp_init();
++      if (retval)
++              return retval;
++#ifdef CONFIG_X86
+       /*
+        * A20 was already enabled during early kernel init. But some buggy
+        * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
+-- 
+2.39.0
+
diff --git a/queue-5.10/input-i8042-move-__initconst-to-fix-code-styling-war.patch b/queue-5.10/input-i8042-move-__initconst-to-fix-code-styling-war.patch
new file mode 100644 (file)
index 0000000..380e390
--- /dev/null
@@ -0,0 +1,38 @@
+From 22d982aed31818dea5035b4cc6d2c33eb08f9bca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Jun 2022 17:34:42 -0700
+Subject: Input: i8042 - move __initconst to fix code styling warning
+
+From: Werner Sembach <wse@tuxedocomputers.com>
+
+[ Upstream commit 95a9916c909f0b1d95e24b4232b4bc38ff755415 ]
+
+Move __intconst from before i8042_dmi_laptop_table[] to after it for
+consistent code styling.
+
+Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Link: https://lore.kernel.org/r/20220629112725.12922-2-wse@tuxedocomputers.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Stable-dep-of: 9c445d2637c9 ("Input: i8042 - add Clevo PCX0DX to i8042 quirk table")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/serio/i8042-x86ia64io.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 148a7c5fd0e2..91c6f24b4837 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -791,7 +791,7 @@ static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {
+       { }
+ };
+-static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = {
++static const struct dmi_system_id i8042_dmi_laptop_table[] __initconst = {
+       {
+               .matches = {
+                       DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
+-- 
+2.39.0
+
index 083285c4e889b0e5743156f0acdca9b77014619b..b26f1a1172cf075df6cee0d5274dd6367b3d156b 100644 (file)
@@ -40,3 +40,12 @@ scsi-iscsi_tcp-fix-uaf-during-login-when-accessing-t.patch
 i2c-rk3x-fix-a-bunch-of-kernel-doc-warnings.patch
 platform-x86-dell-wmi-add-a-keymap-for-key_mute-in-t.patch
 net-x25-fix-to-not-accept-on-connected-socket.patch
+iio-adc-stm32-dfsdm-fill-module-aliases.patch
+usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch
+usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch
+usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch
+vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch
+input-i8042-move-__initconst-to-fix-code-styling-war.patch
+input-i8042-merge-quirk-tables.patch
+input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch
+input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch
diff --git a/queue-5.10/usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch b/queue-5.10/usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch
new file mode 100644 (file)
index 0000000..918b750
--- /dev/null
@@ -0,0 +1,66 @@
+From 77ae541ac3d4120531f55fe63a83f5175ec5e6d6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 4 Jul 2021 02:33:12 +0100
+Subject: usb: dwc3: dwc3-qcom: Fix typo in the dwc3 vbus override API
+
+From: Wesley Cheng <wcheng@codeaurora.org>
+
+[ Upstream commit 8e6cb5d27e8246d9c986ec162d066a502d2b602b ]
+
+There was an extra character in the dwc3_qcom_vbus_override_enable()
+function.  Removed the extra character.
+
+Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
+Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20210704013314.200951-2-bryan.odonoghue@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: eb320f76e31d ("usb: dwc3: qcom: enable vbus override when in OTG dr-mode")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/dwc3-qcom.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
+index 528e36cc58ea..c2662e3a5b84 100644
+--- a/drivers/usb/dwc3/dwc3-qcom.c
++++ b/drivers/usb/dwc3/dwc3-qcom.c
+@@ -115,7 +115,7 @@ static inline void dwc3_qcom_clrbits(void __iomem *base, u32 offset, u32 val)
+       readl(base + offset);
+ }
+-static void dwc3_qcom_vbus_overrride_enable(struct dwc3_qcom *qcom, bool enable)
++static void dwc3_qcom_vbus_override_enable(struct dwc3_qcom *qcom, bool enable)
+ {
+       if (enable) {
+               dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_SS_PHY_CTRL,
+@@ -136,7 +136,7 @@ static int dwc3_qcom_vbus_notifier(struct notifier_block *nb,
+       struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, vbus_nb);
+       /* enable vbus override for device mode */
+-      dwc3_qcom_vbus_overrride_enable(qcom, event);
++      dwc3_qcom_vbus_override_enable(qcom, event);
+       qcom->mode = event ? USB_DR_MODE_PERIPHERAL : USB_DR_MODE_HOST;
+       return NOTIFY_DONE;
+@@ -148,7 +148,7 @@ static int dwc3_qcom_host_notifier(struct notifier_block *nb,
+       struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, host_nb);
+       /* disable vbus override in host mode */
+-      dwc3_qcom_vbus_overrride_enable(qcom, !event);
++      dwc3_qcom_vbus_override_enable(qcom, !event);
+       qcom->mode = event ? USB_DR_MODE_HOST : USB_DR_MODE_PERIPHERAL;
+       return NOTIFY_DONE;
+@@ -833,7 +833,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
+       /* enable vbus override for device mode */
+       if (qcom->mode == USB_DR_MODE_PERIPHERAL)
+-              dwc3_qcom_vbus_overrride_enable(qcom, true);
++              dwc3_qcom_vbus_override_enable(qcom, true);
+       /* register extcon to override sw_vbus on Vbus change later */
+       ret = dwc3_qcom_register_extcon(qcom);
+-- 
+2.39.0
+
diff --git a/queue-5.10/usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch b/queue-5.10/usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch
new file mode 100644 (file)
index 0000000..a856891
--- /dev/null
@@ -0,0 +1,39 @@
+From 7d93782aaf3f8bc071f6b82e260d22f61f82ffed Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Jan 2023 09:31:21 +0100
+Subject: usb: dwc3: qcom: enable vbus override when in OTG dr-mode
+
+From: Neil Armstrong <neil.armstrong@linaro.org>
+
+[ Upstream commit eb320f76e31dc835b9f57f04af1a2353b13bb7d8 ]
+
+With vbus override enabled when in OTG dr_mode, Host<->Peripheral
+switch now works on SM8550, otherwise the DWC3 seems to be stuck
+in Host mode only.
+
+Fixes: a4333c3a6ba9 ("usb: dwc3: Add Qualcomm DWC3 glue driver")
+Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
+Link: https://lore.kernel.org/r/20230123-topic-sm8550-upstream-dwc3-qcom-otg-v2-1-2d400e598463@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/dwc3-qcom.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
+index c2662e3a5b84..dac13fe97811 100644
+--- a/drivers/usb/dwc3/dwc3-qcom.c
++++ b/drivers/usb/dwc3/dwc3-qcom.c
+@@ -832,7 +832,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
+       qcom->mode = usb_get_dr_mode(&qcom->dwc3->dev);
+       /* enable vbus override for device mode */
+-      if (qcom->mode == USB_DR_MODE_PERIPHERAL)
++      if (qcom->mode != USB_DR_MODE_HOST)
+               dwc3_qcom_vbus_override_enable(qcom, true);
+       /* register extcon to override sw_vbus on Vbus change later */
+-- 
+2.39.0
+
diff --git a/queue-5.10/usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch b/queue-5.10/usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch
new file mode 100644 (file)
index 0000000..a2e0fb0
--- /dev/null
@@ -0,0 +1,45 @@
+From 011c7f14a336abfabb40828d0eae02a48c86baea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Jan 2023 14:41:49 +0530
+Subject: usb: gadget: f_fs: Fix unbalanced spinlock in __ffs_ep0_queue_wait
+
+From: Udipto Goswami <quic_ugoswami@quicinc.com>
+
+[ Upstream commit 921deb9da15851425ccbb6ee409dc2fd8fbdfe6b ]
+
+__ffs_ep0_queue_wait executes holding the spinlock of &ffs->ev.waitq.lock
+and unlocks it after the assignments to usb_request are done.
+However in the code if the request is already NULL we bail out returning
+-EINVAL but never unlocked the spinlock.
+
+Fix this by adding spin_unlock_irq &ffs->ev.waitq.lock before returning.
+
+Fixes: 6a19da111057 ("usb: gadget: f_fs: Prevent race during ffs_ep0_queue_wait")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Udipto Goswami <quic_ugoswami@quicinc.com>
+Link: https://lore.kernel.org/r/20230124091149.18647-1-quic_ugoswami@quicinc.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/function/f_fs.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
+index 94000fd190e5..8c48c9f801be 100644
+--- a/drivers/usb/gadget/function/f_fs.c
++++ b/drivers/usb/gadget/function/f_fs.c
+@@ -278,8 +278,10 @@ static int __ffs_ep0_queue_wait(struct ffs_data *ffs, char *data, size_t len)
+       struct usb_request *req = ffs->ep0req;
+       int ret;
+-      if (!req)
++      if (!req) {
++              spin_unlock_irq(&ffs->ev.waitq.lock);
+               return -EINVAL;
++      }
+       req->zero     = len < le16_to_cpu(ffs->ev.setup.wLength);
+-- 
+2.39.0
+
diff --git a/queue-5.10/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch b/queue-5.10/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch
new file mode 100644 (file)
index 0000000..c0f1738
--- /dev/null
@@ -0,0 +1,122 @@
+From 263a090d7efd538319a927c43e0ec0befabbb98f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Jan 2023 11:16:54 -0500
+Subject: vc_screen: move load of struct vc_data pointer in vcs_read() to avoid
+ UAF
+
+From: George Kennedy <george.kennedy@oracle.com>
+
+[ Upstream commit 226fae124b2dac217ea5436060d623ff3385bc34 ]
+
+After a call to console_unlock() in vcs_read() the vc_data struct can be
+freed by vc_deallocate(). Because of that, the struct vc_data pointer
+load must be done at the top of while loop in vcs_read() to avoid a UAF
+when vcs_size() is called.
+
+Syzkaller reported a UAF in vcs_size().
+
+BUG: KASAN: use-after-free in vcs_size (drivers/tty/vt/vc_screen.c:215)
+Read of size 4 at addr ffff8881137479a8 by task 4a005ed81e27e65/1537
+
+CPU: 0 PID: 1537 Comm: 4a005ed81e27e65 Not tainted 6.2.0-rc5 #1
+Hardware name: Red Hat KVM, BIOS 1.15.0-2.module
+Call Trace:
+  <TASK>
+__asan_report_load4_noabort (mm/kasan/report_generic.c:350)
+vcs_size (drivers/tty/vt/vc_screen.c:215)
+vcs_read (drivers/tty/vt/vc_screen.c:415)
+vfs_read (fs/read_write.c:468 fs/read_write.c:450)
+...
+  </TASK>
+
+Allocated by task 1191:
+...
+kmalloc_trace (mm/slab_common.c:1069)
+vc_allocate (./include/linux/slab.h:580 ./include/linux/slab.h:720
+     drivers/tty/vt/vt.c:1128 drivers/tty/vt/vt.c:1108)
+con_install (drivers/tty/vt/vt.c:3383)
+tty_init_dev (drivers/tty/tty_io.c:1301 drivers/tty/tty_io.c:1413
+     drivers/tty/tty_io.c:1390)
+tty_open (drivers/tty/tty_io.c:2080 drivers/tty/tty_io.c:2126)
+chrdev_open (fs/char_dev.c:415)
+do_dentry_open (fs/open.c:883)
+vfs_open (fs/open.c:1014)
+...
+
+Freed by task 1548:
+...
+kfree (mm/slab_common.c:1021)
+vc_port_destruct (drivers/tty/vt/vt.c:1094)
+tty_port_destructor (drivers/tty/tty_port.c:296)
+tty_port_put (drivers/tty/tty_port.c:312)
+vt_disallocate_all (drivers/tty/vt/vt_ioctl.c:662 (discriminator 2))
+vt_ioctl (drivers/tty/vt/vt_ioctl.c:903)
+tty_ioctl (drivers/tty/tty_io.c:2776)
+...
+
+The buggy address belongs to the object at ffff888113747800
+  which belongs to the cache kmalloc-1k of size 1024
+The buggy address is located 424 bytes inside of
+  1024-byte region [ffff888113747800, ffff888113747c00)
+
+The buggy address belongs to the physical page:
+page:00000000b3fe6c7c refcount:1 mapcount:0 mapping:0000000000000000
+     index:0x0 pfn:0x113740
+head:00000000b3fe6c7c order:3 compound_mapcount:0 subpages_mapcount:0
+     compound_pincount:0
+anon flags: 0x17ffffc0010200(slab|head|node=0|zone=2|lastcpupid=0x1fffff)
+raw: 0017ffffc0010200 ffff888100042dc0 0000000000000000 dead000000000001
+raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000
+page dumped because: kasan: bad access detected
+
+Memory state around the buggy address:
+  ffff888113747880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+  ffff888113747900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+> ffff888113747980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+                                   ^
+  ffff888113747a00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+  ffff888113747a80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+==================================================================
+Disabling lock debugging due to kernel taint
+
+Fixes: ac751efa6a0d ("console: rename acquire/release_console_sem() to console_lock/unlock()")
+Reported-by: syzkaller <syzkaller@googlegroups.com>
+Suggested-by: Jiri Slaby <jirislaby@kernel.org>
+Signed-off-by: George Kennedy <george.kennedy@oracle.com>
+Link: https://lore.kernel.org/r/1674577014-12374-1-git-send-email-george.kennedy@oracle.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/vt/vc_screen.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/tty/vt/vc_screen.c b/drivers/tty/vt/vc_screen.c
+index 1850bacdb5b0..f566eb1839dc 100644
+--- a/drivers/tty/vt/vc_screen.c
++++ b/drivers/tty/vt/vc_screen.c
+@@ -386,10 +386,6 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
+       uni_mode = use_unicode(inode);
+       attr = use_attributes(inode);
+-      ret = -ENXIO;
+-      vc = vcs_vc(inode, &viewed);
+-      if (!vc)
+-              goto unlock_out;
+       ret = -EINVAL;
+       if (pos < 0)
+@@ -407,6 +403,11 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
+               unsigned int this_round, skip = 0;
+               int size;
++              ret = -ENXIO;
++              vc = vcs_vc(inode, &viewed);
++              if (!vc)
++                      goto unlock_out;
++
+               /* Check whether we are above size each round,
+                * as copy_to_user at the end of this loop
+                * could sleep.
+-- 
+2.39.0
+