aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/mouse/synaptics.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/mouse/synaptics.c')
-rw-r--r--drivers/input/mouse/synaptics.c36
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
423static 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
423static void synaptics_parse_agm(const unsigned char buf[], 431static 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
434static int synaptics_parse_hw_state(const unsigned char buf[], 458static 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