Message ID | 20231231205643.129435-2-macroalpha82@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Allow inverted axes for adc-joystick | expand |
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.
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; +} +EXPORT_SYMBOL(input_invert_abs); + /** * input_grab_device - grabs device for exclusive use * @handle: input handle that wants to own the device diff --git a/include/linux/input.h b/include/linux/input.h index de6503c0edb8..deb5f8bb0ec7 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -477,6 +477,7 @@ void input_set_abs_params(struct input_dev *dev, unsigned int axis, int min, int max, int fuzz, int flat); void input_copy_abs(struct input_dev *dst, unsigned int dst_axis, const struct input_dev *src, unsigned int src_axis); +int input_invert_abs(struct input_dev *dev, unsigned int axis, int val); #define INPUT_GENERATE_ABS_ACCESSORS(_suffix, _item) \ static inline int input_abs_get_##_suffix(struct input_dev *dev, \