diff options
Diffstat (limited to 'drivers/hid/hid-core.c')
-rw-r--r-- | drivers/hid/hid-core.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 3402033fa52a..c3d0ac1a0988 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -702,6 +702,11 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type) | |||
702 | if (((parser->global.usage_page << 16) == HID_UP_SENSOR) && | 702 | if (((parser->global.usage_page << 16) == HID_UP_SENSOR) && |
703 | type == HID_COLLECTION_PHYSICAL) | 703 | type == HID_COLLECTION_PHYSICAL) |
704 | hid->group = HID_GROUP_SENSOR_HUB; | 704 | hid->group = HID_GROUP_SENSOR_HUB; |
705 | |||
706 | if (hid->vendor == USB_VENDOR_ID_MICROSOFT && | ||
707 | hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3 && | ||
708 | hid->group == HID_GROUP_MULTITOUCH) | ||
709 | hid->group = HID_GROUP_GENERIC; | ||
705 | } | 710 | } |
706 | 711 | ||
707 | static int hid_scan_main(struct hid_parser *parser, struct hid_item *item) | 712 | static int hid_scan_main(struct hid_parser *parser, struct hid_item *item) |
@@ -780,22 +785,19 @@ static int hid_scan_report(struct hid_device *hid) | |||
780 | hid->group = HID_GROUP_MULTITOUCH_WIN_8; | 785 | hid->group = HID_GROUP_MULTITOUCH_WIN_8; |
781 | 786 | ||
782 | /* | 787 | /* |
783 | * Vendor specific handlings | ||
784 | */ | ||
785 | if ((hid->vendor == USB_VENDOR_ID_SYNAPTICS) && | ||
786 | (hid->group == HID_GROUP_GENERIC) && | ||
787 | /* only bind to the mouse interface of composite USB devices */ | ||
788 | (hid->bus != BUS_USB || hid->type == HID_TYPE_USBMOUSE)) | ||
789 | /* hid-rmi should take care of them, not hid-generic */ | ||
790 | hid->group = HID_GROUP_RMI; | ||
791 | |||
792 | /* | ||
793 | * Vendor specific handlings | 788 | * Vendor specific handlings |
794 | */ | 789 | */ |
795 | switch (hid->vendor) { | 790 | switch (hid->vendor) { |
796 | case USB_VENDOR_ID_WACOM: | 791 | case USB_VENDOR_ID_WACOM: |
797 | hid->group = HID_GROUP_WACOM; | 792 | hid->group = HID_GROUP_WACOM; |
798 | break; | 793 | break; |
794 | case USB_VENDOR_ID_SYNAPTICS: | ||
795 | if ((hid->group == HID_GROUP_GENERIC) && | ||
796 | (hid->bus != BUS_USB || hid->type == HID_TYPE_USBMOUSE)) | ||
797 | /* hid-rmi should only bind to the mouse interface of | ||
798 | * composite USB devices */ | ||
799 | hid->group = HID_GROUP_RMI; | ||
800 | break; | ||
799 | } | 801 | } |
800 | 802 | ||
801 | vfree(parser); | 803 | vfree(parser); |
@@ -1280,12 +1282,6 @@ void hid_output_report(struct hid_report *report, __u8 *data) | |||
1280 | } | 1282 | } |
1281 | EXPORT_SYMBOL_GPL(hid_output_report); | 1283 | EXPORT_SYMBOL_GPL(hid_output_report); |
1282 | 1284 | ||
1283 | static int hid_report_len(struct hid_report *report) | ||
1284 | { | ||
1285 | /* equivalent to DIV_ROUND_UP(report->size, 8) + !!(report->id > 0) */ | ||
1286 | return ((report->size - 1) >> 3) + 1 + (report->id > 0); | ||
1287 | } | ||
1288 | |||
1289 | /* | 1285 | /* |
1290 | * Allocator for buffer that is going to be passed to hid_output_report() | 1286 | * Allocator for buffer that is going to be passed to hid_output_report() |
1291 | */ | 1287 | */ |
@@ -1822,6 +1818,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1822 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, | 1818 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, |
1823 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) }, | 1819 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) }, |
1824 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) }, | 1820 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) }, |
1821 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_T651) }, | ||
1825 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) }, | 1822 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) }, |
1826 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) }, | 1823 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) }, |
1827 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) }, | 1824 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) }, |
@@ -1862,6 +1859,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1862 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) }, | 1859 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) }, |
1863 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, | 1860 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, |
1864 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) }, | 1861 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) }, |
1862 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3) }, | ||
1865 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, | 1863 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, |
1866 | { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) }, | 1864 | { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) }, |
1867 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, | 1865 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) }, |
@@ -1887,6 +1885,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1887 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, | 1885 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, |
1888 | { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) }, | 1886 | { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) }, |
1889 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, | 1887 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, |
1888 | { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) }, | ||
1890 | { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) }, | 1889 | { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) }, |
1891 | #if IS_ENABLED(CONFIG_HID_ROCCAT) | 1890 | #if IS_ENABLED(CONFIG_HID_ROCCAT) |
1892 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, | 1891 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, |
@@ -1910,10 +1909,12 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1910 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) }, | 1909 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) }, |
1911 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7) }, | 1910 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7) }, |
1912 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7) }, | 1911 | { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7) }, |
1912 | { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9) }, | ||
1913 | #endif | 1913 | #endif |
1914 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, | 1914 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, |
1915 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, | 1915 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, |
1916 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, | 1916 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, |
1917 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE) }, | ||
1917 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, | 1918 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, |
1918 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) }, | 1919 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) }, |
1919 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, | 1920 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, |
@@ -2539,7 +2540,8 @@ int hid_add_device(struct hid_device *hdev) | |||
2539 | * Scan generic devices for group information | 2540 | * Scan generic devices for group information |
2540 | */ | 2541 | */ |
2541 | if (hid_ignore_special_drivers || | 2542 | if (hid_ignore_special_drivers || |
2542 | !hid_match_id(hdev, hid_have_special_driver)) { | 2543 | (!hdev->group && |
2544 | !hid_match_id(hdev, hid_have_special_driver))) { | ||
2543 | ret = hid_scan_report(hdev); | 2545 | ret = hid_scan_report(hdev); |
2544 | if (ret) | 2546 | if (ret) |
2545 | hid_warn(hdev, "bad device descriptor (%d)\n", ret); | 2547 | hid_warn(hdev, "bad device descriptor (%d)\n", ret); |