aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-11-27 11:56:17 -0500
committerHenrik Rydberg <rydberg@euromail.se>2010-12-16 04:43:18 -0500
commit4a864183fb28ddf553e5b0b47858bc3c518dae94 (patch)
treef53413263a2cd608cfe471e6ed13970501596711 /drivers/hid
parente42a98b520bb22535687ead3120e80edc268279a (diff)
hid: egalax: Setup input device manually
The hid core does not yet handle input filtering. Take over the setup of the input device, so that proper signal-to-noise ratios can be used. Signed-off-by: Jiri Kosina <jkosina@suse.cz> Cc: Stephane Chatty <chatty@enac.fr> Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/hid-egalax.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/hid/hid-egalax.c b/drivers/hid/hid-egalax.c
index 54b017ad258d..5be513c363e3 100644
--- a/drivers/hid/hid-egalax.c
+++ b/drivers/hid/hid-egalax.c
@@ -34,10 +34,21 @@ struct egalax_data {
34 __u16 lastx, lasty, lastz; /* latest valid (x, y, z) in the frame */ 34 __u16 lastx, lasty, lastz; /* latest valid (x, y, z) in the frame */
35}; 35};
36 36
37static void set_abs(struct input_dev *input, unsigned int code,
38 struct hid_field *field, int snratio)
39{
40 int fmin = field->logical_minimum;
41 int fmax = field->logical_maximum;
42 int fuzz = snratio ? (fmax - fmin) / snratio : 0;
43 input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
44}
45
37static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi, 46static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi,
38 struct hid_field *field, struct hid_usage *usage, 47 struct hid_field *field, struct hid_usage *usage,
39 unsigned long **bit, int *max) 48 unsigned long **bit, int *max)
40{ 49{
50 struct input_dev *input = hi->input;
51
41 switch (usage->hid & HID_USAGE_PAGE) { 52 switch (usage->hid & HID_USAGE_PAGE) {
42 53
43 case HID_UP_GENDESK: 54 case HID_UP_GENDESK:
@@ -45,18 +56,16 @@ static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi,
45 case HID_GD_X: 56 case HID_GD_X:
46 hid_map_usage(hi, usage, bit, max, 57 hid_map_usage(hi, usage, bit, max,
47 EV_ABS, ABS_MT_POSITION_X); 58 EV_ABS, ABS_MT_POSITION_X);
59 set_abs(input, ABS_MT_POSITION_X, field, 0);
48 /* touchscreen emulation */ 60 /* touchscreen emulation */
49 input_set_abs_params(hi->input, ABS_X, 61 set_abs(input, ABS_X, field, 0);
50 field->logical_minimum,
51 field->logical_maximum, 0, 0);
52 return 1; 62 return 1;
53 case HID_GD_Y: 63 case HID_GD_Y:
54 hid_map_usage(hi, usage, bit, max, 64 hid_map_usage(hi, usage, bit, max,
55 EV_ABS, ABS_MT_POSITION_Y); 65 EV_ABS, ABS_MT_POSITION_Y);
66 set_abs(input, ABS_MT_POSITION_Y, field, 0);
56 /* touchscreen emulation */ 67 /* touchscreen emulation */
57 input_set_abs_params(hi->input, ABS_Y, 68 set_abs(input, ABS_Y, field, 0);
58 field->logical_minimum,
59 field->logical_maximum, 0, 0);
60 return 1; 69 return 1;
61 } 70 }
62 return 0; 71 return 0;
@@ -66,6 +75,7 @@ static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi,
66 case HID_DG_TIPSWITCH: 75 case HID_DG_TIPSWITCH:
67 /* touchscreen emulation */ 76 /* touchscreen emulation */
68 hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); 77 hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH);
78 input_set_capability(input, EV_KEY, BTN_TOUCH);
69 return 1; 79 return 1;
70 case HID_DG_INRANGE: 80 case HID_DG_INRANGE:
71 case HID_DG_CONFIDENCE: 81 case HID_DG_CONFIDENCE:
@@ -75,14 +85,14 @@ static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi,
75 case HID_DG_CONTACTID: 85 case HID_DG_CONTACTID:
76 hid_map_usage(hi, usage, bit, max, 86 hid_map_usage(hi, usage, bit, max,
77 EV_ABS, ABS_MT_TRACKING_ID); 87 EV_ABS, ABS_MT_TRACKING_ID);
88 set_abs(input, ABS_MT_TRACKING_ID, field, 0);
78 return 1; 89 return 1;
79 case HID_DG_TIPPRESSURE: 90 case HID_DG_TIPPRESSURE:
80 hid_map_usage(hi, usage, bit, max, 91 hid_map_usage(hi, usage, bit, max,
81 EV_ABS, ABS_MT_PRESSURE); 92 EV_ABS, ABS_MT_PRESSURE);
93 set_abs(input, ABS_MT_PRESSURE, field, 0);
82 /* touchscreen emulation */ 94 /* touchscreen emulation */
83 input_set_abs_params(hi->input, ABS_PRESSURE, 95 set_abs(input, ABS_PRESSURE, field, 0);
84 field->logical_minimum,
85 field->logical_maximum, 0, 0);
86 return 1; 96 return 1;
87 } 97 }
88 return 0; 98 return 0;
@@ -96,10 +106,10 @@ static int egalax_input_mapped(struct hid_device *hdev, struct hid_input *hi,
96 struct hid_field *field, struct hid_usage *usage, 106 struct hid_field *field, struct hid_usage *usage,
97 unsigned long **bit, int *max) 107 unsigned long **bit, int *max)
98{ 108{
109 /* tell hid-input to skip setup of these event types */
99 if (usage->type == EV_KEY || usage->type == EV_ABS) 110 if (usage->type == EV_KEY || usage->type == EV_ABS)
100 clear_bit(usage->code, *bit); 111 set_bit(usage->type, hi->input->evbit);
101 112 return -1;
102 return 0;
103} 113}
104 114
105/* 115/*