Hi, On 1/20/23 15:34, Hans de Goede wrote: > Commit 1ea0d3b46798 ("platform/x86: asus-wmi: Simplify tablet-mode-switch > handling") unified the asus-wmi tablet-switch handling, but it did not take > into account that the value returned for the kbd_dock_devid WMI method is > inverted where as the other ones are not inverted. > > This causes asus-wmi to report an inverted tablet-switch state for devices > which use the kbd_dock_devid, which causes libinput to ignore touchpad > events while the affected T10x model 2-in-1s are docked. > > Add inverting of the return value in the kbd_dock_devid case to fix this. > > Fixes: 1ea0d3b46798 ("platform/x86: asus-wmi: Simplify tablet-mode-switch handling") > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> I have added this to my review-hans branch now. Regards, Hans > --- > drivers/platform/x86/asus-wmi.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c > index 104188d70988..1038dfdcdd32 100644 > --- a/drivers/platform/x86/asus-wmi.c > +++ b/drivers/platform/x86/asus-wmi.c > @@ -225,6 +225,7 @@ struct asus_wmi { > > int tablet_switch_event_code; > u32 tablet_switch_dev_id; > + bool tablet_switch_inverted; > > enum fan_type fan_type; > enum fan_type gpu_fan_type; > @@ -493,6 +494,13 @@ static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id) > } > > /* Input **********************************************************************/ > +static void asus_wmi_tablet_sw_report(struct asus_wmi *asus, bool value) > +{ > + input_report_switch(asus->inputdev, SW_TABLET_MODE, > + asus->tablet_switch_inverted ? !value : value); > + input_sync(asus->inputdev); > +} > + > static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code) > { > struct device *dev = &asus->platform_device->dev; > @@ -501,7 +509,7 @@ static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event > result = asus_wmi_get_devstate_simple(asus, dev_id); > if (result >= 0) { > input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE); > - input_report_switch(asus->inputdev, SW_TABLET_MODE, result); > + asus_wmi_tablet_sw_report(asus, result); > asus->tablet_switch_dev_id = dev_id; > asus->tablet_switch_event_code = event_code; > } else if (result == -ENODEV) { > @@ -534,6 +542,7 @@ static int asus_wmi_input_init(struct asus_wmi *asus) > case asus_wmi_no_tablet_switch: > break; > case asus_wmi_kbd_dock_devid: > + asus->tablet_switch_inverted = true; > asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE); > break; > case asus_wmi_lid_flip_devid: > @@ -573,10 +582,8 @@ static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus) > return; > > result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id); > - if (result >= 0) { > - input_report_switch(asus->inputdev, SW_TABLET_MODE, result); > - input_sync(asus->inputdev); > - } > + if (result >= 0) > + asus_wmi_tablet_sw_report(asus, result); > } > > /* dGPU ********************************************************************/