This patch encapsulates the variables used by the default debounce
filter in a struct. The values are allocated only if the debounce filter
is used by the platform.

Signed-off-by: Matthias Brugger <[email protected]>
---
 drivers/input/touchscreen/ads7846.c |   42 ++++++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/drivers/input/touchscreen/ads7846.c 
b/drivers/input/touchscreen/ads7846.c
index f02028e..9e61a4b 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -90,6 +90,15 @@ struct ads7846_packet {
        u8                      read_x_cmd[3], read_y_cmd[3], pwrdown_cmd[3];
 };
 
+struct ads7846_filterd {
+       int                     read_cnt;
+       int                     read_rep;
+       int                     last_read;
+       u16                     debounce_max;
+       u16                     debounce_tol;
+       u16                     debounce_rep;
+};
+
 struct ads7846 {
        struct input_dev        *input;
        char                    phys[32];
@@ -121,14 +130,6 @@ struct ads7846 {
 
        bool                    pendown;
 
-       int                     read_cnt;
-       int                     read_rep;
-       int                     last_read;
-
-       u16                     debounce_max;
-       u16                     debounce_tol;
-       u16                     debounce_rep;
-
        u16                     penirq_recheck_delay_usecs;
 
        struct mutex            lock;
@@ -643,9 +644,14 @@ static void null_wait_for_sync(void)
 {
 }
 
+static void ads7864_filter_cleanup(void *data)
+{
+       kfree(data);
+}
+
 static int ads7846_debounce_filter(void *ads, int data_idx, int *val)
 {
-       struct ads7846 *ts = ads;
+       struct ads7846_filterd *ts = (struct ads7846_filterd*) ads;
 
        if (!ts->read_cnt || (abs(ts->last_read - *val) > ts->debounce_tol)) {
                /* Start over collecting consistent readings. */
@@ -1261,13 +1267,19 @@ static int __devinit ads7846_probe(struct spi_device 
*spi)
                ts->filter = pdata->filter;
                ts->filter_cleanup = pdata->filter_cleanup;
        } else if (pdata->debounce_max) {
-               ts->debounce_max = pdata->debounce_max;
-               if (ts->debounce_max < 2)
-                       ts->debounce_max = 2;
-               ts->debounce_tol = pdata->debounce_tol;
-               ts->debounce_rep = pdata->debounce_rep;
+               struct ads7846_filterd *fdata = kmalloc(sizeof(struct 
ads7846_filterd), GFP_KERNEL);
+               if (!fdata) {
+                       err = -ENOMEM;
+                       goto err_free_mem;
+               }
+               fdata->debounce_max = pdata->debounce_max;
+               if (fdata->debounce_max < 2)
+                       fdata->debounce_max = 2;
+               fdata->debounce_tol = pdata->debounce_tol;
+               fdata->debounce_rep = pdata->debounce_rep;
                ts->filter = ads7846_debounce_filter;
-               ts->filter_data = ts;
+               ts->filter_cleanup = ads7864_filter_cleanup;
+               ts->filter_data = fdata;
        } else {
                ts->filter = ads7846_no_filter;
        }
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to