CHROMIUM: Input: atmel_mxt_ts - send all MT-B slots in one input report
authorDaniel Kurtz <djkurtz@chromium.org>
Tue, 21 Feb 2012 10:41:31 +0000 (18:41 +0800)
committerGrant Grundler <grundler@google.com>
Thu, 24 May 2012 22:12:06 +0000 (15:12 -0700)
Each interrupt contains information for all contacts with changing
properties.  Process all of this information at once, and send it all in a
a single input report (ie input events ending in EV_SYN/SYN_REPORT).

Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
BUG=chromium-os:27713
TEST=builds clean;
  Touch 3 fingers on the atmel device touch surface.
  Notice that 3 MT-B slots are created with unique SLOT & TRACKING IDs.
  Move all 3 fingers at once.
  Using evtest, notice that all 3 slots are updated between SYN_REPORTs.

Change-Id: Ib8ff0487a5db454afc0c9bb2271082178dc9371e
Reviewed-on: https://gerrit.chromium.org/gerrit/17958
Commit-Ready: Daniel Kurtz <djkurtz@chromium.org>
Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
Tested-by: Daniel Kurtz <djkurtz@chromium.org>
Reviewed-by: Benson Leung <bleung@chromium.org>
drivers/input/touchscreen/atmel_mxt_ts.c

index 2c5661f..17066a3 100644 (file)
@@ -516,8 +516,7 @@ static int mxt_read_messages(struct mxt_data *data, u8 count,
                            sizeof(struct mxt_message) * count, messages);
 }
 
-static void mxt_input_touchevent(struct mxt_data *data,
-                                struct mxt_message *message)
+static void mxt_input_touch(struct mxt_data *data, struct mxt_message *message)
 {
        struct device *dev = &data->client->dev;
        struct input_dev *input_dev = data->input_dev;
@@ -571,9 +570,6 @@ static void mxt_input_touchevent(struct mxt_data *data,
                input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, area);
                /* TODO: Use vector to report ORIENTATION & TOUCH_MINOR */
        }
-
-       input_mt_report_pointer_emulation(input_dev, false);
-       input_sync(input_dev);
 }
 
 static int mxt_proc_messages(struct mxt_data *data, u8 count)
@@ -581,6 +577,7 @@ static int mxt_proc_messages(struct mxt_data *data, u8 count)
        struct device *dev = &data->client->dev;
        struct mxt_message messages[count], *msg;
        int ret;
+       bool update_input;
 
        ret = mxt_read_messages(data, count, messages);
        if (ret) {
@@ -588,12 +585,14 @@ static int mxt_proc_messages(struct mxt_data *data, u8 count)
                return ret;
        }
 
+       update_input = false;
        for (msg = messages; msg < &messages[count]; msg++) {
                mxt_dump_message(dev, msg);
 
                if (msg->reportid >= data->T9_reportid_min &&
                    msg->reportid <= data->T9_reportid_max) {
-                       mxt_input_touchevent(data, msg);
+                       mxt_input_touch(data, msg);
+                       update_input = true;
                } else if (msg->reportid == data->T6_reportid) {
                        unsigned csum = msg->message[1] |
                                        (msg->message[2] << 8) |
@@ -603,6 +602,11 @@ static int mxt_proc_messages(struct mxt_data *data, u8 count)
                }
        }
 
+       if (update_input) {
+               input_mt_report_pointer_emulation(data->input_dev, false);
+               input_sync(data->input_dev);
+       }
+
        return 0;
 }