diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-12-02 11:49:06 +0100 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-12-02 11:49:11 +0100 |
commit | 83ed79c561da20019cb24944f535530d73b2d615 (patch) | |
tree | 8a26828f4f69ead058d95e7c5903feaf2bbc178c /drivers/hid/hid-input.c | |
parent | d65c3768afb47fb93c43fbfcafef53502edaaa85 (diff) | |
download | linux-83ed79c561da20019cb24944f535530d73b2d615.tar.gz |
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/hid/hid-input.c')
-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, * * as seen in the HID specification v1.11 6.2.2.7 Global Items. * - * Only exponent 1 length units are processed. Centimeters are converted to - * inches. Degrees are converted to radians. + * Only exponent 1 length units are processed. Centimeters and inches are + * converted to millimeters. Degrees are converted to radians. */ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) { @@ -184,13 +184,16 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) */ if (code == ABS_X || code == ABS_Y || code == ABS_Z) { if (field->unit == 0x11) { /* If centimeters */ - /* Convert to inches */ - prev = logical_extents; - logical_extents *= 254; - if (logical_extents < prev) + /* Convert to millimeters */ + unit_exponent += 1; + } else if (field->unit == 0x13) { /* If inches */ + /* Convert to millimeters */ + prev = physical_extents; + physical_extents *= 254; + if (physical_extents < prev) return 0; - unit_exponent += 2; - } else if (field->unit != 0x13) { /* If not inches */ + unit_exponent -= 1; + } else { return 0; } } else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) { |