Files
omarchy-pkgs/pkgbuilds/linux-omarchy-bore/0560-input.patch
T

77 lines
2.3 KiB
Diff

diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -78,8 +78,8 @@ struct focaltech_finger_state {
* Absolute position (from the bottom left corner) of the
* finger.
*/
- unsigned int x;
- unsigned int y;
+ int x;
+ int y;
};
/*
@@ -108,7 +108,7 @@ struct focaltech_hw_state {
};
struct focaltech_data {
- unsigned int x_max, y_max;
+ int x_max, y_max;
struct focaltech_hw_state state;
};
@@ -126,17 +126,16 @@ static void focaltech_report_state(struct psmouse *psmouse)
input_mt_slot(dev, i);
input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
if (active) {
- unsigned int clamped_x, clamped_y;
/*
* The touchpad might report invalid data, so we clamp
* the resulting values so that we do not confuse
- * userspace.
+ * userspace or accumulate coordinate wind-up.
*/
- clamped_x = clamp(finger->x, 0U, priv->x_max);
- clamped_y = clamp(finger->y, 0U, priv->y_max);
- input_report_abs(dev, ABS_MT_POSITION_X, clamped_x);
+ finger->x = clamp(finger->x, 0, priv->x_max);
+ finger->y = clamp(finger->y, 0, priv->y_max);
+ input_report_abs(dev, ABS_MT_POSITION_X, finger->x);
input_report_abs(dev, ABS_MT_POSITION_Y,
- priv->y_max - clamped_y);
+ priv->y_max - finger->y);
input_report_abs(dev, ABS_TOOL_WIDTH, state->width);
}
}
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -267,7 +267,15 @@ void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
*/
static int psmouse_handle_byte(struct psmouse *psmouse)
{
- psmouse_ret_t rc = psmouse->protocol_handler(psmouse);
+ psmouse_ret_t rc;
+
+ /* protocol_handler is NULL when device is being disconnected */
+ if (unlikely(!psmouse->protocol_handler)) {
+ psmouse->pktcnt = 0;
+ return 0;
+ }
+
+ rc = psmouse->protocol_handler(psmouse);
switch (rc) {
case PSMOUSE_BAD_DATA:
@@ -1466,6 +1474,9 @@ static void psmouse_disconnect(struct serio *serio)
psmouse_deactivate(parent);
}
+ scoped_guard(serio_pause_rx, serio)
+ psmouse->protocol_handler = NULL;
+
if (psmouse->disconnect)
psmouse->disconnect(psmouse);