linux/drivers/input/joystick/xpad.c
<<
>>
Prefs
   1/*
   2 * X-Box gamepad driver
   3 *
   4 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de>
   5 *               2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>,
   6 *                    Steven Toth <steve@toth.demon.co.uk>,
   7 *                    Franz Lehner <franz@caos.at>,
   8 *                    Ivan Hawkes <blackhawk@ivanhawkes.com>
   9 *               2005 Dominic Cerquetti <binary1230@yahoo.com>
  10 *               2006 Adam Buchbinder <adam.buchbinder@gmail.com>
  11 *               2007 Jan Kratochvil <honza@jikos.cz>
  12 *
  13 * This program is free software; you can redistribute it and/or
  14 * modify it under the terms of the GNU General Public License as
  15 * published by the Free Software Foundation; either version 2 of
  16 * the License, or (at your option) any later version.
  17 *
  18 * This program is distributed in the hope that it will be useful,
  19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 * GNU General Public License for more details.
  22 *
  23 * You should have received a copy of the GNU General Public License
  24 * along with this program; if not, write to the Free Software
  25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  26 *
  27 *
  28 * This driver is based on:
  29 *  - information from     http://euc.jp/periphs/xbox-controller.ja.html
  30 *  - the iForce driver    drivers/char/joystick/iforce.c
  31 *  - the skeleton-driver  drivers/usb/usb-skeleton.c
  32 *  - Xbox 360 information http://www.free60.org/wiki/Gamepad
  33 *
  34 * Thanks to:
  35 *  - ITO Takayuki for providing essential xpad information on his website
  36 *  - Vojtech Pavlik     - iforce driver / input subsystem
  37 *  - Greg Kroah-Hartman - usb-skeleton driver
  38 *  - XBOX Linux project - extra USB id's
  39 *
  40 * TODO:
  41 *  - fine tune axes (especially trigger axes)
  42 *  - fix "analog" buttons (reported as digital now)
  43 *  - get rumble working
  44 *  - need USB IDs for other dance pads
  45 *
  46 * History:
  47 *
  48 * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller"
  49 *
  50 * 2002-07-02 - 0.0.2 : basic working version
  51 *  - all axes and 9 of the 10 buttons work (german InterAct device)
  52 *  - the black button does not work
  53 *
  54 * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik
  55 *  - indentation fixes
  56 *  - usb + input init sequence fixes
  57 *
  58 * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3
  59 *  - verified the lack of HID and report descriptors
  60 *  - verified that ALL buttons WORK
  61 *  - fixed d-pad to axes mapping
  62 *
  63 * 2002-07-17 - 0.0.5 : simplified d-pad handling
  64 *
  65 * 2004-10-02 - 0.0.6 : DDR pad support
  66 *  - borrowed from the XBOX linux kernel
  67 *  - USB id's for commonly used dance pads are present
  68 *  - dance pads will map D-PAD to buttons, not axes
  69 *  - pass the module paramater 'dpad_to_buttons' to force
  70 *    the D-PAD to map to buttons if your pad is not detected
  71 *
  72 * Later changes can be tracked in SCM.
  73 */
  74
  75#include <linux/kernel.h>
  76#include <linux/init.h>
  77#include <linux/slab.h>
  78#include <linux/stat.h>
  79#include <linux/module.h>
  80#include <linux/usb/input.h>
  81
  82#define DRIVER_AUTHOR "Marko Friedemann <mfr@bmx-chemnitz.de>"
  83#define DRIVER_DESC "X-Box pad driver"
  84
  85#define XPAD_PKT_LEN 32
  86
  87/* xbox d-pads should map to buttons, as is required for DDR pads
  88   but we map them to axes when possible to simplify things */
  89#define MAP_DPAD_TO_BUTTONS    0
  90#define MAP_DPAD_TO_AXES       1
  91#define MAP_DPAD_UNKNOWN       2
  92
  93#define XTYPE_XBOX        0
  94#define XTYPE_XBOX360     1
  95#define XTYPE_XBOX360W    2
  96#define XTYPE_UNKNOWN     3
  97
  98static int dpad_to_buttons;
  99module_param(dpad_to_buttons, bool, S_IRUGO);
 100MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
 101
 102static const struct xpad_device {
 103        u16 idVendor;
 104        u16 idProduct;
 105        char *name;
 106        u8 dpad_mapping;
 107        u8 xtype;
 108} xpad_device[] = {
 109        { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 110        { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 111        { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 112        { 0x045e, 0x0287, "Microsoft Xbox Controller S", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 113        { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
 114        { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 115        { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 116        { 0x046d, 0xc242, "Logitech Chillstream Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
 117        { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 118        { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 119        { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 120        { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 121        { 0x0738, 0x4516, "Mad Catz Control Pad", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 122        { 0x0738, 0x4522, "Mad Catz LumiCON", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 123        { 0x0738, 0x4526, "Mad Catz Control Pad Pro", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 124        { 0x0738, 0x4536, "Mad Catz MicroCON", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 125        { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 126        { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 127        { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
 128        { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 129        { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 130        { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 131        { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 132        { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 133        { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 134        { 0x0e4c, 0x2390, "Radica Games Jtech Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 135        { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 136        { 0x0e6f, 0x0005, "Eclipse wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 137        { 0x0e6f, 0x0006, "Edge wireless Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 138        { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
 139        { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 140        { 0x0f30, 0x0202, "Joytech Advanced Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 141        { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 142        { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 143        { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 144        { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
 145        { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 146        { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
 147        { 0x045e, 0x028e, "Microsoft X-Box 360 pad", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
 148        { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 149        { 0xffff, 0xffff, "Chinese-made Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
 150        { 0x0000, 0x0000, "Generic X-Box pad", MAP_DPAD_UNKNOWN, XTYPE_UNKNOWN }
 151};
 152
 153/* buttons shared with xbox and xbox360 */
 154static const signed short xpad_common_btn[] = {
 155        BTN_A, BTN_B, BTN_X, BTN_Y,                     /* "analog" buttons */
 156        BTN_START, BTN_BACK, BTN_THUMBL, BTN_THUMBR,    /* start/back/sticks */
 157        -1                                              /* terminating entry */
 158};
 159
 160/* original xbox controllers only */
 161static const signed short xpad_btn[] = {
 162        BTN_C, BTN_Z,           /* "analog" buttons */
 163        -1                      /* terminating entry */
 164};
 165
 166/* only used if MAP_DPAD_TO_BUTTONS */
 167static const signed short xpad_btn_pad[] = {
 168        BTN_LEFT, BTN_RIGHT,            /* d-pad left, right */
 169        BTN_0, BTN_1,                   /* d-pad up, down (XXX names??) */
 170        -1                              /* terminating entry */
 171};
 172
 173static const signed short xpad360_btn[] = {  /* buttons for x360 controller */
 174        BTN_TL, BTN_TR,         /* Button LB/RB */
 175        BTN_MODE,               /* The big X button */
 176        -1
 177};
 178
 179static const signed short xpad_abs[] = {
 180        ABS_X, ABS_Y,           /* left stick */
 181        ABS_RX, ABS_RY,         /* right stick */
 182        ABS_Z, ABS_RZ,          /* triggers left/right */
 183        -1                      /* terminating entry */
 184};
 185
 186/* only used if MAP_DPAD_TO_AXES */
 187static const signed short xpad_abs_pad[] = {
 188        ABS_HAT0X, ABS_HAT0Y,   /* d-pad axes */
 189        -1                      /* terminating entry */
 190};
 191
 192/* Xbox 360 has a vendor-specific class, so we cannot match it with only
 193 * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we
 194 * match against vendor id as well. Wired Xbox 360 devices have protocol 1,
 195 * wireless controllers have protocol 129. */
 196#define XPAD_XBOX360_VENDOR_PROTOCOL(vend,pr) \
 197        .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
 198        .idVendor = (vend), \
 199        .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
 200        .bInterfaceSubClass = 93, \
 201        .bInterfaceProtocol = (pr)
 202#define XPAD_XBOX360_VENDOR(vend) \
 203        { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
 204        { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
 205
 206static struct usb_device_id xpad_table [] = {
 207        { USB_INTERFACE_INFO('X', 'B', 0) },    /* X-Box USB-IF not approved class */
 208        XPAD_XBOX360_VENDOR(0x045e),            /* Microsoft X-Box 360 controllers */
 209        XPAD_XBOX360_VENDOR(0x046d),            /* Logitech X-Box 360 style controllers */
 210        XPAD_XBOX360_VENDOR(0x0738),            /* Mad Catz X-Box 360 controllers */
 211        XPAD_XBOX360_VENDOR(0x0e6f),            /* 0x0e6f X-Box 360 controllers */
 212        XPAD_XBOX360_VENDOR(0x1430),            /* RedOctane X-Box 360 controllers */
 213        XPAD_XBOX360_VENDOR(0x146b),            /* BigBen Interactive Controllers */
 214        XPAD_XBOX360_VENDOR(0x1bad),            /* Rock Band Drums */
 215        { }
 216};
 217
 218MODULE_DEVICE_TABLE (usb, xpad_table);
 219
 220struct usb_xpad {
 221        struct input_dev *dev;          /* input device interface */
 222        struct usb_device *udev;        /* usb device */
 223
 224        int pad_present;
 225
 226        struct urb *irq_in;             /* urb for interrupt in report */
 227        unsigned char *idata;           /* input data */
 228        dma_addr_t idata_dma;
 229
 230        struct urb *bulk_out;
 231        unsigned char *bdata;
 232
 233#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS)
 234        struct urb *irq_out;            /* urb for interrupt out report */
 235        unsigned char *odata;           /* output data */
 236        dma_addr_t odata_dma;
 237        struct mutex odata_mutex;
 238#endif
 239
 240#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
 241        struct xpad_led *led;
 242#endif
 243
 244        char phys[64];                  /* physical device path */
 245
 246        int dpad_mapping;               /* map d-pad to buttons or to axes */
 247        int xtype;                      /* type of xbox device */
 248};
 249
 250/*
 251 *      xpad_process_packet
 252 *
 253 *      Completes a request by converting the data into events for the
 254 *      input subsystem.
 255 *
 256 *      The used report descriptor was taken from ITO Takayukis website:
 257 *       http://euc.jp/periphs/xbox-controller.ja.html
 258 */
 259
 260static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 261{
 262        struct input_dev *dev = xpad->dev;
 263
 264        /* left stick */
 265        input_report_abs(dev, ABS_X,
 266                         (__s16) le16_to_cpup((__le16 *)(data + 12)));
 267        input_report_abs(dev, ABS_Y,
 268                         ~(__s16) le16_to_cpup((__le16 *)(data + 14)));
 269
 270        /* right stick */
 271        input_report_abs(dev, ABS_RX,
 272                         (__s16) le16_to_cpup((__le16 *)(data + 16)));
 273        input_report_abs(dev, ABS_RY,
 274                         ~(__s16) le16_to_cpup((__le16 *)(data + 18)));
 275
 276        /* triggers left/right */
 277        input_report_abs(dev, ABS_Z, data[10]);
 278        input_report_abs(dev, ABS_RZ, data[11]);
 279
 280        /* digital pad */
 281        if (xpad->dpad_mapping == MAP_DPAD_TO_AXES) {
 282                input_report_abs(dev, ABS_HAT0X,
 283                                 !!(data[2] & 0x08) - !!(data[2] & 0x04));
 284                input_report_abs(dev, ABS_HAT0Y,
 285                                 !!(data[2] & 0x02) - !!(data[2] & 0x01));
 286        } else /* xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS */ {
 287                input_report_key(dev, BTN_LEFT,  data[2] & 0x04);
 288                input_report_key(dev, BTN_RIGHT, data[2] & 0x08);
 289                input_report_key(dev, BTN_0,     data[2] & 0x01); /* up */
 290                input_report_key(dev, BTN_1,     data[2] & 0x02); /* down */
 291        }
 292
 293        /* start/back buttons and stick press left/right */
 294        input_report_key(dev, BTN_START,  data[2] & 0x10);
 295        input_report_key(dev, BTN_BACK,   data[2] & 0x20);
 296        input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
 297        input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
 298
 299        /* "analog" buttons A, B, X, Y */
 300        input_report_key(dev, BTN_A, data[4]);
 301        input_report_key(dev, BTN_B, data[5]);
 302        input_report_key(dev, BTN_X, data[6]);
 303        input_report_key(dev, BTN_Y, data[7]);
 304
 305        /* "analog" buttons black, white */
 306        input_report_key(dev, BTN_C, data[8]);
 307        input_report_key(dev, BTN_Z, data[9]);
 308
 309        input_sync(dev);
 310}
 311
 312/*
 313 *      xpad360_process_packet
 314 *
 315 *      Completes a request by converting the data into events for the
 316 *      input subsystem. It is version for xbox 360 controller
 317 *
 318 *      The used report descriptor was taken from:
 319 *              http://www.free60.org/wiki/Gamepad
 320 */
 321
 322static void xpad360_process_packet(struct usb_xpad *xpad,
 323                                   u16 cmd, unsigned char *data)
 324{
 325        struct input_dev *dev = xpad->dev;
 326
 327        /* digital pad */
 328        if (xpad->dpad_mapping == MAP_DPAD_TO_AXES) {
 329                input_report_abs(dev, ABS_HAT0X,
 330                                 !!(data[2] & 0x08) - !!(data[2] & 0x04));
 331                input_report_abs(dev, ABS_HAT0Y,
 332                                 !!(data[2] & 0x02) - !!(data[2] & 0x01));
 333        } else if (xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS) {
 334                /* dpad as buttons (right, left, down, up) */
 335                input_report_key(dev, BTN_LEFT, data[2] & 0x04);
 336                input_report_key(dev, BTN_RIGHT, data[2] & 0x08);
 337                input_report_key(dev, BTN_0, data[2] & 0x01);   /* up */
 338                input_report_key(dev, BTN_1, data[2] & 0x02);   /* down */
 339        }
 340
 341        /* start/back buttons */
 342        input_report_key(dev, BTN_START,  data[2] & 0x10);
 343        input_report_key(dev, BTN_BACK,   data[2] & 0x20);
 344
 345        /* stick press left/right */
 346        input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
 347        input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
 348
 349        /* buttons A,B,X,Y,TL,TR and MODE */
 350        input_report_key(dev, BTN_A,    data[3] & 0x10);
 351        input_report_key(dev, BTN_B,    data[3] & 0x20);
 352        input_report_key(dev, BTN_X,    data[3] & 0x40);
 353        input_report_key(dev, BTN_Y,    data[3] & 0x80);
 354        input_report_key(dev, BTN_TL,   data[3] & 0x01);
 355        input_report_key(dev, BTN_TR,   data[3] & 0x02);
 356        input_report_key(dev, BTN_MODE, data[3] & 0x04);
 357
 358        /* left stick */
 359        input_report_abs(dev, ABS_X,
 360                         (__s16) le16_to_cpup((__le16 *)(data + 6)));
 361        input_report_abs(dev, ABS_Y,
 362                         ~(__s16) le16_to_cpup((__le16 *)(data + 8)));
 363
 364        /* right stick */
 365        input_report_abs(dev, ABS_RX,
 366                         (__s16) le16_to_cpup((__le16 *)(data + 10)));
 367        input_report_abs(dev, ABS_RY,
 368                         ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
 369
 370        /* triggers left/right */
 371        input_report_abs(dev, ABS_Z, data[4]);
 372        input_report_abs(dev, ABS_RZ, data[5]);
 373
 374        input_sync(dev);
 375}
 376
 377/*
 378 * xpad360w_process_packet
 379 *
 380 * Completes a request by converting the data into events for the
 381 * input subsystem. It is version for xbox 360 wireless controller.
 382 *
 383 * Byte.Bit
 384 * 00.1 - Status change: The controller or headset has connected/disconnected
 385 *                       Bits 01.7 and 01.6 are valid
 386 * 01.7 - Controller present
 387 * 01.6 - Headset present
 388 * 01.1 - Pad state (Bytes 4+) valid
 389 *
 390 */
 391
 392static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 393{
 394        /* Presence change */
 395        if (data[0] & 0x08) {
 396                if (data[1] & 0x80) {
 397                        xpad->pad_present = 1;
 398                        usb_submit_urb(xpad->bulk_out, GFP_ATOMIC);
 399                } else
 400                        xpad->pad_present = 0;
 401        }
 402
 403        /* Valid pad data */
 404        if (!(data[1] & 0x1))
 405                return;
 406
 407        xpad360_process_packet(xpad, cmd, &data[4]);
 408}
 409
 410static void xpad_irq_in(struct urb *urb)
 411{
 412        struct usb_xpad *xpad = urb->context;
 413        int retval, status;
 414
 415        status = urb->status;
 416
 417        switch (status) {
 418        case 0:
 419                /* success */
 420                break;
 421        case -ECONNRESET:
 422        case -ENOENT:
 423        case -ESHUTDOWN:
 424                /* this urb is terminated, clean up */
 425                dbg("%s - urb shutting down with status: %d",
 426                        __func__, status);
 427                return;
 428        default:
 429                dbg("%s - nonzero urb status received: %d",
 430                        __func__, status);
 431                goto exit;
 432        }
 433
 434        switch (xpad->xtype) {
 435        case XTYPE_XBOX360:
 436                xpad360_process_packet(xpad, 0, xpad->idata);
 437                break;
 438        case XTYPE_XBOX360W:
 439                xpad360w_process_packet(xpad, 0, xpad->idata);
 440                break;
 441        default:
 442                xpad_process_packet(xpad, 0, xpad->idata);
 443        }
 444
 445exit:
 446        retval = usb_submit_urb (urb, GFP_ATOMIC);
 447        if (retval)
 448                err ("%s - usb_submit_urb failed with result %d",
 449                     __func__, retval);
 450}
 451
 452static void xpad_bulk_out(struct urb *urb)
 453{
 454        switch (urb->status) {
 455        case 0:
 456                /* success */
 457                break;
 458        case -ECONNRESET:
 459        case -ENOENT:
 460        case -ESHUTDOWN:
 461                /* this urb is terminated, clean up */
 462                dbg("%s - urb shutting down with status: %d", __func__, urb->status);
 463                break;
 464        default:
 465                dbg("%s - nonzero urb status received: %d", __func__, urb->status);
 466        }
 467}
 468
 469#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS)
 470static void xpad_irq_out(struct urb *urb)
 471{
 472        int retval, status;
 473
 474        status = urb->status;
 475
 476        switch (status) {
 477        case 0:
 478                /* success */
 479                return;
 480
 481        case -ECONNRESET:
 482        case -ENOENT:
 483        case -ESHUTDOWN:
 484                /* this urb is terminated, clean up */
 485                dbg("%s - urb shutting down with status: %d", __func__, status);
 486                return;
 487
 488        default:
 489                dbg("%s - nonzero urb status received: %d", __func__, status);
 490                goto exit;
 491        }
 492
 493exit:
 494        retval = usb_submit_urb(urb, GFP_ATOMIC);
 495        if (retval)
 496                err("%s - usb_submit_urb failed with result %d",
 497                    __func__, retval);
 498}
 499
 500static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
 501{
 502        struct usb_endpoint_descriptor *ep_irq_out;
 503        int error = -ENOMEM;
 504
 505        if (xpad->xtype != XTYPE_XBOX360)
 506                return 0;
 507
 508        xpad->odata = usb_buffer_alloc(xpad->udev, XPAD_PKT_LEN,
 509                                       GFP_KERNEL, &xpad->odata_dma);
 510        if (!xpad->odata)
 511                goto fail1;
 512
 513        mutex_init(&xpad->odata_mutex);
 514
 515        xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
 516        if (!xpad->irq_out)
 517                goto fail2;
 518
 519        ep_irq_out = &intf->cur_altsetting->endpoint[1].desc;
 520        usb_fill_int_urb(xpad->irq_out, xpad->udev,
 521                         usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress),
 522                         xpad->odata, XPAD_PKT_LEN,
 523                         xpad_irq_out, xpad, ep_irq_out->bInterval);
 524        xpad->irq_out->transfer_dma = xpad->odata_dma;
 525        xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 526
 527        return 0;
 528
 529 fail2: usb_buffer_free(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
 530 fail1: return error;
 531}
 532
 533static void xpad_stop_output(struct usb_xpad *xpad)
 534{
 535        if (xpad->xtype == XTYPE_XBOX360)
 536                usb_kill_urb(xpad->irq_out);
 537}
 538
 539static void xpad_deinit_output(struct usb_xpad *xpad)
 540{
 541        if (xpad->xtype == XTYPE_XBOX360) {
 542                usb_free_urb(xpad->irq_out);
 543                usb_buffer_free(xpad->udev, XPAD_PKT_LEN,
 544                                xpad->odata, xpad->odata_dma);
 545        }
 546}
 547#else
 548static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) { return 0; }
 549static void xpad_deinit_output(struct usb_xpad *xpad) {}
 550static void xpad_stop_output(struct usb_xpad *xpad) {}
 551#endif
 552
 553#ifdef CONFIG_JOYSTICK_XPAD_FF
 554static int xpad_play_effect(struct input_dev *dev, void *data,
 555                            struct ff_effect *effect)
 556{
 557        struct usb_xpad *xpad = input_get_drvdata(dev);
 558
 559        if (effect->type == FF_RUMBLE) {
 560                __u16 strong = effect->u.rumble.strong_magnitude;
 561                __u16 weak = effect->u.rumble.weak_magnitude;
 562                xpad->odata[0] = 0x00;
 563                xpad->odata[1] = 0x08;
 564                xpad->odata[2] = 0x00;
 565                xpad->odata[3] = strong / 256;
 566                xpad->odata[4] = weak / 256;
 567                xpad->odata[5] = 0x00;
 568                xpad->odata[6] = 0x00;
 569                xpad->odata[7] = 0x00;
 570                xpad->irq_out->transfer_buffer_length = 8;
 571                usb_submit_urb(xpad->irq_out, GFP_KERNEL);
 572        }
 573
 574        return 0;
 575}
 576
 577static int xpad_init_ff(struct usb_xpad *xpad)
 578{
 579        if (xpad->xtype != XTYPE_XBOX360)
 580                return 0;
 581
 582        input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
 583
 584        return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect);
 585}
 586
 587#else
 588static int xpad_init_ff(struct usb_xpad *xpad) { return 0; }
 589#endif
 590
 591#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
 592#include <linux/leds.h>
 593
 594struct xpad_led {
 595        char name[16];
 596        struct led_classdev led_cdev;
 597        struct usb_xpad *xpad;
 598};
 599
 600static void xpad_send_led_command(struct usb_xpad *xpad, int command)
 601{
 602        if (command >= 0 && command < 14) {
 603                mutex_lock(&xpad->odata_mutex);
 604                xpad->odata[0] = 0x01;
 605                xpad->odata[1] = 0x03;
 606                xpad->odata[2] = command;
 607                xpad->irq_out->transfer_buffer_length = 3;
 608                usb_submit_urb(xpad->irq_out, GFP_KERNEL);
 609                mutex_unlock(&xpad->odata_mutex);
 610        }
 611}
 612
 613static void xpad_led_set(struct led_classdev *led_cdev,
 614                         enum led_brightness value)
 615{
 616        struct xpad_led *xpad_led = container_of(led_cdev,
 617                                                 struct xpad_led, led_cdev);
 618
 619        xpad_send_led_command(xpad_led->xpad, value);
 620}
 621
 622static int xpad_led_probe(struct usb_xpad *xpad)
 623{
 624        static atomic_t led_seq = ATOMIC_INIT(0);
 625        long led_no;
 626        struct xpad_led *led;
 627        struct led_classdev *led_cdev;
 628        int error;
 629
 630        if (xpad->xtype != XTYPE_XBOX360)
 631                return 0;
 632
 633        xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL);
 634        if (!led)
 635                return -ENOMEM;
 636
 637        led_no = (long)atomic_inc_return(&led_seq) - 1;
 638
 639        snprintf(led->name, sizeof(led->name), "xpad%ld", led_no);
 640        led->xpad = xpad;
 641
 642        led_cdev = &led->led_cdev;
 643        led_cdev->name = led->name;
 644        led_cdev->brightness_set = xpad_led_set;
 645
 646        error = led_classdev_register(&xpad->udev->dev, led_cdev);
 647        if (error) {
 648                kfree(led);
 649                xpad->led = NULL;
 650                return error;
 651        }
 652
 653        /*
 654         * Light up the segment corresponding to controller number
 655         */
 656        xpad_send_led_command(xpad, (led_no % 4) + 2);
 657
 658        return 0;
 659}
 660
 661static void xpad_led_disconnect(struct usb_xpad *xpad)
 662{
 663        struct xpad_led *xpad_led = xpad->led;
 664
 665        if (xpad_led) {
 666                led_classdev_unregister(&xpad_led->led_cdev);
 667                kfree(xpad_led->name);
 668        }
 669}
 670#else
 671static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
 672static void xpad_led_disconnect(struct usb_xpad *xpad) { }
 673#endif
 674
 675
 676static int xpad_open(struct input_dev *dev)
 677{
 678        struct usb_xpad *xpad = input_get_drvdata(dev);
 679
 680        /* URB was submitted in probe */
 681        if(xpad->xtype == XTYPE_XBOX360W)
 682                return 0;
 683
 684        xpad->irq_in->dev = xpad->udev;
 685        if (usb_submit_urb(xpad->irq_in, GFP_KERNEL))
 686                return -EIO;
 687
 688        return 0;
 689}
 690
 691static void xpad_close(struct input_dev *dev)
 692{
 693        struct usb_xpad *xpad = input_get_drvdata(dev);
 694
 695        if(xpad->xtype != XTYPE_XBOX360W)
 696                usb_kill_urb(xpad->irq_in);
 697        xpad_stop_output(xpad);
 698}
 699
 700static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs)
 701{
 702        set_bit(abs, input_dev->absbit);
 703
 704        switch (abs) {
 705        case ABS_X:
 706        case ABS_Y:
 707        case ABS_RX:
 708        case ABS_RY:    /* the two sticks */
 709                input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128);
 710                break;
 711        case ABS_Z:
 712        case ABS_RZ:    /* the triggers */
 713                input_set_abs_params(input_dev, abs, 0, 255, 0, 0);
 714                break;
 715        case ABS_HAT0X:
 716        case ABS_HAT0Y: /* the d-pad (only if MAP_DPAD_TO_AXES) */
 717                input_set_abs_params(input_dev, abs, -1, 1, 0, 0);
 718                break;
 719        }
 720}
 721
 722static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)
 723{
 724        struct usb_device *udev = interface_to_usbdev(intf);
 725        struct usb_xpad *xpad;
 726        struct input_dev *input_dev;
 727        struct usb_endpoint_descriptor *ep_irq_in;
 728        int i;
 729        int error = -ENOMEM;
 730
 731        for (i = 0; xpad_device[i].idVendor; i++) {
 732                if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) &&
 733                    (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct))
 734                        break;
 735        }
 736
 737        xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
 738        input_dev = input_allocate_device();
 739        if (!xpad || !input_dev)
 740                goto fail1;
 741
 742        xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN,
 743                                       GFP_KERNEL, &xpad->idata_dma);
 744        if (!xpad->idata)
 745                goto fail1;
 746
 747        xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
 748        if (!xpad->irq_in)
 749                goto fail2;
 750
 751        xpad->udev = udev;
 752        xpad->dpad_mapping = xpad_device[i].dpad_mapping;
 753        xpad->xtype = xpad_device[i].xtype;
 754        if (xpad->dpad_mapping == MAP_DPAD_UNKNOWN)
 755                xpad->dpad_mapping = !dpad_to_buttons;
 756        if (xpad->xtype == XTYPE_UNKNOWN) {
 757                if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
 758                        if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
 759                                xpad->xtype = XTYPE_XBOX360W;
 760                        else
 761                                xpad->xtype = XTYPE_XBOX360;
 762                } else
 763                        xpad->xtype = XTYPE_XBOX;
 764        }
 765        xpad->dev = input_dev;
 766        usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
 767        strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
 768
 769        input_dev->name = xpad_device[i].name;
 770        input_dev->phys = xpad->phys;
 771        usb_to_input_id(udev, &input_dev->id);
 772        input_dev->dev.parent = &intf->dev;
 773
 774        input_set_drvdata(input_dev, xpad);
 775
 776        input_dev->open = xpad_open;
 777        input_dev->close = xpad_close;
 778
 779        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
 780
 781        /* set up buttons */
 782        for (i = 0; xpad_common_btn[i] >= 0; i++)
 783                set_bit(xpad_common_btn[i], input_dev->keybit);
 784        if ((xpad->xtype == XTYPE_XBOX360) || (xpad->xtype == XTYPE_XBOX360W))
 785                for (i = 0; xpad360_btn[i] >= 0; i++)
 786                        set_bit(xpad360_btn[i], input_dev->keybit);
 787        else
 788                for (i = 0; xpad_btn[i] >= 0; i++)
 789                        set_bit(xpad_btn[i], input_dev->keybit);
 790        if (xpad->dpad_mapping == MAP_DPAD_TO_BUTTONS)
 791                for (i = 0; xpad_btn_pad[i] >= 0; i++)
 792                        set_bit(xpad_btn_pad[i], input_dev->keybit);
 793
 794        /* set up axes */
 795        for (i = 0; xpad_abs[i] >= 0; i++)
 796                xpad_set_up_abs(input_dev, xpad_abs[i]);
 797        if (xpad->dpad_mapping == MAP_DPAD_TO_AXES)
 798                for (i = 0; xpad_abs_pad[i] >= 0; i++)
 799                    xpad_set_up_abs(input_dev, xpad_abs_pad[i]);
 800
 801        error = xpad_init_output(intf, xpad);
 802        if (error)
 803                goto fail2;
 804
 805        error = xpad_init_ff(xpad);
 806        if (error)
 807                goto fail3;
 808
 809        error = xpad_led_probe(xpad);
 810        if (error)
 811                goto fail3;
 812
 813        ep_irq_in = &intf->cur_altsetting->endpoint[0].desc;
 814        usb_fill_int_urb(xpad->irq_in, udev,
 815                         usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
 816                         xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
 817                         xpad, ep_irq_in->bInterval);
 818        xpad->irq_in->transfer_dma = xpad->idata_dma;
 819        xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 820
 821        error = input_register_device(xpad->dev);
 822        if (error)
 823                goto fail4;
 824
 825        usb_set_intfdata(intf, xpad);
 826
 827        /*
 828         * Submit the int URB immediatly rather than waiting for open
 829         * because we get status messages from the device whether
 830         * or not any controllers are attached.  In fact, it's
 831         * exactly the message that a controller has arrived that
 832         * we're waiting for.
 833         */
 834        if (xpad->xtype == XTYPE_XBOX360W) {
 835                xpad->irq_in->dev = xpad->udev;
 836                error = usb_submit_urb(xpad->irq_in, GFP_KERNEL);
 837                if (error)
 838                        goto fail4;
 839
 840                /*
 841                 * Setup the message to set the LEDs on the
 842                 * controller when it shows up
 843                 */
 844                xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL);
 845                if(!xpad->bulk_out)
 846                        goto fail5;
 847
 848                xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL);
 849                if(!xpad->bdata)
 850                        goto fail6;
 851
 852                xpad->bdata[2] = 0x08;
 853                switch (intf->cur_altsetting->desc.bInterfaceNumber) {
 854                case 0:
 855                        xpad->bdata[3] = 0x42;
 856                        break;
 857                case 2:
 858                        xpad->bdata[3] = 0x43;
 859                        break;
 860                case 4:
 861                        xpad->bdata[3] = 0x44;
 862                        break;
 863                case 6:
 864                        xpad->bdata[3] = 0x45;
 865                }
 866
 867                ep_irq_in = &intf->cur_altsetting->endpoint[1].desc;
 868                usb_fill_bulk_urb(xpad->bulk_out, udev,
 869                                usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress),
 870                                xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad);
 871        }
 872
 873        return 0;
 874
 875 fail6: usb_free_urb(xpad->bulk_out);
 876 fail5: usb_kill_urb(xpad->irq_in);
 877 fail4: usb_free_urb(xpad->irq_in);
 878 fail3: xpad_deinit_output(xpad);
 879 fail2: usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
 880 fail1: input_free_device(input_dev);
 881        kfree(xpad);
 882        return error;
 883
 884}
 885
 886static void xpad_disconnect(struct usb_interface *intf)
 887{
 888        struct usb_xpad *xpad = usb_get_intfdata (intf);
 889
 890        usb_set_intfdata(intf, NULL);
 891        if (xpad) {
 892                xpad_led_disconnect(xpad);
 893                input_unregister_device(xpad->dev);
 894                xpad_deinit_output(xpad);
 895                if (xpad->xtype == XTYPE_XBOX360W) {
 896                        usb_kill_urb(xpad->bulk_out);
 897                        usb_free_urb(xpad->bulk_out);
 898                        usb_kill_urb(xpad->irq_in);
 899                }
 900                usb_free_urb(xpad->irq_in);
 901                usb_buffer_free(xpad->udev, XPAD_PKT_LEN,
 902                                xpad->idata, xpad->idata_dma);
 903                kfree(xpad);
 904        }
 905}
 906
 907static struct usb_driver xpad_driver = {
 908        .name           = "xpad",
 909        .probe          = xpad_probe,
 910        .disconnect     = xpad_disconnect,
 911        .id_table       = xpad_table,
 912};
 913
 914static int __init usb_xpad_init(void)
 915{
 916        int result = usb_register(&xpad_driver);
 917        if (result == 0)
 918                printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
 919        return result;
 920}
 921
 922static void __exit usb_xpad_exit(void)
 923{
 924        usb_deregister(&xpad_driver);
 925}
 926
 927module_init(usb_xpad_init);
 928module_exit(usb_xpad_exit);
 929
 930MODULE_AUTHOR(DRIVER_AUTHOR);
 931MODULE_DESCRIPTION(DRIVER_DESC);
 932MODULE_LICENSE("GPL");
 933