Input: tsc2007 - add max_rt parameter to platform data
authorThierry Reding <thierry.reding@avionic-design.de>
Tue, 17 May 2011 16:31:01 +0000 (09:31 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 17 May 2011 16:38:39 +0000 (09:38 -0700)
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>
drivers/input/touchscreen/tsc2007.c
include/linux/i2c/tsc2007.h

index df4ae354969dc7751b39ff52a966b8bdb8f552eb..8c48a91a678341cdb18695b09547eeae4d1c707e 100644 (file)
@@ -75,6 +75,7 @@ struct tsc2007 {
 
        u16                     model;
        u16                     x_plate_ohms;
+       u16                     max_rt;
 
        bool                    pendown;
        int                     irq;
@@ -185,7 +186,7 @@ static void tsc2007_work(struct work_struct *work)
        tsc2007_read_values(ts, &tc);
 
        rt = tsc2007_calculate_pressure(ts, &tc);
-       if (rt > MAX_12BIT) {
+       if (rt > ts->max_rt) {
                /*
                 * Sample found inconsistent by debouncing or pressure is
                 * beyond the maximum. Don't report it to user space,
@@ -294,6 +295,7 @@ static int __devinit tsc2007_probe(struct i2c_client *client,
 
        ts->model             = pdata->model;
        ts->x_plate_ohms      = pdata->x_plate_ohms;
+       ts->max_rt            = pdata->max_rt ? : MAX_12BIT;
        ts->get_pendown_state = pdata->get_pendown_state;
        ts->clear_penirq      = pdata->clear_penirq;
 
index c6361fbb7bf9e2eb38e087e158910c0b4daf4528..d95f11347314b24c7ddfa5dc0554f0209ff5c3c3 100644 (file)
@@ -6,6 +6,7 @@
 struct tsc2007_platform_data {
        u16     model;                          /* 2007. */
        u16     x_plate_ohms;
+       u16     max_rt; /* max. resistance above which samples are ignored */
 
        int     (*get_pendown_state)(void);
        void    (*clear_penirq)(void);          /* If needed, clear 2nd level