Re: [PATCH] platform/x86: lenovo-ymc: Only bind on machines with a convertible DMI chassis-type

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

 



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);
> 




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

  Powered by Linux