All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org,
	Benjamin Tissoires <benjamin.tissoires@redhat.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.4 14/37] Input: elants_i2c - do not bind to i2c-hid compatible ACPI instantiated devices
Date: Thu, 20 May 2021 11:22:35 +0200	[thread overview]
Message-ID: <20210520092052.745496208@linuxfoundation.org> (raw)
In-Reply-To: <20210520092052.265851579@linuxfoundation.org>

From: Hans de Goede <hdegoede@redhat.com>

[ Upstream commit 65299e8bfb24774e6340e93ae49f6626598917c8 ]

Several users have been reporting that elants_i2c gives several errors
during probe and that their touchscreen does not work on their Lenovo AMD
based laptops with a touchscreen with a ELAN0001 ACPI hardware-id:

[    0.550596] elants_i2c i2c-ELAN0001:00: i2c-ELAN0001:00 supply vcc33 not found, using dummy regulator
[    0.551836] elants_i2c i2c-ELAN0001:00: i2c-ELAN0001:00 supply vccio not found, using dummy regulator
[    0.560932] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121
[    0.562427] elants_i2c i2c-ELAN0001:00: software reset failed: -121
[    0.595925] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121
[    0.597974] elants_i2c i2c-ELAN0001:00: software reset failed: -121
[    0.621893] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121
[    0.622504] elants_i2c i2c-ELAN0001:00: software reset failed: -121
[    0.632650] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (4d 61 69 6e): -121
[    0.634256] elants_i2c i2c-ELAN0001:00: boot failed: -121
[    0.699212] elants_i2c i2c-ELAN0001:00: invalid 'hello' packet: 00 00 ff ff
[    1.630506] elants_i2c i2c-ELAN0001:00: Failed to read fw id: -121
[    1.645508] elants_i2c i2c-ELAN0001:00: unknown packet 00 00 ff ff

Despite these errors, the elants_i2c driver stays bound to the device
(it returns 0 from its probe method despite the errors), blocking the
i2c-hid driver from binding.

Manually unbinding the elants_i2c driver and binding the i2c-hid driver
makes the touchscreen work.

Check if the ACPI-fwnode for the touchscreen contains one of the i2c-hid
compatiblity-id strings and if it has the I2C-HID spec's DSM to get the
HID descriptor address, If it has both then make elants_i2c not bind,
so that the i2c-hid driver can bind.

This assumes that non of the (older) elan touchscreens which actually
need the elants_i2c driver falsely advertise an i2c-hid compatiblity-id
+ DSM in their ACPI-fwnodes. If some of them actually do have this
false advertising, then this change may lead to regressions.

While at it also drop the unnecessary DEVICE_NAME prefixing of the
"I2C check functionality error", dev_err already outputs the driver-name.

BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207759
Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20210405202756.16830-1-hdegoede@redhat.com

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/input/touchscreen/elants_i2c.c | 44 ++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index d4ad24ea54c8..a51e7c85f581 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -36,6 +36,7 @@
 #include <linux/of.h>
 #include <linux/gpio/consumer.h>
 #include <linux/regulator/consumer.h>
+#include <linux/uuid.h>
 #include <asm/unaligned.h>
 
 /* Device, Driver information */
