Commit 37cf6e6f authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Jiri Kosina

HID: export hidinput_calc_abs_res

Exporting the function allows us to calculate the resolution in third
party drivers like hid-multitouch.
This patch also complete the function with additional valid axes.
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@gmail.com>
Acked-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 976bacef
...@@ -208,7 +208,7 @@ static int hidinput_setkeycode(struct input_dev *dev, ...@@ -208,7 +208,7 @@ static int hidinput_setkeycode(struct input_dev *dev,
* Only exponent 1 length units are processed. Centimeters and inches are * Only exponent 1 length units are processed. Centimeters and inches are
* converted to millimeters. Degrees are converted to radians. * converted to millimeters. Degrees are converted to radians.
*/ */
static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
{ {
__s32 unit_exponent = field->unit_exponent; __s32 unit_exponent = field->unit_exponent;
__s32 logical_extents = field->logical_maximum - __s32 logical_extents = field->logical_maximum -
...@@ -229,6 +229,12 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) ...@@ -229,6 +229,12 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
case ABS_X: case ABS_X:
case ABS_Y: case ABS_Y:
case ABS_Z: case ABS_Z:
case ABS_MT_POSITION_X:
case ABS_MT_POSITION_Y:
case ABS_MT_TOOL_X:
case ABS_MT_TOOL_Y:
case ABS_MT_TOUCH_MAJOR:
case ABS_MT_TOUCH_MINOR:
if (field->unit == 0x11) { /* If centimeters */ if (field->unit == 0x11) { /* If centimeters */
/* Convert to millimeters */ /* Convert to millimeters */
unit_exponent += 1; unit_exponent += 1;
...@@ -283,6 +289,7 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) ...@@ -283,6 +289,7 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
/* Calculate resolution */ /* Calculate resolution */
return logical_extents / physical_extents; return logical_extents / physical_extents;
} }
EXPORT_SYMBOL_GPL(hidinput_calc_abs_res);
#ifdef CONFIG_HID_BATTERY_STRENGTH #ifdef CONFIG_HID_BATTERY_STRENGTH
static enum power_supply_property hidinput_battery_props[] = { static enum power_supply_property hidinput_battery_props[] = {
......
...@@ -297,6 +297,7 @@ static void set_abs(struct input_dev *input, unsigned int code, ...@@ -297,6 +297,7 @@ static void set_abs(struct input_dev *input, unsigned int code,
int fmax = field->logical_maximum; int fmax = field->logical_maximum;
int fuzz = snratio ? (fmax - fmin) / snratio : 0; int fuzz = snratio ? (fmax - fmin) / snratio : 0;
input_set_abs_params(input, code, fmin, fmax, fuzz, 0); input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
input_abs_set_res(input, code, hidinput_calc_abs_res(field, code));
} }
static void mt_store_field(struct hid_usage *usage, struct mt_device *td, static void mt_store_field(struct hid_usage *usage, struct mt_device *td,
......
...@@ -706,6 +706,7 @@ int hid_input_report(struct hid_device *, int type, u8 *, int, int); ...@@ -706,6 +706,7 @@ int hid_input_report(struct hid_device *, int type, u8 *, int, int);
int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field); int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field);
struct hid_field *hidinput_get_led_field(struct hid_device *hid); struct hid_field *hidinput_get_led_field(struct hid_device *hid);
unsigned int hidinput_count_leds(struct hid_device *hid); unsigned int hidinput_count_leds(struct hid_device *hid);
__s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code);
void hid_output_report(struct hid_report *report, __u8 *data); void hid_output_report(struct hid_report *report, __u8 *data);
struct hid_device *hid_allocate_device(void); struct hid_device *hid_allocate_device(void);
struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id); struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment