Takashi Iwai 26e60a
From: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 26e60a
Subject: [PATCH] Input: elan_i2c: Add deny list for Lenovo Yoga Slim 7
Takashi Iwai 26e60a
Date: Fri, 04 Feb 2022 17:57:14 +0100
Takashi Iwai 26e60a
Message-ID: <s5hleyqwowl.wl-tiwai@suse.de>
Takashi Iwai 26e60a
Patch-mainline: Submitted, linux-input ML
Takashi Iwai 26e60a
References: bsc#1193064
Takashi Iwai 26e60a
Takashi Iwai 26e60a
The touchpad on Lenovo Yoga Slim 7 doesn't work well with elan-i2c but
Takashi Iwai 26e60a
rather better with i2c-hid.  Add a deny list for avoiding to bind with
Takashi Iwai 26e60a
elan-i2c.
Takashi Iwai 26e60a
Takashi Iwai 26e60a
BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1193064
Takashi Iwai 26e60a
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 26e60a
Takashi Iwai 26e60a
---
Michal Kubecek 769d7a
 drivers/input/mouse/elan_i2c_core.c | 19 +++++++++++++++++++
Takashi Iwai 26e60a
 1 file changed, 19 insertions(+)
Takashi Iwai 26e60a
Takashi Iwai 26e60a
--- a/drivers/input/mouse/elan_i2c_core.c
Takashi Iwai 26e60a
+++ b/drivers/input/mouse/elan_i2c_core.c
Takashi Iwai 26e60a
@@ -18,6 +18,7 @@
Takashi Iwai 26e60a
 #include <linux/acpi.h>
Takashi Iwai 26e60a
 #include <linux/delay.h>
Takashi Iwai 26e60a
 #include <linux/device.h>
Takashi Iwai 26e60a
+#include <linux/dmi.h>
Takashi Iwai 26e60a
 #include <linux/firmware.h>
Takashi Iwai 26e60a
 #include <linux/i2c.h>
Takashi Iwai 26e60a
 #include <linux/init.h>
Michal Kubecek 769d7a
@@ -1187,6 +1188,20 @@ static void elan_disable_regulator(void *_data)
Takashi Iwai 26e60a
 	regulator_disable(data->vcc);
Takashi Iwai 26e60a
 }
Takashi Iwai 26e60a
 
Takashi Iwai 672f0d
+static const struct dmi_system_id elan_i2c_denylist[] = {
Takashi Iwai 26e60a
+#if IS_ENABLED(CONFIG_I2C_HID_ACPI)
Takashi Iwai 26e60a
+	{
Takashi Iwai 26e60a
+		/* Lenovo Yoga Slim 7 is better supported by i2c-hid */
Takashi Iwai 26e60a
+		.matches = {
Takashi Iwai 26e60a
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
Takashi Iwai 26e60a
+			DMI_MATCH(DMI_PRODUCT_NAME, "82A3"),
Takashi Iwai 26e60a
+			DMI_MATCH(DMI_PRODUCT_VERSION, "Yoga Slim 7 14ITL05"),
Takashi Iwai 26e60a
+		},
Takashi Iwai 26e60a
+	},
Takashi Iwai 26e60a
+#endif
Takashi Iwai 26e60a
+	{ }
Takashi Iwai 26e60a
+};
Takashi Iwai 26e60a
+
Michal Kubecek 769d7a
 static int elan_probe(struct i2c_client *client)
Takashi Iwai 26e60a
 {
Michal Kubecek 769d7a
 	const struct elan_transport_ops *transport_ops;
Michal Kubecek 769d7a
@@ -1197,6 +1212,10 @@ static int elan_probe(struct i2c_client *client)
Takashi Iwai 26e60a
 
Takashi Iwai 26e60a
 	if (IS_ENABLED(CONFIG_MOUSE_ELAN_I2C_I2C) &&
Takashi Iwai 26e60a
 	    i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
Takashi Iwai 26e60a
+		if (dmi_check_system(elan_i2c_denylist)) {
Takashi Iwai 26e60a
+			dev_info(dev, "Hits deny list, skipping\n");
Takashi Iwai 26e60a
+			return -ENODEV;
Takashi Iwai 26e60a
+		}
Takashi Iwai 26e60a
 		transport_ops = &elan_i2c_ops;
Takashi Iwai 26e60a
 	} else if (IS_ENABLED(CONFIG_MOUSE_ELAN_I2C_SMBUS) &&
Takashi Iwai 26e60a
 		   i2c_check_functionality(client->adapter,