Merge tag 'staging-4.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[cascardo/linux.git] / drivers / iio / adc / at91_adc.c
index 0438c68..bbdac07 100644 (file)
 #define                AT91_ADC_TSMR_TSAV      (3 << 4)        /* Averages samples */
 #define                        AT91_ADC_TSMR_TSAV_(x)          ((x) << 4)
 #define                AT91_ADC_TSMR_SCTIM     (0x0f << 16)    /* Switch closure time */
+#define                        AT91_ADC_TSMR_SCTIM_(x)         ((x) << 16)
 #define                AT91_ADC_TSMR_PENDBC    (0x0f << 28)    /* Pen Debounce time */
 #define                        AT91_ADC_TSMR_PENDBC_(x)        ((x) << 28)
 #define                AT91_ADC_TSMR_NOTSDMA   (1 << 22)       /* No Touchscreen DMA */
 #define MAX_RLPOS_BITS         10
 #define TOUCH_SAMPLE_PERIOD_US_RL      10000   /* 10ms, the SoC can't keep up with 2ms */
 #define TOUCH_SHTIM                    0xa
+#define TOUCH_SCTIM_US         10              /* 10us for the Touchscreen Switches Closure Time */
 
 /**
  * struct at91_adc_reg_desc - Various informations relative to registers
@@ -1001,7 +1003,9 @@ static void atmel_ts_close(struct input_dev *dev)
 
 static int at91_ts_hw_init(struct at91_adc_state *st, u32 adc_clk_khz)
 {
+       struct iio_dev *idev = iio_priv_to_dev(st);
        u32 reg = 0;
+       u32 tssctim = 0;
        int i = 0;
 
        /* a Pen Detect Debounce Time is necessary for the ADC Touch to avoid
@@ -1034,11 +1038,20 @@ static int at91_ts_hw_init(struct at91_adc_state *st, u32 adc_clk_khz)
                return 0;
        }
 
+       /* Touchscreen Switches Closure time needed for allowing the value to
+        * stabilize.
+        * Switch Closure Time = (TSSCTIM * 4) ADCClock periods
+        */
+       tssctim = DIV_ROUND_UP(TOUCH_SCTIM_US * adc_clk_khz / 1000, 4);
+       dev_dbg(&idev->dev, "adc_clk at: %d KHz, tssctim at: %d\n",
+               adc_clk_khz, tssctim);
+
        if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE)
                reg = AT91_ADC_TSMR_TSMODE_4WIRE_PRESS;
        else
                reg = AT91_ADC_TSMR_TSMODE_5WIRE;
 
+       reg |= AT91_ADC_TSMR_SCTIM_(tssctim) & AT91_ADC_TSMR_SCTIM;
        reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average)
               & AT91_ADC_TSMR_TSAV;
        reg |= AT91_ADC_TSMR_PENDBC_(st->ts_pendbc) & AT91_ADC_TSMR_PENDBC;