Commit 3a2f53cd authored by Hans de Goede's avatar Hans de Goede

platform/x86: intel-vbtn: Add alternative method to enable switches

Some 2-in-1s have a broken VGBS method, so we cannot get an initial
state for the switches from them. Reporting the wrong initial state for
SW_TABLET_MODE causes serious problems (touchpad and/or keyboard events
being ignored by userspace when reporting SW_TABLET_MODE=1), so on these
devices we cannot register an input-dev for the switches at probe time.

We can however register an input-dev for the switches as soon as we
receive the first switches event, because then we will know the state.

Note this mirrors the behavior of recent changs to the intel-hid driver
which also registers a separate switches input-dev on receiving the
first event on machines with a broken VGBS method.

Cc: Elia Devito <eliadevito@gmail.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20210115161850.117614-3-hdegoede@redhat.com
parent 034b8c2e
...@@ -145,6 +145,7 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) ...@@ -145,6 +145,7 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)
const struct key_entry *ke, *ke_rel; const struct key_entry *ke, *ke_rel;
struct input_dev *input_dev; struct input_dev *input_dev;
bool autorelease; bool autorelease;
int ret;
if ((ke = sparse_keymap_entry_from_scancode(priv->buttons_dev, event))) { if ((ke = sparse_keymap_entry_from_scancode(priv->buttons_dev, event))) {
if (!priv->has_buttons) { if (!priv->has_buttons) {
...@@ -154,8 +155,12 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) ...@@ -154,8 +155,12 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)
input_dev = priv->buttons_dev; input_dev = priv->buttons_dev;
} else if ((ke = sparse_keymap_entry_from_scancode(priv->switches_dev, event))) { } else if ((ke = sparse_keymap_entry_from_scancode(priv->switches_dev, event))) {
if (!priv->has_switches) { if (!priv->has_switches) {
dev_warn(&device->dev, "Warning: received a switches event on a device without switchess, please report this.\n"); dev_info(&device->dev, "Registering Intel Virtual Switches input-dev after receiving a switch event\n");
return; ret = input_register_device(priv->switches_dev);
if (ret)
return;
priv->has_switches = true;
} }
input_dev = priv->switches_dev; input_dev = priv->switches_dev;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment