[PATCH 1/2] touchscreen/ads7846.c: Alloc filter data only when needed.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <matthias.bgg@xxxxxxxxx>
---
 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux