Hi, On 8/12/23 22:48, Gergő Köteles wrote: > Hi, > > On Sat, 2023-08-12 at 16:48 +0200, Hans de Goede wrote: >> The lenovo-ymc driver is causing the keyboard + touchpad to stop working >> on some regular laptop models such as the Lenovo ThinkBook 13s G2 ITL 20V9. >> >> The problem is that there are YMC WMI GUID methods in the ACPI tables >> of these laptops, despite them not being Yogas and lenovo-ymc loading >> causes libinput to see a SW_TABLET_MODE switch with state 1. >> >> This in turn causes libinput to ignore events from the builtin keyboard >> and touchpad, since it filters those out for a Yoga in tablet mode. >> >> Similar issues with false-positive SW_TABLET_MODE=1 reporting have >> been seen with the intel-hid driver. >> >> Copy the intel-hid driver approach to fix this and only bind to the WMI >> device on machines where the DMI chassis-type indicates the machine >> is a convertible. >> >> Add a 'force' module parameter to allow overriding the chassis-type check >> so that users can easily test if the YMC interface works on models which >> report an unexpected chassis-type. >> >> Fixes: e82882cdd241 ("platform/x86: Add driver for Yoga Tablet Mode switch") >> Link: https://bugzilla.redhat.com/show_bug.cgi?id=2229373 >> Cc: Gergo Koteles <soyer@xxxxxx> >> Cc: Andrew Kallmeyer <kallmeyeras@xxxxxxxxx> >> Cc: André Apitzsch <git@xxxxxxxxxxx> >> Cc: stable@xxxxxxxxxxxxxxx >> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > > Thanks for fixing this! > It works on Yoga 7 14ARB7. > > Tested-by: Gergő Köteles <soyer@xxxxxx> On 8/12/23 19:25, Andrew Kallmeyer wrote: > Too bad that this caused problems for some people. Thank you for > getting it fixed Hans! > > Tested-by: Andrew Kallmeyer <kallmeyeras@xxxxxxxxx> Thank you both for testing this. I've added this to the pdx86/fixes branch now, with both your Tested-by-s added. Regards, Hans >> --- >> Note: The chassis-type can be checked by doing: >> cat /sys/class/dmi/id/chassis_type >> if this reports 31 or 32 then this patch should not have any impact >> on your machine. >> --- >> drivers/platform/x86/lenovo-ymc.c | 25 +++++++++++++++++++++++++ >> 1 file changed, 25 insertions(+) >> >> diff --git a/drivers/platform/x86/lenovo-ymc.c b/drivers/platform/x86/lenovo-ymc.c >> index 41676188b373..f360370d5002 100644 >> --- a/drivers/platform/x86/lenovo-ymc.c >> +++ b/drivers/platform/x86/lenovo-ymc.c >> @@ -24,6 +24,10 @@ static bool ec_trigger __read_mostly; >> module_param(ec_trigger, bool, 0444); >> MODULE_PARM_DESC(ec_trigger, "Enable EC triggering work-around to force emitting tablet mode events"); >> >> +static bool force; >> +module_param(force, bool, 0444); >> +MODULE_PARM_DESC(force, "Force loading on boards without a convertible DMI chassis-type"); >> + >> static const struct dmi_system_id ec_trigger_quirk_dmi_table[] = { >> { >> /* Lenovo Yoga 7 14ARB7 */ >> @@ -35,6 +39,20 @@ static const struct dmi_system_id ec_trigger_quirk_dmi_table[] = { >> { } >> }; >> >> +static const struct dmi_system_id allowed_chasis_types_dmi_table[] = { >> + { >> + .matches = { >> + DMI_EXACT_MATCH(DMI_CHASSIS_TYPE, "31" /* Convertible */), >> + }, >> + }, >> + { >> + .matches = { >> + DMI_EXACT_MATCH(DMI_CHASSIS_TYPE, "32" /* Detachable */), >> + }, >> + }, >> + { } >> +}; >> + >> struct lenovo_ymc_private { >> struct input_dev *input_dev; >> struct acpi_device *ec_acpi_dev; >> @@ -111,6 +129,13 @@ static int lenovo_ymc_probe(struct wmi_device *wdev, const void *ctx) >> struct input_dev *input_dev; >> int err; >> >> + if (!dmi_check_system(allowed_chasis_types_dmi_table)) { >> + if (force) >> + dev_info(&wdev->dev, "Force loading Lenovo YMC support\n"); >> + else >> + return -ENODEV; >> + } >> + >> ec_trigger |= dmi_check_system(ec_trigger_quirk_dmi_table); >> >> priv = devm_kzalloc(&wdev->dev, sizeof(*priv), GFP_KERNEL); >