diff options
Diffstat (limited to 'drivers/input/touchscreen/ad7879.c')
-rw-r--r-- | drivers/input/touchscreen/ad7879.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c index ba6f0bd1e762..bc3b5187f3a3 100644 --- a/drivers/input/touchscreen/ad7879.c +++ b/drivers/input/touchscreen/ad7879.c | |||
@@ -129,6 +129,9 @@ struct ad7879 { | |||
129 | u16 cmd_crtl1; | 129 | u16 cmd_crtl1; |
130 | u16 cmd_crtl2; | 130 | u16 cmd_crtl2; |
131 | u16 cmd_crtl3; | 131 | u16 cmd_crtl3; |
132 | int x; | ||
133 | int y; | ||
134 | int Rt; | ||
132 | }; | 135 | }; |
133 | 136 | ||
134 | static int ad7879_read(struct ad7879 *ts, u8 reg) | 137 | static int ad7879_read(struct ad7879 *ts, u8 reg) |
@@ -175,13 +178,32 @@ static int ad7879_report(struct ad7879 *ts) | |||
175 | Rt /= z1; | 178 | Rt /= z1; |
176 | Rt = (Rt + 2047) >> 12; | 179 | Rt = (Rt + 2047) >> 12; |
177 | 180 | ||
178 | if (!timer_pending(&ts->timer)) | 181 | /* |
182 | * Sample found inconsistent, pressure is beyond | ||
183 | * the maximum. Don't report it to user space. | ||
184 | */ | ||
185 | if (Rt > ts->pressure_max) | ||
186 | return -EINVAL; | ||
187 | |||
188 | /* | ||
189 | * Note that we delay reporting events by one sample. | ||
190 | * This is done to avoid reporting last sample of the | ||
191 | * touch sequence, which may be incomplete if finger | ||
192 | * leaves the surface before last reading is taken. | ||
193 | */ | ||
194 | if (timer_pending(&ts->timer)) { | ||
195 | /* Touch continues */ | ||
179 | input_report_key(input_dev, BTN_TOUCH, 1); | 196 | input_report_key(input_dev, BTN_TOUCH, 1); |
197 | input_report_abs(input_dev, ABS_X, ts->x); | ||
198 | input_report_abs(input_dev, ABS_Y, ts->y); | ||
199 | input_report_abs(input_dev, ABS_PRESSURE, ts->Rt); | ||
200 | input_sync(input_dev); | ||
201 | } | ||
202 | |||
203 | ts->x = x; | ||
204 | ts->y = y; | ||
205 | ts->Rt = Rt; | ||
180 | 206 | ||
181 | input_report_abs(input_dev, ABS_X, x); | ||
182 | input_report_abs(input_dev, ABS_Y, y); | ||
183 | input_report_abs(input_dev, ABS_PRESSURE, Rt); | ||
184 | input_sync(input_dev); | ||
185 | return 0; | 207 | return 0; |
186 | } | 208 | } |
187 | 209 | ||