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)