Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Sat, 3 Nov 2007 02:37:41 +0000 (19:37 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Sat, 3 Nov 2007 02:37:41 +0000 (19:37 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: linux-input mailing list moved to vger.kernel.org
  Input: inport, logibm - use KERN_INFO when reporting missing mouse
  Input: appletouch - idle reset logic broke older Fountains
  Input: hp_sdc.c - fix section mismatch
  Input: appletouch - add Johannes Berg as maintainer
  Input: Add Euro and Dollar key codes
  Input: xpad - add more USB IDs

MAINTAINERS
drivers/input/joystick/xpad.c
drivers/input/mouse/appletouch.c
drivers/input/mouse/inport.c
drivers/input/mouse/logibm.c
drivers/input/serio/hp_sdc.c
include/linux/input.h

index 4a26f832b4b54b25a8d3e766cf103f83d7e1f986..6c0e44bbf601849ff78d18f2bb63ef423c2fe6b9 100644 (file)
@@ -398,6 +398,12 @@ P: Arnaldo Carvalho de Melo
 M:     acme@ghostprotocols.net
 S:     Maintained
 
+APPLETOUCH TOUCHPAD DRIVER
+P:     Johannes Berg
+M:     johannes@sipsolutions.net
+L:     linux-input@vger.kernel.org
+S:     Maintained
+
 ARC FRAMEBUFFER DRIVER
 P:     Jaya Kumar
 M:     jayalk@intworks.biz
@@ -1701,7 +1707,7 @@ S:        Maintained
 HID CORE LAYER
 P:     Jiri Kosina
 M:     jkosina@suse.cz
-L:     linux-input@atrey.karlin.mff.cuni.cz
+L:     linux-input@vger.kernel.org
 T:     git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git
 S:     Maintained
 
@@ -1927,8 +1933,7 @@ INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS
 P:     Dmitry Torokhov
 M:     dmitry.torokhov@gmail.com
 M:     dtor@mail.ru
-L:     linux-input@atrey.karlin.mff.cuni.cz
-L:     linux-joystick@atrey.karlin.mff.cuni.cz
+L:     linux-input@vger.kernel.org
 T:     git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git
 S:     Maintained
 
index 6dd375825a1403226c9c727da6d3fc460ed17b6f..6e9d75bd2b1557f1341362d3412dad8edeaf5635 100644 (file)
@@ -120,6 +120,7 @@ static const struct xpad_device {
        { 0x0738, 0x4536, "Mad Catz MicroCON", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
+       { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
        { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
@@ -129,6 +130,7 @@ static const struct xpad_device {
        { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0e6f, 0x0005, "Eclipse wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0e6f, 0x0006, "Edge wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
+       { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
        { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0f30, 0x0202, "Joytech Advanced Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
index f132702d137d1c3810ef01b3080dd33301ef1b87..b4423a471f027e03d8e94499b81b72ed935fcd12 100644 (file)
@@ -129,12 +129,12 @@ MODULE_DEVICE_TABLE (usb, atp_table);
  */
 #define ATP_THRESHOLD   5
 
-/* MacBook Pro (Geyser 3 & 4) initialization constants */
-#define ATP_GEYSER3_MODE_READ_REQUEST_ID 1
-#define ATP_GEYSER3_MODE_WRITE_REQUEST_ID 9
-#define ATP_GEYSER3_MODE_REQUEST_VALUE 0x300
-#define ATP_GEYSER3_MODE_REQUEST_INDEX 0
-#define ATP_GEYSER3_MODE_VENDOR_VALUE 0x04
+/* Geyser initialization constants */
+#define ATP_GEYSER_MODE_READ_REQUEST_ID                1
+#define ATP_GEYSER_MODE_WRITE_REQUEST_ID       9
+#define ATP_GEYSER_MODE_REQUEST_VALUE          0x300
+#define ATP_GEYSER_MODE_REQUEST_INDEX          0
+#define ATP_GEYSER_MODE_VENDOR_VALUE           0x04
 
 /* Structure to hold all of our device specific stuff */
 struct atp {
@@ -142,9 +142,11 @@ struct atp {
        struct usb_device *     udev;           /* usb device */
        struct urb *            urb;            /* usb request block */
        signed char *           data;           /* transferred data */
-       int                     open;           /* non-zero if opened */
-       struct input_dev        *input;         /* input dev */
-       int                     valid;          /* are the sensors valid ? */
+       struct input_dev *      input;          /* input dev */
+       unsigned char           open;           /* non-zero if opened */
+       unsigned char           valid;          /* are the sensors valid ? */
+       unsigned char           size_detect_done;
+       unsigned char           overflowwarn;   /* overflow warning printed? */
        int                     x_old;          /* last reported x/y, */
        int                     y_old;          /* used for smoothing */
                                                /* current value of the sensors */
@@ -153,7 +155,6 @@ struct atp {
        signed char             xy_old[ATP_XSENSORS + ATP_YSENSORS];
                                                /* accumulated sensors */
        int                     xy_acc[ATP_XSENSORS + ATP_YSENSORS];
-       int                     overflowwarn;   /* overflow warning printed? */
        int                     datalen;        /* size of an USB urb transfer */
        int                     idlecount;      /* number of empty packets */
        struct work_struct      work;
@@ -170,7 +171,7 @@ struct atp {
 
 #define dprintk(format, a...)                                          \
        do {                                                            \
-               if (debug) printk(format, ##a);                         \
+               if (debug) printk(KERN_DEBUG format, ##a);              \
        } while (0)
 
 MODULE_AUTHOR("Johannes Berg, Stelian Pop, Frank Arnold, Michael Hanselmann");
@@ -188,6 +189,15 @@ static int debug = 1;
 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)
 {
@@ -211,52 +221,63 @@ static inline int atp_is_geyser_3(struct atp *dev)
 }
 
 /*
- * By default Geyser 3 device sends standard USB HID mouse
+ * By default newer Geyser devices send standard USB HID mouse
  * packets (Report ID 2). This code changes device mode, so it
  * sends raw sensor reports (Report ID 5).
  */
-static int atp_geyser3_init(struct usb_device *udev)
+static int atp_geyser_init(struct usb_device *udev)
 {
        char data[8];
        int size;
 
        size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-                       ATP_GEYSER3_MODE_READ_REQUEST_ID,
+                       ATP_GEYSER_MODE_READ_REQUEST_ID,
                        USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
-                       ATP_GEYSER3_MODE_REQUEST_VALUE,
-                       ATP_GEYSER3_MODE_REQUEST_INDEX, &data, 8, 5000);
+                       ATP_GEYSER_MODE_REQUEST_VALUE,
+                       ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
 
        if (size != 8) {
                err("Could not do mode read request from device"
-                   " (Geyser 3 mode)");
+                   " (Geyser Raw mode)");
                return -EIO;
        }
 
        /* Apply the mode switch */
-       data[0] = ATP_GEYSER3_MODE_VENDOR_VALUE;
+       data[0] = ATP_GEYSER_MODE_VENDOR_VALUE;
 
        size = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-                       ATP_GEYSER3_MODE_WRITE_REQUEST_ID,
+                       ATP_GEYSER_MODE_WRITE_REQUEST_ID,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
-                       ATP_GEYSER3_MODE_REQUEST_VALUE,
-                       ATP_GEYSER3_MODE_REQUEST_INDEX, &data, 8, 5000);
+                       ATP_GEYSER_MODE_REQUEST_VALUE,
+                       ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
 
        if (size != 8) {
                err("Could not do mode write request to device"
-                   " (Geyser 3 mode)");
+                   " (Geyser Raw mode)");
                return -EIO;
        }
        return 0;
 }
 
-/* Reinitialise the device if it's a geyser 3 */
+/*
+ * Reinitialise the device. This usually stops stream of empty packets
+ * coming from it.
+ */
 static void atp_reinit(struct work_struct *work)
 {
        struct atp *dev = container_of(work, struct atp, work);
        struct usb_device *udev = dev->udev;
+       int retval;
 
        dev->idlecount = 0;
-       atp_geyser3_init(udev);
+
+       atp_geyser_init(udev);
+
+       retval = usb_submit_urb(dev->urb, GFP_ATOMIC);
+       if (retval) {
+               err("%s - usb_submit_urb failed with result %d",
+                   __FUNCTION__, retval);
+       }
 }
 
 static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
@@ -337,7 +358,7 @@ static void atp_complete(struct urb* urb)
                break;
        case -EOVERFLOW:
                if(!dev->overflowwarn) {
-                       printk("appletouch: OVERFLOW with data "
+                       printk(KERN_WARNING "appletouch: OVERFLOW with data "
                                "length %d, actual length is %d\n",
                                dev->datalen, dev->urb->actual_length);
                        dev->overflowwarn = 1;
@@ -426,15 +447,17 @@ static void atp_complete(struct urb* urb)
                dev->x_old = dev->y_old = -1;
                memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old));
 
-               if (atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */
+               if (dev->size_detect_done ||
+                   atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */
                        goto exit;
 
                /* 17" Powerbooks have extra X sensors */
-               for (i = (atp_is_geyser_2(dev)?15:16); i < ATP_XSENSORS; i++) {
-                       if (!dev->xy_cur[i]) continue;
+               for (i = (atp_is_geyser_2(dev) ? 15 : 16); i < ATP_XSENSORS; i++) {
+                       if (!dev->xy_cur[i])
+                               continue;
 
-                       printk("appletouch: 17\" model detected.\n");
-                       if(atp_is_geyser_2(dev))
+                       printk(KERN_INFO "appletouch: 17\" model detected.\n");
+                       if (atp_is_geyser_2(dev))
                                input_set_abs_params(dev->input, ABS_X, 0,
                                                     (20 - 1) *
                                                     ATP_XFACT - 1,
@@ -444,10 +467,10 @@ static void atp_complete(struct urb* urb)
                                                     (ATP_XSENSORS - 1) *
                                                     ATP_XFACT - 1,
                                                     ATP_FUZZ, 0);
-
                        break;
                }
 
+               dev->size_detect_done = 1;
                goto exit;
        }
 
@@ -479,7 +502,7 @@ static void atp_complete(struct urb* urb)
                        dev->y_old = y;
 
                        if (debug > 1)
-                               printk("appletouch: X: %3d Y: %3d "
+                               printk(KERN_DEBUG "appletouch: X: %3d Y: %3d "
                                       "Xz: %3d Yz: %3d\n",
                                       x, y, x_z, y_z);
 
@@ -507,19 +530,25 @@ static void atp_complete(struct urb* urb)
        input_report_key(dev->input, BTN_LEFT, key);
        input_sync(dev->input);
 
-       /* Many Geysers will continue to send packets continually after
-          the first touch unless reinitialised. Do so if it's been
-          idle for a while in order to avoid waking the kernel up
-          several hundred times a second */
-
-       if (!x && !y && !key) {
-               dev->idlecount++;
-               if (dev->idlecount == 10) {
-                       dev->valid = 0;
-                       schedule_work(&dev->work);
-               }
-       } else
-               dev->idlecount = 0;
+       /*
+        * Many Geysers will continue to send packets continually after
+        * the first touch unless reinitialised. Do so if it's been
+        * idle for a while in order to avoid waking the kernel up
+        * several hundred times a second. Re-initialization does not
+        * work on Fountain touchpads.
+        */
+       if (!atp_is_fountain(dev)) {
+               if (!x && !y && !key) {
+                       dev->idlecount++;
+                       if (dev->idlecount == 10) {
+                               dev->valid = 0;
+                               schedule_work(&dev->work);
+                               /* Don't resubmit urb here, wait for reinit */
+                               return;
+                       }
+               } else
+                       dev->idlecount = 0;
+       }
 
 exit:
        retval = usb_submit_urb(dev->urb, GFP_ATOMIC);
@@ -593,12 +622,12 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
        else
                dev->datalen = 81;
 
-       if (atp_is_geyser_3(dev)) {
+       if (!atp_is_fountain(dev)) {
                /* switch to raw sensor mode */
-               if (atp_geyser3_init(udev))
+               if (atp_geyser_init(udev))
                        goto err_free_devs;
 
-               printk("appletouch Geyser 3 inited.\n");
+               printk(KERN_INFO "appletouch: Geyser mode initialized.\n");
        }
 
        dev->urb = usb_alloc_urb(0, GFP_KERNEL);
index 655a392174322605a37cf6d2fda29f3cf02c1d32..26ec09529b515fce59a3324f8310b2c64c6a9b62 100644 (file)
@@ -144,7 +144,7 @@ static int __init inport_init(void)
        b = inb(INPORT_SIGNATURE_PORT);
        c = inb(INPORT_SIGNATURE_PORT);
        if (a == b || a != c) {
-               printk(KERN_ERR "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE);
+               printk(KERN_INFO "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE);
                err = -ENODEV;
                goto err_release_region;
        }
index b23a4f3ea5cdcf48d5e09cf789ba610940a3f68f..37e7c75b43bd969a13f6c2bf4d47e2df12827fc6 100644 (file)
@@ -134,7 +134,7 @@ static int __init logibm_init(void)
        udelay(100);
 
        if (inb(LOGIBM_SIGNATURE_PORT) != LOGIBM_SIGNATURE_BYTE) {
-               printk(KERN_ERR "logibm.c: Didn't find Logitech busmouse at %#x\n", LOGIBM_BASE);
+               printk(KERN_INFO "logibm.c: Didn't find Logitech busmouse at %#x\n", LOGIBM_BASE);
                err = -ENODEV;
                goto err_release_region;
        }
index 6af199805ffc420ecfa3cce67e18ba054ed3e648..02b3ad8c082673efaf5e0ee39dd1365c08bae75f 100644 (file)
@@ -944,11 +944,7 @@ static int __init hp_sdc_init_hppa(struct parisc_device *d)
 
 #endif /* __hppa__ */
 
-#if !defined(__mc68000__) /* Link error on m68k! */
-static void __exit hp_sdc_exit(void)
-#else
 static void hp_sdc_exit(void)
-#endif
 {
        write_lock_irq(&hp_sdc.lock);
 
index 62268929856c9d26c8a9be4b134e4d7704796aac..b45f240a8c45029d0d45107f40d5761f97028e2f 100644 (file)
@@ -527,6 +527,9 @@ struct input_absinfo {
 #define KEY_SPELLCHECK         0x1b0   /* AL Spell Check */
 #define KEY_LOGOFF             0x1b1   /* AL Logoff */
 
+#define KEY_DOLLAR             0x1b2
+#define KEY_EURO               0x1b3
+
 #define KEY_DEL_EOL            0x1c0
 #define KEY_DEL_EOS            0x1c1
 #define KEY_INS_LINE           0x1c2