Add a function to switch off ABS_PRESSURE generation if necessary. This may be helpful in case drivers want to generate ABS_PRESSURE events themselves from ABS_MT_PRESSURE. Signed-off-by: Angela Czubak <acz@xxxxxxxxxxxx> --- drivers/input/input-mt.c | 18 ++++++++++++++++-- include/linux/input/mt.h | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c index 44fe6f2f063c..e0bf5917a8b5 100644 --- a/drivers/input/input-mt.c +++ b/drivers/input/input-mt.c @@ -52,6 +52,7 @@ int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots, mt->num_slots = num_slots; mt->flags = flags; + mt->abs_pressure_gen = true; input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0); input_set_abs_params(dev, ABS_MT_TRACKING_ID, 0, TRKID_MAX, 0, 0); @@ -244,12 +245,14 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) input_event(dev, EV_ABS, ABS_X, x); input_event(dev, EV_ABS, ABS_Y, y); - if (test_bit(ABS_MT_PRESSURE, dev->absbit)) { + if (test_bit(ABS_MT_PRESSURE, dev->absbit) && + mt->abs_pressure_gen) { int p = input_mt_get_value(oldest, ABS_MT_PRESSURE); input_event(dev, EV_ABS, ABS_PRESSURE, p); } } else { - if (test_bit(ABS_MT_PRESSURE, dev->absbit)) + if (test_bit(ABS_MT_PRESSURE, dev->absbit) && + mt->abs_pressure_gen) input_event(dev, EV_ABS, ABS_PRESSURE, 0); } } @@ -312,6 +315,17 @@ void input_mt_sync_frame(struct input_dev *dev) } EXPORT_SYMBOL(input_mt_sync_frame); +void input_mt_pressure_toggle(struct input_dev *dev, bool toggle) +{ + struct input_mt *mt = dev->mt; + + if (!mt) + return; + + mt->abs_pressure_gen = toggle; +} +EXPORT_SYMBOL(input_mt_pressure_toggle); + static int adjust_dual(int *begin, int step, int *end, int eq, int mu) { int f, *p, s, c; diff --git a/include/linux/input/mt.h b/include/linux/input/mt.h index 3b8580bd33c1..c870a513bde1 100644 --- a/include/linux/input/mt.h +++ b/include/linux/input/mt.h @@ -38,6 +38,7 @@ struct input_mt_slot { * @flags: input_mt operation flags * @frame: increases every time input_mt_sync_frame() is called * @red: reduced cost matrix for in-kernel tracking + * @abs_pressure_gen: emulate pointer pressure * @slots: array of slots holding current values of tracked contacts */ struct input_mt { @@ -47,6 +48,7 @@ struct input_mt { unsigned int flags; unsigned int frame; int *red; + bool abs_pressure_gen; struct input_mt_slot slots[]; }; @@ -111,6 +113,8 @@ void input_mt_drop_unused(struct input_dev *dev); void input_mt_sync_frame(struct input_dev *dev); +void input_mt_pressure_toggle(struct input_dev *dev, bool toggle); + /** * struct input_mt_pos - contact position * @x: horizontal coordinate -- 2.34.1.307.g9b7440fafd-goog