Re: [PATCH] platform/x86/intel/hid: Add module-params for 5 button array + SW_TABLET_MODE reporting

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

 



Hi all,

On 11/20/22 23:48, Hans de Goede wrote:
> The driver has DMI-quirk tables for force-enabling 5 button array support
> and for 2 different ways of enabling SW_TABLET_MODE reporting.
> 
> Add module parameters to allow user to enable the driver behavior currently
> only available through DMI quirks.
> 
> This is useful for users to test this in bug-reports and for users to use
> as a workaround while new DMI quirks find their way upstream.
> 
> Link: https://gitlab.freedesktop.org/libinput/libinput/-/issues/822
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>

I have added this to my review-hans branch now.

Regards,

Hans




> ---
>  drivers/platform/x86/intel/hid.c | 36 +++++++++++++++++++++++++++-----
>  1 file changed, 31 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel/hid.c b/drivers/platform/x86/intel/hid.c
> index b6313ecd190c..b6c06b37862e 100644
> --- a/drivers/platform/x86/intel/hid.c
> +++ b/drivers/platform/x86/intel/hid.c
> @@ -16,6 +16,25 @@
>  #include <linux/suspend.h>
>  #include "../dual_accel_detect.h"
>  
> +enum intel_hid_tablet_sw_mode {
> +	TABLET_SW_AUTO = -1,
> +	TABLET_SW_OFF  = 0,
> +	TABLET_SW_AT_EVENT,
> +	TABLET_SW_AT_PROBE,
> +};
> +
> +static bool enable_5_button_array;
> +module_param(enable_5_button_array, bool, 0444);
> +MODULE_PARM_DESC(enable_5_button_array,
> +	"Enable 5 Button Array support. "
> +	"If you need this please report this to: platform-driver-x86@xxxxxxxxxxxxxxx");
> +
> +static int enable_sw_tablet_mode = TABLET_SW_AUTO;
> +module_param(enable_sw_tablet_mode, int, 0444);
> +MODULE_PARM_DESC(enable_sw_tablet_mode,
> +	"Enable SW_TABLET_MODE reporting -1:auto 0:off 1:at-first-event 2:at-probe. "
> +	"If you need this please report this to: platform-driver-x86@xxxxxxxxxxxxxxx");
> +
>  /* When NOT in tablet mode, VGBS returns with the flag 0x40 */
>  #define TABLET_MODE_FLAG BIT(6)
>  
> @@ -157,7 +176,6 @@ struct intel_hid_priv {
>  	struct input_dev *array;
>  	struct input_dev *switches;
>  	bool wakeup_mode;
> -	bool auto_add_switch;
>  };
>  
>  #define HID_EVENT_FILTER_UUID	"eeec56b3-4442-408f-a792-4edd4d758054"
> @@ -487,7 +505,8 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)
>  	 * SW_TABLET_MODE report, in these cases we enable support when receiving
>  	 * the first event instead of during driver setup.
>  	 */
> -	if (!priv->switches && priv->auto_add_switch && (event == 0xcc || event == 0xcd)) {
> +	if (!priv->switches && enable_sw_tablet_mode == TABLET_SW_AT_EVENT &&
> +	    (event == 0xcc || event == 0xcd)) {
>  		dev_info(&device->dev, "switch event received, enable switches supports\n");
>  		err = intel_hid_switches_setup(device);
>  		if (err)
> @@ -592,7 +611,7 @@ static bool button_array_present(struct platform_device *device)
>  			return true;
>  	}
>  
> -	if (dmi_check_system(button_array_table))
> +	if (enable_5_button_array || dmi_check_system(button_array_table))
>  		return true;
>  
>  	return false;
> @@ -629,7 +648,14 @@ static int intel_hid_probe(struct platform_device *device)
>  	dev_set_drvdata(&device->dev, priv);
>  
>  	/* See dual_accel_detect.h for more info on the dual_accel check. */
> -	priv->auto_add_switch = dmi_check_system(dmi_auto_add_switch) && !dual_accel_detect();
> +	if (enable_sw_tablet_mode == TABLET_SW_AUTO) {
> +		if (dmi_check_system(dmi_vgbs_allow_list))
> +			enable_sw_tablet_mode = TABLET_SW_AT_PROBE;
> +		else if (dmi_check_system(dmi_auto_add_switch) && !dual_accel_detect())
> +			enable_sw_tablet_mode = TABLET_SW_AT_EVENT;
> +		else
> +			enable_sw_tablet_mode = TABLET_SW_OFF;
> +	}
>  
>  	err = intel_hid_input_setup(device);
>  	if (err) {
> @@ -646,7 +672,7 @@ static int intel_hid_probe(struct platform_device *device)
>  	}
>  
>  	/* Setup switches for devices that we know VGBS return correctly */
> -	if (dmi_check_system(dmi_vgbs_allow_list)) {
> +	if (enable_sw_tablet_mode == TABLET_SW_AT_PROBE) {
>  		dev_info(&device->dev, "platform supports switches\n");
>  		err = intel_hid_switches_setup(device);
>  		if (err)




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

  Powered by Linux