diff options
Diffstat (limited to 'drivers/input/mouse/focaltech.c')
| -rw-r--r-- | drivers/input/mouse/focaltech.c | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c index 757f78a94aec..23d259416f2f 100644 --- a/drivers/input/mouse/focaltech.c +++ b/drivers/input/mouse/focaltech.c | |||
| @@ -67,9 +67,6 @@ static void focaltech_reset(struct psmouse *psmouse) | |||
| 67 | 67 | ||
| 68 | #define FOC_MAX_FINGERS 5 | 68 | #define FOC_MAX_FINGERS 5 |
| 69 | 69 | ||
| 70 | #define FOC_MAX_X 2431 | ||
| 71 | #define FOC_MAX_Y 1663 | ||
| 72 | |||
| 73 | /* | 70 | /* |
| 74 | * Current state of a single finger on the touchpad. | 71 | * Current state of a single finger on the touchpad. |
| 75 | */ | 72 | */ |
| @@ -129,9 +126,17 @@ static void focaltech_report_state(struct psmouse *psmouse) | |||
| 129 | input_mt_slot(dev, i); | 126 | input_mt_slot(dev, i); |
| 130 | input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); | 127 | input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); |
| 131 | if (active) { | 128 | if (active) { |
| 132 | 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); | ||
| 133 | input_report_abs(dev, ABS_MT_POSITION_Y, | 138 | input_report_abs(dev, ABS_MT_POSITION_Y, |
| 134 | FOC_MAX_Y - finger->y); | 139 | priv->y_max - clamped_y); |
| 135 | } | 140 | } |
| 136 | } | 141 | } |
| 137 | input_mt_report_pointer_emulation(dev, true); | 142 | input_mt_report_pointer_emulation(dev, true); |
| @@ -180,16 +185,6 @@ static void focaltech_process_abs_packet(struct psmouse *psmouse, | |||
| 180 | 185 | ||
| 181 | state->pressed = (packet[0] >> 4) & 1; | 186 | state->pressed = (packet[0] >> 4) & 1; |
| 182 | 187 | ||
| 183 | /* | ||
| 184 | * packet[5] contains some kind of tool size in the most | ||
| 185 | * significant nibble. 0xff is a special value (latching) that | ||
| 186 | * signals a large contact area. | ||
| 187 | */ | ||
| 188 | if (packet[5] == 0xff) { | ||
| 189 | state->fingers[finger].valid = false; | ||
| 190 | return; | ||
| 191 | } | ||
| 192 | |||
| 193 | state->fingers[finger].x = ((packet[1] & 0xf) << 8) | packet[2]; | 188 | state->fingers[finger].x = ((packet[1] & 0xf) << 8) | packet[2]; |
| 194 | state->fingers[finger].y = (packet[3] << 8) | packet[4]; | 189 | state->fingers[finger].y = (packet[3] << 8) | packet[4]; |
| 195 | state->fingers[finger].valid = true; | 190 | state->fingers[finger].valid = true; |
| @@ -381,6 +376,23 @@ static int focaltech_read_size(struct psmouse *psmouse) | |||
| 381 | 376 | ||
| 382 | return 0; | 377 | return 0; |
| 383 | } | 378 | } |
| 379 | |||
| 380 | void focaltech_set_resolution(struct psmouse *psmouse, unsigned int resolution) | ||
| 381 | { | ||
| 382 | /* not supported yet */ | ||
| 383 | } | ||
| 384 | |||
| 385 | static void focaltech_set_rate(struct psmouse *psmouse, unsigned int rate) | ||
| 386 | { | ||
| 387 | /* not supported yet */ | ||
| 388 | } | ||
| 389 | |||
| 390 | static void focaltech_set_scale(struct psmouse *psmouse, | ||
| 391 | enum psmouse_scale scale) | ||
| 392 | { | ||
| 393 | /* not supported yet */ | ||
| 394 | } | ||
| 395 | |||
| 384 | int focaltech_init(struct psmouse *psmouse) | 396 | int focaltech_init(struct psmouse *psmouse) |
| 385 | { | 397 | { |
| 386 | struct focaltech_data *priv; | 398 | struct focaltech_data *priv; |
| @@ -415,6 +427,14 @@ int focaltech_init(struct psmouse *psmouse) | |||
| 415 | psmouse->cleanup = focaltech_reset; | 427 | psmouse->cleanup = focaltech_reset; |
| 416 | /* resync is not supported yet */ | 428 | /* resync is not supported yet */ |
| 417 | psmouse->resync_time = 0; | 429 | psmouse->resync_time = 0; |
| 430 | /* | ||
| 431 | * rate/resolution/scale changes are not supported yet, and | ||
| 432 | * the generic implementations of these functions seem to | ||
| 433 | * confuse some touchpads | ||
| 434 | */ | ||
| 435 | psmouse->set_resolution = focaltech_set_resolution; | ||
| 436 | psmouse->set_rate = focaltech_set_rate; | ||
| 437 | psmouse->set_scale = focaltech_set_scale; | ||
| 418 | 438 | ||
| 419 | return 0; | 439 | return 0; |
| 420 | 440 | ||
