diff options
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 76e1f64e976..30af8760174 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) {  |