Input: imx6ul_tsc - generalize the averaging property
authorGuy Shapiro <guy.shapiro@mobi-wize.com>
Fri, 16 Dec 2016 05:23:02 +0000 (21:23 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 16 Dec 2016 05:34:35 +0000 (21:34 -0800)
Make the avarage-samples property a general touchscreen property
rather than imx6ul device specific.

Signed-off-by: Guy Shapiro <guy.shapiro@mobi-wize.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Documentation/devicetree/bindings/input/touchscreen/imx6ul_tsc.txt
Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt
drivers/input/touchscreen/imx6ul_tsc.c

index a66069f6db666dc4fb5c8300c306329450be859d..d4927c202aef271554022e5fd84451f1febe9212 100644 (file)
@@ -17,13 +17,8 @@ Optional properties:
   This value depends on the touch screen.
 - pre-charge-time: the touch screen need some time to precharge.
   This value depends on the touch screen.
-- average-samples: Number of data samples which are averaged for each read.
-       Valid values 0-4
-       0 =  1 sample
-       1 =  4 samples
-       2 =  8 samples
-       3 = 16 samples
-       4 = 32 samples
+- touchscreen-average-samples: Number of data samples which are averaged for
+  each read. Valid values are 1, 4, 8, 16 and 32.
 
 Example:
        tsc: tsc@02040000 {
@@ -39,6 +34,6 @@ Example:
                xnur-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
                measure-delay-time = <0xfff>;
                pre-charge-time = <0xffff>;
-               average-samples = <4>;
+               touchscreen-average-samples = <32>;
                status = "okay";
        };
index bccaa4e7304530b559c411afc2fab9cbccd068b3..537643e86f6186dc3189bb15213ba70ad1b8b336 100644 (file)
@@ -14,6 +14,9 @@ Optional properties for Touchscreens:
  - touchscreen-fuzz-pressure   : pressure noise value of the absolute input
                                  device (arbitrary range dependent on the
                                  controller)
+ - touchscreen-average-samples : Number of data samples which are averaged
+                                 for each read (valid values dependent on the
+                                 controller)
  - touchscreen-inverted-x      : X axis is inverted (boolean)
  - touchscreen-inverted-y      : Y axis is inverted (boolean)
  - touchscreen-swapped-x-y     : X and Y axis are swapped (boolean)
index d2a39120f37f154a5bf3eb59e98c2efb704ea9e2..7098e0a47019539b7cc3482fe3043576a123e348 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/log2.h>
 
 /* ADC configuration registers field define */
 #define ADC_AIEN               (0x1 << 7)
@@ -93,7 +94,8 @@ struct imx6ul_tsc {
 
        u32 measure_delay_time;
        u32 pre_charge_time;
-       u32 average_samples;
+       bool average_enable;
+       u32 average_select;
 
        struct completion completion;
 };
@@ -117,9 +119,9 @@ static int imx6ul_adc_init(struct imx6ul_tsc *tsc)
        adc_cfg |= ADC_12BIT_MODE | ADC_IPG_CLK;
        adc_cfg &= ~(ADC_CLK_DIV_MASK | ADC_SAMPLE_MODE_MASK);
        adc_cfg |= ADC_CLK_DIV_8 | ADC_SHORT_SAMPLE_MODE;
-       if (tsc->average_samples) {
+       if (tsc->average_enable) {
                adc_cfg &= ~ADC_AVGS_MASK;
-               adc_cfg |= (tsc->average_samples - 1) << ADC_AVGS_SHIFT;
+               adc_cfg |= (tsc->average_select) << ADC_AVGS_SHIFT;
        }
        adc_cfg &= ~ADC_HARDWARE_TRIGGER;
        writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG);
@@ -132,7 +134,7 @@ static int imx6ul_adc_init(struct imx6ul_tsc *tsc)
        /* start ADC calibration */
        adc_gc = readl(tsc->adc_regs + REG_ADC_GC);
        adc_gc |= ADC_CAL;
-       if (tsc->average_samples)
+       if (tsc->average_enable)
                adc_gc |= ADC_AVGE;
        writel(adc_gc, tsc->adc_regs + REG_ADC_GC);
 
@@ -362,6 +364,7 @@ static int imx6ul_tsc_probe(struct platform_device *pdev)
        int err;
        int tsc_irq;
        int adc_irq;
+       u32 average_samples;
 
        tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL);
        if (!tsc)
@@ -466,14 +469,27 @@ static int imx6ul_tsc_probe(struct platform_device *pdev)
        if (err)
                tsc->pre_charge_time = 0xfff;
 
-       err = of_property_read_u32(np, "average-samples",
-                                  &tsc->average_samples);
+       err = of_property_read_u32(np, "touchscreen-average-samples",
+                                  &average_samples);
        if (err)
-               tsc->average_samples = 0;
-
-       if (tsc->average_samples > 4) {
-               dev_err(&pdev->dev, "average-samples (%u) must be [0-4]\n",
-                       tsc->average_samples);
+               average_samples = 1;
+
+       switch (average_samples) {
+       case 1:
+               tsc->average_enable = false;
+               tsc->average_select = 0; /* value unused; initialize anyway */
+               break;
+       case 4:
+       case 8:
+       case 16:
+       case 32:
+               tsc->average_enable = true;
+               tsc->average_select = ilog2(average_samples) - 2;
+               break;
+       default:
+               dev_err(&pdev->dev,
+                       "touchscreen-average-samples (%u) must be 1, 4, 8, 16 or 32\n",
+                       average_samples);
                return -EINVAL;
        }