diff options
Diffstat (limited to 'drivers/platform/x86/intel/hid.c')
| -rw-r--r-- | drivers/platform/x86/intel/hid.c | 36 | 
1 files 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: [email protected]"); + +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: [email protected]"); +  /* 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)  |