aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
authorThierry Reding <thierry.reding@avionic-design.de>2011-05-17 12:31:01 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2011-05-17 12:38:39 -0400
commit84005eb5ea2939d448047fcf6924b3b9b6ed974d (patch)
tree3a31ceef0058d784461c5b69b38ca4c23fe42d5a /drivers/input/touchscreen
parent4a1a42af0aba011e263098f107a2f45e0de2f279 (diff)
Input: tsc2007 - add max_rt parameter to platform data
Finger touch events or very quick stylus events on low-quality panels can cause the tsc2007 to read bogus values. Looking at oscilloscope snapshots, this seems to be caused by the touch event disappearing during the measurements. These bogus values result in misclicks, where the X and Y values deviate from the real position. Most of these misclicks can be filtered out by setting a low enough threshold for the maximum resistance (which is loosely the inverse of the pressure) allowed to consider a set of values valid. Since this behaviour is largely dependent on the type and quality of the panel, this commit introduces the max_rt parameter. The default value is kept at MAX_12BIT. Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r--drivers/input/touchscreen/tsc2007.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c
index df4ae354969d..8c48a91a6783 100644
--- a/drivers/input/touchscreen/tsc2007.c
+++ b/drivers/input/touchscreen/tsc2007.c
@@ -75,6 +75,7 @@ struct tsc2007 {
75 75
76 u16 model; 76 u16 model;
77 u16 x_plate_ohms; 77 u16 x_plate_ohms;
78 u16 max_rt;
78 79
79 bool pendown; 80 bool pendown;
80 int irq; 81 int irq;
@@ -185,7 +186,7 @@ static void tsc2007_work(struct work_struct *work)
185 tsc2007_read_values(ts, &tc); 186 tsc2007_read_values(ts, &tc);
186 187
187 rt = tsc2007_calculate_pressure(ts, &tc); 188 rt = tsc2007_calculate_pressure(ts, &tc);
188 if (rt > MAX_12BIT) { 189 if (rt > ts->max_rt) {
189 /* 190 /*
190 * Sample found inconsistent by debouncing or pressure is 191 * Sample found inconsistent by debouncing or pressure is
191 * beyond the maximum. Don't report it to user space, 192 * beyond the maximum. Don't report it to user space,
@@ -294,6 +295,7 @@ static int __devinit tsc2007_probe(struct i2c_client *client,
294 295
295 ts->model = pdata->model; 296 ts->model = pdata->model;
296 ts->x_plate_ohms = pdata->x_plate_ohms; 297 ts->x_plate_ohms = pdata->x_plate_ohms;
298 ts->max_rt = pdata->max_rt ? : MAX_12BIT;
297 ts->get_pendown_state = pdata->get_pendown_state; 299 ts->get_pendown_state = pdata->get_pendown_state;
298 ts->clear_penirq = pdata->clear_penirq; 300 ts->clear_penirq = pdata->clear_penirq;
299 301