diff options
author | Jiri Kosina <jkosina@suse.cz> | 2010-05-19 08:04:49 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-05-19 08:04:49 -0400 |
commit | 7426ef52b42ebd54ba85133ffd29132e008a882c (patch) | |
tree | 5232ca850065baf025e8d7384408b48b4b462c96 /drivers/hid/hid-core.c | |
parent | 537b60d17894b7c19a6060feae40299d7109d6e7 (diff) | |
parent | a8ab5d58b0238b8199cc699b8dff7c5e1da24138 (diff) |
Merge branch 'upstream' into for-linus
Conflicts:
drivers/hid/hid-wacom.c
Diffstat (limited to 'drivers/hid/hid-core.c')
-rw-r--r-- | drivers/hid/hid-core.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 143e788b729b..69fdf1e2347b 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -653,10 +653,9 @@ int hid_parse_report(struct hid_device *device, __u8 *start, | |||
653 | if (device->driver->report_fixup) | 653 | if (device->driver->report_fixup) |
654 | device->driver->report_fixup(device, start, size); | 654 | device->driver->report_fixup(device, start, size); |
655 | 655 | ||
656 | device->rdesc = kmalloc(size, GFP_KERNEL); | 656 | device->rdesc = kmemdup(start, size, GFP_KERNEL); |
657 | if (device->rdesc == NULL) | 657 | if (device->rdesc == NULL) |
658 | return -ENOMEM; | 658 | return -ENOMEM; |
659 | memcpy(device->rdesc, start, size); | ||
660 | device->rsize = size; | 659 | device->rsize = size; |
661 | 660 | ||
662 | parser = vmalloc(sizeof(struct hid_parser)); | 661 | parser = vmalloc(sizeof(struct hid_parser)); |
@@ -940,13 +939,8 @@ static void hid_output_field(struct hid_field *field, __u8 *data) | |||
940 | unsigned count = field->report_count; | 939 | unsigned count = field->report_count; |
941 | unsigned offset = field->report_offset; | 940 | unsigned offset = field->report_offset; |
942 | unsigned size = field->report_size; | 941 | unsigned size = field->report_size; |
943 | unsigned bitsused = offset + count * size; | ||
944 | unsigned n; | 942 | unsigned n; |
945 | 943 | ||
946 | /* make sure the unused bits in the last byte are zeros */ | ||
947 | if (count > 0 && size > 0 && (bitsused % 8) != 0) | ||
948 | data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1; | ||
949 | |||
950 | for (n = 0; n < count; n++) { | 944 | for (n = 0; n < count; n++) { |
951 | if (field->logical_minimum < 0) /* signed values */ | 945 | if (field->logical_minimum < 0) /* signed values */ |
952 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); | 946 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); |
@@ -966,6 +960,7 @@ void hid_output_report(struct hid_report *report, __u8 *data) | |||
966 | if (report->id > 0) | 960 | if (report->id > 0) |
967 | *data++ = report->id; | 961 | *data++ = report->id; |
968 | 962 | ||
963 | memset(data, 0, ((report->size - 1) >> 3) + 1); | ||
969 | for (n = 0; n < report->maxfield; n++) | 964 | for (n = 0; n < report->maxfield; n++) |
970 | hid_output_field(report->field[n], data); | 965 | hid_output_field(report->field[n], data); |
971 | } | 966 | } |
@@ -1167,6 +1162,8 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask) | |||
1167 | unsigned int i; | 1162 | unsigned int i; |
1168 | int len; | 1163 | int len; |
1169 | 1164 | ||
1165 | if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE) | ||
1166 | connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV); | ||
1170 | if (hdev->bus != BUS_USB) | 1167 | if (hdev->bus != BUS_USB) |
1171 | connect_mask &= ~HID_CONNECT_HIDDEV; | 1168 | connect_mask &= ~HID_CONNECT_HIDDEV; |
1172 | if (hid_hiddev(hdev)) | 1169 | if (hid_hiddev(hdev)) |
@@ -1246,6 +1243,7 @@ EXPORT_SYMBOL_GPL(hid_disconnect); | |||
1246 | /* a list of devices for which there is a specialized driver on HID bus */ | 1243 | /* a list of devices for which there is a specialized driver on HID bus */ |
1247 | static const struct hid_device_id hid_blacklist[] = { | 1244 | static const struct hid_device_id hid_blacklist[] = { |
1248 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, | 1245 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, |
1246 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, | ||
1249 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, | 1247 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, |
1250 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, | 1248 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, |
1251 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, | 1249 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, |
@@ -1290,6 +1288,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1290 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | 1288 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
1291 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1289 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
1292 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1290 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
1291 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, | ||
1293 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1292 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
1294 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | 1293 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, |
1295 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | 1294 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, |
@@ -1343,6 +1342,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1343 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) }, | 1342 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) }, |
1344 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, | 1343 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, |
1345 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, | 1344 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, |
1345 | { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, | ||
1346 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, | 1346 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, |
1347 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, | 1347 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, |
1348 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, | 1348 | { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, |
@@ -1359,8 +1359,10 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1359 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, | 1359 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, |
1360 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, | 1360 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, |
1361 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, | 1361 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, |
1362 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, | ||
1362 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, | 1363 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, |
1363 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, | 1364 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, |
1365 | { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, | ||
1364 | 1366 | ||
1365 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, | 1367 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, |
1366 | { } | 1368 | { } |
@@ -1757,7 +1759,7 @@ int hid_add_device(struct hid_device *hdev) | |||
1757 | 1759 | ||
1758 | /* we need to kill them here, otherwise they will stay allocated to | 1760 | /* we need to kill them here, otherwise they will stay allocated to |
1759 | * wait for coming driver */ | 1761 | * wait for coming driver */ |
1760 | if (hid_ignore(hdev)) | 1762 | if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) && hid_ignore(hdev)) |
1761 | return -ENODEV; | 1763 | return -ENODEV; |
1762 | 1764 | ||
1763 | /* XXX hack, any other cleaner solution after the driver core | 1765 | /* XXX hack, any other cleaner solution after the driver core |
@@ -1765,11 +1767,12 @@ int hid_add_device(struct hid_device *hdev) | |||
1765 | dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, | 1767 | dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, |
1766 | hdev->vendor, hdev->product, atomic_inc_return(&id)); | 1768 | hdev->vendor, hdev->product, atomic_inc_return(&id)); |
1767 | 1769 | ||
1770 | hid_debug_register(hdev, dev_name(&hdev->dev)); | ||
1768 | ret = device_add(&hdev->dev); | 1771 | ret = device_add(&hdev->dev); |
1769 | if (!ret) | 1772 | if (!ret) |
1770 | hdev->status |= HID_STAT_ADDED; | 1773 | hdev->status |= HID_STAT_ADDED; |
1771 | 1774 | else | |
1772 | hid_debug_register(hdev, dev_name(&hdev->dev)); | 1775 | hid_debug_unregister(hdev); |
1773 | 1776 | ||
1774 | return ret; | 1777 | return ret; |
1775 | } | 1778 | } |