aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-07-26 01:44:42 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-07-26 17:03:16 -0400
commitcdf333efdcad9891e7f9c26e9ece67776af13ae2 (patch)
treee3ba4c9a943a25cfe702113da98f051f57daa837
parent02d04254a5dfb8de1459805c3433cd0e9e4853d7 (diff)
Input: alps - use standard contact tracking instead of DIY
When there are 2 fingers on the pad we don't know which one is which, so use input_mt_assign_slots to make sure the right set of coordinates ends up in the right slot. Besides ensuring things end up in the right slot, this also results in a nice cleanup, since sync_frame also handles non mt position and btn_touch reporting. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/mouse/alps.c52
1 files changed, 16 insertions, 36 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 8c3017a92788..8c2de016e223 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -419,25 +419,26 @@ static int alps_process_bitmap(struct alps_data *priv,
419 return fingers; 419 return fingers;
420} 420}
421 421
422static void alps_set_slot(struct input_dev *dev, int slot, bool active, 422static void alps_set_slot(struct input_dev *dev, int slot, int x, int y)
423 int x, int y)
424{ 423{
425 input_mt_slot(dev, slot); 424 input_mt_slot(dev, slot);
426 input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); 425 input_mt_report_slot_state(dev, MT_TOOL_FINGER, true);
427 if (active) { 426 input_report_abs(dev, ABS_MT_POSITION_X, x);
428 input_report_abs(dev, ABS_MT_POSITION_X, x); 427 input_report_abs(dev, ABS_MT_POSITION_Y, y);
429 input_report_abs(dev, ABS_MT_POSITION_Y, y);
430 }
431} 428}
432 429
433static void alps_report_semi_mt_data(struct psmouse *psmouse, int num_fingers) 430static void alps_report_mt_data(struct psmouse *psmouse, int n)
434{ 431{
435 struct alps_data *priv = psmouse->private; 432 struct alps_data *priv = psmouse->private;
436 struct input_dev *dev = psmouse->dev; 433 struct input_dev *dev = psmouse->dev;
437 struct alps_fields *f = &priv->f; 434 struct alps_fields *f = &priv->f;
435 int i, slot[MAX_TOUCHES];
436
437 input_mt_assign_slots(dev, slot, f->mt, n);
438 for (i = 0; i < n; i++)
439 alps_set_slot(dev, slot[i], f->mt[i].x, f->mt[i].y);
438 440
439 alps_set_slot(dev, 0, num_fingers != 0, f->mt[0].x, f->mt[0].y); 441 input_mt_sync_frame(dev);
440 alps_set_slot(dev, 1, num_fingers == 2, f->mt[1].x, f->mt[1].y);
441} 442}
442 443
443static void alps_process_trackstick_packet_v3(struct psmouse *psmouse) 444static void alps_process_trackstick_packet_v3(struct psmouse *psmouse)
@@ -674,12 +675,7 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
674 fingers = f->pressure > 0 ? 1 : 0; 675 fingers = f->pressure > 0 ? 1 : 0;
675 } 676 }
676 677
677 if (f->pressure >= 64) 678 alps_report_mt_data(psmouse, (fingers <= 2) ? fingers : 1);
678 input_report_key(dev, BTN_TOUCH, 1);
679 else
680 input_report_key(dev, BTN_TOUCH, 0);
681
682 alps_report_semi_mt_data(psmouse, fingers);
683 679
684 input_mt_report_finger_count(dev, fingers); 680 input_mt_report_finger_count(dev, fingers);
685 681
@@ -687,10 +683,6 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
687 input_report_key(dev, BTN_RIGHT, f->right); 683 input_report_key(dev, BTN_RIGHT, f->right);
688 input_report_key(dev, BTN_MIDDLE, f->middle); 684 input_report_key(dev, BTN_MIDDLE, f->middle);
689 685
690 if (f->pressure > 0) {
691 input_report_abs(dev, ABS_X, f->st.x);
692 input_report_abs(dev, ABS_Y, f->st.y);
693 }
694 input_report_abs(dev, ABS_PRESSURE, f->pressure); 686 input_report_abs(dev, ABS_PRESSURE, f->pressure);
695 687
696 input_sync(dev); 688 input_sync(dev);
@@ -853,22 +845,13 @@ static void alps_process_packet_v4(struct psmouse *psmouse)
853 fingers = f->fingers; 845 fingers = f->fingers;
854 } 846 }
855 847
856 if (f->pressure >= 64) 848 alps_report_mt_data(psmouse, (fingers <= 2) ? fingers : 1);
857 input_report_key(dev, BTN_TOUCH, 1);
858 else
859 input_report_key(dev, BTN_TOUCH, 0);
860
861 alps_report_semi_mt_data(psmouse, fingers);
862 849
863 input_mt_report_finger_count(dev, fingers); 850 input_mt_report_finger_count(dev, fingers);
864 851
865 input_report_key(dev, BTN_LEFT, f->left); 852 input_report_key(dev, BTN_LEFT, f->left);
866 input_report_key(dev, BTN_RIGHT, f->right); 853 input_report_key(dev, BTN_RIGHT, f->right);
867 854
868 if (f->pressure > 0) {
869 input_report_abs(dev, ABS_X, f->st.x);
870 input_report_abs(dev, ABS_Y, f->st.y);
871 }
872 input_report_abs(dev, ABS_PRESSURE, f->pressure); 855 input_report_abs(dev, ABS_PRESSURE, f->pressure);
873 856
874 input_sync(dev); 857 input_sync(dev);
@@ -2003,17 +1986,14 @@ static void alps_set_abs_params_st(struct alps_data *priv,
2003static void alps_set_abs_params_mt(struct alps_data *priv, 1986static void alps_set_abs_params_mt(struct alps_data *priv,
2004 struct input_dev *dev1) 1987 struct input_dev *dev1)
2005{ 1988{
2006 set_bit(INPUT_PROP_SEMI_MT, dev1->propbit);
2007 input_mt_init_slots(dev1, 2, 0);
2008 input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0); 1989 input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0);
2009 input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0); 1990 input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0);
2010 1991
2011 set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); 1992 input_mt_init_slots(dev1, MAX_TOUCHES, INPUT_MT_POINTER |
1993 INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK | INPUT_MT_SEMI_MT);
1994
2012 set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); 1995 set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit);
2013 set_bit(BTN_TOOL_QUADTAP, dev1->keybit); 1996 set_bit(BTN_TOOL_QUADTAP, dev1->keybit);
2014
2015 input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0);
2016 input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0);
2017} 1997}
2018 1998
2019int alps_init(struct psmouse *psmouse) 1999int alps_init(struct psmouse *psmouse)