]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Input: ad7879 - add option to correct xy axis
authorMichael Hennerich <michael.hennerich@analog.com>
Fri, 6 Jul 2012 17:44:19 +0000 (10:44 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 7 Jul 2012 02:12:26 +0000 (19:12 -0700)
Sebastian Zenker reported that driver swaps x and y samples when the
touchscreen leads are connected in accordance with the datasheet
specification.  Transposed axis can be typically corrected by touch
screen calibration however this bug also negatively influences touch
pressure measurements.

Add an option to correct x and y axis.

Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Reported-and-tested-by: Sebastian Zenker <sebastian.zenker@gmx.de>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/ad7879.c
include/linux/spi/ad7879.h

index e2482b40da5198fdb1406e135fff827d049e5895..e60709261951a423592ab1b0b0484ec12448eda8 100644 (file)
@@ -118,6 +118,7 @@ struct ad7879 {
        unsigned int            irq;
        bool                    disabled;       /* P: input->mutex */
        bool                    suspended;      /* P: input->mutex */
+       bool                    swap_xy;
        u16                     conversion_data[AD7879_NR_SENSE];
        char                    phys[32];
        u8                      first_conversion_delay;
@@ -161,6 +162,9 @@ static int ad7879_report(struct ad7879 *ts)
        z1 = ts->conversion_data[AD7879_SEQ_Z1] & MAX_12BIT;
        z2 = ts->conversion_data[AD7879_SEQ_Z2] & MAX_12BIT;
 
+       if (ts->swap_xy)
+               swap(x, y);
+
        /*
         * The samples processed here are already preprocessed by the AD7879.
         * The preprocessing function consists of a median and an averaging
@@ -520,6 +524,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
        ts->dev = dev;
        ts->input = input_dev;
        ts->irq = irq;
+       ts->swap_xy = pdata->swap_xy;
 
        setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts);
 
index 6334cee1a3be6b601e4d0c1665878edbea20e2a9..58368be0b4c075465443f8574e0d333c6c30b212 100644 (file)
@@ -12,6 +12,8 @@ struct ad7879_platform_data {
        u16     y_min, y_max;
        u16     pressure_min, pressure_max;
 
+       bool    swap_xy;                /* swap x and y axes */
+
        /* [0..255] 0=OFF Starts at 1=550us and goes
         * all the way to 9.440ms in steps of 35us.
         */