diff options
| author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2014-05-21 11:15:56 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2014-05-22 05:11:46 -0400 |
| commit | ba391e5a5ac6697b8bcae8c0d01439cb765d9ef8 (patch) | |
| tree | cf04199bb71cffd6c38ecce910dff92d131c675b | |
| parent | 876e7a8a111a4277ea35e5314a5fafc18346d3ca (diff) | |
HID: rmi: do not handle touchscreens through hid-rmi
Currently, hid-rmi drives every Synaptics product, but the touchscreens
on the Windows tablets should be handled through hid-multitouch.
Instead of providing a long list of PIDs, rely on the scan_report
capability to detect which should go to hid-multitouch, and which
should not go to hid-rmi.
related bug:
https://bugzilla.kernel.org/show_bug.cgi?id=74241
https://bugzilla.redhat.com/show_bug.cgi?id=1089583
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
| -rw-r--r-- | drivers/hid/hid-core.c | 10 | ||||
| -rw-r--r-- | drivers/hid/hid-rmi.c | 3 | ||||
| -rw-r--r-- | include/linux/hid.h | 8 |
3 files changed, 17 insertions, 4 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index f05255d92de7..64c71c866916 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -776,6 +776,14 @@ static int hid_scan_report(struct hid_device *hid) | |||
| 776 | (hid->group == HID_GROUP_MULTITOUCH)) | 776 | (hid->group == HID_GROUP_MULTITOUCH)) |
| 777 | hid->group = HID_GROUP_MULTITOUCH_WIN_8; | 777 | hid->group = HID_GROUP_MULTITOUCH_WIN_8; |
| 778 | 778 | ||
| 779 | /* | ||
| 780 | * Vendor specific handlings | ||
| 781 | */ | ||
| 782 | if ((hid->vendor == USB_VENDOR_ID_SYNAPTICS) && | ||
| 783 | (hid->group == HID_GROUP_GENERIC)) | ||
| 784 | /* hid-rmi should take care of them, not hid-generic */ | ||
| 785 | hid->group = HID_GROUP_RMI; | ||
| 786 | |||
| 779 | vfree(parser); | 787 | vfree(parser); |
| 780 | return 0; | 788 | return 0; |
| 781 | } | 789 | } |
| @@ -1882,8 +1890,6 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 1882 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, | 1890 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, |
| 1883 | { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, | 1891 | { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, |
| 1884 | { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, | 1892 | { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) }, |
| 1885 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, | ||
| 1886 | { HID_I2C_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, | ||
| 1887 | { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) }, | 1893 | { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) }, |
| 1888 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, | 1894 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) }, |
| 1889 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, | 1895 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) }, |
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c index c529b033ba9e..2451c7e5febd 100644 --- a/drivers/hid/hid-rmi.c +++ b/drivers/hid/hid-rmi.c | |||
| @@ -894,8 +894,7 @@ static void rmi_remove(struct hid_device *hdev) | |||
| 894 | } | 894 | } |
| 895 | 895 | ||
| 896 | static const struct hid_device_id rmi_id[] = { | 896 | static const struct hid_device_id rmi_id[] = { |
| 897 | { HID_I2C_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, | 897 | { HID_DEVICE(HID_BUS_ANY, HID_GROUP_RMI, HID_ANY_ID, HID_ANY_ID) }, |
| 898 | { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, HID_ANY_ID) }, | ||
| 899 | { } | 898 | { } |
| 900 | }; | 899 | }; |
| 901 | MODULE_DEVICE_TABLE(hid, rmi_id); | 900 | MODULE_DEVICE_TABLE(hid, rmi_id); |
diff --git a/include/linux/hid.h b/include/linux/hid.h index 54f855b2c902..8ce9ff4d50af 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
| @@ -299,6 +299,9 @@ struct hid_item { | |||
| 299 | 299 | ||
| 300 | /* | 300 | /* |
| 301 | * HID device groups | 301 | * HID device groups |
| 302 | * | ||
| 303 | * Note: HID_GROUP_ANY is declared in linux/mod_devicetable.h | ||
| 304 | * and has a value of 0x0000 | ||
| 302 | */ | 305 | */ |
| 303 | #define HID_GROUP_GENERIC 0x0001 | 306 | #define HID_GROUP_GENERIC 0x0001 |
| 304 | #define HID_GROUP_MULTITOUCH 0x0002 | 307 | #define HID_GROUP_MULTITOUCH 0x0002 |
| @@ -306,6 +309,11 @@ struct hid_item { | |||
| 306 | #define HID_GROUP_MULTITOUCH_WIN_8 0x0004 | 309 | #define HID_GROUP_MULTITOUCH_WIN_8 0x0004 |
| 307 | 310 | ||
| 308 | /* | 311 | /* |
| 312 | * Vendor specific HID device groups | ||
| 313 | */ | ||
| 314 | #define HID_GROUP_RMI 0x0100 | ||
| 315 | |||
| 316 | /* | ||
| 309 | * This is the global environment of the parser. This information is | 317 | * This is the global environment of the parser. This information is |
| 310 | * persistent for main-items. The global environment can be saved and | 318 | * persistent for main-items. The global environment can be saved and |
| 311 | * restored with PUSH/POP statements. | 319 | * restored with PUSH/POP statements. |
