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

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

 



On Wed, Oct 24, 2012 at 01:38:55PM +0200, Matthias Brugger wrote:
> 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;

So you are maybe saving 18 bytes if data in ads7846 at the expense
of more code... Not really see the great benefit. Maybe just embed
your new ads7846_debounce_data structure in ads7846 to provide logical
separation?

-- 
Dmitry
--
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