Re: [PATCH 1/5] Input: Add input_copy_abs() function
flat view
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2021-12-13 04:59:02
Hi Hans, On Sun, Dec 12, 2021 at 01:42:38PM +0100, Hans de Goede wrote:
quoted hunk ↗ jump to hunk
Add a new helper function to copy absinfo from one input_dev to another input_dev. This is useful to e.g. setup a pen/stylus input-device for combined touchscreen/pen hardware where the pen uses the same coordinates as the touchscreen. Suggested-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Hans de Goede <redacted> --- drivers/input/input.c | 34 ++++++++++++++++++++++++++++++++++ include/linux/input.h | 2 ++ 2 files changed, 36 insertions(+)diff --git a/drivers/input/input.c b/drivers/input/input.c index ccaeb2426385..60f3eb38906f 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c@@ -526,6 +526,40 @@ void input_set_abs_params(struct input_dev *dev, unsigned int axis, } EXPORT_SYMBOL(input_set_abs_params); +/** + * input_copy_abs - Copy absinfo from one input_dev to another + * @dst: Destination input device to copy the abs settings to + * @dst_axis: ABS_* value selecting the destination axis + * @src: Source input device to copy the abs settings from + * @src_axis: ABS_* value selecting the source axis + * + * Set absinfo for the selected destination axis by copying it from + * the specified source input device's source axis. + * This is useful to e.g. setup a pen/stylus input-device for combined + * touchscreen/pen hardware where the pen uses the same coordinates as + * the touchscreen. + */ +void input_copy_abs(struct input_dev *dst, unsigned int dst_axis, + const struct input_dev *src, unsigned int src_axis) +{ + /* + * input_alloc_absinfo() may have failed for the source. Our caller is + * expected to catch this when registering the input devices, which may + * happen after the input_copy_abs() call. + */ + if (!src->absinfo) + return;
I'd probably check if source device actually declared EV_ABS/src_axis and yelled loudly (WARN?) in such case.
quoted hunk ↗ jump to hunk
+ + input_alloc_absinfo(dst); + if (!dst->absinfo) + return; + + dst->absinfo[dst_axis] = src->absinfo[src_axis]; + + __set_bit(EV_ABS, dst->evbit); + __set_bit(dst_axis, dst->absbit);
input_set_capability() ?
+} +EXPORT_SYMBOL(input_copy_abs);
Thanks. -- Dmitry