Signed-off-by: Silvio Fricke <silvio.fricke@xxxxxxxxx> --- .../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 devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html