All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Mack <daniel@caiaq.de>
To: linux-kernel@vger.kernel.org
Cc: dmitry.torokhov@gmail.com, linux-input@vger.kernel.org,
	Dmitry Torokhov <dtor@mail.ru>
Subject: Re: [PATCH 4/4] input: dynamically allocate ABS information
Date: Mon, 24 May 2010 18:08:05 +0200	[thread overview]
Message-ID: <20100524160805.GO30801@buzzloop.caiaq.de> (raw)
In-Reply-To: <1274289757-2723-5-git-send-email-daniel@caiaq.de>

Hi Dmitry,

any feelings about this approach?

Thanks,
Daniel

On Wed, May 19, 2010 at 07:22:37PM +0200, Daniel Mack wrote:
> As all callers are now changed to only use the input_abs_*() access
> helpers, switching over to dynamically allocated ABS information is
> easy.
> 
> Signed-off-by: Daniel Mack <daniel@caiaq.de>
> Cc: Dmitry Torokhov <dtor@mail.ru>
> ---
>  drivers/input/input.c |   26 ++++++++++++++++++++
>  include/linux/input.h |   63 +++++++++++++++++++++++++++++++-----------------
>  2 files changed, 67 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/input/input.c b/drivers/input/input.c
> index 5bc92f6..ced6b39 100644
> --- a/drivers/input/input.c
> +++ b/drivers/input/input.c
> @@ -373,6 +373,25 @@ void input_inject_event(struct input_handle *handle,
>  EXPORT_SYMBOL(input_inject_event);
>  
>  /**
> + * input_alloc_absinfo - allocates an input_absinfo struct
> + * @dev: the input device
> + * @axis: the ABS axis
> + *
> + * If the absinfo struct the caller asked for is already allocated, this
> + * functions will not do anything but return it.
> + */
> +struct input_absinfo *input_alloc_absinfo(struct input_dev *dev, int axis)
> +{
> +	if (!dev->absinfo[axis])
> +		dev->absinfo[axis] =
> +			kzalloc(sizeof(struct input_absinfo), GFP_KERNEL);
> +
> +	WARN(!dev->absinfo[axis], "%s(): kzalloc() failed?\n", __func__);
> +	return dev->absinfo[axis];
> +}
> +EXPORT_SYMBOL(input_alloc_absinfo);
> +
> +/**
>   * input_grab_device - grabs device for exclusive use
>   * @handle: input handle that wants to own the device
>   *
> @@ -1276,9 +1295,16 @@ static const struct attribute_group *input_dev_attr_groups[] = {
>  
>  static void input_dev_release(struct device *device)
>  {
> +	int i;
>  	struct input_dev *dev = to_input_dev(device);
>  
>  	input_ff_destroy(dev);
> +
> +	for (i = 0; i < ABS_CNT; i++) {
> +		kfree(dev->absinfo[i]);
> +		dev->absinfo[i] = NULL;
> +	}
> +
>  	kfree(dev);
>  
>  	module_put(THIS_MODULE);
> diff --git a/include/linux/input.h b/include/linux/input.h
> index ff1ee6d..67650ab 100644
> --- a/include/linux/input.h
> +++ b/include/linux/input.h
> @@ -1154,7 +1154,6 @@ struct input_dev {
>  
>  	int sync;
>  
> -	int abs[ABS_CNT];
>  	int rep[REP_MAX + 1];
>  
>  	unsigned long key[BITS_TO_LONGS(KEY_CNT)];
> @@ -1162,11 +1161,7 @@ struct input_dev {
>  	unsigned long snd[BITS_TO_LONGS(SND_CNT)];
>  	unsigned long sw[BITS_TO_LONGS(SW_CNT)];
>  
> -	int absmax[ABS_CNT];
> -	int absmin[ABS_CNT];
> -	int absfuzz[ABS_CNT];
> -	int absflat[ABS_CNT];
> -	int absres[ABS_CNT];
> +	struct input_absinfo *absinfo[ABS_CNT];
>  
>  	int (*open)(struct input_dev *dev);
>  	void (*close)(struct input_dev *dev);
> @@ -1190,62 +1185,82 @@ struct input_dev {
>  
>  static inline int input_abs(struct input_dev *dev, int axis)
>  {
> -	return dev->abs[axis];
> +	struct input_absinfo *absinfo = dev->absinfo[axis];
> +	return absinfo ? absinfo->value : 0;
>  }
>  
>  static inline int input_abs_max(struct input_dev *dev, int axis)
>  {
> -	return dev->absmax[axis];
> +	struct input_absinfo *absinfo = dev->absinfo[axis];
> +	return absinfo ? absinfo->maximum : 0;
>  }
>  
>  static inline int input_abs_min(struct input_dev *dev, int axis)
>  {
> -	return dev->absmin[axis];
> +	struct input_absinfo *absinfo = dev->absinfo[axis];
> +	return absinfo ? absinfo->minimum : 0;
>  }
>  
>  static inline int input_abs_fuzz(struct input_dev *dev, int axis)
>  {
> -	return dev->absfuzz[axis];
> +	struct input_absinfo *absinfo = dev->absinfo[axis];
> +	return absinfo ? absinfo->fuzz : 0;
>  }
>  
>  static inline int input_abs_flat(struct input_dev *dev, int axis)
>  {
> -	return dev->absflat[axis];
> +	struct input_absinfo *absinfo = dev->absinfo[axis];
> +	return absinfo ? absinfo->flat : 0;
>  }
>  
>  static inline int input_abs_res(struct input_dev *dev, int axis)
>  {
> -	return dev->absres[axis];
> +	struct input_absinfo *absinfo = dev->absinfo[axis];
> +	return absinfo ? absinfo->resolution: 0;
>  }
>  
> +struct input_absinfo *input_alloc_absinfo(struct input_dev *dev, int axis);
> +
>  static inline void input_abs_set(struct input_dev *dev, int axis, int val)
>  {
> -	dev->abs[axis] = val;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (absinfo)
> +		absinfo->value = val;
>  }
>  
>  static inline void input_abs_set_max(struct input_dev *dev, int axis, int val)
>  {
> -	dev->absmax[axis] = val;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (absinfo)
> +		absinfo->maximum = val;
>  }
>  
>  static inline void input_abs_set_min(struct input_dev *dev, int axis, int val)
>  {
> -	dev->absmin[axis] = val;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (absinfo)
> +		absinfo->minimum = val;
>  }
>  
>  static inline void input_abs_set_fuzz(struct input_dev *dev, int axis, int val)
>  {
> -	dev->absfuzz[axis] = val;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (absinfo)
> +		absinfo->fuzz = val;
>  }
>  
>  static inline void input_abs_set_flat(struct input_dev *dev, int axis, int val)
>  {
> -	dev->absflat[axis] = val;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (absinfo)
> +		absinfo->flat = val;
>  }
>  
>  static inline void input_abs_set_res(struct input_dev *dev, int axis, int val)
>  {
> -	dev->absres[axis] = val;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (absinfo)
> +		absinfo->resolution = val;
>  }
>  
>  /*
> @@ -1469,10 +1484,14 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
>  
>  static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat)
>  {
> -	dev->absmin[axis] = min;
> -	dev->absmax[axis] = max;
> -	dev->absfuzz[axis] = fuzz;
> -	dev->absflat[axis] = flat;
> +	struct input_absinfo *absinfo = input_alloc_absinfo(dev, axis);
> +	if (!absinfo)
> +		return;
> +
> +	absinfo->minimum = min;
> +	absinfo->maximum = max;
> +	absinfo->fuzz = fuzz;
> +	absinfo->flat = flat;
>  
>  	dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);
>  }
> -- 
> 1.7.1
> 

  reply	other threads:[~2010-05-24 16:08 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-19 17:22 [RFC] linux-input: dynamically allocate ABS axis information Daniel Mack
2010-05-19 17:22 ` [PATCH 1/4] input: use ABS_CNT rather than (ABS_MAX + 1) Daniel Mack
2010-05-19 17:22 ` [PATCH 2/4] input: add static inline helpers for ABS properties Daniel Mack
2010-05-19 17:22 ` [PATCH 3/4] input: switch to input_abs_*() access functions Daniel Mack
2010-07-14  8:09   ` Dmitry Torokhov
2010-05-19 17:22 ` [PATCH 4/4] input: dynamically allocate ABS information Daniel Mack
2010-05-24 16:08   ` Daniel Mack [this message]
2010-05-24 16:15     ` Dmitry Torokhov
2010-06-16  8:39       ` Daniel Mack
2010-07-21  8:30         ` Dmitry Torokhov
2010-07-21  8:31           ` Dmitry Torokhov
2010-07-21  8:32             ` Dmitry Torokhov
2010-07-21  9:22               ` ext-phil.2.carmody
2010-07-21  9:22                 ` ext-phil.2.carmody
2010-07-21 10:42                 ` Artem Bityutskiy
2010-07-21 10:42                   ` Artem Bityutskiy
2010-08-11  7:02             ` Daniel Mack
2010-08-13  3:35               ` Dmitry Torokhov
2010-08-07 15:23           ` Daniel Mack
2010-08-11  3:29             ` Dmitry Torokhov
2010-07-14  8:18   ` Dmitry Torokhov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100524160805.GO30801@buzzloop.caiaq.de \
    --to=daniel@caiaq.de \
    --cc=dmitry.torokhov@gmail.com \
    --cc=dtor@mail.ru \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.