Skip to content

Instantly share code, notes, and snippets.

@syndtr
Created November 4, 2011 14:13
Show Gist options
  • Save syndtr/1339406 to your computer and use it in GitHub Desktop.
Save syndtr/1339406 to your computer and use it in GitHub Desktop.
mxt224 mt protocol fix
diff --git a/drivers/input/touchscreen/mxt224.c b/drivers/input/touchscreen/mxt224.c
index 07143b1..47766bf 100644
--- a/drivers/input/touchscreen/mxt224.c
+++ b/drivers/input/touchscreen/mxt224.c
@@ -59,6 +59,7 @@ struct mxt224_data {
struct input_dev *input_dev;
struct early_suspend early_suspend;
u32 finger_mask;
+ u32 touch_mask;
int gpio_read_done;
struct object_t *objects;
u8 objects_len;
@@ -299,7 +300,7 @@ err:
static void report_input_data(struct mxt224_data *data)
{
- int i;
+ int i, iter = 0;
for (i = 0; i < data->num_fingers; i++) {
if (data->fingers[i].z == -1)
@@ -316,12 +317,24 @@ static void report_input_data(struct mxt224_data *data)
input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, i);
input_mt_sync(data->input_dev);
- if (data->fingers[i].z == 0)
+ if (data->fingers[i].z == 0) {
data->fingers[i].z = -1;
+ data->touch_mask &= ~(1U << i);
+ }
+ iter++;
}
- data->finger_mask = 0;
+
+ if (iter == 0)
+ input_mt_sync(data->input_dev);
input_sync(data->input_dev);
+
+ if (iter && data->touch_mask == 0) {
+ input_mt_sync(data->input_dev);
+ input_sync(data->input_dev);
+ }
+
+ data->finger_mask = 0;
}
static irqreturn_t mxt224_irq_thread(int irq, void *ptr)
@@ -335,18 +348,21 @@ static irqreturn_t mxt224_irq_thread(int irq, void *ptr)
return IRQ_HANDLED;
id = msg[0] - data->finger_type;
-
+
/* If not a touch event, then keep going */
if (id < 0 || id >= data->num_fingers)
continue;
+
+
if (data->finger_mask & (1U << id))
report_input_data(data);
if (msg[1] & RELEASE_MSG_MASK) {
- data->fingers[id].z = 0;
+ data->fingers[id].z = -1;
data->fingers[id].w = msg[5];
data->finger_mask |= 1U << id;
+ data->touch_mask &= ~(1U << id);
} else if ((msg[1] & DETECT_MSG_MASK) && (msg[1] &
(PRESS_MSG_MASK | MOVE_MSG_MASK))) {
data->fingers[id].z = msg[6];
@@ -356,6 +372,7 @@ static irqreturn_t mxt224_irq_thread(int irq, void *ptr)
data->fingers[id].y = ((msg[3] << 4) |
(msg[4] & 0xF)) >> data->y_dropbits;
data->finger_mask |= 1U << id;
+ data->touch_mask |= 1U << id;
} else if ((msg[1] & SUPPRESS_MSG_MASK) &&
(data->fingers[id].z != -1)) {
data->fingers[id].z = 0;
@@ -388,9 +405,12 @@ static int mxt224_internal_suspend(struct mxt224_data *data)
for (i = 0; i < data->num_fingers; i++) {
if (data->fingers[i].z == -1)
continue;
- data->fingers[i].z = 0;
+ data->fingers[i].z = -1;
}
- report_input_data(data);
+ data->touch_mask = 0;
+ data->finger_mask = 0;
+ input_mt_sync(data->input_dev);
+ input_sync(data->input_dev);
data->power_off();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment