HID: i2c-hid: Silently fail probe for CHPN0001 touchscreen
authorHans de Goede <hdegoede@redhat.com>
Tue, 3 Apr 2018 13:16:34 +0000 (15:16 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 16 Apr 2018 12:22:42 +0000 (14:22 +0200)
The CHPN0001 ACPI device has a _CID of PNP0C50 and even has the _DSM to
get the HID descriptor address, but it is not a HID device at all.

It uses its own protocol which is handled by the (still being upstreamed)
chipone_icn8505 driver. I guess the _CID and the _DSM are the result of
a copy and paste job when the vendor was building the ACPI tables.

Before this patch the i2c_hid_driver's probe function will fail with a
"hid_descr_cmd failed" error.

This commit makes the i2c_hid_driver's probe function instead silently
ignored devices with an ACPI id of CHPN0001.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/i2c-hid/i2c-hid.c

index 78ca994..cf71c33 100644 (file)
@@ -863,6 +863,15 @@ static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
 }
 
 #ifdef CONFIG_ACPI
+static const struct acpi_device_id i2c_hid_acpi_blacklist[] = {
+       /*
+        * The CHPN0001 ACPI device, which is used to describe the Chipone
+        * ICN8505 controller, has a _CID of PNP0C50 but is not HID compatible.
+        */
+       {"CHPN0001", 0 },
+       { },
+};
+
 static int i2c_hid_acpi_pdata(struct i2c_client *client,
                struct i2c_hid_platform_data *pdata)
 {
@@ -879,6 +888,9 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client,
                return -ENODEV;
        }
 
+       if (acpi_match_device_ids(adev, i2c_hid_acpi_blacklist) == 0)
+               return -ENODEV;
+
        obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid, 1, 1, NULL,
                                      ACPI_TYPE_INTEGER);
        if (!obj) {