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