diff options
Diffstat (limited to 'drivers/input/mouse/focaltech.c')
-rw-r--r-- | drivers/input/mouse/focaltech.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c index e8fafe8785a7..c66e0e04bb7e 100644 --- a/drivers/input/mouse/focaltech.c +++ b/drivers/input/mouse/focaltech.c | |||
@@ -126,9 +126,17 @@ static void focaltech_report_state(struct psmouse *psmouse) | |||
126 | input_mt_slot(dev, i); | 126 | input_mt_slot(dev, i); |
127 | input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); | 127 | input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); |
128 | if (active) { | 128 | if (active) { |
129 | input_report_abs(dev, ABS_MT_POSITION_X, finger->x); | 129 | unsigned int clamped_x, clamped_y; |
130 | /* | ||
131 | * The touchpad might report invalid data, so we clamp | ||
132 | * the resulting values so that we do not confuse | ||
133 | * userspace. | ||
134 | */ | ||
135 | clamped_x = clamp(finger->x, 0U, priv->x_max); | ||
136 | clamped_y = clamp(finger->y, 0U, priv->y_max); | ||
137 | input_report_abs(dev, ABS_MT_POSITION_X, clamped_x); | ||
130 | input_report_abs(dev, ABS_MT_POSITION_Y, | 138 | input_report_abs(dev, ABS_MT_POSITION_Y, |
131 | priv->y_max - finger->y); | 139 | priv->y_max - clamped_y); |
132 | } | 140 | } |
133 | } | 141 | } |
134 | input_mt_report_pointer_emulation(dev, true); | 142 | input_mt_report_pointer_emulation(dev, true); |