Input: alps - use the generic process_bitmap function for v5 touchpads
authorHans de Goede <hdegoede@redhat.com>
Wed, 20 May 2015 21:43:09 +0000 (14:43 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 20 May 2015 21:45:45 +0000 (14:45 -0700)
Now that the generic process_bitmap function has been improved to offer
accurate coordinates for the first touch we can use it for v5 (dolphin)
touchpads too.

Besides being a nice code cleanup this also fixes the saw tooth pattern
in the coordinates for the second touch the dolphin specific version had.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/alps.c

index e9e13cd026d2418d3a1345355122cb074f465710..4e1af89c774947981d4745f0b0ce3240f894dca7 100644 (file)
@@ -302,53 +302,6 @@ static void alps_process_packet_v1_v2(struct psmouse *psmouse)
        input_sync(dev);
 }
 
-/*
- * Process bitmap data for V5 protocols. Return value is null.
- *
- * The bitmaps don't have enough data to track fingers, so this function
- * only generates points representing a bounding box of at most two contacts.
- * These two points are returned in fields->mt.
- */
-static void alps_process_bitmap_dolphin(struct alps_data *priv,
-                                       struct alps_fields *fields)
-{
-       int box_middle_x, box_middle_y;
-       unsigned int x_map, y_map;
-       unsigned char start_bit, end_bit;
-       unsigned char x_msb, x_lsb, y_msb, y_lsb;
-
-       x_map = fields->x_map;
-       y_map = fields->y_map;
-
-       if (!x_map || !y_map)
-               return;
-
-       /* Get Most-significant and Least-significant bit */
-       x_msb = fls(x_map);
-       x_lsb = ffs(x_map);
-       y_msb = fls(y_map);
-       y_lsb = ffs(y_map);
-
-       /* Most-significant bit should never exceed max sensor line number */
-       if (x_msb > priv->x_bits || y_msb > priv->y_bits)
-               return;
-
-       if (fields->fingers > 1) {
-               start_bit = priv->x_bits - x_msb;
-               end_bit = priv->x_bits - x_lsb;
-               box_middle_x = (priv->x_max * (start_bit + end_bit)) /
-                               (2 * (priv->x_bits - 1));
-
-               start_bit = y_lsb - 1;
-               end_bit = y_msb - 1;
-               box_middle_y = (priv->y_max * (start_bit + end_bit)) /
-                               (2 * (priv->y_bits - 1));
-               fields->mt[0] = fields->st;
-               fields->mt[1].x = 2 * box_middle_x - fields->mt[0].x;
-               fields->mt[1].y = 2 * box_middle_y - fields->mt[0].y;
-       }
-}
-
 static void alps_get_bitmap_points(unsigned int map,
                                   struct alps_bitmap_point *low,
                                   struct alps_bitmap_point *high,
@@ -376,7 +329,7 @@ static void alps_get_bitmap_points(unsigned int map,
 }
 
 /*
- * Process bitmap data from v3 and v4 protocols. Returns the number of
+ * Process bitmap data from semi-mt protocols. Returns the number of
  * fingers detected. A return value of 0 means at least one of the
  * bitmaps was empty.
  *
@@ -454,8 +407,15 @@ static int alps_process_bitmap(struct alps_data *priv,
                (priv->y_max * (2 * y_high.start_bit + y_high.num_bits - 1)) /
                (2 * (priv->y_bits - 1));
 
-       /* y-bitmap order is reversed, except on rushmore */
-       if (priv->proto_version != ALPS_PROTO_V3_RUSHMORE) {
+       /* x-bitmap order is reversed on v5 touchpads  */
+       if (priv->proto_version == ALPS_PROTO_V5) {
+               for (i = 0; i < 4; i++)
+                       corner[i].x = priv->x_max - corner[i].x;
+       }
+
+       /* y-bitmap order is reversed on v3 and v4 touchpads  */
+       if (priv->proto_version == ALPS_PROTO_V3 ||
+           priv->proto_version == ALPS_PROTO_V4) {
                for (i = 0; i < 4; i++)
                        corner[i].y = priv->y_max - corner[i].y;
        }
@@ -742,18 +702,8 @@ static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse)
                         * data, so we need to do decode it first.
                         */
                        priv->decode_fields(f, priv->multi_data, psmouse);
-
-                       if (priv->proto_version == ALPS_PROTO_V3 ||
-                           priv->proto_version == ALPS_PROTO_V3_RUSHMORE) {
-                               if (alps_process_bitmap(priv, f) == 0)
-                                       fingers = 0; /* Use st data */
-                       } else {
-                               /*
-                                * Since Dolphin's finger number is reliable,
-                                * there is no need to compare with bmap_fn.
-                                */
-                               alps_process_bitmap_dolphin(priv, f);
-                       }
+                       if (alps_process_bitmap(priv, f) == 0)
+                               fingers = 0; /* Use st data */
                } else {
                        priv->multi_packet = 0;
                }