From f2eb993d4763957befda8cf808957c1e0671ecee Mon Sep 17 00:00:00 2001 From: "Justin M. Forbes" Date: Thu, 17 Sep 2020 11:26:26 -0500 Subject: Linux v5.8.10 Signed-off-by: Justin M. Forbes --- pdx86-SW_TABLET_MODE-fixes.patch | 212 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 pdx86-SW_TABLET_MODE-fixes.patch (limited to 'pdx86-SW_TABLET_MODE-fixes.patch') diff --git a/pdx86-SW_TABLET_MODE-fixes.patch b/pdx86-SW_TABLET_MODE-fixes.patch new file mode 100644 index 000000000..3fa9f843c --- /dev/null +++ b/pdx86-SW_TABLET_MODE-fixes.patch @@ -0,0 +1,212 @@ +From 9126d28cf4e537ef5e77006c51b1a24ad8e8170b Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 11 Sep 2020 13:34:42 +0200 +Subject: [PATCH 1/2] platform/x86: intel-vbtn: Fix SW_TABLET_MODE always + reporting 1 on the HP Pavilion 11 x360 + +Commit cfae58ed681c ("platform/x86: intel-vbtn: Only blacklist +SW_TABLET_MODE on the 9 / "Laptop" chasis-type") restored SW_TABLET_MODE +reporting on the HP stream x360 11 series on which it was previously broken +by commit de9647efeaa9 ("platform/x86: intel-vbtn: Only activate tablet +mode switch on 2-in-1's"). + +It turns out that enabling SW_TABLET_MODE reporting on devices with a +chassis-type of 10 ("Notebook") causes SW_TABLET_MODE to always report 1 +at boot on the HP Pavilion 11 x360, which causes libinput to disable the +kbd and touchpad. + +The HP Pavilion 11 x360's ACPI VGBS method sets bit 4 instead of bit 6 when +NOT in tablet mode at boot. Inspecting all the DSDTs in my DSDT collection +shows only one other model, the Medion E1239T ever setting bit 4 and it +always sets this together with bit 6. + +So lets treat bit 4 as a second bit which when set indicates the device not +being in tablet-mode, as we already do for bit 6. + +While at it also prefix all VGBS constant defines with "VGBS_". + +Fixes: cfae58ed681c ("platform/x86: intel-vbtn: Only blacklist SW_TABLET_MODE on the 9 / "Laptop" chasis-type") +Signed-off-by: Hans de Goede +--- + drivers/platform/x86/intel-vbtn.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/platform/x86/intel-vbtn.c b/drivers/platform/x86/intel-vbtn.c +index e85d8e58320c..f443619e1e7e 100644 +--- a/drivers/platform/x86/intel-vbtn.c ++++ b/drivers/platform/x86/intel-vbtn.c +@@ -15,9 +15,13 @@ + #include + #include + ++/* Returned when NOT in tablet mode on some HP Stream x360 11 models */ ++#define VGBS_TABLET_MODE_FLAG_ALT 0x10 + /* When NOT in tablet mode, VGBS returns with the flag 0x40 */ +-#define TABLET_MODE_FLAG 0x40 +-#define DOCK_MODE_FLAG 0x80 ++#define VGBS_TABLET_MODE_FLAG 0x40 ++#define VGBS_DOCK_MODE_FLAG 0x80 ++ ++#define VGBS_TABLET_MODE_FLAGS (VGBS_TABLET_MODE_FLAG | VGBS_TABLET_MODE_FLAG_ALT) + + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("AceLan Kao"); +@@ -72,9 +76,9 @@ static void detect_tablet_mode(struct platform_device *device) + if (ACPI_FAILURE(status)) + return; + +- m = !(vgbs & TABLET_MODE_FLAG); ++ m = !(vgbs & VGBS_TABLET_MODE_FLAGS); + input_report_switch(priv->input_dev, SW_TABLET_MODE, m); +- m = (vgbs & DOCK_MODE_FLAG) ? 1 : 0; ++ m = (vgbs & VGBS_DOCK_MODE_FLAG) ? 1 : 0; + input_report_switch(priv->input_dev, SW_DOCK, m); + } + +-- +2.28.0 + +From d26d82852e926fee13b5fa71cc004da391aaa5e3 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 16 Sep 2020 16:14:39 +0200 +Subject: [PATCH 2/2] platform/x86: asus-wmi: Fix SW_TABLET_MODE always + reporting 1 on many different models +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit b0dbd97de1f1 ("platform/x86: asus-wmi: Add support for +SW_TABLET_MODE") added support for reporting SW_TABLET_MODE using the +Asus 0x00120063 WMI-device-id to see if various transformer models were +docked into their keyboard-dock (SW_TABLET_MODE=0) or if they were +being used as a tablet. + +The new SW_TABLET_MODE support (naively?) assumed that non Transformer +devices would either not support the 0x00120063 WMI-device-id at all, +or would NOT set ASUS_WMI_DSTS_PRESENCE_BIT in their reply when querying +the device-id. + +Unfortunately this is not true and we have received many bug reports about +this change causing the asus-wmi driver to always report SW_TABLET_MODE=1 +on non Transformer devices. This causes libinput to think that these are +360 degree hinges style 2-in-1s folded into tablet-mode. Making libinput +suppress keyboard and touchpad events from the builtin keyboard and +touchpad. So effectively this causes the keyboard and touchpad to not work +on many non Transformer Asus models. + +This commit fixes this by using the existing DMI based quirk mechanism in +asus-nb-wmi.c to allow using the 0x00120063 device-id for reporting +SW_TABLET_MODE on Transformer models and ignoring it on all other models. + +Fixes: b0dbd97de1f1 ("platform/x86: asus-wmi: Add support for SW_TABLET_MODE") +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=209011 +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1875339 +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1875828 +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1876997 +Reported-by: Samuel Čavoj +Signed-off-by: Hans de Goede +--- + drivers/platform/x86/asus-nb-wmi.c | 32 ++++++++++++++++++++++++++++++ + drivers/platform/x86/asus-wmi.c | 16 ++++++++------- + drivers/platform/x86/asus-wmi.h | 1 + + 3 files changed, 42 insertions(+), 7 deletions(-) + +diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c +index 680c3640e013..1d9fbabd02fb 100644 +--- a/drivers/platform/x86/asus-nb-wmi.c ++++ b/drivers/platform/x86/asus-nb-wmi.c +@@ -115,6 +115,10 @@ static struct quirk_entry quirk_asus_vendor_backlight = { + .wmi_backlight_set_devstate = true, + }; + ++static struct quirk_entry quirk_asus_use_kbd_dock_devid = { ++ .use_kbd_dock_devid = true, ++}; ++ + static int dmi_matched(const struct dmi_system_id *dmi) + { + pr_info("Identified laptop model '%s'\n", dmi->ident); +@@ -488,6 +492,34 @@ static const struct dmi_system_id asus_quirks[] = { + }, + .driver_data = &quirk_asus_ga502i, + }, ++ { ++ .callback = dmi_matched, ++ .ident = "Asus Transformer T100TA / T100HA / T100CHI", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ /* Match *T100* */ ++ DMI_MATCH(DMI_PRODUCT_NAME, "T100"), ++ }, ++ .driver_data = &quirk_asus_use_kbd_dock_devid, ++ }, ++ { ++ .callback = dmi_matched, ++ .ident = "Asus Transformer T101HA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "T101HA"), ++ }, ++ .driver_data = &quirk_asus_use_kbd_dock_devid, ++ }, ++ { ++ .callback = dmi_matched, ++ .ident = "Asus Transformer T200TA", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "T200TA"), ++ }, ++ .driver_data = &quirk_asus_use_kbd_dock_devid, ++ }, + {}, + }; + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 8f4acdc06b13..ae6289d37faf 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -365,12 +365,14 @@ static int asus_wmi_input_init(struct asus_wmi *asus) + if (err) + goto err_free_dev; + +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_KBD_DOCK); +- if (result >= 0) { +- input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE); +- input_report_switch(asus->inputdev, SW_TABLET_MODE, !result); +- } else if (result != -ENODEV) { +- pr_err("Error checking for keyboard-dock: %d\n", result); ++ if (asus->driver->quirks->use_kbd_dock_devid) { ++ result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_KBD_DOCK); ++ if (result >= 0) { ++ input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE); ++ input_report_switch(asus->inputdev, SW_TABLET_MODE, !result); ++ } else if (result != -ENODEV) { ++ pr_err("Error checking for keyboard-dock: %d\n", result); ++ } + } + + err = input_register_device(asus->inputdev); +@@ -2114,7 +2116,7 @@ static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus) + return; + } + +- if (code == NOTIFY_KBD_DOCK_CHANGE) { ++ if (asus->driver->quirks->use_kbd_dock_devid && code == NOTIFY_KBD_DOCK_CHANGE) { + result = asus_wmi_get_devstate_simple(asus, + ASUS_WMI_DEVID_KBD_DOCK); + if (result >= 0) { +diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h +index 4f31b68642a0..1a95c172f94b 100644 +--- a/drivers/platform/x86/asus-wmi.h ++++ b/drivers/platform/x86/asus-wmi.h +@@ -33,6 +33,7 @@ struct quirk_entry { + bool wmi_backlight_native; + bool wmi_backlight_set_devstate; + bool wmi_force_als_set; ++ bool use_kbd_dock_devid; + int wapf; + /* + * For machines with AMD graphic chips, it will send out WMI event +-- +2.28.0 + -- cgit