diff options
Diffstat (limited to 'drivers/hid/hid-core.c')
-rw-r--r-- | drivers/hid/hid-core.c | 64 |
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 | ||
740 | static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | 743 | static __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 | */ |
763 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) | 767 | static __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 | ||
931 | static void hid_output_field(struct hid_field *field, __u8 *data) | 939 | static 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 | } |
961 | EXPORT_SYMBOL_GPL(hid_output_report); | 972 | EXPORT_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 | ||