Re: [PATCH] platform/x86: asus-wmi: Fix kbd_dock_devid tablet-switch reporting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 ********************************************************************/




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux