diff options
Diffstat (limited to 'drivers/input/mouse/synaptics.c')
-rw-r--r-- | drivers/input/mouse/synaptics.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index e6e59c59391d..a7af8565e2de 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -420,15 +420,39 @@ static void synaptics_pt_create(struct psmouse *psmouse) | |||
420 | * Functions to interpret the absolute mode packets | 420 | * Functions to interpret the absolute mode packets |
421 | ****************************************************************************/ | 421 | ****************************************************************************/ |
422 | 422 | ||
423 | static void synaptics_mt_state_set(struct synaptics_mt_state *state, int count, | ||
424 | int sgm, int agm) | ||
425 | { | ||
426 | state->count = count; | ||
427 | state->sgm = sgm; | ||
428 | state->agm = agm; | ||
429 | } | ||
430 | |||
423 | static void synaptics_parse_agm(const unsigned char buf[], | 431 | static void synaptics_parse_agm(const unsigned char buf[], |
424 | struct synaptics_data *priv) | 432 | struct synaptics_data *priv, |
433 | struct synaptics_hw_state *hw) | ||
425 | { | 434 | { |
426 | struct synaptics_hw_state *agm = &priv->agm; | 435 | struct synaptics_hw_state *agm = &priv->agm; |
436 | int agm_packet_type; | ||
437 | |||
438 | agm_packet_type = (buf[5] & 0x30) >> 4; | ||
439 | switch (agm_packet_type) { | ||
440 | case 1: | ||
441 | /* Gesture packet: (x, y, z) half resolution */ | ||
442 | agm->w = hw->w; | ||
443 | agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1; | ||
444 | agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1; | ||
445 | agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1; | ||
446 | break; | ||
427 | 447 | ||
428 | /* Gesture packet: (x, y, z) at half resolution */ | 448 | case 2: |
429 | agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1; | 449 | /* AGM-CONTACT packet: (count, sgm, agm) */ |
430 | agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1; | 450 | synaptics_mt_state_set(&agm->mt_state, buf[1], buf[2], buf[4]); |
431 | agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1; | 451 | break; |
452 | |||
453 | default: | ||
454 | break; | ||
455 | } | ||
432 | } | 456 | } |
433 | 457 | ||
434 | static int synaptics_parse_hw_state(const unsigned char buf[], | 458 | static int synaptics_parse_hw_state(const unsigned char buf[], |
@@ -467,7 +491,7 @@ static int synaptics_parse_hw_state(const unsigned char buf[], | |||
467 | if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || | 491 | if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || |
468 | SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && | 492 | SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && |
469 | hw->w == 2) { | 493 | hw->w == 2) { |
470 | synaptics_parse_agm(buf, priv); | 494 | synaptics_parse_agm(buf, priv, hw); |
471 | return 1; | 495 | return 1; |
472 | } | 496 | } |
473 | 497 | ||