diff options
author | Nikolai Kondrashov <spbnick@gmail.com> | 2010-08-06 15:03:06 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-08-09 13:52:42 -0400 |
commit | 73e4008ddddc84d5f2499c17012b340a0dae153e (patch) | |
tree | d3adfa8c5792e71c21cb7a9cd18517cce9c92685 /drivers/hid/hid-samsung.c | |
parent | 3cfc2c42c1cbc8e238bb9c0612c0df4565e3a8b4 (diff) |
HID: allow resizing and replacing report descriptors
Update hid_driver's report_fixup prototype to allow changing report
descriptor size and/or returning completely different report descriptor.
Update existing usage accordingly.
This is to give more freedom in descriptor fixup and to allow having a whole
fixed descriptor in the code for the sake of readability.
Signed-off-by: Nikolai Kondrashov <spbnick@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-samsung.c')
-rw-r--r-- | drivers/hid/hid-samsung.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/hid/hid-samsung.c b/drivers/hid/hid-samsung.c index bda0fd60c98d..35894444e000 100644 --- a/drivers/hid/hid-samsung.c +++ b/drivers/hid/hid-samsung.c | |||
@@ -61,10 +61,10 @@ static inline void samsung_irda_dev_trace(struct hid_device *hdev, | |||
61 | "descriptor\n", rsize); | 61 | "descriptor\n", rsize); |
62 | } | 62 | } |
63 | 63 | ||
64 | static void samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc, | 64 | static __u8 *samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
65 | unsigned int rsize) | 65 | unsigned int *rsize) |
66 | { | 66 | { |
67 | if (rsize == 184 && rdesc[175] == 0x25 && rdesc[176] == 0x40 && | 67 | if (*rsize == 184 && rdesc[175] == 0x25 && rdesc[176] == 0x40 && |
68 | rdesc[177] == 0x75 && rdesc[178] == 0x30 && | 68 | rdesc[177] == 0x75 && rdesc[178] == 0x30 && |
69 | rdesc[179] == 0x95 && rdesc[180] == 0x01 && | 69 | rdesc[179] == 0x95 && rdesc[180] == 0x01 && |
70 | rdesc[182] == 0x40) { | 70 | rdesc[182] == 0x40) { |
@@ -74,24 +74,25 @@ static void samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
74 | rdesc[180] = 0x06; | 74 | rdesc[180] = 0x06; |
75 | rdesc[182] = 0x42; | 75 | rdesc[182] = 0x42; |
76 | } else | 76 | } else |
77 | if (rsize == 203 && rdesc[192] == 0x15 && rdesc[193] == 0x0 && | 77 | if (*rsize == 203 && rdesc[192] == 0x15 && rdesc[193] == 0x0 && |
78 | rdesc[194] == 0x25 && rdesc[195] == 0x12) { | 78 | rdesc[194] == 0x25 && rdesc[195] == 0x12) { |
79 | samsung_irda_dev_trace(hdev, 203); | 79 | samsung_irda_dev_trace(hdev, 203); |
80 | rdesc[193] = 0x1; | 80 | rdesc[193] = 0x1; |
81 | rdesc[195] = 0xf; | 81 | rdesc[195] = 0xf; |
82 | } else | 82 | } else |
83 | if (rsize == 135 && rdesc[124] == 0x15 && rdesc[125] == 0x0 && | 83 | if (*rsize == 135 && rdesc[124] == 0x15 && rdesc[125] == 0x0 && |
84 | rdesc[126] == 0x25 && rdesc[127] == 0x11) { | 84 | rdesc[126] == 0x25 && rdesc[127] == 0x11) { |
85 | samsung_irda_dev_trace(hdev, 135); | 85 | samsung_irda_dev_trace(hdev, 135); |
86 | rdesc[125] = 0x1; | 86 | rdesc[125] = 0x1; |
87 | rdesc[127] = 0xe; | 87 | rdesc[127] = 0xe; |
88 | } else | 88 | } else |
89 | if (rsize == 171 && rdesc[160] == 0x15 && rdesc[161] == 0x0 && | 89 | if (*rsize == 171 && rdesc[160] == 0x15 && rdesc[161] == 0x0 && |
90 | rdesc[162] == 0x25 && rdesc[163] == 0x01) { | 90 | rdesc[162] == 0x25 && rdesc[163] == 0x01) { |
91 | samsung_irda_dev_trace(hdev, 171); | 91 | samsung_irda_dev_trace(hdev, 171); |
92 | rdesc[161] = 0x1; | 92 | rdesc[161] = 0x1; |
93 | rdesc[163] = 0x3; | 93 | rdesc[163] = 0x3; |
94 | } | 94 | } |
95 | return rdesc; | ||
95 | } | 96 | } |
96 | 97 | ||
97 | #define samsung_kbd_mouse_map_key_clear(c) \ | 98 | #define samsung_kbd_mouse_map_key_clear(c) \ |
@@ -130,11 +131,12 @@ static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev, | |||
130 | return 1; | 131 | return 1; |
131 | } | 132 | } |
132 | 133 | ||
133 | static void samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc, | 134 | static __u8 *samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
134 | unsigned int rsize) | 135 | unsigned int *rsize) |
135 | { | 136 | { |
136 | if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product) | 137 | if (USB_DEVICE_ID_SAMSUNG_IR_REMOTE == hdev->product) |
137 | samsung_irda_report_fixup(hdev, rdesc, rsize); | 138 | rdesc = samsung_irda_report_fixup(hdev, rdesc, rsize); |
139 | return rdesc; | ||
138 | } | 140 | } |
139 | 141 | ||
140 | static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi, | 142 | static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi, |