aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/hid-magicmouse.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index 319b0e57ee41..b74abf202e01 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -98,7 +98,6 @@ struct magicmouse_sc {
98 short scroll_x; 98 short scroll_x;
99 short scroll_y; 99 short scroll_y;
100 u8 size; 100 u8 size;
101 u8 down;
102 } touches[16]; 101 } touches[16];
103 int tracking_ids[16]; 102 int tracking_ids[16];
104}; 103};
@@ -226,8 +225,6 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
226 if (report_touches && down) { 225 if (report_touches && down) {
227 int orientation = (misc >> 10) - 32; 226 int orientation = (misc >> 10) - 32;
228 227
229 msc->touches[id].down = 1;
230
231 input_report_abs(input, ABS_MT_TRACKING_ID, id); 228 input_report_abs(input, ABS_MT_TRACKING_ID, id);
232 input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]); 229 input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]);
233 input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]); 230 input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]);
@@ -240,6 +237,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
240 237
241 input_mt_sync(input); 238 input_mt_sync(input);
242 } 239 }
240
241 if (down)
242 msc->ntouches++;
243} 243}
244 244
245static int magicmouse_raw_event(struct hid_device *hdev, 245static int magicmouse_raw_event(struct hid_device *hdev,
@@ -247,7 +247,7 @@ static int magicmouse_raw_event(struct hid_device *hdev,
247{ 247{
248 struct magicmouse_sc *msc = hid_get_drvdata(hdev); 248 struct magicmouse_sc *msc = hid_get_drvdata(hdev);
249 struct input_dev *input = msc->input; 249 struct input_dev *input = msc->input;
250 int x, y, ts, ii, clicks, last_up; 250 int x, y, ts, ii, clicks, npoints;
251 251
252 switch (data[0]) { 252 switch (data[0]) {
253 case 0x10: 253 case 0x10:
@@ -264,22 +264,13 @@ static int magicmouse_raw_event(struct hid_device *hdev,
264 ts = data[3] >> 6 | data[4] << 2 | data[5] << 10; 264 ts = data[3] >> 6 | data[4] << 2 | data[5] << 10;
265 msc->delta_time = (ts - msc->last_timestamp) & 0x3ffff; 265 msc->delta_time = (ts - msc->last_timestamp) & 0x3ffff;
266 msc->last_timestamp = ts; 266 msc->last_timestamp = ts;
267 msc->ntouches = (size - 6) / 8; 267 npoints = (size - 6) / 8;
268 for (ii = 0; ii < msc->ntouches; ii++) 268 msc->ntouches = 0;
269 for (ii = 0; ii < npoints; ii++)
269 magicmouse_emit_touch(msc, ii, data + ii * 8 + 6); 270 magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
270 271
271 if (report_touches) { 272 if (report_touches && msc->ntouches == 0)
272 last_up = 1; 273 input_mt_sync(input);
273 for (ii = 0; ii < ARRAY_SIZE(msc->touches); ii++) {
274 if (msc->touches[ii].down) {
275 last_up = 0;
276 msc->touches[ii].down = 0;
277 }
278 }
279 if (last_up) {
280 input_mt_sync(input);
281 }
282 }
283 274
284 /* When emulating three-button mode, it is important 275 /* When emulating three-button mode, it is important
285 * to have the current touch information before 276 * to have the current touch information before