@@ -1127,6 +1128,40 @@ static void elants_i2c_power_off(void *_data)
 	}
 }
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id i2c_hid_ids[] = {
+	{"ACPI0C50", 0 },
+	{"PNP0C50", 0 },
+	{ },
+};
+
+static const guid_t i2c_hid_guid =
+	GUID_INIT(0x3CDFF6F7, 0x4267, 0x4555,
+		  0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE);
+
+static bool elants_acpi_is_hid_device(struct device *dev)
+{
+	acpi_handle handle = ACPI_HANDLE(dev);
+	union acpi_object *obj;
+
+	if (acpi_match_device_ids(ACPI_COMPANION(dev), i2c_hid_ids))
+		return false;
+
+	obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid, 1, 1, NULL, ACPI_TYPE_INTEGER);
+	if (obj) {
+		ACPI_FREE(obj);
+		return true;
+	}
+
+	return false;
+}
+#else
+static bool elants_acpi_is_hid_device(struct device *dev)
+{
+	return false;
+}
+#endif
+
 static int elants_i2c_probe(struct i2c_client *client,
 			    const struct i2c_device_id *id)
 {
@@ -1135,9 +1170,14 @@ static int elants_i2c_probe(struct i2c_client *client,
 	unsigned long irqflags;
 	int error;
 
+	/* Don't bind to i2c-hid compatible devices, these are handled by the i2c-hid drv. */
+	if (elants_acpi_is_hid_device(&client->dev)) {
+		dev_warn(&client->dev, "This device appears to be an I2C-HID device, not binding\n");
+		return -ENODEV;
+	}
+
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-		dev_err(&client->dev,
-			"%s: i2c check functionality error\n", DEVICE_NAME);
+		dev_err(&client->dev, "I2C check functionality error\n");
 		return -ENXIO;
 	}
 
-- 
2.30.2




  parent reply	other threads:[~2021-05-20  9:32 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-20  9:22 [PATCH 5.4 00/37] 5.4.121-rc1 review Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 01/37] x86/msr: Fix wr/rdmsr_safe_regs_on_cpu() prototypes Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 02/37] kgdb: fix gcc-11 warning on indentation Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 03/37] usb: sl811-hcd: improve misleading indentation Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 04/37] cxgb4: Fix the -Wmisleading-indentation warning Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 05/37] isdn: capi: fix mismatched prototypes Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 06/37] pinctrl: ingenic: Improve unreachable code generation Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 07/37] xsk: Simplify detection of empty and full rings Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 08/37] virtio_net: Do not pull payload in skb->head Greg Kroah-Hartman
2021-05-20  9:22   ` Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 09/37] ARM: 9058/1: cache-v7: refactor v7_invalidate_l1 to avoid clobbering r5/r6 Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 10/37] PCI: thunder: Fix compile testing Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 11/37] dmaengine: dw-edma: Fix crash on loading/unloading driver Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 12/37] ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend() Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 13/37] ACPI / hotplug / PCI: Fix reference count leak in enable_slot() Greg Kroah-Hartman
2021-05-20  9:22 ` Greg Kroah-Hartman [this message]
2021-05-20  9:22 ` [PATCH 5.4 15/37] Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 16/37] um: Mark all kernel symbols as local Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 17/37] um: Disable CONFIG_GCOV with MODULES Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 18/37] ARM: 9075/1: kernel: Fix interrupted SMC calls Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 19/37] scripts/recordmcount.pl: Fix RISC-V regex for clang Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 20/37] riscv: Workaround mcount name prior to clang-13 Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 21/37] scsi: lpfc: Fix illegal memory access on Abort IOCBs Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 22/37] ceph: fix fscache invalidation Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 23/37] scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 24/37] bridge: Fix possible races between assigning rx_handler_data and setting IFF_BRIDGE_PORT bit Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 25/37] drm/amd/display: Fix two cursor duplication when using overlay Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 26/37] gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055 Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 27/37] ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 28/37] block: reexpand iov_iter after read/write Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 29/37] lib: stackdepot: turn depot_lock spinlock to raw_spinlock Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 30/37] net: stmmac: Do not enable RX FIFO overflow interrupts Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 31/37] ip6_gre: proper dev_{hold|put} in ndo_[un]init methods Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 32/37] sit: " Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 33/37] ip6_tunnel: " Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 34/37] ipv6: remove extra dev_hold() for fallback tunnels Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 35/37] KVM: arm64: Initialize VCPU mdcr_el2 before loading it Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 36/37] tweewide: Fix most Shebang lines Greg Kroah-Hartman
2021-05-20  9:22 ` [PATCH 5.4 37/37] scripts: switch explicitly to Python 3 Greg Kroah-Hartman
2021-05-20 15:24 ` [PATCH 5.4 00/37] 5.4.121-rc1 review Jon Hunter
2021-05-20 21:44 ` Shuah Khan
2021-05-20 22:53 ` Guenter Roeck
2021-05-21  4:39 ` Florian Fainelli
2021-05-22  9:39   ` Greg Kroah-Hartman
2021-05-21  5:23 ` Naresh Kamboju
2021-05-21 18:21 ` Sudip Mukherjee

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210520092052.745496208@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=benjamin.tissoires@redhat.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.