platform/x86: asus-wmi: Fix kbd_dock_devid tablet-switch reporting
commitfdcc0602d6
upstream. Commit1ea0d3b467
("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:1ea0d3b467
("platform/x86: asus-wmi: Simplify tablet-mode-switch handling") Signed-off-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20230120143441.527334-1-hdegoede@redhat.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
e65128616f
Коммит
7aed508668
|
@ -206,6 +206,7 @@ struct asus_wmi {
|
|||
|
||||
int tablet_switch_event_code;
|
||||
u32 tablet_switch_dev_id;
|
||||
bool tablet_switch_inverted;
|
||||
|
||||
enum fan_type fan_type;
|
||||
int fan_pwm_mode;
|
||||
|
@ -367,6 +368,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;
|
||||
|
@ -375,7 +383,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) {
|
||||
|
@ -408,6 +416,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:
|
||||
|
@ -447,10 +456,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 ********************************************************************/
|
||||
|
|
Загрузка…
Ссылка в новой задаче