Signed-off-by: Silvio Fricke <silvio.fri...@gmail.com>
---
 .../bindings/input/touchscreen/stmpe.txt           |  3 ++
 drivers/input/touchscreen/stmpe-ts.c               | 38 +++++++++++++++-------
 include/linux/mfd/stmpe.h                          |  1 +
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt 
b/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt
index 127baa3..586f1e7 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt
+++ b/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt
@@ -23,6 +23,8 @@ Optional properties:
   the fractional part) recommended is 7
 - st,i-drive: current limit value of the touchscreen drivers (0 -> 20 mA 
typical 35
   mA max, 1 -> 50 mA typical 80 mA max)
+- st,fifo-threshold: size of samples in chip internal buffer. Needs to be
+  between 1 and 127, defaults to 1
 
 Node name must be stmpe_touchscreen and should be child node of stmpe node to
 which it belongs.
@@ -40,4 +42,5 @@ Example:
                st,settling = <2>;
                st,fraction-z = <7>;
                st,i-drive = <1>;
+               st,fifo-threshold = <10>;
        };
diff --git a/drivers/input/touchscreen/stmpe-ts.c 
b/drivers/input/touchscreen/stmpe-ts.c
index 2d5ff86..a40e573 100644
--- a/drivers/input/touchscreen/stmpe-ts.c
+++ b/drivers/input/touchscreen/stmpe-ts.c
@@ -37,8 +37,12 @@
 #define STMPE_REG_FIFO_TH              0x4A
 #define STMPE_REG_FIFO_STA             0x4B
 #define STMPE_REG_FIFO_SIZE            0x4C
+#define STMPE_REG_TSC_DATA_X           0x4d
+#define STMPE_REG_TSC_DATA_Y           0x4f
+#define STMPE_REG_TSC_DATA_Z           0x51
 #define STMPE_REG_TSC_DATA_XYZ         0x52
 #define STMPE_REG_TSC_FRACTION_Z       0x56
+#define STMPE_REG_TSC_DATA             0xD7
 #define STMPE_REG_TSC_I_DRIVE          0x58
 
 #define OP_MOD_XYZ                     0
@@ -48,6 +52,7 @@
 #define STMPE_FIFO_STA_RESET           (1<<0)
 
 #define STMPE_IRQ_TOUCH_DET            0
+#define STMPE_IRQ_FIFO_TH              1
 
 #define SAMPLE_TIME(x)                 ((x & 0xf) << 4)
 #define MOD_12B(x)                     ((x & 0x1) << 3)
@@ -77,6 +82,7 @@ struct stmpe_touch {
        u8 settling;
        u8 fraction_z;
        u8 i_drive;
+       u8 threshold;
 };
 
 static int __stmpe_reset_fifo(struct stmpe *stmpe)
@@ -126,7 +132,7 @@ static void stmpe_work(struct work_struct *work)
 static irqreturn_t stmpe_ts_handler(int irq, void *data)
 {
        u8 data_set[4];
-       int x, y, z;
+       int x, y, z, i, fsize;
        struct stmpe_touch *ts = data;
 
        /*
@@ -144,17 +150,21 @@ static irqreturn_t stmpe_ts_handler(int irq, void *data)
        stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL,
                                STMPE_TSC_CTRL_TSC_EN, 0);
 
-       stmpe_block_read(ts->stmpe, STMPE_REG_TSC_DATA_XYZ, 4, data_set);
+       fsize = stmpe_reg_read(ts->stmpe, STMPE_REG_FIFO_SIZE);
 
-       x = (data_set[0] << 4) | (data_set[1] >> 4);
-       y = ((data_set[1] & 0xf) << 8) | data_set[2];
-       z = data_set[3];
+       for (i = 0; i < fsize; i++) {
+               stmpe_block_read(ts->stmpe, STMPE_REG_TSC_DATA, 4, data_set);
 
-       input_report_abs(ts->idev, ABS_X, x);
-       input_report_abs(ts->idev, ABS_Y, y);
-       input_report_abs(ts->idev, ABS_PRESSURE, z);
-       input_report_key(ts->idev, BTN_TOUCH, 1);
-       input_sync(ts->idev);
+               x = (data_set[0] << 4) | (data_set[1] >> 4);
+               y = ((data_set[1] & 0xf) << 8) | data_set[2];
+               z = data_set[3];
+
+               input_report_abs(ts->idev, ABS_X, x);
+               input_report_abs(ts->idev, ABS_Y, y);
+               input_report_abs(ts->idev, ABS_PRESSURE, z);
+               input_report_key(ts->idev, BTN_TOUCH, 1);
+               input_sync(ts->idev);
+       }
 
        /* flush the FIFO after we have read out our values. */
        __stmpe_reset_fifo(ts->stmpe);
@@ -225,7 +235,7 @@ static int stmpe_init_hw(struct stmpe_touch *ts)
        }
 
        /* set FIFO to 1 for single point reading */
-       ret = stmpe_reg_write(stmpe, STMPE_REG_FIFO_TH, 1);
+       ret = stmpe_reg_write(stmpe, STMPE_REG_FIFO_TH, ts->threshold);
        if (ret) {
                dev_err(dev, "Could not set FIFO\n");
                return ret;
@@ -285,6 +295,7 @@ static void stmpe_ts_get_platform_info(struct 
platform_device *pdev,
                ts->settling = ts_pdata->settling;
                ts->fraction_z = ts_pdata->fraction_z;
                ts->i_drive = ts_pdata->i_drive;
+               ts->threshold = ts_pdata->threshold;
        } else if (np) {
                u32 val;
 
@@ -306,7 +317,12 @@ static void stmpe_ts_get_platform_info(struct 
platform_device *pdev,
                        ts->fraction_z = val;
                if (!of_property_read_u32(np, "st,i-drive", &val))
                        ts->i_drive = val;
+               if (!of_property_read_u32(np, "st,threshold", &val))
+                       ts->threshold = val;
        }
+
+       if ((ts->threshold < 1) || (ts->threshold > 127))
+               ts->threshold = 1;
 }
 
 static int stmpe_input_probe(struct platform_device *pdev)
diff --git a/include/linux/mfd/stmpe.h b/include/linux/mfd/stmpe.h
index c9d8690..34efc28e 100644
--- a/include/linux/mfd/stmpe.h
+++ b/include/linux/mfd/stmpe.h
@@ -156,6 +156,7 @@ struct stmpe_ts_platform_data {
        u8 settling;
        u8 fraction_z;
        u8 i_drive;
+       u8 threshold;
 };
 
 /**
-- 
2.4.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to