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

Regards,
Gergő

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