Input: appletouch - simplify touchpad type detection
authorSven Anders <anders@anduras.de>
Tue, 6 May 2008 03:57:10 +0000 (23:57 -0400)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 16 May 2008 18:50:22 +0000 (14:50 -0400)
This patch simplifies type detection and removes unnecessary code.

Signed-off-by: Sven Anders <anders@anduras.de>
[jberg: don't typedef, checkpatch clean, remove useless comments, ...]
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/mouse/appletouch.c

index 814e904..6867c91 100644 (file)
 #include <linux/module.h>
 #include <linux/usb/input.h>
 
-/* Apple has powerbooks which have the keyboard with different Product IDs */
-#define APPLE_VENDOR_ID                0x05AC
-
-/* These names come from Info.plist in AppleUSBTrackpad.kext */
-
-/* PowerBooks Feb 2005 / iBooks */
-#define FOUNTAIN_ANSI_PRODUCT_ID       0x020E
-#define FOUNTAIN_ISO_PRODUCT_ID                0x020F
-
-#define FOUNTAIN_TP_ONLY_PRODUCT_ID    0x030A
-
-#define GEYSER1_TP_ONLY_PRODUCT_ID     0x030B
-
-/* PowerBooks Oct 2005 */
-#define GEYSER2_ANSI_PRODUCT_ID                0x0214
-#define GEYSER2_ISO_PRODUCT_ID         0x0215
-#define GEYSER2_JIS_PRODUCT_ID         0x0216
-
-/* MacBook devices */
-#define GEYSER3_ANSI_PRODUCT_ID                0x0217
-#define GEYSER3_ISO_PRODUCT_ID         0x0218
-#define GEYSER3_JIS_PRODUCT_ID         0x0219
-
-/*
- * Geyser IV: same as Geyser III according to Info.plist in OSX's
- * AppleUSBTrackpad.kext
- * -> same IOClass (AppleUSBGrIIITrackpad), same acceleration tables
- */
-#define GEYSER4_ANSI_PRODUCT_ID                0x021A
-#define GEYSER4_ISO_PRODUCT_ID         0x021B
-#define GEYSER4_JIS_PRODUCT_ID         0x021C
-
-/* Macbook3,1 devices */
-#define GEYSER4_HF_ANSI_PRODUCT_ID     0x0229
-#define GEYSER4_HF_ISO_PRODUCT_ID      0x022A
-#define GEYSER4_HF_JIS_PRODUCT_ID      0x022B
+/* Type of touchpad */
+enum atp_touchpad_type {
+       ATP_FOUNTAIN,
+       ATP_GEYSER1,
+       ATP_GEYSER2,
+       ATP_GEYSER3,
+       ATP_GEYSER4
+};
 
-#define ATP_DEVICE(prod)                                       \
+#define ATP_DEVICE(prod, type)                                 \
+{                                                              \
        .match_flags = USB_DEVICE_ID_MATCH_DEVICE |             \
                       USB_DEVICE_ID_MATCH_INT_CLASS |          \
                       USB_DEVICE_ID_MATCH_INT_PROTOCOL,        \
-       .idVendor = APPLE_VENDOR_ID,                            \
+       .idVendor = 0x05ac, /* Apple */                         \
        .idProduct = (prod),                                    \
        .bInterfaceClass = 0x03,                                \
-       .bInterfaceProtocol = 0x02
+       .bInterfaceProtocol = 0x02,                             \
+       .driver_info = ATP_ ## type,                            \
+}
+
+/*
+ * Table of devices (Product IDs) that work with this driver.
+ * (The names come from Info.plist in AppleUSBTrackpad.kext,
+ *  According to Info.plist Geyser IV is the same as Geyser III.)
+ */
 
-/* table of devices that work with this driver */
 static struct usb_device_id atp_table [] = {
        /* PowerBooks Feb 2005, iBooks G4 */
-       { ATP_DEVICE(FOUNTAIN_ANSI_PRODUCT_ID) },
-       { ATP_DEVICE(FOUNTAIN_ISO_PRODUCT_ID) },
-       { ATP_DEVICE(FOUNTAIN_TP_ONLY_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER1_TP_ONLY_PRODUCT_ID) },
+       ATP_DEVICE(0x020e, FOUNTAIN),   /* FOUNTAIN ANSI */
+       ATP_DEVICE(0x020f, FOUNTAIN),   /* FOUNTAIN ISO */
+       ATP_DEVICE(0x030a, FOUNTAIN),   /* FOUNTAIN TP ONLY */
+       ATP_DEVICE(0x030b, GEYSER1),    /* GEYSER 1 TP ONLY */
 
        /* PowerBooks Oct 2005 */
-       { ATP_DEVICE(GEYSER2_ANSI_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER2_ISO_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER2_JIS_PRODUCT_ID) },
+       ATP_DEVICE(0x0214, GEYSER2),    /* GEYSER 2 ANSI */
+       ATP_DEVICE(0x0215, GEYSER2),    /* GEYSER 2 ISO */
+       ATP_DEVICE(0x0216, GEYSER2),    /* GEYSER 2 JIS */
 
        /* Core Duo MacBook & MacBook Pro */
-       { ATP_DEVICE(GEYSER3_ANSI_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER3_ISO_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER3_JIS_PRODUCT_ID) },
+       ATP_DEVICE(0x0217, GEYSER3),    /* GEYSER 3 ANSI */
+       ATP_DEVICE(0x0218, GEYSER3),    /* GEYSER 3 ISO */
+       ATP_DEVICE(0x0219, GEYSER3),    /* GEYSER 3 JIS */
 
        /* Core2 Duo MacBook & MacBook Pro */
-       { ATP_DEVICE(GEYSER4_ANSI_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER4_ISO_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER4_JIS_PRODUCT_ID) },
+       ATP_DEVICE(0x021a, GEYSER4),    /* GEYSER 4 ANSI */
+       ATP_DEVICE(0x021b, GEYSER4),    /* GEYSER 4 ISO */
+       ATP_DEVICE(0x021c, GEYSER4),    /* GEYSER 4 JIS */
 
        /* Core2 Duo MacBook3,1 */
-       { ATP_DEVICE(GEYSER4_HF_ANSI_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER4_HF_ISO_PRODUCT_ID) },
-       { ATP_DEVICE(GEYSER4_HF_JIS_PRODUCT_ID) },
+       ATP_DEVICE(0x0229, GEYSER4),    /* GEYSER 4 HF ANSI */
+       ATP_DEVICE(0x022a, GEYSER4),    /* GEYSER 4 HF ISO */
+       ATP_DEVICE(0x022b, GEYSER4),    /* GEYSER 4 HF JIS */
 
        /* Terminating entry */
        { }
@@ -132,9 +112,13 @@ MODULE_DEVICE_TABLE(usb, atp_table);
  * We try to keep the touchpad aspect ratio while still doing only simple
  * arithmetics.
  * The factors below give coordinates like:
- *     0 <= x <  960 on 12" and 15" Powerbooks
- *     0 <= x < 1600 on 17" Powerbooks
- *     0 <= y <  646
+ *
+ *      0 <= x <  960 on 12" and 15" Powerbooks
+ *      0 <= x < 1600 on 17" Powerbooks and 17" MacBook Pro
+ *      0 <= x < 1216 on MacBooks and 15" MacBook Pro
+ *
+ *      0 <= y <  646 on all Powerbooks
+ *      0 <= y <  774 on all MacBooks
  */
 #define ATP_XFACT      64
 #define ATP_YFACT      43
@@ -159,6 +143,7 @@ struct atp {
        struct urb              *urb;           /* usb request block */
        signed char             *data;          /* transferred data */
        struct input_dev        *input;         /* input dev */
+       enum atp_touchpad_type  type;           /* type of touchpad */
        bool                    open;
        bool                    valid;          /* are the samples valid? */
        bool                    size_detect_done;
@@ -209,40 +194,6 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "Activate debugging output");
 
-static inline int atp_is_fountain(struct atp *dev)
-{
-       u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
-
-       return productId == FOUNTAIN_ANSI_PRODUCT_ID ||
-              productId == FOUNTAIN_ISO_PRODUCT_ID ||
-              productId == FOUNTAIN_TP_ONLY_PRODUCT_ID;
-}
-
-/* Checks if the device a Geyser 2 (ANSI, ISO, JIS) */
-static inline int atp_is_geyser_2(struct atp *dev)
-{
-       u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
-
-       return (productId == GEYSER2_ANSI_PRODUCT_ID) ||
-               (productId == GEYSER2_ISO_PRODUCT_ID) ||
-               (productId == GEYSER2_JIS_PRODUCT_ID);
-}
-
-static inline int atp_is_geyser_3(struct atp *dev)
-{
-       u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
-
-       return (productId == GEYSER3_ANSI_PRODUCT_ID) ||
-               (productId == GEYSER3_ISO_PRODUCT_ID) ||
-               (productId == GEYSER3_JIS_PRODUCT_ID) ||
-               (productId == GEYSER4_ANSI_PRODUCT_ID) ||
-               (productId == GEYSER4_ISO_PRODUCT_ID) ||
-               (productId == GEYSER4_JIS_PRODUCT_ID) ||
-               (productId == GEYSER4_HF_ANSI_PRODUCT_ID) ||
-               (productId == GEYSER4_HF_ISO_PRODUCT_ID) ||
-               (productId == GEYSER4_HF_JIS_PRODUCT_ID);
-}
-
 /*
  * By default newer Geyser devices send standard USB HID mouse
  * packets (Report ID 2). This code changes device mode, so it
@@ -416,7 +367,7 @@ static void atp_complete(struct urb *urb)
        }
 
        /* reorder the sensors values */
-       if (atp_is_geyser_3(dev)) {
+       if (dev->type == ATP_GEYSER3 || dev->type == ATP_GEYSER4) {
                memset(dev->xy_cur, 0, sizeof(dev->xy_cur));
 
                /*
@@ -435,7 +386,7 @@ static void atp_complete(struct urb *urb)
                        dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1];
                        dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2];
                }
-       } else if (atp_is_geyser_2(dev)) {
+       } else if (dev->type == ATP_GEYSER2) {
                memset(dev->xy_cur, 0, sizeof(dev->xy_cur));
 
                /*
@@ -479,17 +430,17 @@ static void atp_complete(struct urb *urb)
                memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old));
 
                if (dev->size_detect_done ||
-                   atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */
+                   dev->type == ATP_GEYSER3) /* No 17" Macbooks (yet) */
                        goto exit;
 
                /* 17" Powerbooks have extra X sensors */
-               for (i = (atp_is_geyser_2(dev) ? 15 : 16);
+               for (i = (dev->type == ATP_GEYSER2 ? 15 : 16);
                     i < ATP_XSENSORS; i++) {
                        if (!dev->xy_cur[i])
                                continue;
 
                        printk(KERN_INFO "appletouch: 17\" model detected.\n");
-                       if (atp_is_geyser_2(dev))
+                       if (dev->type == ATP_GEYSER2)
                                input_set_abs_params(dev->input, ABS_X, 0,
                                                     (20 - 1) *
                                                     ATP_XFACT - 1,
@@ -569,7 +520,7 @@ static void atp_complete(struct urb *urb)
         * several hundred times a second. Re-initialization does not
         * work on Fountain touchpads.
         */
-       if (!atp_is_fountain(dev)) {
+       if (dev->type != ATP_FOUNTAIN) {
                /*
                 * Button must not be pressed when entering suspend,
                 * otherwise we will never release the button.
@@ -650,15 +601,14 @@ static int atp_probe(struct usb_interface *iface,
 
        dev->udev = udev;
        dev->input = input_dev;
+       dev->type = id->driver_info;
        dev->overflow_warned = false;
-       if (atp_is_geyser_3(dev))
-               dev->datalen = 64;
-       else if (atp_is_geyser_2(dev))
-               dev->datalen = 64;
-       else
+       if (dev->type == ATP_FOUNTAIN || dev->type == ATP_GEYSER1)
                dev->datalen = 81;
+       else
+               dev->datalen = 64;
 
-       if (!atp_is_fountain(dev)) {
+       if (dev->type != ATP_FOUNTAIN) {
                /* switch to raw sensor mode */
                if (atp_geyser_init(udev))
                        goto err_free_devs;
@@ -694,7 +644,7 @@ static int atp_probe(struct usb_interface *iface,
 
        set_bit(EV_ABS, input_dev->evbit);
 
-       if (atp_is_geyser_3(dev)) {
+       if (dev->type == ATP_GEYSER3 || dev->type == ATP_GEYSER4) {
                /*
                 * MacBook have 20 X sensors, 10 Y sensors
                 */
@@ -702,7 +652,7 @@ static int atp_probe(struct usb_interface *iface,
                                     ((20 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0);
                input_set_abs_params(input_dev, ABS_Y, 0,
                                     ((10 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0);
-       } else if (atp_is_geyser_2(dev)) {
+       } else if (dev->type == ATP_GEYSER2) {
                /*
                 * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected
                 * later.