input: TSC: ti_tscadc: Add Step configuration as platform data
authorPatil, Rachna <rachna@ti.com>
Tue, 16 Oct 2012 07:25:39 +0000 (12:55 +0530)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 5 Nov 2012 22:50:26 +0000 (23:50 +0100)
There are 16 programmable Step Configuration
registers which are used by the sequencer.
Program the Steps in order to configure a channel
input to be sampled. If the same step is applied
several times, the coordinate values read are more
accurate.
Hence we provide the user an option of how many steps
should be configured.

For ex: If this value is assigned as 4, This means that
4 steps are applied to read x co-ordinate and 4 steps to read
y co-ordinate. Furtheron the interrupt handler already
holds code to use delta filter and report the best value
out of these values to the input sub-system.

Signed-off-by: Patil, Rachna <rachna@ti.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/input/touchscreen/ti_tscadc.c
include/linux/input/ti_tscadc.h

index d198cab61a69a109e51553c53ff3625b46f14318..c1bd8e5c132c0781b63571be752fc0613372fb4f 100644 (file)
 #define REG_CHARGEDELAY                0x060
 #define REG_STEPCONFIG(n)      (0x64 + ((n - 1) * 8))
 #define REG_STEPDELAY(n)       (0x68 + ((n - 1) * 8))
-#define REG_STEPCONFIG13       0x0C4
-#define REG_STEPDELAY13                0x0C8
-#define REG_STEPCONFIG14       0x0CC
-#define REG_STEPDELAY14                0x0D0
 #define REG_FIFO0CNT           0xE4
 #define REG_FIFO1THR           0xF4
 #define REG_FIFO0              0x100
@@ -134,6 +130,7 @@ struct tscadc {
        unsigned int            wires;
        unsigned int            x_plate_resistance;
        bool                    pen_down;
+       int                     steps_to_configure;
 };
 
 static unsigned int tscadc_readl(struct tscadc *ts, unsigned int reg)
@@ -150,9 +147,10 @@ static void tscadc_writel(struct tscadc *tsc, unsigned int reg,
 static void tscadc_step_config(struct tscadc *ts_dev)
 {
        unsigned int    config;
-       int i;
+       int i, total_steps;
 
        /* Configure the Step registers */
+       total_steps = 2 * ts_dev->steps_to_configure;
 
        config = STEPCONFIG_MODE_HWSYNC |
                        STEPCONFIG_AVG_16 | STEPCONFIG_XPP;
@@ -170,7 +168,7 @@ static void tscadc_step_config(struct tscadc *ts_dev)
                break;
        }
 
-       for (i = 1; i < 7; i++) {
+       for (i = 1; i <= ts_dev->steps_to_configure; i++) {
                tscadc_writel(ts_dev, REG_STEPCONFIG(i), config);
                tscadc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
        }
@@ -192,7 +190,7 @@ static void tscadc_step_config(struct tscadc *ts_dev)
                break;
        }
 
-       for (i = 7; i < 13; i++) {
+       for (i = (ts_dev->steps_to_configure + 1); i <= total_steps; i++) {
                tscadc_writel(ts_dev, REG_STEPCONFIG(i), config);
                tscadc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
        }
@@ -211,12 +209,14 @@ static void tscadc_step_config(struct tscadc *ts_dev)
        config = STEPCONFIG_MODE_HWSYNC |
                        STEPCONFIG_AVG_16 | STEPCONFIG_YPP |
                        STEPCONFIG_XNN | STEPCONFIG_INM_ADCREFM;
-       tscadc_writel(ts_dev, REG_STEPCONFIG13, config);
-       tscadc_writel(ts_dev, REG_STEPDELAY13, STEPCONFIG_OPENDLY);
+       tscadc_writel(ts_dev, REG_STEPCONFIG(total_steps + 1), config);
+       tscadc_writel(ts_dev, REG_STEPDELAY(total_steps + 1),
+                       STEPCONFIG_OPENDLY);
 
        config |= STEPCONFIG_INP_AN3 | STEPCONFIG_FIFO1;
-       tscadc_writel(ts_dev, REG_STEPCONFIG14, config);
-       tscadc_writel(ts_dev, REG_STEPDELAY14, STEPCONFIG_OPENDLY);
+       tscadc_writel(ts_dev, REG_STEPCONFIG(total_steps + 2), config);
+       tscadc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
+                       STEPCONFIG_OPENDLY);
 
        tscadc_writel(ts_dev, REG_SE, STPENB_STEPENB);
 }
@@ -379,6 +379,7 @@ static int __devinit tscadc_probe(struct platform_device *pdev)
        ts_dev->irq = irq;
        ts_dev->wires = pdata->wires;
        ts_dev->x_plate_resistance = pdata->x_plate_resistance;
+       ts_dev->steps_to_configure = pdata->steps_to_configure;
 
        res = request_mem_region(res->start, resource_size(res), pdev->name);
        if (!res) {
@@ -447,7 +448,7 @@ static int __devinit tscadc_probe(struct platform_device *pdev)
        tscadc_idle_config(ts_dev);
        tscadc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO1THRES);
        tscadc_step_config(ts_dev);
-       tscadc_writel(ts_dev, REG_FIFO1THR, 6);
+       tscadc_writel(ts_dev, REG_FIFO1THR, ts_dev->steps_to_configure);
 
        ctrl |= CNTRLREG_TSCSSENB;
        tscadc_writel(ts_dev, REG_CTRL, ctrl);
index b10a527a92a4ce8b8cdbce695a48b8254dc63f53..ad442a3eb68bb634d56218fabef6122a49c0f3c0 100644 (file)
@@ -7,11 +7,17 @@
  *                     i.e. 4/5/8 wire touchscreen support
  *                     on the platform.
  * @x_plate_resistance:        X plate resistance.
+ * @steps_to_configure:        The sequencer supports a total of
+ *                     16 programmable steps.
+ *                     A step configured to read a single
+ *                     co-ordinate value, can be applied
+ *                     more number of times for better results.
  */
 
 struct tsc_data {
        int wires;
        int x_plate_resistance;
+       int steps_to_configure;
 };
 
 #endif