Commit 7f6d5ff2 authored by Eric Miao's avatar Eric Miao Committed by Dmitry Torokhov

Input: da9034-ts - make pen {down,up} events more reliable

PEN_{UP/DOWN} events are expected to be available soon after stopping
TSI auto measurement, but this is found not always be true. Work around
this by adding delay and simulating such an event (according to pen down
status bit).
Signed-off-by: default avatarBin Yang <bin.yang@marvell.com>
Signed-off-by: default avatarEric Miao <eric.miao@marvell.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 93ff27c6
...@@ -176,6 +176,16 @@ static void da9034_event_handler(struct da9034_touch *touch, int event) ...@@ -176,6 +176,16 @@ static void da9034_event_handler(struct da9034_touch *touch, int event)
goto err_reset; goto err_reset;
touch->state = STATE_STOP; touch->state = STATE_STOP;
/* FIXME: PEN_{UP/DOWN} events are expected to be
* available by stopping TSI, but this is found not
* always true, delay and simulate such an event
* here is more reliable
*/
mdelay(1);
da9034_event_handler(touch,
is_pen_down(touch) ? EVENT_PEN_DOWN :
EVENT_PEN_UP);
break; break;
case STATE_STOP: case STATE_STOP:
...@@ -190,8 +200,6 @@ static void da9034_event_handler(struct da9034_touch *touch, int event) ...@@ -190,8 +200,6 @@ static void da9034_event_handler(struct da9034_touch *touch, int event)
report_pen_up(touch); report_pen_up(touch);
touch->state = STATE_IDLE; touch->state = STATE_IDLE;
} }
input_sync(touch->input_dev);
break; break;
case STATE_WAIT: case STATE_WAIT:
...@@ -201,8 +209,10 @@ static void da9034_event_handler(struct da9034_touch *touch, int event) ...@@ -201,8 +209,10 @@ static void da9034_event_handler(struct da9034_touch *touch, int event)
if (is_pen_down(touch)) { if (is_pen_down(touch)) {
start_tsi(touch); start_tsi(touch);
touch->state = STATE_BUSY; touch->state = STATE_BUSY;
} else } else {
report_pen_up(touch);
touch->state = STATE_IDLE; touch->state = STATE_IDLE;
}
break; break;
} }
return; return;
...@@ -227,16 +237,12 @@ static int da9034_touch_notifier(struct notifier_block *nb, ...@@ -227,16 +237,12 @@ static int da9034_touch_notifier(struct notifier_block *nb,
struct da9034_touch *touch = struct da9034_touch *touch =
container_of(nb, struct da9034_touch, notifier); container_of(nb, struct da9034_touch, notifier);
if (event & DA9034_EVENT_PEN_DOWN) {
if (is_pen_down(touch))
da9034_event_handler(touch, EVENT_PEN_DOWN);
else
da9034_event_handler(touch, EVENT_PEN_UP);
}
if (event & DA9034_EVENT_TSI_READY) if (event & DA9034_EVENT_TSI_READY)
da9034_event_handler(touch, EVENT_TSI_READY); da9034_event_handler(touch, EVENT_TSI_READY);
if ((event & DA9034_EVENT_PEN_DOWN) && touch->state == STATE_IDLE)
da9034_event_handler(touch, EVENT_PEN_DOWN);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment