platform/x86/intel/hid: Add module-params for 5 button array + SW_TABLET_MODE reporting
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@redhat.com> Link: https://lore.kernel.org/r/20221120224820.746478-1-hdegoede@redhat.com
This commit is contained in:
parent
301e0d766d
commit
e32354bb8f
@ -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@vger.kernel.org");
|
||||
|
||||
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@vger.kernel.org");
|
||||
|
||||
/* 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)
|
||||
|
Loading…
Reference in New Issue
Block a user