]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Tue, 7 Feb 2023 03:15:38 +0000 (22:15 -0500)
committerSasha Levin <sashal@kernel.org>
Tue, 7 Feb 2023 03:15:38 +0000 (22:15 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
15 files changed:
queue-4.19/iio-adc-stm32-dfsdm-fill-module-aliases.patch [new file with mode: 0644]
queue-4.19/input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch [new file with mode: 0644]
queue-4.19/input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch [new file with mode: 0644]
queue-4.19/input-i8042-merge-quirk-tables.patch [new file with mode: 0644]
queue-4.19/input-i8042-move-__initconst-to-fix-code-styling-war.patch [new file with mode: 0644]
queue-4.19/kvm-vmx-move-caching-of-msr_ia32_xss-to-hardware_set.patch [new file with mode: 0644]
queue-4.19/kvm-vmx-move-vmx-specific-files-to-a-vmx-subdirector.patch [new file with mode: 0644]
queue-4.19/kvm-x86-vmx-do-not-skip-segment-attributes-if-unusab.patch [new file with mode: 0644]
queue-4.19/nvmx-x86-check-vmx-preemption-timer-controls-on-vmen.patch [new file with mode: 0644]
queue-4.19/series
queue-4.19/thermal-intel-int340x-protect-trip-temperature-from-.patch [new file with mode: 0644]
queue-4.19/usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch [new file with mode: 0644]
queue-4.19/usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch [new file with mode: 0644]
queue-4.19/usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch [new file with mode: 0644]
queue-4.19/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch [new file with mode: 0644]

diff --git a/queue-4.19/iio-adc-stm32-dfsdm-fill-module-aliases.patch b/queue-4.19/iio-adc-stm32-dfsdm-fill-module-aliases.patch
new file mode 100644 (file)
index 0000000..cb3d52e
--- /dev/null
@@ -0,0 +1,37 @@
+From 6655fb4c3eced46339b22bd54f2fc13d0e564ee0 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 1c492a7f4587..bb90b22b809c 100644
+--- a/drivers/iio/adc/stm32-dfsdm-adc.c
++++ b/drivers/iio/adc/stm32-dfsdm-adc.c
+@@ -1099,6 +1099,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-4.19/input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch b/queue-4.19/input-i8042-add-clevo-pcx0dx-to-i8042-quirk-table.patch
new file mode 100644 (file)
index 0000000..a0c74ea
--- /dev/null
@@ -0,0 +1,44 @@
+From 4ad372ba9ed146f9741b8eb326a186ef0a06f470 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 95968a2d14cc..b2ab20c16cc7 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -1173,6 +1173,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-4.19/input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch b/queue-4.19/input-i8042-add-tuxedo-devices-to-i8042-quirk-tables.patch
new file mode 100644 (file)
index 0000000..e73bfe9
--- /dev/null
@@ -0,0 +1,187 @@
+From 456cebe32789c571a13e78d2edfb9a3c8e2c94c8 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 7f9714830262..95968a2d14cc 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -1029,6 +1029,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 = {
+@@ -1058,6 +1081,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-4.19/input-i8042-merge-quirk-tables.patch b/queue-4.19/input-i8042-merge-quirk-tables.patch
new file mode 100644 (file)
index 0000000..b2ebc5b
--- /dev/null
@@ -0,0 +1,1653 @@
+From 7b7566481c41c80090999fde79d27c23585c47b4 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 27405c8d850a..7f9714830262 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -71,654 +71,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 */
+@@ -726,6 +807,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 */
+@@ -733,13 +815,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 */
+@@ -747,275 +823,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 */
+@@ -1170,11 +1240,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;
+@@ -1278,6 +1343,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;
+@@ -1300,45 +1418,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-4.19/input-i8042-move-__initconst-to-fix-code-styling-war.patch b/queue-4.19/input-i8042-move-__initconst-to-fix-code-styling-war.patch
new file mode 100644 (file)
index 0000000..75cb523
--- /dev/null
@@ -0,0 +1,38 @@
+From 4e4011015cd2be713d0a4310b92efff05170464d 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 ee0b0a7237ad..27405c8d850a 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -795,7 +795,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
+
diff --git a/queue-4.19/kvm-vmx-move-caching-of-msr_ia32_xss-to-hardware_set.patch b/queue-4.19/kvm-vmx-move-caching-of-msr_ia32_xss-to-hardware_set.patch
new file mode 100644 (file)
index 0000000..5665e56
--- /dev/null
@@ -0,0 +1,48 @@
+From 5ae9240c33846ae0c566bab68fd366a154218688 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Dec 2018 13:52:59 -0800
+Subject: KVM: VMX: Move caching of MSR_IA32_XSS to hardware_setup()
+
+From: Sean Christopherson <sean.j.christopherson@intel.com>
+
+[ Upstream commit 71d9409e20934e16f2d2ea88f0d1fb9851a7da3b ]
+
+MSR_IA32_XSS has no relation to the VMCS whatsoever, it doesn't belong
+in setup_vmcs_config() and its reference to host_xss prevents moving
+setup_vmcs_config() to a dedicated file.
+
+Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Stable-dep-of: a44b331614e6 ("KVM: x86/vmx: Do not skip segment attributes if unusable bit is set")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kvm/vmx/vmx.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
+index f8ad29968e85..5c4d2758b1d9 100644
+--- a/arch/x86/kvm/vmx/vmx.c
++++ b/arch/x86/kvm/vmx/vmx.c
+@@ -4740,9 +4740,6 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
+               }
+       }
+-      if (boot_cpu_has(X86_FEATURE_XSAVES))
+-              rdmsrl(MSR_IA32_XSS, host_xss);
+-
+       return 0;
+ }
+@@ -7957,6 +7954,9 @@ static __init int hardware_setup(void)
+               WARN_ONCE(host_bndcfgs, "KVM: BNDCFGS in host will be lost");
+       }
++      if (boot_cpu_has(X86_FEATURE_XSAVES))
++              rdmsrl(MSR_IA32_XSS, host_xss);
++
+       if (!cpu_has_vmx_vpid() || !cpu_has_vmx_invvpid() ||
+               !(cpu_has_vmx_invvpid_single() || cpu_has_vmx_invvpid_global()))
+               enable_vpid = 0;
+-- 
+2.39.0
+
diff --git a/queue-4.19/kvm-vmx-move-vmx-specific-files-to-a-vmx-subdirector.patch b/queue-4.19/kvm-vmx-move-vmx-specific-files-to-a-vmx-subdirector.patch
new file mode 100644 (file)
index 0000000..ef2915f
--- /dev/null
@@ -0,0 +1,60 @@
+From e86996641b795793f2333a388e3c612d21a60518 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Dec 2018 13:52:56 -0800
+Subject: KVM: VMX: Move VMX specific files to a "vmx" subdirectory
+
+From: Sean Christopherson <sean.j.christopherson@intel.com>
+
+[ Upstream commit a821bab2d1ee869e04b218b198837bf07f2d27c1 ]
+
+...to prepare for shattering vmx.c into multiple files without having
+to prepend "vmx_" to all new files.
+
+Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Stable-dep-of: a44b331614e6 ("KVM: x86/vmx: Do not skip segment attributes if unusable bit is set")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kvm/Makefile                      | 2 +-
+ arch/x86/kvm/{ => vmx}/pmu_intel.c         | 0
+ arch/x86/kvm/{ => vmx}/vmx.c               | 0
+ arch/x86/kvm/{ => vmx}/vmx_evmcs.h         | 0
+ arch/x86/kvm/{ => vmx}/vmx_shadow_fields.h | 0
+ 5 files changed, 1 insertion(+), 1 deletion(-)
+ rename arch/x86/kvm/{ => vmx}/pmu_intel.c (100%)
+ rename arch/x86/kvm/{ => vmx}/vmx.c (100%)
+ rename arch/x86/kvm/{ => vmx}/vmx_evmcs.h (100%)
+ rename arch/x86/kvm/{ => vmx}/vmx_shadow_fields.h (100%)
+
+diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile
+index dc4f2fdf5e57..13fd54de5449 100644
+--- a/arch/x86/kvm/Makefile
++++ b/arch/x86/kvm/Makefile
+@@ -16,7 +16,7 @@ kvm-y                        += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \
+                          i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \
+                          hyperv.o page_track.o debugfs.o
+-kvm-intel-y           += vmx.o pmu_intel.o
++kvm-intel-y           += vmx/vmx.o vmx/pmu_intel.o
+ kvm-amd-y             += svm.o pmu_amd.o
+ obj-$(CONFIG_KVM)     += kvm.o
+diff --git a/arch/x86/kvm/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
+similarity index 100%
+rename from arch/x86/kvm/pmu_intel.c
+rename to arch/x86/kvm/vmx/pmu_intel.c
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx/vmx.c
+similarity index 100%
+rename from arch/x86/kvm/vmx.c
+rename to arch/x86/kvm/vmx/vmx.c
+diff --git a/arch/x86/kvm/vmx_evmcs.h b/arch/x86/kvm/vmx/vmx_evmcs.h
+similarity index 100%
+rename from arch/x86/kvm/vmx_evmcs.h
+rename to arch/x86/kvm/vmx/vmx_evmcs.h
+diff --git a/arch/x86/kvm/vmx_shadow_fields.h b/arch/x86/kvm/vmx/vmx_shadow_fields.h
+similarity index 100%
+rename from arch/x86/kvm/vmx_shadow_fields.h
+rename to arch/x86/kvm/vmx/vmx_shadow_fields.h
+-- 
+2.39.0
+
diff --git a/queue-4.19/kvm-x86-vmx-do-not-skip-segment-attributes-if-unusab.patch b/queue-4.19/kvm-x86-vmx-do-not-skip-segment-attributes-if-unusab.patch
new file mode 100644 (file)
index 0000000..1f6a8b8
--- /dev/null
@@ -0,0 +1,91 @@
+From 8d5ec3063609eada0cbc79f51a7702bbf3daff29 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 14 Nov 2022 16:48:23 +0000
+Subject: KVM: x86/vmx: Do not skip segment attributes if unusable bit is set
+
+From: Hendrik Borghorst <hborghor@amazon.de>
+
+[ Upstream commit a44b331614e6f7e63902ed7dff7adc8c85edd8bc ]
+
+When serializing and deserializing kvm_sregs, attributes of the segment
+descriptors are stored by user space. For unusable segments,
+vmx_segment_access_rights skips all attributes and sets them to 0.
+
+This means we zero out the DPL (Descriptor Privilege Level) for unusable
+entries.
+
+Unusable segments are - contrary to their name - usable in 64bit mode and
+are used by guests to for example create a linear map through the
+NULL selector.
+
+VMENTER checks if SS.DPL is correct depending on the CS segment type.
+For types 9 (Execute Only) and 11 (Execute Read), CS.DPL must be equal to
+SS.DPL [1].
+
+We have seen real world guests setting CS to a usable segment with DPL=3
+and SS to an unusable segment with DPL=3. Once we go through an sregs
+get/set cycle, SS.DPL turns to 0. This causes the virtual machine to crash
+reproducibly.
+
+This commit changes the attribute logic to always preserve attributes for
+unusable segments. According to [2] SS.DPL is always saved on VM exits,
+regardless of the unusable bit so user space applications should have saved
+the information on serialization correctly.
+
+[3] specifies that besides SS.DPL the rest of the attributes of the
+descriptors are undefined after VM entry if unusable bit is set. So, there
+should be no harm in setting them all to the previous state.
+
+[1] Intel SDM Vol 3C 26.3.1.2 Checks on Guest Segment Registers
+[2] Intel SDM Vol 3C 27.3.2 Saving Segment Registers and Descriptor-Table
+Registers
+[3] Intel SDM Vol 3C 26.3.2.2 Loading Guest Segment Registers and
+Descriptor-Table Registers
+
+Cc: Alexander Graf <graf@amazon.de>
+Cc: stable@vger.kernel.org
+Signed-off-by: Hendrik Borghorst <hborghor@amazon.de>
+Reviewed-by: Jim Mattson <jmattson@google.com>
+Reviewed-by: Alexander Graf <graf@amazon.com>
+Message-Id: <20221114164823.69555-1-hborghor@amazon.de>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kvm/vmx/vmx.c | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
+index 5c4d2758b1d9..ec821a5d131a 100644
+--- a/arch/x86/kvm/vmx/vmx.c
++++ b/arch/x86/kvm/vmx/vmx.c
+@@ -5521,18 +5521,15 @@ static u32 vmx_segment_access_rights(struct kvm_segment *var)
+ {
+       u32 ar;
+-      if (var->unusable || !var->present)
+-              ar = 1 << 16;
+-      else {
+-              ar = var->type & 15;
+-              ar |= (var->s & 1) << 4;
+-              ar |= (var->dpl & 3) << 5;
+-              ar |= (var->present & 1) << 7;
+-              ar |= (var->avl & 1) << 12;
+-              ar |= (var->l & 1) << 13;
+-              ar |= (var->db & 1) << 14;
+-              ar |= (var->g & 1) << 15;
+-      }
++      ar = var->type & 15;
++      ar |= (var->s & 1) << 4;
++      ar |= (var->dpl & 3) << 5;
++      ar |= (var->present & 1) << 7;
++      ar |= (var->avl & 1) << 12;
++      ar |= (var->l & 1) << 13;
++      ar |= (var->db & 1) << 14;
++      ar |= (var->g & 1) << 15;
++      ar |= (var->unusable || !var->present) << 16;
+       return ar;
+ }
+-- 
+2.39.0
+
diff --git a/queue-4.19/nvmx-x86-check-vmx-preemption-timer-controls-on-vmen.patch b/queue-4.19/nvmx-x86-check-vmx-preemption-timer-controls-on-vmen.patch
new file mode 100644 (file)
index 0000000..fc41eea
--- /dev/null
@@ -0,0 +1,56 @@
+From aefe920482dc9da233499ff56187e9feabb136e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 1 Nov 2018 01:21:58 -0400
+Subject: nVMX x86: Check VMX-preemption timer controls on vmentry of L2 guests
+
+From: Krish Sadhukhan <krish.sadhukhan@oracle.com>
+
+[ Upstream commit 14aa61d0a9eb3ddad06c3a0033f88b5fa7f05613 ]
+
+According to section "Checks on VMX Controls" in Intel SDM vol 3C, the
+following check needs to be enforced on vmentry of L2 guests:
+
+    If the "activate VMX-preemption timer" VM-execution control is 0, the
+    the "save VMX-preemption timer value" VM-exit control must also be 0.
+
+Signed-off-by: Krish Sadhukhan <krish.sadhukhan@oracle.com>
+Reviewed-by: Mihai Carabas <mihai.carabas@oracle.com>
+Reviewed-by: Liran Alon <liran.alon@oracle.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Stable-dep-of: a44b331614e6 ("KVM: x86/vmx: Do not skip segment attributes if unusable bit is set")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kvm/vmx.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 9bb696d7300c..f8ad29968e85 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -2062,6 +2062,12 @@ static inline bool nested_cpu_has_shadow_vmcs(struct vmcs12 *vmcs12)
+       return nested_cpu_has2(vmcs12, SECONDARY_EXEC_SHADOW_VMCS);
+ }
++static inline bool nested_cpu_has_save_preemption_timer(struct vmcs12 *vmcs12)
++{
++      return vmcs12->vm_exit_controls &
++          VM_EXIT_SAVE_VMX_PREEMPTION_TIMER;
++}
++
+ static inline bool is_nmi(u32 intr_info)
+ {
+       return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK))
+@@ -12609,6 +12615,10 @@ static int check_vmentry_prereqs(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
+       if (nested_vmx_check_msr_switch_controls(vcpu, vmcs12))
+               return VMXERR_ENTRY_INVALID_CONTROL_FIELD;
++      if (!nested_cpu_has_preemption_timer(vmcs12) &&
++          nested_cpu_has_save_preemption_timer(vmcs12))
++              return VMXERR_ENTRY_INVALID_CONTROL_FIELD;
++
+       if (nested_vmx_check_pml_controls(vcpu, vmcs12))
+               return VMXERR_ENTRY_INVALID_CONTROL_FIELD;
+-- 
+2.39.0
+
index 3ce93b0054ca8297316c27737bf3223234ab24c8..b74649129effb26c04bef18cb38f96a672dcc3af 100644 (file)
@@ -9,3 +9,17 @@ scsi-target-core-fix-warning-on-rt-kernels.patch
 scsi-iscsi_tcp-fix-uaf-during-login-when-accessing-t.patch
 i2c-rk3x-fix-a-bunch-of-kernel-doc-warnings.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
+nvmx-x86-check-vmx-preemption-timer-controls-on-vmen.patch
+kvm-vmx-move-vmx-specific-files-to-a-vmx-subdirector.patch
+kvm-vmx-move-caching-of-msr_ia32_xss-to-hardware_set.patch
+kvm-x86-vmx-do-not-skip-segment-attributes-if-unusab.patch
+thermal-intel-int340x-protect-trip-temperature-from-.patch
diff --git a/queue-4.19/thermal-intel-int340x-protect-trip-temperature-from-.patch b/queue-4.19/thermal-intel-int340x-protect-trip-temperature-from-.patch
new file mode 100644 (file)
index 0000000..7eb4a98
--- /dev/null
@@ -0,0 +1,125 @@
+From a88e15909e822faedef7160f604db526073c60cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 23 Jan 2023 09:21:10 -0800
+Subject: thermal: intel: int340x: Protect trip temperature from concurrent
+ updates
+
+From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+
+[ Upstream commit 6757a7abe47bcb12cb2d45661067e182424b0ee3 ]
+
+Trip temperatures are read using ACPI methods and stored in the memory
+during zone initializtion and when the firmware sends a notification for
+change. This trip temperature is returned when the thermal core calls via
+callback get_trip_temp().
+
+But it is possible that while updating the memory copy of the trips when
+the firmware sends a notification for change, thermal core is reading the
+trip temperature via the callback get_trip_temp(). This may return invalid
+trip temperature.
+
+To address this add a mutex to protect the invalid temperature reads in
+the callback get_trip_temp() and int340x_thermal_read_trips().
+
+Fixes: 5fbf7f27fa3d ("Thermal/int340x: Add common thermal zone handler")
+Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+Cc: 5.0+ <stable@vger.kernel.org> # 5.0+
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../int340x_thermal/int340x_thermal_zone.c     | 18 +++++++++++++++---
+ .../int340x_thermal/int340x_thermal_zone.h     |  1 +
+ 2 files changed, 16 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/thermal/int340x_thermal/int340x_thermal_zone.c b/drivers/thermal/int340x_thermal/int340x_thermal_zone.c
+index 9ec27ac1856b..d3829308560c 100644
+--- a/drivers/thermal/int340x_thermal/int340x_thermal_zone.c
++++ b/drivers/thermal/int340x_thermal/int340x_thermal_zone.c
+@@ -52,11 +52,13 @@ static int int340x_thermal_get_trip_temp(struct thermal_zone_device *zone,
+                                        int trip, int *temp)
+ {
+       struct int34x_thermal_zone *d = zone->devdata;
+-      int i;
++      int i, ret = 0;
+       if (d->override_ops && d->override_ops->get_trip_temp)
+               return d->override_ops->get_trip_temp(zone, trip, temp);
++      mutex_lock(&d->trip_mutex);
++
+       if (trip < d->aux_trip_nr)
+               *temp = d->aux_trips[trip];
+       else if (trip == d->crt_trip_id)
+@@ -74,10 +76,12 @@ static int int340x_thermal_get_trip_temp(struct thermal_zone_device *zone,
+                       }
+               }
+               if (i == INT340X_THERMAL_MAX_ACT_TRIP_COUNT)
+-                      return -EINVAL;
++                      ret = -EINVAL;
+       }
+-      return 0;
++      mutex_unlock(&d->trip_mutex);
++
++      return ret;
+ }
+ static int int340x_thermal_get_trip_type(struct thermal_zone_device *zone,
+@@ -182,6 +186,8 @@ int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone)
+       int trip_cnt = int34x_zone->aux_trip_nr;
+       int i;
++      mutex_lock(&int34x_zone->trip_mutex);
++
+       int34x_zone->crt_trip_id = -1;
+       if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_CRT",
+                                            &int34x_zone->crt_temp))
+@@ -209,6 +215,8 @@ int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone)
+               int34x_zone->act_trips[i].valid = true;
+       }
++      mutex_unlock(&int34x_zone->trip_mutex);
++
+       return trip_cnt;
+ }
+ EXPORT_SYMBOL_GPL(int340x_thermal_read_trips);
+@@ -232,6 +240,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
+       if (!int34x_thermal_zone)
+               return ERR_PTR(-ENOMEM);
++      mutex_init(&int34x_thermal_zone->trip_mutex);
++
+       int34x_thermal_zone->adev = adev;
+       int34x_thermal_zone->override_ops = override_ops;
+@@ -274,6 +284,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
+       acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
+       kfree(int34x_thermal_zone->aux_trips);
+ err_trip_alloc:
++      mutex_destroy(&int34x_thermal_zone->trip_mutex);
+       kfree(int34x_thermal_zone);
+       return ERR_PTR(ret);
+ }
+@@ -285,6 +296,7 @@ void int340x_thermal_zone_remove(struct int34x_thermal_zone
+       thermal_zone_device_unregister(int34x_thermal_zone->zone);
+       acpi_lpat_free_conversion_table(int34x_thermal_zone->lpat_table);
+       kfree(int34x_thermal_zone->aux_trips);
++      mutex_destroy(&int34x_thermal_zone->trip_mutex);
+       kfree(int34x_thermal_zone);
+ }
+ EXPORT_SYMBOL_GPL(int340x_thermal_zone_remove);
+diff --git a/drivers/thermal/int340x_thermal/int340x_thermal_zone.h b/drivers/thermal/int340x_thermal/int340x_thermal_zone.h
+index 5f3ba4775c5c..e74648e330c7 100644
+--- a/drivers/thermal/int340x_thermal/int340x_thermal_zone.h
++++ b/drivers/thermal/int340x_thermal/int340x_thermal_zone.h
+@@ -41,6 +41,7 @@ struct int34x_thermal_zone {
+       struct thermal_zone_device_ops *override_ops;
+       void *priv_data;
+       struct acpi_lpat_conversion_table *lpat_table;
++      struct mutex trip_mutex;
+ };
+ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *,
+-- 
+2.39.0
+
diff --git a/queue-4.19/usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch b/queue-4.19/usb-dwc3-dwc3-qcom-fix-typo-in-the-dwc3-vbus-overrid.patch
new file mode 100644 (file)
index 0000000..5af88dd
--- /dev/null
@@ -0,0 +1,66 @@
+From ef416770d34c38f75938a64d081b1aa926e5ac8e 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 9d5320562e81..07135be83593 100644
+--- a/drivers/usb/dwc3/dwc3-qcom.c
++++ b/drivers/usb/dwc3/dwc3-qcom.c
+@@ -85,7 +85,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,
+@@ -106,7 +106,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;
+@@ -118,7 +118,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;
+@@ -513,7 +513,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-4.19/usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch b/queue-4.19/usb-dwc3-qcom-enable-vbus-override-when-in-otg-dr-mo.patch
new file mode 100644 (file)
index 0000000..01cac67
--- /dev/null
@@ -0,0 +1,39 @@
+From 9c8df7b316f7f0d5bf0c122a0a614e015429063d 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 07135be83593..58e1bc3a77d8 100644
+--- a/drivers/usb/dwc3/dwc3-qcom.c
++++ b/drivers/usb/dwc3/dwc3-qcom.c
+@@ -512,7 +512,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-4.19/usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch b/queue-4.19/usb-gadget-f_fs-fix-unbalanced-spinlock-in-__ffs_ep0.patch
new file mode 100644 (file)
index 0000000..ac96ded
--- /dev/null
@@ -0,0 +1,45 @@
+From ef2767a4004ceca2ef709d57a6a4b977caeb8552 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 48bdb2a3972b..f9f324f76a72 100644
+--- a/drivers/usb/gadget/function/f_fs.c
++++ b/drivers/usb/gadget/function/f_fs.c
+@@ -271,8 +271,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-4.19/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch b/queue-4.19/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs.patch
new file mode 100644 (file)
index 0000000..5afec2d
--- /dev/null
@@ -0,0 +1,122 @@
+From 1d3455b2094ff80bc63e8a92a0398e0e67f74c2c 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 2fb509d57e88..03fe692d940b 100644
+--- a/drivers/tty/vt/vc_screen.c
++++ b/drivers/tty/vt/vc_screen.c
+@@ -247,10 +247,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)
+@@ -270,6 +266,11 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
+               ssize_t orig_count;
+               long p = pos;
++              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
+