From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Hans de Goede <hdegoede@redhat.com>
Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com>,
linux-input@vger.kernel.org
Subject: Re: [PATCH] Input: elants_i2c - Do not bind to i2c-hid compatible ACPI instantiated devices
Date: Tue, 2 Mar 2021 11:42:39 -0800 [thread overview]
Message-ID: <YD6VL4CwudwKs5Vo@google.com> (raw)
In-Reply-To: <20210302145057.112437-1-hdegoede@redhat.com>
On Tue, Mar 02, 2021 at 03:50:57PM +0100, Hans de Goede wrote:
> 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.
>
> Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207759
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> drivers/input/touchscreen/elants_i2c.c | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
> index 4c2b579f6c8b..510638e5ba5a 100644
> --- a/drivers/input/touchscreen/elants_i2c.c
> +++ b/drivers/input/touchscreen/elants_i2c.c
> @@ -1334,6 +1334,12 @@ static void elants_i2c_power_off(void *_data)
> }
> }
>
> +static const struct acpi_device_id i2c_hid_ids[] = {
> + {"ACPI0C50", 0 },
> + {"PNP0C50", 0 },
> + { },
> +};
This ideally needs to be protected by CONFIG_ACPI.
> +
> static int elants_i2c_probe(struct i2c_client *client,
> const struct i2c_device_id *id)
> {
> @@ -1342,6 +1348,25 @@ static int elants_i2c_probe(struct i2c_client *client,
> unsigned long irqflags;
> int error;
>
> +#ifdef CONFIG_ACPI
> + /* Don't bind to i2c-hid compatible devices, these are handled by the i2c-hid drv. */
> + if (acpi_match_device_ids(ACPI_COMPANION(&client->dev), i2c_hid_ids) == 0) {
> + static const guid_t i2c_hid_guid =
> + GUID_INIT(0x3CDFF6F7, 0x4267, 0x4555,
> + 0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE);
> + acpi_handle handle = ACPI_HANDLE(&client->dev);
> + union acpi_object *obj;
> +
> + obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid, 1, 1, NULL,
> + ACPI_TYPE_INTEGER);
> + if (obj) {
> + dev_warn(&client->dev, "elants_i2c: This device appears to be an I2C-HID device, not binding\n");
No need for "elants_i2c" prefix as dev_warn already gives driver info I
believe.
> + ACPI_FREE(obj);
> + return -ENODEV;
> + }
> + }
> +#endif
Could we tuck this away into "elants_acpi_is_hid_device" and have #ifdef
protecting that and have a complementing stub?
> +
> if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
> dev_err(&client->dev,
> "%s: i2c check functionality error\n", DEVICE_NAME);
As a cleanup should probably drop device prefix from this message as
well.
Thanks.
--
Dmitry
next prev parent reply other threads:[~2021-03-03 5:38 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-02 14:50 [PATCH] Input: elants_i2c - Do not bind to i2c-hid compatible ACPI instantiated devices Hans de Goede
2021-03-02 15:38 ` Benjamin Tissoires
2021-03-02 19:42 ` Dmitry Torokhov [this message]
2021-03-10 10:45 ` Hans de Goede
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=YD6VL4CwudwKs5Vo@google.com \
--to=dmitry.torokhov@gmail.com \
--cc=benjamin.tissoires@redhat.com \
--cc=hdegoede@redhat.com \
--cc=linux-input@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.