aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-04-24 16:08:41 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-04-24 16:08:41 -0700
commit915521c1df29905839fc5e372fc898bb4104f907 (patch)
tree00456561327887dc80496bc0774c7081c332d053 /usb
parent4a076f7ffaae89e3f1c2ffecd147b79ae1e0bd9d (diff)
downloadpatches-915521c1df29905839fc5e372fc898bb4104f907.tar.gz
more patches added (and 1 removed)
Diffstat (limited to 'usb')
-rw-r--r--usb/usb-console-fix-cr-lf-issues.patch70
-rw-r--r--usb/usb-console-fix-oops.patch57
-rw-r--r--usb/usb-console-prevent-enodev-on-node.patch40
-rw-r--r--usb/usb-ftdi_sio-add-support-for-ask-rdr-400-series-card-reader.patch44
-rw-r--r--usb/usb-ftdi_sio-adds-support-for-iplus-device.patch41
-rw-r--r--usb/usb-ftdi_sio-vendor-code-for-rr-cirkits-locobuffer-usb.patch43
-rw-r--r--usb/usb-macbook-pro-touchpad-support.patch217
7 files changed, 512 insertions, 0 deletions
diff --git a/usb/usb-console-fix-cr-lf-issues.patch b/usb/usb-console-fix-cr-lf-issues.patch
new file mode 100644
index 0000000000000..81de7d206b347
--- /dev/null
+++ b/usb/usb-console-fix-cr-lf-issues.patch
@@ -0,0 +1,70 @@
+From g.liakhovetski@gmx.de Thu Apr 13 13:26:36 2006
+Date: Thu, 13 Apr 2006 22:26:35 +0200 (CEST)
+From: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+To: Greg KH <gregkh@suse.de>
+Cc: Paul Fulghum <paulkf@microgate.com>
+Subject: USB: console: fix cr/lf issues
+Message-ID: <Pine.LNX.4.60.0604132225390.4711@poirot.grange>
+
+From: Paul Fulghum <paulkf@microgate.com>
+
+Append Carriage-Returns after Line-Feeds, analogous to the serial driver.
+
+From: Paul Fulghum <paulkf@microgate.com>
+Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/console.c | 39 ++++++++++++++++++++++++++++++---------
+ 1 file changed, 30 insertions(+), 9 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/serial/console.c
++++ gregkh-2.6/drivers/usb/serial/console.c
+@@ -213,17 +213,38 @@ static void usb_console_write(struct con
+
+ if (!port->open_count) {
+ dbg ("%s - port not opened", __FUNCTION__);
+- goto exit;
++ return;
+ }
+
+- /* pass on to the driver specific version of this function if it is available */
+- if (serial->type->write)
+- retval = serial->type->write(port, buf, count);
+- else
+- retval = usb_serial_generic_write(port, buf, count);
+-
+-exit:
+- dbg("%s - return value (if we had one): %d", __FUNCTION__, retval);
++ while (count) {
++ unsigned int i;
++ unsigned int lf;
++ /* search for LF so we can insert CR if necessary */
++ for (i=0, lf=0 ; i < count ; i++) {
++ if (*(buf + i) == 10) {
++ lf = 1;
++ i++;
++ break;
++ }
++ }
++ /* pass on to the driver specific version of this function if it is available */
++ if (serial->type->write)
++ retval = serial->type->write(port, buf, i);
++ else
++ retval = usb_serial_generic_write(port, buf, i);
++ dbg("%s - return value : %d", __FUNCTION__, retval);
++ if (lf) {
++ /* append CR after LF */
++ unsigned char cr = 13;
++ if (serial->type->write)
++ retval = serial->type->write(port, &cr, 1);
++ else
++ retval = usb_serial_generic_write(port, &cr, 1);
++ dbg("%s - return value : %d", __FUNCTION__, retval);
++ }
++ buf += i;
++ count -= i;
++ }
+ }
+
+ static struct console usbcons = {
diff --git a/usb/usb-console-fix-oops.patch b/usb/usb-console-fix-oops.patch
new file mode 100644
index 0000000000000..73679e08eaf2b
--- /dev/null
+++ b/usb/usb-console-fix-oops.patch
@@ -0,0 +1,57 @@
+From g.liakhovetski@gmx.de Thu Apr 13 13:27:14 2006
+Date: Thu, 13 Apr 2006 22:27:12 +0200 (CEST)
+From: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+To: Greg KH <gregkh@suse.de>
+Cc: Paul Fulghum <paulkf@microgate.com>
+Subject: USB: console: fix oops
+Message-ID: <Pine.LNX.4.60.0604132226400.4711@poirot.grange>
+
+Prevent NULL dereference when used as a USB-serial console.
+
+Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c
+@@ -1259,7 +1259,6 @@ static void ftdi_shutdown (struct usb_se
+
+ static int ftdi_open (struct usb_serial_port *port, struct file *filp)
+ { /* ftdi_open */
+- struct termios tmp_termios;
+ struct usb_device *dev = port->serial->dev;
+ struct ftdi_private *priv = usb_get_serial_port_data(port);
+ unsigned long flags;
+@@ -1269,8 +1268,8 @@ static int ftdi_open (struct usb_serial
+
+ dbg("%s", __FUNCTION__);
+
+-
+- port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
++ if (port->tty)
++ port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+
+ /* No error checking for this (will get errors later anyway) */
+ /* See ftdi_sio.h for description of what is reset */
+@@ -1284,7 +1283,8 @@ static int ftdi_open (struct usb_serial
+ This is same behaviour as serial.c/rs_open() - Kuba */
+
+ /* ftdi_set_termios will send usb control messages */
+- ftdi_set_termios(port, &tmp_termios);
++ if (port->tty)
++ ftdi_set_termios(port, NULL);
+
+ /* FIXME: Flow control might be enabled, so it should be checked -
+ we have no control of defaults! */
+@@ -1865,7 +1865,7 @@ static void ftdi_set_termios (struct usb
+ err("%s urb failed to set baudrate", __FUNCTION__);
+ }
+ /* Ensure RTS and DTR are raised when baudrate changed from 0 */
+- if ((old_termios->c_cflag & CBAUD) == B0) {
++ if (!old_termios || (old_termios->c_cflag & CBAUD) == B0) {
+ set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
+ }
+ }
diff --git a/usb/usb-console-prevent-enodev-on-node.patch b/usb/usb-console-prevent-enodev-on-node.patch
new file mode 100644
index 0000000000000..e48b8b2ff832f
--- /dev/null
+++ b/usb/usb-console-prevent-enodev-on-node.patch
@@ -0,0 +1,40 @@
+From g.liakhovetski@gmx.de Thu Apr 13 13:28:18 2006
+Date: Thu, 13 Apr 2006 22:28:17 +0200 (CEST)
+From: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+To: Greg KH <gregkh@suse.de>
+Cc: Paul Fulghum <paulkf@microgate.com>
+Subject: USB: console: prevent ENODEV on node
+Message-ID: <Pine.LNX.4.60.0604132227160.4711@poirot.grange>
+
+From: Paul Fulghum <paulkf@microgate.com>
+
+Prevent ENODEV on a /dev/ttyUSBx, used as a USB-serial console.
+
+From: Paul Fulghum <paulkf@microgate.com>
+Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/usb-serial.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/serial/usb-serial.c
++++ gregkh-2.6/drivers/usb/serial/usb-serial.c
+@@ -197,12 +197,12 @@ static int serial_open (struct tty_struc
+
+ ++port->open_count;
+
+- if (port->open_count == 1) {
++ /* set up our port structure making the tty driver
++ * remember our port object, and us it */
++ tty->driver_data = port;
++ port->tty = tty;
+
+- /* set up our port structure making the tty driver
+- * remember our port object, and us it */
+- tty->driver_data = port;
+- port->tty = tty;
++ if (port->open_count == 1) {
+
+ /* lock this module before we call it
+ * this may fail, which means we must bail out,
diff --git a/usb/usb-ftdi_sio-add-support-for-ask-rdr-400-series-card-reader.patch b/usb/usb-ftdi_sio-add-support-for-ask-rdr-400-series-card-reader.patch
new file mode 100644
index 0000000000000..36737e93438ab
--- /dev/null
+++ b/usb/usb-ftdi_sio-add-support-for-ask-rdr-400-series-card-reader.patch
@@ -0,0 +1,44 @@
+From ian.abbott@mev.co.uk Wed Apr 12 07:21:09 2006
+Message-ID: <443D0CB3.5090506@mev.co.uk>
+Date: Wed, 12 Apr 2006 15:20:35 +0100
+From: Ian Abbott <abbotti@mev.co.uk>
+Cc: Greg KH <greg@kroah.com>, <adriano.couto@link.pt>
+Subject: USB: ftdi_sio: add support for ASK RDR 400 series card reader
+
+This patch adds support for an ASK RDR 400 series contactless card
+reader <http://www.ask.fr/uk/products_and_services/terminals.html> to
+the ftdi_sio driver's device ID table. The product ID was supplied by
+Adriano Couto on the ftdi-usb-sio-devel list.
+
+Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 1 +
+ drivers/usb/serial/ftdi_sio.h | 5 +++++
+ 2 files changed, 6 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c
+@@ -495,6 +495,7 @@ static struct usb_device_id id_table_com
+ { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
++ { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
+ { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) },
+ { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
+ { }, /* Optional parameter entry */
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.h
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.h
+@@ -156,6 +156,11 @@
+ #define ICOM_ID1_PID 0x0004
+
+ /*
++ * ASK.fr devices
++ */
++#define FTDI_ASK_RDR400_PID 0xC991 /* ASK RDR 400 series card reader */
++
++/*
+ * DSS-20 Sync Station for Sony Ericsson P800
+ */
+
diff --git a/usb/usb-ftdi_sio-adds-support-for-iplus-device.patch b/usb/usb-ftdi_sio-adds-support-for-iplus-device.patch
new file mode 100644
index 0000000000000..8d76005f4097e
--- /dev/null
+++ b/usb/usb-ftdi_sio-adds-support-for-iplus-device.patch
@@ -0,0 +1,41 @@
+From lcapitulino@mandriva.com.br Tue Apr 11 11:52:58 2006
+Date: Tue, 11 Apr 2006 15:52:41 -0300
+From: "Luiz Fernando N. Capitulino" <lcapitulino@mandriva.com.br>
+To: Greg KH <gregkh@suse.de>
+Subject: USB: ftdi_sio: Adds support for iPlus device.
+Message-ID: <20060411155241.72242b56@doriath.conectiva>
+
+
+Adds support in ftdi_sio usbserial driver for USB modems sold by
+Plus GSM Company in Poland.
+
+Signed-off-by: Luiz Fernando Capitulino <lcapitulino@mandriva.com.br>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 1 +
+ drivers/usb/serial/ftdi_sio.h | 3 +++
+ 2 files changed, 4 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c
+@@ -308,6 +308,7 @@ static struct ftdi_sio_quirk ftdi_HE_TIR
+
+ static struct usb_device_id id_table_combined [] = {
+ { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
++ { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.h
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.h
+@@ -39,6 +39,9 @@
+ /* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */
+ #define FTDI_TTUSB_PID 0xFF20 /* Product Id */
+
++/* iPlus device */
++#define FTDI_IPLUS_PID 0xD070 /* Product Id */
++
+ /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */
+ /* they use the ftdi chipset for the USB interface and the vendor id is the same */
+ #define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */
diff --git a/usb/usb-ftdi_sio-vendor-code-for-rr-cirkits-locobuffer-usb.patch b/usb/usb-ftdi_sio-vendor-code-for-rr-cirkits-locobuffer-usb.patch
new file mode 100644
index 0000000000000..ca71da2d50174
--- /dev/null
+++ b/usb/usb-ftdi_sio-vendor-code-for-rr-cirkits-locobuffer-usb.patch
@@ -0,0 +1,43 @@
+From ndb@sns-usa.com Sun Apr 9 21:05:22 2006
+Date: Mon, 10 Apr 2006 00:05:09 -0400 (EDT)
+From: Nathan Bronson <ndb@sns-usa.com>
+To: gregkh@suse.de
+Cc: dick.bronson@rr-cirkits.com
+Subject: USB: ftdi_sio vendor code for RR-CirKits LocoBuffer USB
+Message-ID: <Pine.LNX.4.64.0604092332370.29414@ariel.sns-i>
+
+This patch adds recognition of the RR-CirKits LocoBuffer USB
+to the existing FTDI driver. http://www.rr-cirkits.com
+
+Signed-off-by: Nathan Bronson <ngb@sns-usa.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 1 +
+ drivers/usb/serial/ftdi_sio.h | 5 +++++
+ 2 files changed, 6 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c
+@@ -493,6 +493,7 @@ static struct usb_device_id id_table_com
+ { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
++ { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
+ { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) },
+ { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
+ { }, /* Optional parameter entry */
+--- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.h
++++ gregkh-2.6/drivers/usb/serial/ftdi_sio.h
+@@ -400,6 +400,11 @@
+ #define FTDI_WESTREX_MODEL_8900F_PID 0xDC01 /* Model 8900F */
+
+ /*
++ * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com)
++ */
++#define FTDI_RRCIRKITS_LOCOBUFFER_PID 0xc7d0 /* LocoBuffer USB */
++
++/*
+ * Eclo (http://www.eclo.pt/) product IDs.
+ * PID 0xEA90 submitted by Martin Grill.
+ */
diff --git a/usb/usb-macbook-pro-touchpad-support.patch b/usb/usb-macbook-pro-touchpad-support.patch
new file mode 100644
index 0000000000000..b050710c0dc26
--- /dev/null
+++ b/usb/usb-macbook-pro-touchpad-support.patch
@@ -0,0 +1,217 @@
+From nicolas@boichat.ch Wed Apr 19 14:38:19 2006
+Subject: USB: MacBook Pro touchpad support
+From: Nicolas Boichat <nicolas@boichat.ch>
+To: Greg KH <greg@kroah.com>
+Cc: Stelian Pop <stelian@popies.net>, <yoshfuji@linux-ipv6.org>, <johannes@sipsolutions.net>, <dtor_core@ameritech.net>, <frank@scirocco-5v-turbo.de>, <petero2@telia.com>, <linux-kernel@hansmi.ch>
+Date: Wed, 19 Apr 2006 23:36:40 +0200
+Message-Id: <1145482600.15052.4.camel@localhost>
+
+From: Nicolas Boichat <nicolas@boichat.ch>
+
+Add support for MacBook touchpad in appletouch driver.
+Thanks to Alex Harper for the informations.
+
+Use u16 instead of int16_t in atp_is_geyser* functions.
+
+Acked-by: Johannes Berg <johannes@sipsolutions.net>
+Acked-by: Stelian Pop <stelian@popies.net>
+Signed-off-by: Nicolas Boichat <nicolas@boichat.ch>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/input/appletouch.c | 113 ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 107 insertions(+), 6 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/input/appletouch.c
++++ gregkh-2.6/drivers/usb/input/appletouch.c
+@@ -1,5 +1,5 @@
+ /*
+- * Apple USB Touchpad (for post-February 2005 PowerBooks) driver
++ * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver
+ *
+ * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
+ * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net)
+@@ -7,6 +7,7 @@
+ * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de)
+ * Copyright (C) 2005 Peter Osterlund (petero2@telia.com)
+ * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch)
++ * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch)
+ *
+ * Thanks to Alex Harper <basilisk@foobox.net> for his inputs.
+ *
+@@ -44,6 +45,11 @@
+ #define GEYSER_ISO_PRODUCT_ID 0x0215
+ #define GEYSER_JIS_PRODUCT_ID 0x0216
+
++/* MacBook devices */
++#define GEYSER3_ANSI_PRODUCT_ID 0x0217
++#define GEYSER3_ISO_PRODUCT_ID 0x0218
++#define GEYSER3_JIS_PRODUCT_ID 0x0219
++
+ #define ATP_DEVICE(prod) \
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
+ USB_DEVICE_ID_MATCH_INT_CLASS | \
+@@ -65,6 +71,10 @@ static struct usb_device_id atp_table []
+ { ATP_DEVICE(GEYSER_ISO_PRODUCT_ID) },
+ { ATP_DEVICE(GEYSER_JIS_PRODUCT_ID) },
+
++ { ATP_DEVICE(GEYSER3_ANSI_PRODUCT_ID) },
++ { ATP_DEVICE(GEYSER3_ISO_PRODUCT_ID) },
++ { ATP_DEVICE(GEYSER3_JIS_PRODUCT_ID) },
++
+ /* Terminating entry */
+ { }
+ };
+@@ -101,6 +111,13 @@ MODULE_DEVICE_TABLE (usb, atp_table);
+ */
+ #define ATP_THRESHOLD 5
+
++/* MacBook Pro (Geyser 3) 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
++
+ /* Structure to hold all of our device specific stuff */
+ struct atp {
+ char phys[64];
+@@ -147,13 +164,22 @@ MODULE_PARM_DESC(debug, "Activate debugg
+ /* Checks if the device a Geyser 2 (ANSI, ISO, JIS) */
+ static inline int atp_is_geyser_2(struct atp *dev)
+ {
+- int16_t productId = le16_to_cpu(dev->udev->descriptor.idProduct);
++ u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct);
+
+ return (productId == GEYSER_ANSI_PRODUCT_ID) ||
+ (productId == GEYSER_ISO_PRODUCT_ID) ||
+ (productId == GEYSER_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);
++}
++
+ static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact,
+ int *z, int *fingers)
+ {
+@@ -219,12 +245,33 @@ static void atp_complete(struct urb* urb
+
+ /* drop incomplete datasets */
+ if (dev->urb->actual_length != dev->datalen) {
+- dprintk("appletouch: incomplete data package.\n");
++ dprintk("appletouch: incomplete data package"
++ " (first byte: %d, length: %d).\n",
++ dev->data[0], dev->urb->actual_length);
+ goto exit;
+ }
+
+ /* reorder the sensors values */
+- if (atp_is_geyser_2(dev)) {
++ if (atp_is_geyser_3(dev)) {
++ memset(dev->xy_cur, 0, sizeof(dev->xy_cur));
++
++ /*
++ * The values are laid out like this:
++ * -, Y1, Y2, -, Y3, Y4, -, ..., -, X1, X2, -, X3, X4, ...
++ * '-' is an unused value.
++ */
++
++ /* read X values */
++ for (i = 0, j = 19; i < 20; i += 2, j += 3) {
++ dev->xy_cur[i] = dev->data[j + 1];
++ dev->xy_cur[i + 1] = dev->data[j + 2];
++ }
++ /* read Y values */
++ for (i = 0, j = 1; i < 9; i += 2, j += 3) {
++ 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)) {
+ memset(dev->xy_cur, 0, sizeof(dev->xy_cur));
+
+ /*
+@@ -267,6 +314,9 @@ 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) */
++ 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;
+@@ -414,7 +464,50 @@ static int atp_probe(struct usb_interfac
+ dev->udev = udev;
+ dev->input = input_dev;
+ dev->overflowwarn = 0;
+- dev->datalen = (atp_is_geyser_2(dev)?64:81);
++ if (atp_is_geyser_3(dev))
++ dev->datalen = 64;
++ else if (atp_is_geyser_2(dev))
++ dev->datalen = 64;
++ else
++ dev->datalen = 81;
++
++ if (atp_is_geyser_3(dev)) {
++ /*
++ * By default Geyser 3 device sends standard USB HID mouse
++ * packets (Report ID 2). This code changes device mode, so it
++ * sends raw sensor reports (Report ID 5).
++ */
++ char data[8];
++ int size;
++
++ size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
++ ATP_GEYSER3_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);
++
++ if (size != 8) {
++ err("Could not do mode read request from device"
++ " (Geyser 3 mode)");
++ goto err_free_devs;
++ }
++
++ /* Apply the mode switch */
++ data[0] = ATP_GEYSER3_MODE_VENDOR_VALUE;
++
++ size = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
++ ATP_GEYSER3_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);
++
++ if (size != 8) {
++ err("Could not do mode write request to device"
++ " (Geyser 3 mode)");
++ goto err_free_devs;
++ }
++ printk("appletouch Geyser 3 inited.\n");
++ }
+
+ dev->urb = usb_alloc_urb(0, GFP_KERNEL);
+ if (!dev->urb) {
+@@ -447,7 +540,15 @@ static int atp_probe(struct usb_interfac
+
+ set_bit(EV_ABS, input_dev->evbit);
+
+- if (atp_is_geyser_2(dev)) {
++ if (atp_is_geyser_3(dev)) {
++ /*
++ * MacBook have 20 X sensors, 10 Y sensors
++ */
++ input_set_abs_params(input_dev, ABS_X, 0,
++ ((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)) {
+ /*
+ * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected
+ * later.