diff options
| -rw-r--r-- | drivers/input/mouse/synaptics.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 14eaecea2b70..0786919c15cd 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
| @@ -53,14 +53,19 @@ | |||
| 53 | #define ABS_POS_BITS 13 | 53 | #define ABS_POS_BITS 13 |
| 54 | 54 | ||
| 55 | /* | 55 | /* |
| 56 | * Any position values from the hardware above the following limits are | 56 | * These values should represent the absolute maximum value that will |
| 57 | * treated as "wrapped around negative" values that have been truncated to | 57 | * be reported for a positive position value. Some Synaptics firmware |
| 58 | * the 13-bit reporting range of the hardware. These are just reasonable | 58 | * uses this value to indicate a finger near the edge of the touchpad |
| 59 | * guesses and can be adjusted if hardware is found that operates outside | 59 | * whose precise position cannot be determined. |
| 60 | * of these parameters. | 60 | * |
| 61 | * At least one touchpad is known to report positions in excess of this | ||
| 62 | * value which are actually negative values truncated to the 13-bit | ||
| 63 | * reporting range. These values have never been observed to be lower | ||
| 64 | * than 8184 (i.e. -8), so we treat all values greater than 8176 as | ||
| 65 | * negative and any other value as positive. | ||
| 61 | */ | 66 | */ |
| 62 | #define X_MAX_POSITIVE (((1 << ABS_POS_BITS) + XMAX) / 2) | 67 | #define X_MAX_POSITIVE 8176 |
| 63 | #define Y_MAX_POSITIVE (((1 << ABS_POS_BITS) + YMAX) / 2) | 68 | #define Y_MAX_POSITIVE 8176 |
| 64 | 69 | ||
| 65 | /***************************************************************************** | 70 | /***************************************************************************** |
| 66 | * Stuff we need even when we do not want native Synaptics support | 71 | * Stuff we need even when we do not want native Synaptics support |
| @@ -604,11 +609,21 @@ static int synaptics_parse_hw_state(const unsigned char buf[], | |||
| 604 | hw->right = (buf[0] & 0x02) ? 1 : 0; | 609 | hw->right = (buf[0] & 0x02) ? 1 : 0; |
| 605 | } | 610 | } |
| 606 | 611 | ||
| 607 | /* Convert wrap-around values to negative */ | 612 | /* |
| 613 | * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE | ||
| 614 | * is used by some firmware to indicate a finger at the edge of | ||
| 615 | * the touchpad whose precise position cannot be determined, so | ||
| 616 | * convert these values to the maximum axis value. | ||
| 617 | */ | ||
| 608 | if (hw->x > X_MAX_POSITIVE) | 618 | if (hw->x > X_MAX_POSITIVE) |
| 609 | hw->x -= 1 << ABS_POS_BITS; | 619 | hw->x -= 1 << ABS_POS_BITS; |
| 620 | else if (hw->x == X_MAX_POSITIVE) | ||
| 621 | hw->x = XMAX; | ||
| 622 | |||
| 610 | if (hw->y > Y_MAX_POSITIVE) | 623 | if (hw->y > Y_MAX_POSITIVE) |
| 611 | hw->y -= 1 << ABS_POS_BITS; | 624 | hw->y -= 1 << ABS_POS_BITS; |
| 625 | else if (hw->y == Y_MAX_POSITIVE) | ||
| 626 | hw->y = YMAX; | ||
| 612 | 627 | ||
| 613 | return 0; | 628 | return 0; |
| 614 | } | 629 | } |
