mbox series

[0/2] Allow inverted axes for adc-joystick

Message ID 20231231205643.129435-1-macroalpha82@gmail.com
Headers show
Series Allow inverted axes for adc-joystick | expand

Message

Chris Morgan Dec. 31, 2023, 8:56 p.m. UTC
From: Chris Morgan <macromorgan@hotmail.com>

Handle inverted axes in the adc-joystick driver so that reported input
events downstream from the driver conform with assumptions that
abs_min < abs_max. Add a new helper function for inputs so that abs
can be inverted that drivers can use.

Chris Morgan (2):
  Input: add input_invert_abs()
  Input: adc-joystick: Handle inverted axes

 drivers/input/input.c                 | 19 +++++++++++++++++++
 drivers/input/joystick/adc-joystick.c | 13 ++++++++++++-
 include/linux/input.h                 |  1 +
 3 files changed, 32 insertions(+), 1 deletion(-)

Comments

Dmitry Torokhov Jan. 4, 2024, 5:59 p.m. UTC | #1
Hi Chris,

On Sun, Dec 31, 2023 at 02:56:42PM -0600, Chris Morgan wrote:
> From: Chris Morgan <macromorgan@hotmail.com>
> 
> Add a helper function to make it easier for a driver to invert abs
> values when needed. It is up to the driver itself to track axes that
> need to be inverted and normalize the data before it is passed on.
> 
> This function assumes that drivers will set the min and max values
> so that min < max and then will simply call this function each time
> the values need to be inverted.
> 
> Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
> ---
>  drivers/input/input.c | 19 +++++++++++++++++++
>  include/linux/input.h |  1 +
>  2 files changed, 20 insertions(+)
> 
> diff --git a/drivers/input/input.c b/drivers/input/input.c
> index 8c5fdb0f858a..f135aed165a1 100644
> --- a/drivers/input/input.c
> +++ b/drivers/input/input.c
> @@ -552,6 +552,25 @@ void input_copy_abs(struct input_dev *dst, unsigned int dst_axis,
>  }
>  EXPORT_SYMBOL(input_copy_abs);
>  
> +/**
> + * input_invert_abs - Invert the abs value for an inverted axis.
> + * @dev: Input device with absolute events
> + * @axis: ABS_* value selecting the destination axis for the event to
> + *	  invert.
> + * @val: Value to be inverted based on min and max values of the axis.
> + *
> + * Return an inverted value for a given ABS axis based on its min and
> + * max values.
> + */
> +int input_invert_abs(struct input_dev *dev, unsigned int axis, int val)
> +{
> +	int min = dev->absinfo[axis].minimum;
> +	int max = dev->absinfo[axis].maximum;
> +
> +	return (max + min) - val;

I do not think this is generic enough (i.e. sometimes you have a
theoretical range in which you want to invert that is bigger than the
normal min/max - see synaptics_invert_y()), so I would prefer this be
lolcal to the ADC joystick driver, at least for now.

Thanks.