diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-24 16:08:41 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-24 16:08:41 -0700 |
commit | 915521c1df29905839fc5e372fc898bb4104f907 (patch) | |
tree | 00456561327887dc80496bc0774c7081c332d053 /usb | |
parent | 4a076f7ffaae89e3f1c2ffecd147b79ae1e0bd9d (diff) | |
download | patches-915521c1df29905839fc5e372fc898bb4104f907.tar.gz |
more patches added (and 1 removed)
Diffstat (limited to 'usb')
-rw-r--r-- | usb/usb-console-fix-cr-lf-issues.patch | 70 | ||||
-rw-r--r-- | usb/usb-console-fix-oops.patch | 57 | ||||
-rw-r--r-- | usb/usb-console-prevent-enodev-on-node.patch | 40 | ||||
-rw-r--r-- | usb/usb-ftdi_sio-add-support-for-ask-rdr-400-series-card-reader.patch | 44 | ||||
-rw-r--r-- | usb/usb-ftdi_sio-adds-support-for-iplus-device.patch | 41 | ||||
-rw-r--r-- | usb/usb-ftdi_sio-vendor-code-for-rr-cirkits-locobuffer-usb.patch | 43 | ||||
-rw-r--r-- | usb/usb-macbook-pro-touchpad-support.patch | 217 |
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. |