summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhang Jiejing <jiejing.zhang@freescale.com>2012-12-20 16:09:40 +0800
committerZhang Jiejing <jiejing.zhang@freescale.com>2012-12-20 17:46:17 +0800
commitaa17b10c240550df1927fc37db863bd714d4f5fa (patch)
treea52788e4efec34f4882ab3f24f1bf01b2eaba0c8
parentd4259cb522ba83b77a57d2ad14b2ffe19cab1e12 (diff)
ENGR00237868 input: egalax_ts: remove the while loop for system performance.
Remove the while loop inside of threaded-irq handler. Found this system issue on Sabre-AI board, if touch screen keep comming, the UI is very slow, special on slow SD card. After remove the loop, the UI is much smoother on SD card, and same on eMMC based system. When add this patch, this was caused by the local timer not enable, after local timer enable, the threaded irq is almost real time, so we don't need add this while loop anymore. Signed-off-by: Zhang Jiejing <jiejing.zhang@freescale.com>
-rw-r--r--drivers/input/touchscreen/egalax_ts.c85
1 files changed, 41 insertions, 44 deletions
diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c
index 9a149e4e43da..a4b60b031455 100644
--- a/drivers/input/touchscreen/egalax_ts.c
+++ b/drivers/input/touchscreen/egalax_ts.c
@@ -124,51 +124,48 @@ static irqreturn_t egalax_ts_interrupt(int irq, void *dev_id)
bool down, valid;
u8 state;
+ memset(buf, 0, MAX_I2C_DATA_LEN);
do {
- memset(buf, 0, MAX_I2C_DATA_LEN);
- do {
- ret = i2c_master_recv(client, buf, MAX_I2C_DATA_LEN);
- } while (ret == -EAGAIN && tries++ < EGALAX_MAX_TRIES);
-
- if (ret < 0)
- return IRQ_HANDLED;
-
- if (buf[0] != REPORT_MODE_MTTOUCH) {
- /* ignore mouse events and vendor events */
- return IRQ_HANDLED;
- }
-
- state = buf[1];
- x = (buf[3] << 8) | buf[2];
- y = (buf[5] << 8) | buf[4];
- z = (buf[7] << 8) | buf[6];
-
- valid = state & EVENT_VALID_MASK;
- id = (state & EVENT_ID_MASK) >> EVENT_ID_OFFSET;
- down = state & EVENT_DOWN_UP;
-
- if (!valid || id >= MAX_SUPPORT_POINTS) {
- dev_dbg(&client->dev, "point invalid\n");
- return IRQ_HANDLED;
- }
-
- if (data->finger_mask & (1U << id))
- report_input_data(data);
-
- if (!down) {
- data->fingers[id].z = -1;
- data->finger_mask |= 1U << id;
- } else {
- data->fingers[id].x = x;
- data->fingers[id].y = y;
- data->fingers[id].z = z;
- data->finger_mask |= 1U << id;
- }
-
- dev_dbg(&client->dev, "%s id:%d x:%d y:%d z:%d\n",
- (down ? "down" : "up"), id, x, y, z);
-
- } while (gpio_get_value(irq_to_gpio(client->irq)) == 0);
+ ret = i2c_master_recv(client, buf, MAX_I2C_DATA_LEN);
+ } while (ret == -EAGAIN && tries++ < EGALAX_MAX_TRIES);
+
+ if (ret < 0)
+ return IRQ_HANDLED;
+
+ if (buf[0] != REPORT_MODE_MTTOUCH) {
+ /* ignore mouse events and vendor events */
+ return IRQ_HANDLED;
+ }
+
+ state = buf[1];
+ x = (buf[3] << 8) | buf[2];
+ y = (buf[5] << 8) | buf[4];
+ z = (buf[7] << 8) | buf[6];
+
+ valid = state & EVENT_VALID_MASK;
+ id = (state & EVENT_ID_MASK) >> EVENT_ID_OFFSET;
+ down = state & EVENT_DOWN_UP;
+
+ if (!valid || id >= MAX_SUPPORT_POINTS) {
+ dev_dbg(&client->dev, "point invalid\n");
+ return IRQ_HANDLED;
+ }
+
+ if (data->finger_mask & (1U << id))
+ report_input_data(data);
+
+ if (!down) {
+ data->fingers[id].z = -1;
+ data->finger_mask |= 1U << id;
+ } else {
+ data->fingers[id].x = x;
+ data->fingers[id].y = y;
+ data->fingers[id].z = z;
+ data->finger_mask |= 1U << id;
+ }
+
+ dev_dbg(&client->dev, "%s id:%d x:%d y:%d z:%d\n",
+ (down ? "down" : "up"), id, x, y, z);
if (data->finger_mask)
report_input_data(data);