213 lines
8.2 KiB
Diff
213 lines
8.2 KiB
Diff
From 9126d28cf4e537ef5e77006c51b1a24ad8e8170b Mon Sep 17 00:00:00 2001
|
|
From: Hans de Goede <hdegoede@redhat.com>
|
|
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 <hdegoede@redhat.com>
|
|
---
|
|
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 <linux/platform_device.h>
|
|
#include <linux/suspend.h>
|
|
|
|
+/* 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 <hdegoede@redhat.com>
|
|
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 <samuel@cavoj.net>
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
---
|
|
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
|
|
|