Skip to content

Commit 3a2f53c

Browse files
committed
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 <[email protected]> Signed-off-by: Hans de Goede <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 034b8c2 commit 3a2f53c

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

drivers/platform/x86/intel-vbtn.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)
145145
const struct key_entry *ke, *ke_rel;
146146
struct input_dev *input_dev;
147147
bool autorelease;
148+
int ret;
148149

149150
if ((ke = sparse_keymap_entry_from_scancode(priv->buttons_dev, event))) {
150151
if (!priv->has_buttons) {
@@ -154,8 +155,12 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)
154155
input_dev = priv->buttons_dev;
155156
} else if ((ke = sparse_keymap_entry_from_scancode(priv->switches_dev, event))) {
156157
if (!priv->has_switches) {
157-
dev_warn(&device->dev, "Warning: received a switches event on a device without switchess, please report this.\n");
158-
return;
158+
dev_info(&device->dev, "Registering Intel Virtual Switches input-dev after receiving a switch event\n");
159+
ret = input_register_device(priv->switches_dev);
160+
if (ret)
161+
return;
162+
163+
priv->has_switches = true;
159164
}
160165
input_dev = priv->switches_dev;
161166
} else {

0 commit comments

Comments
 (0)