diff options
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/touchscreen/da9034-ts.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/input/touchscreen/da9034-ts.c b/drivers/input/touchscreen/da9034-ts.c index 666a6e74be40..3ffd4c4b170c 100644 --- a/drivers/input/touchscreen/da9034-ts.c +++ b/drivers/input/touchscreen/da9034-ts.c | |||
@@ -176,6 +176,16 @@ static void da9034_event_handler(struct da9034_touch *touch, int event) | |||
176 | goto err_reset; | 176 | goto err_reset; |
177 | 177 | ||
178 | touch->state = STATE_STOP; | 178 | touch->state = STATE_STOP; |
179 | |||
180 | /* FIXME: PEN_{UP/DOWN} events are expected to be | ||
181 | * available by stopping TSI, but this is found not | ||
182 | * always true, delay and simulate such an event | ||
183 | * here is more reliable | ||
184 | */ | ||
185 | mdelay(1); | ||
186 | da9034_event_handler(touch, | ||
187 | is_pen_down(touch) ? EVENT_PEN_DOWN : | ||
188 | EVENT_PEN_UP); | ||
179 | break; | 189 | break; |
180 | 190 | ||
181 | case STATE_STOP: | 191 | case STATE_STOP: |
@@ -190,8 +200,6 @@ static void da9034_event_handler(struct da9034_touch *touch, int event) | |||
190 | report_pen_up(touch); | 200 | report_pen_up(touch); |
191 | touch->state = STATE_IDLE; | 201 | touch->state = STATE_IDLE; |
192 | } | 202 | } |
193 | |||
194 | input_sync(touch->input_dev); | ||
195 | break; | 203 | break; |
196 | 204 | ||
197 | case STATE_WAIT: | 205 | case STATE_WAIT: |
@@ -201,8 +209,10 @@ static void da9034_event_handler(struct da9034_touch *touch, int event) | |||
201 | if (is_pen_down(touch)) { | 209 | if (is_pen_down(touch)) { |
202 | start_tsi(touch); | 210 | start_tsi(touch); |
203 | touch->state = STATE_BUSY; | 211 | touch->state = STATE_BUSY; |
204 | } else | 212 | } else { |
213 | report_pen_up(touch); | ||
205 | touch->state = STATE_IDLE; | 214 | touch->state = STATE_IDLE; |
215 | } | ||
206 | break; | 216 | break; |
207 | } | 217 | } |
208 | return; | 218 | return; |
@@ -227,16 +237,12 @@ static int da9034_touch_notifier(struct notifier_block *nb, | |||
227 | struct da9034_touch *touch = | 237 | struct da9034_touch *touch = |
228 | container_of(nb, struct da9034_touch, notifier); | 238 | container_of(nb, struct da9034_touch, notifier); |
229 | 239 | ||
230 | if (event & DA9034_EVENT_PEN_DOWN) { | ||
231 | if (is_pen_down(touch)) | ||
232 | da9034_event_handler(touch, EVENT_PEN_DOWN); | ||
233 | else | ||
234 | da9034_event_handler(touch, EVENT_PEN_UP); | ||
235 | } | ||
236 | |||
237 | if (event & DA9034_EVENT_TSI_READY) | 240 | if (event & DA9034_EVENT_TSI_READY) |
238 | da9034_event_handler(touch, EVENT_TSI_READY); | 241 | da9034_event_handler(touch, EVENT_TSI_READY); |
239 | 242 | ||
243 | if ((event & DA9034_EVENT_PEN_DOWN) && touch->state == STATE_IDLE) | ||
244 | da9034_event_handler(touch, EVENT_PEN_DOWN); | ||
245 | |||
240 | return 0; | 246 | return 0; |
241 | } | 247 | } |
242 | 248 | ||