aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-core.c')
-rw-r--r--drivers/hid/hid-core.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 396f8c7e0076..1fd5e331fa8d 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -14,6 +14,8 @@
14 * any later version. 14 * any later version.
15 */ 15 */
16 16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
17#include <linux/module.h> 19#include <linux/module.h>
18#include <linux/slab.h> 20#include <linux/slab.h>
19#include <linux/init.h> 21#include <linux/init.h>
@@ -672,7 +674,8 @@ int hid_parse_report(struct hid_device *device, __u8 *start,
672 674
673 if (dispatch_type[item.type](parser, &item)) { 675 if (dispatch_type[item.type](parser, &item)) {
674 dbg_hid("item %u %u %u %u parsing failed\n", 676 dbg_hid("item %u %u %u %u parsing failed\n",
675 item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); 677 item.format, (unsigned)item.size,
678 (unsigned)item.type, (unsigned)item.tag);
676 goto err; 679 goto err;
677 } 680 }
678 681
@@ -737,13 +740,14 @@ static u32 s32ton(__s32 value, unsigned n)
737 * Search linux-kernel and linux-usb-devel archives for "hid-core extract". 740 * Search linux-kernel and linux-usb-devel archives for "hid-core extract".
738 */ 741 */
739 742
740static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) 743static __inline__ __u32 extract(const struct hid_device *hid, __u8 *report,
744 unsigned offset, unsigned n)
741{ 745{
742 u64 x; 746 u64 x;
743 747
744 if (n > 32) 748 if (n > 32)
745 printk(KERN_WARNING "HID: extract() called with n (%d) > 32! (%s)\n", 749 hid_warn(hid, "extract() called with n (%d) > 32! (%s)\n",
746 n, current->comm); 750 n, current->comm);
747 751
748 report += offset >> 3; /* adjust byte index */ 752 report += offset >> 3; /* adjust byte index */
749 offset &= 7; /* now only need bit offset into one byte */ 753 offset &= 7; /* now only need bit offset into one byte */
@@ -760,18 +764,19 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n)
760 * endianness of register values by considering a register 764 * endianness of register values by considering a register
761 * a "cached" copy of the little endiad bit stream. 765 * a "cached" copy of the little endiad bit stream.
762 */ 766 */
763static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) 767static __inline__ void implement(const struct hid_device *hid, __u8 *report,
768 unsigned offset, unsigned n, __u32 value)
764{ 769{
765 u64 x; 770 u64 x;
766 u64 m = (1ULL << n) - 1; 771 u64 m = (1ULL << n) - 1;
767 772
768 if (n > 32) 773 if (n > 32)
769 printk(KERN_WARNING "HID: implement() called with n (%d) > 32! (%s)\n", 774 hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n",
770 n, current->comm); 775 __func__, n, current->comm);
771 776
772 if (value > m) 777 if (value > m)
773 printk(KERN_WARNING "HID: implement() called with too large value %d! (%s)\n", 778 hid_warn(hid, "%s() called with too large value %d! (%s)\n",
774 value, current->comm); 779 __func__, value, current->comm);
775 WARN_ON(value > m); 780 WARN_ON(value > m);
776 value &= m; 781 value &= m;
777 782
@@ -892,13 +897,16 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field,
892 897
893 for (n = 0; n < count; n++) { 898 for (n = 0; n < count; n++) {
894 899
895 value[n] = min < 0 ? snto32(extract(data, offset + n * size, size), size) : 900 value[n] = min < 0 ?
896 extract(data, offset + n * size, size); 901 snto32(extract(hid, data, offset + n * size, size),
902 size) :
903 extract(hid, data, offset + n * size, size);
897 904
898 if (!(field->flags & HID_MAIN_ITEM_VARIABLE) /* Ignore report if ErrorRollOver */ 905 /* Ignore report if ErrorRollOver */
899 && value[n] >= min && value[n] <= max 906 if (!(field->flags & HID_MAIN_ITEM_VARIABLE) &&
900 && field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1) 907 value[n] >= min && value[n] <= max &&
901 goto exit; 908 field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1)
909 goto exit;
902 } 910 }
903 911
904 for (n = 0; n < count; n++) { 912 for (n = 0; n < count; n++) {
@@ -928,7 +936,8 @@ exit:
928 * Output the field into the report. 936 * Output the field into the report.
929 */ 937 */
930 938
931static void hid_output_field(struct hid_field *field, __u8 *data) 939static void hid_output_field(const struct hid_device *hid,
940 struct hid_field *field, __u8 *data)
932{ 941{
933 unsigned count = field->report_count; 942 unsigned count = field->report_count;
934 unsigned offset = field->report_offset; 943 unsigned offset = field->report_offset;
@@ -937,9 +946,11 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
937 946
938 for (n = 0; n < count; n++) { 947 for (n = 0; n < count; n++) {
939 if (field->logical_minimum < 0) /* signed values */ 948 if (field->logical_minimum < 0) /* signed values */
940 implement(data, offset + n * size, size, s32ton(field->value[n], size)); 949 implement(hid, data, offset + n * size, size,
950 s32ton(field->value[n], size));
941 else /* unsigned values */ 951 else /* unsigned values */
942 implement(data, offset + n * size, size, field->value[n]); 952 implement(hid, data, offset + n * size, size,
953 field->value[n]);
943 } 954 }
944} 955}
945 956
@@ -956,7 +967,7 @@ void hid_output_report(struct hid_report *report, __u8 *data)
956 967
957 memset(data, 0, ((report->size - 1) >> 3) + 1); 968 memset(data, 0, ((report->size - 1) >> 3) + 1);
958 for (n = 0; n < report->maxfield; n++) 969 for (n = 0; n < report->maxfield; n++)
959 hid_output_field(report->field[n], data); 970 hid_output_field(report->device, report->field[n], data);
960} 971}
961EXPORT_SYMBOL_GPL(hid_output_report); 972EXPORT_SYMBOL_GPL(hid_output_report);
962 973
@@ -1169,8 +1180,7 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
1169 hdev->claimed |= HID_CLAIMED_HIDRAW; 1180 hdev->claimed |= HID_CLAIMED_HIDRAW;
1170 1181
1171 if (!hdev->claimed) { 1182 if (!hdev->claimed) {
1172 dev_err(&hdev->dev, "claimed by neither input, hiddev nor " 1183 hid_err(hdev, "claimed by neither input, hiddev nor hidraw\n");
1173 "hidraw\n");
1174 return -ENODEV; 1184 return -ENODEV;
1175 } 1185 }
1176 1186
@@ -1210,9 +1220,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
1210 bus = "<UNKNOWN>"; 1220 bus = "<UNKNOWN>";
1211 } 1221 }
1212 1222
1213 dev_info(&hdev->dev, "%s: %s HID v%x.%02x %s [%s] on %s\n", 1223 hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
1214 buf, bus, hdev->version >> 8, hdev->version & 0xff, 1224 buf, bus, hdev->version >> 8, hdev->version & 0xff,
1215 type, hdev->name, hdev->phys); 1225 type, hdev->name, hdev->phys);
1216 1226
1217 return 0; 1227 return 0;
1218} 1228}
@@ -1956,12 +1966,12 @@ static int __init hid_init(void)
1956 int ret; 1966 int ret;
1957 1967
1958 if (hid_debug) 1968 if (hid_debug)
1959 printk(KERN_WARNING "HID: hid_debug is now used solely for parser and driver debugging.\n" 1969 pr_warn("hid_debug is now used solely for parser and driver debugging.\n"
1960 "HID: debugfs is now used for inspecting the device (report descriptor, reports)\n"); 1970 "debugfs is now used for inspecting the device (report descriptor, reports)\n");
1961 1971
1962 ret = bus_register(&hid_bus_type); 1972 ret = bus_register(&hid_bus_type);
1963 if (ret) { 1973 if (ret) {
1964 printk(KERN_ERR "HID: can't register hid bus\n"); 1974 pr_err("can't register hid bus\n");
1965 goto err; 1975 goto err;
1966 } 1976 }
1967 1977