diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-12-02 05:49:06 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-12-02 05:49:11 -0500 |
commit | 83ed79c561da20019cb24944f535530d73b2d615 (patch) | |
tree | 8a26828f4f69ead058d95e7c5903feaf2bbc178c /drivers | |
parent | d65c3768afb47fb93c43fbfcafef53502edaaa85 (diff) |
HID: length resolution should be reported units/mm
Input ABI requires reporting resolution on main axes in units per
millimeter, not units per inch, so we need to convert accordingly.
Tested-by: Nikolai Kondrashov <spbnick@gmail.com>
Acked-by: Nikolai Kondrashov <spbnick@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hid/hid-input.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 76e1f64e9765..30af8760174b 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -162,8 +162,8 @@ static int hidinput_setkeycode(struct input_dev *dev, | |||
162 | * | 162 | * |
163 | * as seen in the HID specification v1.11 6.2.2.7 Global Items. | 163 | * as seen in the HID specification v1.11 6.2.2.7 Global Items. |
164 | * | 164 | * |
165 | * Only exponent 1 length units are processed. Centimeters are converted to | 165 | * Only exponent 1 length units are processed. Centimeters and inches are |
166 | * inches. Degrees are converted to radians. | 166 | * converted to millimeters. Degrees are converted to radians. |
167 | */ | 167 | */ |
168 | static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) | 168 | static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) |
169 | { | 169 | { |
@@ -184,13 +184,16 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) | |||
184 | */ | 184 | */ |
185 | if (code == ABS_X || code == ABS_Y || code == ABS_Z) { | 185 | if (code == ABS_X || code == ABS_Y || code == ABS_Z) { |
186 | if (field->unit == 0x11) { /* If centimeters */ | 186 | if (field->unit == 0x11) { /* If centimeters */ |
187 | /* Convert to inches */ | 187 | /* Convert to millimeters */ |
188 | prev = logical_extents; | 188 | unit_exponent += 1; |
189 | logical_extents *= 254; | 189 | } else if (field->unit == 0x13) { /* If inches */ |
190 | if (logical_extents < prev) | 190 | /* Convert to millimeters */ |
191 | prev = physical_extents; | ||
192 | physical_extents *= 254; | ||
193 | if (physical_extents < prev) | ||
191 | return 0; | 194 | return 0; |
192 | unit_exponent += 2; | 195 | unit_exponent -= 1; |
193 | } else if (field->unit != 0x13) { /* If not inches */ | 196 | } else { |
194 | return 0; | 197 | return 0; |
195 | } | 198 | } |
196 | } else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) { | 199 | } else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) { |