Linux Audio

Check our new training course

Loading...
v5.14.15
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * X-Box gamepad driver
   4 *
   5 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de>
   6 *               2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>,
   7 *                    Steven Toth <steve@toth.demon.co.uk>,
   8 *                    Franz Lehner <franz@caos.at>,
   9 *                    Ivan Hawkes <blackhawk@ivanhawkes.com>
  10 *               2005 Dominic Cerquetti <binary1230@yahoo.com>
  11 *               2006 Adam Buchbinder <adam.buchbinder@gmail.com>
  12 *               2007 Jan Kratochvil <honza@jikos.cz>
  13 *               2010 Christoph Fritz <chf.fritz@googlemail.com>
  14 *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  15 * This driver is based on:
  16 *  - information from     http://euc.jp/periphs/xbox-controller.ja.html
  17 *  - the iForce driver    drivers/char/joystick/iforce.c
  18 *  - the skeleton-driver  drivers/usb/usb-skeleton.c
  19 *  - Xbox 360 information http://www.free60.org/wiki/Gamepad
  20 *  - Xbox One information https://github.com/quantus/xbox-one-controller-protocol
  21 *
  22 * Thanks to:
  23 *  - ITO Takayuki for providing essential xpad information on his website
  24 *  - Vojtech Pavlik     - iforce driver / input subsystem
  25 *  - Greg Kroah-Hartman - usb-skeleton driver
  26 *  - XBOX Linux project - extra USB id's
  27 *  - Pekka Pöyry (quantus) - Xbox One controller reverse engineering
  28 *
  29 * TODO:
  30 *  - fine tune axes (especially trigger axes)
  31 *  - fix "analog" buttons (reported as digital now)
  32 *  - get rumble working
  33 *  - need USB IDs for other dance pads
  34 *
  35 * History:
  36 *
  37 * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller"
  38 *
  39 * 2002-07-02 - 0.0.2 : basic working version
  40 *  - all axes and 9 of the 10 buttons work (german InterAct device)
  41 *  - the black button does not work
  42 *
  43 * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik
  44 *  - indentation fixes
  45 *  - usb + input init sequence fixes
  46 *
  47 * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3
  48 *  - verified the lack of HID and report descriptors
  49 *  - verified that ALL buttons WORK
  50 *  - fixed d-pad to axes mapping
  51 *
  52 * 2002-07-17 - 0.0.5 : simplified d-pad handling
  53 *
  54 * 2004-10-02 - 0.0.6 : DDR pad support
  55 *  - borrowed from the XBOX linux kernel
  56 *  - USB id's for commonly used dance pads are present
  57 *  - dance pads will map D-PAD to buttons, not axes
  58 *  - pass the module paramater 'dpad_to_buttons' to force
  59 *    the D-PAD to map to buttons if your pad is not detected
  60 *
  61 * Later changes can be tracked in SCM.
  62 */
  63
  64#include <linux/kernel.h>
  65#include <linux/input.h>
  66#include <linux/rcupdate.h>
  67#include <linux/slab.h>
  68#include <linux/stat.h>
  69#include <linux/module.h>
  70#include <linux/usb/input.h>
  71#include <linux/usb/quirks.h>
  72
  73#define XPAD_PKT_LEN 64
  74
  75/*
  76 * xbox d-pads should map to buttons, as is required for DDR pads
  77 * but we map them to axes when possible to simplify things
  78 */
  79#define MAP_DPAD_TO_BUTTONS		(1 << 0)
  80#define MAP_TRIGGERS_TO_BUTTONS		(1 << 1)
  81#define MAP_STICKS_TO_NULL		(1 << 2)
  82#define MAP_SELECT_BUTTON		(1 << 3)
  83#define DANCEPAD_MAP_CONFIG	(MAP_DPAD_TO_BUTTONS |			\
  84				MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
  85
  86#define XTYPE_XBOX        0
  87#define XTYPE_XBOX360     1
  88#define XTYPE_XBOX360W    2
  89#define XTYPE_XBOXONE     3
  90#define XTYPE_UNKNOWN     4
  91
  92static bool dpad_to_buttons;
  93module_param(dpad_to_buttons, bool, S_IRUGO);
  94MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
  95
  96static bool triggers_to_buttons;
  97module_param(triggers_to_buttons, bool, S_IRUGO);
  98MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads");
  99
 100static bool sticks_to_null;
 101module_param(sticks_to_null, bool, S_IRUGO);
 102MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads");
 103
 104static bool auto_poweroff = true;
 105module_param(auto_poweroff, bool, S_IWUSR | S_IRUGO);
 106MODULE_PARM_DESC(auto_poweroff, "Power off wireless controllers on suspend");
 107
 108static const struct xpad_device {
 109	u16 idVendor;
 110	u16 idProduct;
 111	char *name;
 112	u8 mapping;
 113	u8 xtype;
 114} xpad_device[] = {
 115	{ 0x0079, 0x18d4, "GPD Win 2 X-Box Controller", 0, XTYPE_XBOX360 },
 116	{ 0x044f, 0x0f00, "Thrustmaster Wheel", 0, XTYPE_XBOX },
 117	{ 0x044f, 0x0f03, "Thrustmaster Wheel", 0, XTYPE_XBOX },
 118	{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
 119	{ 0x044f, 0x0f10, "Thrustmaster Modena GT Wheel", 0, XTYPE_XBOX },
 120	{ 0x044f, 0xb326, "Thrustmaster Gamepad GP XID", 0, XTYPE_XBOX360 },
 121	{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
 122	{ 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
 123	{ 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
 124	{ 0x045e, 0x0288, "Microsoft Xbox Controller S v2", 0, XTYPE_XBOX },
 125	{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
 126	{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
 127	{ 0x045e, 0x028f, "Microsoft X-Box 360 pad v2", 0, XTYPE_XBOX360 },
 128	{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
 129	{ 0x045e, 0x02d1, "Microsoft X-Box One pad", 0, XTYPE_XBOXONE },
 130	{ 0x045e, 0x02dd, "Microsoft X-Box One pad (Firmware 2015)", 0, XTYPE_XBOXONE },
 131	{ 0x045e, 0x02e3, "Microsoft X-Box One Elite pad", 0, XTYPE_XBOXONE },
 132	{ 0x045e, 0x02ea, "Microsoft X-Box One S pad", 0, XTYPE_XBOXONE },
 133	{ 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
 134	{ 0x045e, 0x0b12, "Microsoft Xbox One X pad", MAP_SELECT_BUTTON, XTYPE_XBOXONE },
 135	{ 0x046d, 0xc21d, "Logitech Gamepad F310", 0, XTYPE_XBOX360 },
 136	{ 0x046d, 0xc21e, "Logitech Gamepad F510", 0, XTYPE_XBOX360 },
 137	{ 0x046d, 0xc21f, "Logitech Gamepad F710", 0, XTYPE_XBOX360 },
 138	{ 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
 139	{ 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
 140	{ 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX },
 141	{ 0x046d, 0xca8a, "Logitech Precision Vibration Feedback Wheel", 0, XTYPE_XBOX },
 142	{ 0x046d, 0xcaa3, "Logitech DriveFx Racing Wheel", 0, XTYPE_XBOX360 },
 143	{ 0x056e, 0x2004, "Elecom JC-U3613M", 0, XTYPE_XBOX360 },
 144	{ 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX },
 145	{ 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX },
 146	{ 0x05fe, 0x3030, "Chic Controller", 0, XTYPE_XBOX },
 147	{ 0x05fe, 0x3031, "Chic Controller", 0, XTYPE_XBOX },
 148	{ 0x062a, 0x0020, "Logic3 Xbox GamePad", 0, XTYPE_XBOX },
 149	{ 0x062a, 0x0033, "Competition Pro Steering Wheel", 0, XTYPE_XBOX },
 150	{ 0x06a3, 0x0200, "Saitek Racing Wheel", 0, XTYPE_XBOX },
 151	{ 0x06a3, 0x0201, "Saitek Adrenalin", 0, XTYPE_XBOX },
 152	{ 0x06a3, 0xf51a, "Saitek P3600", 0, XTYPE_XBOX360 },
 153	{ 0x0738, 0x4506, "Mad Catz 4506 Wireless Controller", 0, XTYPE_XBOX },
 154	{ 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX },
 155	{ 0x0738, 0x4520, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
 156	{ 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX },
 157	{ 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
 158	{ 0x0738, 0x4530, "Mad Catz Universal MC2 Racing Wheel and Pedals", 0, XTYPE_XBOX },
 159	{ 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX },
 160	{ 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 161	{ 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
 162	{ 0x0738, 0x4586, "Mad Catz MicroCon Wireless Controller", 0, XTYPE_XBOX },
 163	{ 0x0738, 0x4588, "Mad Catz Blaster", 0, XTYPE_XBOX },
 164	{ 0x0738, 0x45ff, "Mad Catz Beat Pad (w/ Handle)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 165	{ 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
 166	{ 0x0738, 0x4718, "Mad Catz Street Fighter IV FightStick SE", 0, XTYPE_XBOX360 },
 167	{ 0x0738, 0x4726, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
 168	{ 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 169	{ 0x0738, 0x4736, "Mad Catz MicroCon Gamepad", 0, XTYPE_XBOX360 },
 170	{ 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 171	{ 0x0738, 0x4740, "Mad Catz Beat Pad", 0, XTYPE_XBOX360 },
 172	{ 0x0738, 0x4743, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 173	{ 0x0738, 0x4758, "Mad Catz Arcade Game Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 174	{ 0x0738, 0x4a01, "Mad Catz FightStick TE 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 175	{ 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 176	{ 0x0738, 0x9871, "Mad Catz Portable Drum", 0, XTYPE_XBOX360 },
 177	{ 0x0738, 0xb726, "Mad Catz Xbox controller - MW2", 0, XTYPE_XBOX360 },
 178	{ 0x0738, 0xb738, "Mad Catz MVC2TE Stick 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 179	{ 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
 180	{ 0x0738, 0xcb02, "Saitek Cyborg Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
 181	{ 0x0738, 0xcb03, "Saitek P3200 Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
 182	{ 0x0738, 0xcb29, "Saitek Aviator Stick AV8R02", 0, XTYPE_XBOX360 },
 183	{ 0x0738, 0xf738, "Super SFIV FightStick TE S", 0, XTYPE_XBOX360 },
 184	{ 0x07ff, 0xffff, "Mad Catz GamePad", 0, XTYPE_XBOX360 },
 185	{ 0x0c12, 0x0005, "Intec wireless", 0, XTYPE_XBOX },
 186	{ 0x0c12, 0x8801, "Nyko Xbox Controller", 0, XTYPE_XBOX },
 187	{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
 188	{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
 189	{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
 190	{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
 191	{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
 192	{ 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 193	{ 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX },
 194	{ 0x0e4c, 0x1103, "Radica Gamester Reflex", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX },
 195	{ 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX },
 196	{ 0x0e4c, 0x3510, "Radica Gamester", 0, XTYPE_XBOX },
 197	{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
 198	{ 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
 199	{ 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
 200	{ 0x0e6f, 0x0008, "After Glow Pro Controller", 0, XTYPE_XBOX },
 201	{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 202	{ 0x0e6f, 0x0113, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 203	{ 0x0e6f, 0x011f, "Rock Candy Gamepad Wired Controller", 0, XTYPE_XBOX360 },
 204	{ 0x0e6f, 0x0131, "PDP EA Sports Controller", 0, XTYPE_XBOX360 },
 205	{ 0x0e6f, 0x0133, "Xbox 360 Wired Controller", 0, XTYPE_XBOX360 },
 206	{ 0x0e6f, 0x0139, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
 207	{ 0x0e6f, 0x013a, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 208	{ 0x0e6f, 0x0146, "Rock Candy Wired Controller for Xbox One", 0, XTYPE_XBOXONE },
 209	{ 0x0e6f, 0x0147, "PDP Marvel Xbox One Controller", 0, XTYPE_XBOXONE },
 210	{ 0x0e6f, 0x015c, "PDP Xbox One Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 211	{ 0x0e6f, 0x0161, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 212	{ 0x0e6f, 0x0162, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 213	{ 0x0e6f, 0x0163, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 214	{ 0x0e6f, 0x0164, "PDP Battlefield One", 0, XTYPE_XBOXONE },
 215	{ 0x0e6f, 0x0165, "PDP Titanfall 2", 0, XTYPE_XBOXONE },
 216	{ 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
 217	{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 218	{ 0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 219	{ 0x0e6f, 0x0246, "Rock Candy Gamepad for Xbox One 2015", 0, XTYPE_XBOXONE },
 220	{ 0x0e6f, 0x02a0, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 221	{ 0x0e6f, 0x02a1, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 222	{ 0x0e6f, 0x02a2, "PDP Wired Controller for Xbox One - Crimson Red", 0, XTYPE_XBOXONE },
 223	{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
 224	{ 0x0e6f, 0x02a6, "PDP Wired Controller for Xbox One - Camo Series", 0, XTYPE_XBOXONE },
 225	{ 0x0e6f, 0x02a7, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 226	{ 0x0e6f, 0x02a8, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 227	{ 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE },
 228	{ 0x0e6f, 0x02ad, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
 229	{ 0x0e6f, 0x02b3, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
 230	{ 0x0e6f, 0x02b8, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
 231	{ 0x0e6f, 0x0301, "Logic3 Controller", 0, XTYPE_XBOX360 },
 232	{ 0x0e6f, 0x0346, "Rock Candy Gamepad for Xbox One 2016", 0, XTYPE_XBOXONE },
 233	{ 0x0e6f, 0x0401, "Logic3 Controller", 0, XTYPE_XBOX360 },
 234	{ 0x0e6f, 0x0413, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 235	{ 0x0e6f, 0x0501, "PDP Xbox 360 Controller", 0, XTYPE_XBOX360 },
 236	{ 0x0e6f, 0xf900, "PDP Afterglow AX.1", 0, XTYPE_XBOX360 },
 237	{ 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
 238	{ 0x0e8f, 0x3008, "Generic xbox control (dealextreme)", 0, XTYPE_XBOX },
 239	{ 0x0f0d, 0x000a, "Hori Co. DOA4 FightStick", 0, XTYPE_XBOX360 },
 240	{ 0x0f0d, 0x000c, "Hori PadEX Turbo", 0, XTYPE_XBOX360 },
 241	{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 242	{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 243	{ 0x0f0d, 0x001b, "Hori Real Arcade Pro VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 244	{ 0x0f0d, 0x0063, "Hori Real Arcade Pro Hayabusa (USA) Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 245	{ 0x0f0d, 0x0067, "HORIPAD ONE", 0, XTYPE_XBOXONE },
 246	{ 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 247	{ 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX },
 248	{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
 249	{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
 250	{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
 251	{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
 252	{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
 253	{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
 254	{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
 255	{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 256	{ 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 },
 257	{ 0x12ab, 0x0303, "Mortal Kombat Klassic FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 258	{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 259	{ 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
 260	{ 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 261	{ 0x1430, 0xf801, "RedOctane Controller", 0, XTYPE_XBOX360 },
 262	{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
 263	{ 0x1532, 0x0037, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 264	{ 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 265	{ 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
 266	{ 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
 267	{ 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
 268	{ 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 },
 269	{ 0x162e, 0xbeef, "Joytech Neo-Se Take2", 0, XTYPE_XBOX360 },
 270	{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", 0, XTYPE_XBOX360 },
 271	{ 0x1689, 0xfd01, "Razer Onza Classic Edition", 0, XTYPE_XBOX360 },
 272	{ 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 273	{ 0x1949, 0x041a, "Amazon Game Controller", 0, XTYPE_XBOX360 },
 274	{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
 275	{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 276	{ 0x1bad, 0x0130, "Ion Drum Rocker", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 277	{ 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
 278	{ 0x1bad, 0xf018, "Mad Catz Street Fighter IV SE Fighting Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 279	{ 0x1bad, 0xf019, "Mad Catz Brawlstick for Xbox 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 280	{ 0x1bad, 0xf021, "Mad Cats Ghost Recon FS GamePad", 0, XTYPE_XBOX360 },
 281	{ 0x1bad, 0xf023, "MLG Pro Circuit Controller (Xbox)", 0, XTYPE_XBOX360 },
 282	{ 0x1bad, 0xf025, "Mad Catz Call Of Duty", 0, XTYPE_XBOX360 },
 283	{ 0x1bad, 0xf027, "Mad Catz FPS Pro", 0, XTYPE_XBOX360 },
 284	{ 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
 285	{ 0x1bad, 0xf02e, "Mad Catz Fightpad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 286	{ 0x1bad, 0xf030, "Mad Catz Xbox 360 MC2 MicroCon Racing Wheel", 0, XTYPE_XBOX360 },
 287	{ 0x1bad, 0xf036, "Mad Catz MicroCon GamePad Pro", 0, XTYPE_XBOX360 },
 288	{ 0x1bad, 0xf038, "Street Fighter IV FightStick TE", 0, XTYPE_XBOX360 },
 289	{ 0x1bad, 0xf039, "Mad Catz MvC2 TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 290	{ 0x1bad, 0xf03a, "Mad Catz SFxT Fightstick Pro", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 291	{ 0x1bad, 0xf03d, "Street Fighter IV Arcade Stick TE - Chun Li", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 292	{ 0x1bad, 0xf03e, "Mad Catz MLG FightStick TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 293	{ 0x1bad, 0xf03f, "Mad Catz FightStick SoulCaliber", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 294	{ 0x1bad, 0xf042, "Mad Catz FightStick TES+", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 295	{ 0x1bad, 0xf080, "Mad Catz FightStick TE2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 296	{ 0x1bad, 0xf501, "HoriPad EX2 Turbo", 0, XTYPE_XBOX360 },
 297	{ 0x1bad, 0xf502, "Hori Real Arcade Pro.VX SA", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 298	{ 0x1bad, 0xf503, "Hori Fighting Stick VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 299	{ 0x1bad, 0xf504, "Hori Real Arcade Pro. EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 300	{ 0x1bad, 0xf505, "Hori Fighting Stick EX2B", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 301	{ 0x1bad, 0xf506, "Hori Real Arcade Pro.EX Premium VLX", 0, XTYPE_XBOX360 },
 302	{ 0x1bad, 0xf900, "Harmonix Xbox 360 Controller", 0, XTYPE_XBOX360 },
 303	{ 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
 304	{ 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
 305	{ 0x1bad, 0xf904, "PDP Versus Fighting Pad", 0, XTYPE_XBOX360 },
 306	{ 0x1bad, 0xf906, "MortalKombat FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 307	{ 0x1bad, 0xfa01, "MadCatz GamePad", 0, XTYPE_XBOX360 },
 308	{ 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
 309	{ 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
 310	{ 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
 311	{ 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
 312	{ 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
 313	{ 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
 314	{ 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 315	{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
 316	{ 0x24c6, 0x5303, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
 317	{ 0x24c6, 0x530a, "Xbox 360 Pro EX Controller", 0, XTYPE_XBOX360 },
 318	{ 0x24c6, 0x531a, "PowerA Pro Ex", 0, XTYPE_XBOX360 },
 319	{ 0x24c6, 0x5397, "FUS1ON Tournament Controller", 0, XTYPE_XBOX360 },
 320	{ 0x24c6, 0x541a, "PowerA Xbox One Mini Wired Controller", 0, XTYPE_XBOXONE },
 321	{ 0x24c6, 0x542a, "Xbox ONE spectra", 0, XTYPE_XBOXONE },
 322	{ 0x24c6, 0x543a, "PowerA Xbox One wired controller", 0, XTYPE_XBOXONE },
 323	{ 0x24c6, 0x5500, "Hori XBOX 360 EX 2 with Turbo", 0, XTYPE_XBOX360 },
 324	{ 0x24c6, 0x5501, "Hori Real Arcade Pro VX-SA", 0, XTYPE_XBOX360 },
 325	{ 0x24c6, 0x5502, "Hori Fighting Stick VX Alt", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 326	{ 0x24c6, 0x5503, "Hori Fighting Edge", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 327	{ 0x24c6, 0x5506, "Hori SOULCALIBUR V Stick", 0, XTYPE_XBOX360 },
 328	{ 0x24c6, 0x550d, "Hori GEM Xbox controller", 0, XTYPE_XBOX360 },
 329	{ 0x24c6, 0x550e, "Hori Real Arcade Pro V Kai 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 330	{ 0x24c6, 0x551a, "PowerA FUSION Pro Controller", 0, XTYPE_XBOXONE },
 331	{ 0x24c6, 0x561a, "PowerA FUSION Controller", 0, XTYPE_XBOXONE },
 332	{ 0x24c6, 0x5b00, "ThrustMaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
 333	{ 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 },
 334	{ 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
 335	{ 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 336	{ 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 337	{ 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 },
 338	{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
 339	{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
 340	{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
 341};
 342
 343/* buttons shared with xbox and xbox360 */
 344static const signed short xpad_common_btn[] = {
 345	BTN_A, BTN_B, BTN_X, BTN_Y,			/* "analog" buttons */
 346	BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR,	/* start/back/sticks */
 347	-1						/* terminating entry */
 348};
 349
 350/* original xbox controllers only */
 351static const signed short xpad_btn[] = {
 352	BTN_C, BTN_Z,		/* "analog" buttons */
 353	-1			/* terminating entry */
 354};
 355
 356/* used when dpad is mapped to buttons */
 357static const signed short xpad_btn_pad[] = {
 358	BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2,		/* d-pad left, right */
 359	BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4,		/* d-pad up, down */
 360	-1				/* terminating entry */
 361};
 362
 363/* used when triggers are mapped to buttons */
 364static const signed short xpad_btn_triggers[] = {
 365	BTN_TL2, BTN_TR2,		/* triggers left/right */
 366	-1
 367};
 368
 369static const signed short xpad360_btn[] = {  /* buttons for x360 controller */
 370	BTN_TL, BTN_TR,		/* Button LB/RB */
 371	BTN_MODE,		/* The big X button */
 372	-1
 373};
 374
 375static const signed short xpad_abs[] = {
 376	ABS_X, ABS_Y,		/* left stick */
 377	ABS_RX, ABS_RY,		/* right stick */
 378	-1			/* terminating entry */
 379};
 380
 381/* used when dpad is mapped to axes */
 382static const signed short xpad_abs_pad[] = {
 383	ABS_HAT0X, ABS_HAT0Y,	/* d-pad axes */
 384	-1			/* terminating entry */
 385};
 386
 387/* used when triggers are mapped to axes */
 388static const signed short xpad_abs_triggers[] = {
 389	ABS_Z, ABS_RZ,		/* triggers left/right */
 390	-1
 391};
 392
 393/*
 394 * Xbox 360 has a vendor-specific class, so we cannot match it with only
 395 * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we
 396 * match against vendor id as well. Wired Xbox 360 devices have protocol 1,
 397 * wireless controllers have protocol 129.
 398 */
 399#define XPAD_XBOX360_VENDOR_PROTOCOL(vend, pr) \
 400	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
 401	.idVendor = (vend), \
 402	.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
 403	.bInterfaceSubClass = 93, \
 404	.bInterfaceProtocol = (pr)
 405#define XPAD_XBOX360_VENDOR(vend) \
 406	{ XPAD_XBOX360_VENDOR_PROTOCOL((vend), 1) }, \
 407	{ XPAD_XBOX360_VENDOR_PROTOCOL((vend), 129) }
 408
 409/* The Xbox One controller uses subclass 71 and protocol 208. */
 410#define XPAD_XBOXONE_VENDOR_PROTOCOL(vend, pr) \
 411	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
 412	.idVendor = (vend), \
 413	.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
 414	.bInterfaceSubClass = 71, \
 415	.bInterfaceProtocol = (pr)
 416#define XPAD_XBOXONE_VENDOR(vend) \
 417	{ XPAD_XBOXONE_VENDOR_PROTOCOL((vend), 208) }
 418
 419static const struct usb_device_id xpad_table[] = {
 420	{ USB_INTERFACE_INFO('X', 'B', 0) },	/* X-Box USB-IF not approved class */
 421	XPAD_XBOX360_VENDOR(0x0079),		/* GPD Win 2 Controller */
 422	XPAD_XBOX360_VENDOR(0x044f),		/* Thrustmaster X-Box 360 controllers */
 423	XPAD_XBOX360_VENDOR(0x045e),		/* Microsoft X-Box 360 controllers */
 424	XPAD_XBOXONE_VENDOR(0x045e),		/* Microsoft X-Box One controllers */
 425	XPAD_XBOX360_VENDOR(0x046d),		/* Logitech X-Box 360 style controllers */
 426	XPAD_XBOX360_VENDOR(0x056e),		/* Elecom JC-U3613M */
 427	XPAD_XBOX360_VENDOR(0x06a3),		/* Saitek P3600 */
 428	XPAD_XBOX360_VENDOR(0x0738),		/* Mad Catz X-Box 360 controllers */
 429	{ USB_DEVICE(0x0738, 0x4540) },		/* Mad Catz Beat Pad */
 430	XPAD_XBOXONE_VENDOR(0x0738),		/* Mad Catz FightStick TE 2 */
 431	XPAD_XBOX360_VENDOR(0x07ff),		/* Mad Catz GamePad */
 432	XPAD_XBOX360_VENDOR(0x0e6f),		/* 0x0e6f X-Box 360 controllers */
 433	XPAD_XBOXONE_VENDOR(0x0e6f),		/* 0x0e6f X-Box One controllers */
 434	XPAD_XBOX360_VENDOR(0x0f0d),		/* Hori Controllers */
 435	XPAD_XBOXONE_VENDOR(0x0f0d),		/* Hori Controllers */
 436	XPAD_XBOX360_VENDOR(0x1038),		/* SteelSeries Controllers */
 437	XPAD_XBOX360_VENDOR(0x11c9),		/* Nacon GC100XF */
 438	XPAD_XBOX360_VENDOR(0x1209),		/* Ardwiino Controllers */
 439	XPAD_XBOX360_VENDOR(0x12ab),		/* X-Box 360 dance pads */
 440	XPAD_XBOX360_VENDOR(0x1430),		/* RedOctane X-Box 360 controllers */
 441	XPAD_XBOX360_VENDOR(0x146b),		/* BigBen Interactive Controllers */
 442	XPAD_XBOX360_VENDOR(0x1532),		/* Razer Sabertooth */
 443	XPAD_XBOXONE_VENDOR(0x1532),		/* Razer Wildcat */
 444	XPAD_XBOX360_VENDOR(0x15e4),		/* Numark X-Box 360 controllers */
 445	XPAD_XBOX360_VENDOR(0x162e),		/* Joytech X-Box 360 controllers */
 446	XPAD_XBOX360_VENDOR(0x1689),		/* Razer Onza */
 447	XPAD_XBOX360_VENDOR(0x1949),		/* Amazon controllers */
 448	XPAD_XBOX360_VENDOR(0x1bad),		/* Harminix Rock Band Guitar and Drums */
 449	XPAD_XBOX360_VENDOR(0x20d6),		/* PowerA Controllers */
 450	XPAD_XBOXONE_VENDOR(0x20d6),		/* PowerA Controllers */
 451	XPAD_XBOX360_VENDOR(0x24c6),		/* PowerA Controllers */
 452	XPAD_XBOXONE_VENDOR(0x24c6),		/* PowerA Controllers */
 453	XPAD_XBOXONE_VENDOR(0x2e24),		/* Hyperkin Duke X-Box One pad */
 454	XPAD_XBOX360_VENDOR(0x2f24),		/* GameSir Controllers */
 455	XPAD_XBOX360_VENDOR(0x3285),		/* Nacon GC-100 */
 456	{ }
 457};
 458
 459MODULE_DEVICE_TABLE(usb, xpad_table);
 460
 461struct xboxone_init_packet {
 462	u16 idVendor;
 463	u16 idProduct;
 464	const u8 *data;
 465	u8 len;
 466};
 467
 468#define XBOXONE_INIT_PKT(_vid, _pid, _data)		\
 469	{						\
 470		.idVendor	= (_vid),		\
 471		.idProduct	= (_pid),		\
 472		.data		= (_data),		\
 473		.len		= ARRAY_SIZE(_data),	\
 474	}
 475
 476
 477/*
 478 * This packet is required for all Xbox One pads with 2015
 479 * or later firmware installed (or present from the factory).
 480 */
 481static const u8 xboxone_fw2015_init[] = {
 482	0x05, 0x20, 0x00, 0x01, 0x00
 483};
 484
 485/*
 486 * This packet is required for Xbox One S (0x045e:0x02ea)
 487 * and Xbox One Elite Series 2 (0x045e:0x0b00) pads to
 488 * initialize the controller that was previously used in
 489 * Bluetooth mode.
 490 */
 491static const u8 xboxone_s_init[] = {
 492	0x05, 0x20, 0x00, 0x0f, 0x06
 493};
 494
 495/*
 496 * This packet is required for the Titanfall 2 Xbox One pads
 497 * (0x0e6f:0x0165) to finish initialization and for Hori pads
 498 * (0x0f0d:0x0067) to make the analog sticks work.
 499 */
 500static const u8 xboxone_hori_init[] = {
 501	0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a,
 502	0x00, 0x00, 0x00, 0x80, 0x00
 503};
 504
 505/*
 506 * This packet is required for most (all?) of the PDP pads to start
 507 * sending input reports. These pads include: (0x0e6f:0x02ab),
 508 * (0x0e6f:0x02a4), (0x0e6f:0x02a6).
 509 */
 510static const u8 xboxone_pdp_init1[] = {
 511	0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14
 512};
 513
 514/*
 515 * This packet is required for most (all?) of the PDP pads to start
 516 * sending input reports. These pads include: (0x0e6f:0x02ab),
 517 * (0x0e6f:0x02a4), (0x0e6f:0x02a6).
 518 */
 519static const u8 xboxone_pdp_init2[] = {
 520	0x06, 0x20, 0x00, 0x02, 0x01, 0x00
 521};
 522
 523/*
 524 * A specific rumble packet is required for some PowerA pads to start
 525 * sending input reports. One of those pads is (0x24c6:0x543a).
 526 */
 527static const u8 xboxone_rumblebegin_init[] = {
 528	0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
 529	0x1D, 0x1D, 0xFF, 0x00, 0x00
 530};
 531
 532/*
 533 * A rumble packet with zero FF intensity will immediately
 534 * terminate the rumbling required to init PowerA pads.
 535 * This should happen fast enough that the motors don't
 536 * spin up to enough speed to actually vibrate the gamepad.
 537 */
 538static const u8 xboxone_rumbleend_init[] = {
 539	0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
 540	0x00, 0x00, 0x00, 0x00, 0x00
 541};
 542
 543/*
 544 * This specifies the selection of init packets that a gamepad
 545 * will be sent on init *and* the order in which they will be
 546 * sent. The correct sequence number will be added when the
 547 * packet is going to be sent.
 548 */
 549static const struct xboxone_init_packet xboxone_init_packets[] = {
 550	XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init),
 551	XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init),
 552	XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init),
 553	XBOXONE_INIT_PKT(0x045e, 0x02ea, xboxone_s_init),
 554	XBOXONE_INIT_PKT(0x045e, 0x0b00, xboxone_s_init),
 555	XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init1),
 556	XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init2),
 557	XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
 558	XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
 559	XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
 560	XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumbleend_init),
 561	XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumbleend_init),
 562	XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumbleend_init),
 563};
 564
 565struct xpad_output_packet {
 566	u8 data[XPAD_PKT_LEN];
 567	u8 len;
 568	bool pending;
 569};
 570
 571#define XPAD_OUT_CMD_IDX	0
 572#define XPAD_OUT_FF_IDX		1
 573#define XPAD_OUT_LED_IDX	(1 + IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF))
 574#define XPAD_NUM_OUT_PACKETS	(1 + \
 575				 IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF) + \
 576				 IS_ENABLED(CONFIG_JOYSTICK_XPAD_LEDS))
 577
 578struct usb_xpad {
 579	struct input_dev *dev;		/* input device interface */
 580	struct input_dev __rcu *x360w_dev;
 581	struct usb_device *udev;	/* usb device */
 582	struct usb_interface *intf;	/* usb interface */
 583
 584	bool pad_present;
 585	bool input_created;
 586
 587	struct urb *irq_in;		/* urb for interrupt in report */
 588	unsigned char *idata;		/* input data */
 589	dma_addr_t idata_dma;
 590
 591	struct urb *irq_out;		/* urb for interrupt out report */
 592	struct usb_anchor irq_out_anchor;
 593	bool irq_out_active;		/* we must not use an active URB */
 594	u8 odata_serial;		/* serial number for xbox one protocol */
 595	unsigned char *odata;		/* output data */
 596	dma_addr_t odata_dma;
 597	spinlock_t odata_lock;
 598
 599	struct xpad_output_packet out_packets[XPAD_NUM_OUT_PACKETS];
 600	int last_out_packet;
 601	int init_seq;
 602
 603#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
 604	struct xpad_led *led;
 605#endif
 606
 607	char phys[64];			/* physical device path */
 608
 609	int mapping;			/* map d-pad to buttons or to axes */
 610	int xtype;			/* type of xbox device */
 611	int pad_nr;			/* the order x360 pads were attached */
 612	const char *name;		/* name of the device */
 613	struct work_struct work;	/* init/remove device from callback */
 614};
 615
 616static int xpad_init_input(struct usb_xpad *xpad);
 617static void xpad_deinit_input(struct usb_xpad *xpad);
 618static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
 619
 620/*
 621 *	xpad_process_packet
 622 *
 623 *	Completes a request by converting the data into events for the
 624 *	input subsystem.
 625 *
 626 *	The used report descriptor was taken from ITO Takayukis website:
 627 *	 http://euc.jp/periphs/xbox-controller.ja.html
 628 */
 629static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 630{
 631	struct input_dev *dev = xpad->dev;
 632
 633	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 634		/* left stick */
 635		input_report_abs(dev, ABS_X,
 636				 (__s16) le16_to_cpup((__le16 *)(data + 12)));
 637		input_report_abs(dev, ABS_Y,
 638				 ~(__s16) le16_to_cpup((__le16 *)(data + 14)));
 639
 640		/* right stick */
 641		input_report_abs(dev, ABS_RX,
 642				 (__s16) le16_to_cpup((__le16 *)(data + 16)));
 643		input_report_abs(dev, ABS_RY,
 644				 ~(__s16) le16_to_cpup((__le16 *)(data + 18)));
 645	}
 646
 647	/* triggers left/right */
 648	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
 649		input_report_key(dev, BTN_TL2, data[10]);
 650		input_report_key(dev, BTN_TR2, data[11]);
 651	} else {
 652		input_report_abs(dev, ABS_Z, data[10]);
 653		input_report_abs(dev, ABS_RZ, data[11]);
 654	}
 655
 656	/* digital pad */
 657	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
 658		/* dpad as buttons (left, right, up, down) */
 659		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
 660		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
 661		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
 662		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
 663	} else {
 664		input_report_abs(dev, ABS_HAT0X,
 665				 !!(data[2] & 0x08) - !!(data[2] & 0x04));
 666		input_report_abs(dev, ABS_HAT0Y,
 667				 !!(data[2] & 0x02) - !!(data[2] & 0x01));
 668	}
 669
 670	/* start/back buttons and stick press left/right */
 671	input_report_key(dev, BTN_START,  data[2] & 0x10);
 672	input_report_key(dev, BTN_SELECT, data[2] & 0x20);
 673	input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
 674	input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
 675
 676	/* "analog" buttons A, B, X, Y */
 677	input_report_key(dev, BTN_A, data[4]);
 678	input_report_key(dev, BTN_B, data[5]);
 679	input_report_key(dev, BTN_X, data[6]);
 680	input_report_key(dev, BTN_Y, data[7]);
 681
 682	/* "analog" buttons black, white */
 683	input_report_key(dev, BTN_C, data[8]);
 684	input_report_key(dev, BTN_Z, data[9]);
 685
 686	input_sync(dev);
 687}
 688
 689/*
 690 *	xpad360_process_packet
 691 *
 692 *	Completes a request by converting the data into events for the
 693 *	input subsystem. It is version for xbox 360 controller
 694 *
 695 *	The used report descriptor was taken from:
 696 *		http://www.free60.org/wiki/Gamepad
 697 */
 698
 699static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
 700				   u16 cmd, unsigned char *data)
 701{
 702	/* valid pad data */
 703	if (data[0] != 0x00)
 704		return;
 705
 706	/* digital pad */
 707	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
 708		/* dpad as buttons (left, right, up, down) */
 709		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
 710		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
 711		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
 712		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
 713	}
 714
 715	/*
 716	 * This should be a simple else block. However historically
 717	 * xbox360w has mapped DPAD to buttons while xbox360 did not. This
 718	 * made no sense, but now we can not just switch back and have to
 719	 * support both behaviors.
 720	 */
 721	if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
 722	    xpad->xtype == XTYPE_XBOX360W) {
 723		input_report_abs(dev, ABS_HAT0X,
 724				 !!(data[2] & 0x08) - !!(data[2] & 0x04));
 725		input_report_abs(dev, ABS_HAT0Y,
 726				 !!(data[2] & 0x02) - !!(data[2] & 0x01));
 727	}
 728
 729	/* start/back buttons */
 730	input_report_key(dev, BTN_START,  data[2] & 0x10);
 731	input_report_key(dev, BTN_SELECT, data[2] & 0x20);
 732
 733	/* stick press left/right */
 734	input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
 735	input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
 736
 737	/* buttons A,B,X,Y,TL,TR and MODE */
 738	input_report_key(dev, BTN_A,	data[3] & 0x10);
 739	input_report_key(dev, BTN_B,	data[3] & 0x20);
 740	input_report_key(dev, BTN_X,	data[3] & 0x40);
 741	input_report_key(dev, BTN_Y,	data[3] & 0x80);
 742	input_report_key(dev, BTN_TL,	data[3] & 0x01);
 743	input_report_key(dev, BTN_TR,	data[3] & 0x02);
 744	input_report_key(dev, BTN_MODE,	data[3] & 0x04);
 745
 746	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 747		/* left stick */
 748		input_report_abs(dev, ABS_X,
 749				 (__s16) le16_to_cpup((__le16 *)(data + 6)));
 750		input_report_abs(dev, ABS_Y,
 751				 ~(__s16) le16_to_cpup((__le16 *)(data + 8)));
 752
 753		/* right stick */
 754		input_report_abs(dev, ABS_RX,
 755				 (__s16) le16_to_cpup((__le16 *)(data + 10)));
 756		input_report_abs(dev, ABS_RY,
 757				 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
 758	}
 759
 760	/* triggers left/right */
 761	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
 762		input_report_key(dev, BTN_TL2, data[4]);
 763		input_report_key(dev, BTN_TR2, data[5]);
 764	} else {
 765		input_report_abs(dev, ABS_Z, data[4]);
 766		input_report_abs(dev, ABS_RZ, data[5]);
 767	}
 768
 769	input_sync(dev);
 770}
 771
 772static void xpad_presence_work(struct work_struct *work)
 773{
 774	struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
 775	int error;
 776
 777	if (xpad->pad_present) {
 778		error = xpad_init_input(xpad);
 779		if (error) {
 780			/* complain only, not much else we can do here */
 781			dev_err(&xpad->dev->dev,
 782				"unable to init device: %d\n", error);
 783		} else {
 784			rcu_assign_pointer(xpad->x360w_dev, xpad->dev);
 785		}
 786	} else {
 787		RCU_INIT_POINTER(xpad->x360w_dev, NULL);
 788		synchronize_rcu();
 789		/*
 790		 * Now that we are sure xpad360w_process_packet is not
 791		 * using input device we can get rid of it.
 792		 */
 793		xpad_deinit_input(xpad);
 794	}
 795}
 796
 797/*
 798 * xpad360w_process_packet
 799 *
 800 * Completes a request by converting the data into events for the
 801 * input subsystem. It is version for xbox 360 wireless controller.
 802 *
 803 * Byte.Bit
 804 * 00.1 - Status change: The controller or headset has connected/disconnected
 805 *                       Bits 01.7 and 01.6 are valid
 806 * 01.7 - Controller present
 807 * 01.6 - Headset present
 808 * 01.1 - Pad state (Bytes 4+) valid
 809 *
 810 */
 811static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 812{
 813	struct input_dev *dev;
 814	bool present;
 815
 816	/* Presence change */
 817	if (data[0] & 0x08) {
 818		present = (data[1] & 0x80) != 0;
 819
 820		if (xpad->pad_present != present) {
 821			xpad->pad_present = present;
 822			schedule_work(&xpad->work);
 823		}
 824	}
 825
 826	/* Valid pad data */
 827	if (data[1] != 0x1)
 828		return;
 829
 830	rcu_read_lock();
 831	dev = rcu_dereference(xpad->x360w_dev);
 832	if (dev)
 833		xpad360_process_packet(xpad, dev, cmd, &data[4]);
 834	rcu_read_unlock();
 835}
 836
 837/*
 838 *	xpadone_process_packet
 839 *
 840 *	Completes a request by converting the data into events for the
 841 *	input subsystem. This version is for the Xbox One controller.
 842 *
 843 *	The report format was gleaned from
 844 *	https://github.com/kylelemons/xbox/blob/master/xbox.go
 845 */
 846static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 847{
 848	struct input_dev *dev = xpad->dev;
 849
 850	/* the xbox button has its own special report */
 851	if (data[0] == 0X07) {
 852		/*
 853		 * The Xbox One S controller requires these reports to be
 854		 * acked otherwise it continues sending them forever and
 855		 * won't report further mode button events.
 856		 */
 857		if (data[1] == 0x30)
 858			xpadone_ack_mode_report(xpad, data[2]);
 859
 860		input_report_key(dev, BTN_MODE, data[4] & 0x01);
 861		input_sync(dev);
 862		return;
 863	}
 864	/* check invalid packet */
 865	else if (data[0] != 0X20)
 866		return;
 867
 868	/* menu/view buttons */
 869	input_report_key(dev, BTN_START,  data[4] & 0x04);
 870	input_report_key(dev, BTN_SELECT, data[4] & 0x08);
 871	if (xpad->mapping & MAP_SELECT_BUTTON)
 872		input_report_key(dev, KEY_RECORD, data[22] & 0x01);
 873
 874	/* buttons A,B,X,Y */
 875	input_report_key(dev, BTN_A,	data[4] & 0x10);
 876	input_report_key(dev, BTN_B,	data[4] & 0x20);
 877	input_report_key(dev, BTN_X,	data[4] & 0x40);
 878	input_report_key(dev, BTN_Y,	data[4] & 0x80);
 879
 880	/* digital pad */
 881	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
 882		/* dpad as buttons (left, right, up, down) */
 883		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[5] & 0x04);
 884		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[5] & 0x08);
 885		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[5] & 0x01);
 886		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[5] & 0x02);
 887	} else {
 888		input_report_abs(dev, ABS_HAT0X,
 889				 !!(data[5] & 0x08) - !!(data[5] & 0x04));
 890		input_report_abs(dev, ABS_HAT0Y,
 891				 !!(data[5] & 0x02) - !!(data[5] & 0x01));
 892	}
 893
 894	/* TL/TR */
 895	input_report_key(dev, BTN_TL,	data[5] & 0x10);
 896	input_report_key(dev, BTN_TR,	data[5] & 0x20);
 897
 898	/* stick press left/right */
 899	input_report_key(dev, BTN_THUMBL, data[5] & 0x40);
 900	input_report_key(dev, BTN_THUMBR, data[5] & 0x80);
 901
 902	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 903		/* left stick */
 904		input_report_abs(dev, ABS_X,
 905				 (__s16) le16_to_cpup((__le16 *)(data + 10)));
 906		input_report_abs(dev, ABS_Y,
 907				 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
 908
 909		/* right stick */
 910		input_report_abs(dev, ABS_RX,
 911				 (__s16) le16_to_cpup((__le16 *)(data + 14)));
 912		input_report_abs(dev, ABS_RY,
 913				 ~(__s16) le16_to_cpup((__le16 *)(data + 16)));
 914	}
 915
 916	/* triggers left/right */
 917	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
 918		input_report_key(dev, BTN_TL2,
 919				 (__u16) le16_to_cpup((__le16 *)(data + 6)));
 920		input_report_key(dev, BTN_TR2,
 921				 (__u16) le16_to_cpup((__le16 *)(data + 8)));
 922	} else {
 923		input_report_abs(dev, ABS_Z,
 924				 (__u16) le16_to_cpup((__le16 *)(data + 6)));
 925		input_report_abs(dev, ABS_RZ,
 926				 (__u16) le16_to_cpup((__le16 *)(data + 8)));
 927	}
 928
 929	input_sync(dev);
 930}
 931
 932static void xpad_irq_in(struct urb *urb)
 933{
 934	struct usb_xpad *xpad = urb->context;
 935	struct device *dev = &xpad->intf->dev;
 936	int retval, status;
 937
 938	status = urb->status;
 939
 940	switch (status) {
 941	case 0:
 942		/* success */
 943		break;
 944	case -ECONNRESET:
 945	case -ENOENT:
 946	case -ESHUTDOWN:
 947		/* this urb is terminated, clean up */
 948		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
 949			__func__, status);
 950		return;
 951	default:
 952		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
 953			__func__, status);
 954		goto exit;
 955	}
 956
 957	switch (xpad->xtype) {
 958	case XTYPE_XBOX360:
 959		xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
 960		break;
 961	case XTYPE_XBOX360W:
 962		xpad360w_process_packet(xpad, 0, xpad->idata);
 963		break;
 964	case XTYPE_XBOXONE:
 965		xpadone_process_packet(xpad, 0, xpad->idata);
 966		break;
 967	default:
 968		xpad_process_packet(xpad, 0, xpad->idata);
 969	}
 970
 971exit:
 972	retval = usb_submit_urb(urb, GFP_ATOMIC);
 973	if (retval)
 974		dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
 975			__func__, retval);
 976}
 977
 978/* Callers must hold xpad->odata_lock spinlock */
 979static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
 980{
 981	const struct xboxone_init_packet *init_packet;
 982
 983	if (xpad->xtype != XTYPE_XBOXONE)
 984		return false;
 985
 986	/* Perform initialization sequence for Xbox One pads that require it */
 987	while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
 988		init_packet = &xboxone_init_packets[xpad->init_seq++];
 989
 990		if (init_packet->idVendor != 0 &&
 991		    init_packet->idVendor != xpad->dev->id.vendor)
 992			continue;
 993
 994		if (init_packet->idProduct != 0 &&
 995		    init_packet->idProduct != xpad->dev->id.product)
 996			continue;
 997
 998		/* This packet applies to our device, so prepare to send it */
 999		memcpy(xpad->odata, init_packet->data, init_packet->len);
1000		xpad->irq_out->transfer_buffer_length = init_packet->len;
1001
1002		/* Update packet with current sequence number */
1003		xpad->odata[2] = xpad->odata_serial++;
1004		return true;
1005	}
1006
1007	return false;
1008}
1009
1010/* Callers must hold xpad->odata_lock spinlock */
1011static bool xpad_prepare_next_out_packet(struct usb_xpad *xpad)
1012{
1013	struct xpad_output_packet *pkt, *packet = NULL;
1014	int i;
1015
1016	/* We may have init packets to send before we can send user commands */
1017	if (xpad_prepare_next_init_packet(xpad))
1018		return true;
1019
1020	for (i = 0; i < XPAD_NUM_OUT_PACKETS; i++) {
1021		if (++xpad->last_out_packet >= XPAD_NUM_OUT_PACKETS)
1022			xpad->last_out_packet = 0;
1023
1024		pkt = &xpad->out_packets[xpad->last_out_packet];
1025		if (pkt->pending) {
1026			dev_dbg(&xpad->intf->dev,
1027				"%s - found pending output packet %d\n",
1028				__func__, xpad->last_out_packet);
1029			packet = pkt;
1030			break;
1031		}
1032	}
1033
1034	if (packet) {
1035		memcpy(xpad->odata, packet->data, packet->len);
1036		xpad->irq_out->transfer_buffer_length = packet->len;
1037		packet->pending = false;
1038		return true;
1039	}
1040
1041	return false;
1042}
1043
1044/* Callers must hold xpad->odata_lock spinlock */
1045static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)
1046{
1047	int error;
1048
1049	if (!xpad->irq_out_active && xpad_prepare_next_out_packet(xpad)) {
1050		usb_anchor_urb(xpad->irq_out, &xpad->irq_out_anchor);
1051		error = usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
1052		if (error) {
1053			dev_err(&xpad->intf->dev,
1054				"%s - usb_submit_urb failed with result %d\n",
1055				__func__, error);
1056			usb_unanchor_urb(xpad->irq_out);
1057			return -EIO;
1058		}
1059
1060		xpad->irq_out_active = true;
1061	}
1062
1063	return 0;
1064}
1065
1066static void xpad_irq_out(struct urb *urb)
1067{
1068	struct usb_xpad *xpad = urb->context;
1069	struct device *dev = &xpad->intf->dev;
1070	int status = urb->status;
1071	int error;
1072	unsigned long flags;
1073
1074	spin_lock_irqsave(&xpad->odata_lock, flags);
1075
1076	switch (status) {
1077	case 0:
1078		/* success */
1079		xpad->irq_out_active = xpad_prepare_next_out_packet(xpad);
1080		break;
1081
1082	case -ECONNRESET:
1083	case -ENOENT:
1084	case -ESHUTDOWN:
1085		/* this urb is terminated, clean up */
1086		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
1087			__func__, status);
1088		xpad->irq_out_active = false;
1089		break;
1090
1091	default:
1092		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
1093			__func__, status);
1094		break;
1095	}
1096
1097	if (xpad->irq_out_active) {
1098		usb_anchor_urb(urb, &xpad->irq_out_anchor);
1099		error = usb_submit_urb(urb, GFP_ATOMIC);
1100		if (error) {
1101			dev_err(dev,
1102				"%s - usb_submit_urb failed with result %d\n",
1103				__func__, error);
1104			usb_unanchor_urb(urb);
1105			xpad->irq_out_active = false;
1106		}
1107	}
1108
1109	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1110}
1111
1112static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad,
1113			struct usb_endpoint_descriptor *ep_irq_out)
1114{
1115	int error;
1116
1117	if (xpad->xtype == XTYPE_UNKNOWN)
1118		return 0;
1119
1120	init_usb_anchor(&xpad->irq_out_anchor);
1121
1122	xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN,
1123					 GFP_KERNEL, &xpad->odata_dma);
1124	if (!xpad->odata)
1125		return -ENOMEM;
1126
1127	spin_lock_init(&xpad->odata_lock);
1128
1129	xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
1130	if (!xpad->irq_out) {
1131		error = -ENOMEM;
1132		goto err_free_coherent;
1133	}
1134
1135	usb_fill_int_urb(xpad->irq_out, xpad->udev,
1136			 usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress),
1137			 xpad->odata, XPAD_PKT_LEN,
1138			 xpad_irq_out, xpad, ep_irq_out->bInterval);
1139	xpad->irq_out->transfer_dma = xpad->odata_dma;
1140	xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1141
1142	return 0;
1143
1144err_free_coherent:
1145	usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
1146	return error;
1147}
1148
1149static void xpad_stop_output(struct usb_xpad *xpad)
1150{
1151	if (xpad->xtype != XTYPE_UNKNOWN) {
1152		if (!usb_wait_anchor_empty_timeout(&xpad->irq_out_anchor,
1153						   5000)) {
1154			dev_warn(&xpad->intf->dev,
1155				 "timed out waiting for output URB to complete, killing\n");
1156			usb_kill_anchored_urbs(&xpad->irq_out_anchor);
1157		}
1158	}
1159}
1160
1161static void xpad_deinit_output(struct usb_xpad *xpad)
1162{
1163	if (xpad->xtype != XTYPE_UNKNOWN) {
1164		usb_free_urb(xpad->irq_out);
1165		usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
1166				xpad->odata, xpad->odata_dma);
1167	}
1168}
1169
1170static int xpad_inquiry_pad_presence(struct usb_xpad *xpad)
1171{
1172	struct xpad_output_packet *packet =
1173			&xpad->out_packets[XPAD_OUT_CMD_IDX];
1174	unsigned long flags;
1175	int retval;
1176
1177	spin_lock_irqsave(&xpad->odata_lock, flags);
1178
1179	packet->data[0] = 0x08;
1180	packet->data[1] = 0x00;
1181	packet->data[2] = 0x0F;
1182	packet->data[3] = 0xC0;
1183	packet->data[4] = 0x00;
1184	packet->data[5] = 0x00;
1185	packet->data[6] = 0x00;
1186	packet->data[7] = 0x00;
1187	packet->data[8] = 0x00;
1188	packet->data[9] = 0x00;
1189	packet->data[10] = 0x00;
1190	packet->data[11] = 0x00;
1191	packet->len = 12;
1192	packet->pending = true;
1193
1194	/* Reset the sequence so we send out presence first */
1195	xpad->last_out_packet = -1;
1196	retval = xpad_try_sending_next_out_packet(xpad);
1197
1198	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1199
1200	return retval;
1201}
1202
1203static int xpad_start_xbox_one(struct usb_xpad *xpad)
1204{
1205	unsigned long flags;
1206	int retval;
1207
1208	spin_lock_irqsave(&xpad->odata_lock, flags);
1209
1210	/*
1211	 * Begin the init sequence by attempting to send a packet.
1212	 * We will cycle through the init packet sequence before
1213	 * sending any packets from the output ring.
1214	 */
1215	xpad->init_seq = 0;
1216	retval = xpad_try_sending_next_out_packet(xpad);
1217
1218	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1219
1220	return retval;
1221}
1222
1223static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num)
1224{
1225	unsigned long flags;
1226	struct xpad_output_packet *packet =
1227			&xpad->out_packets[XPAD_OUT_CMD_IDX];
1228	static const u8 mode_report_ack[] = {
1229		0x01, 0x20, 0x00, 0x09, 0x00, 0x07, 0x20, 0x02,
1230		0x00, 0x00, 0x00, 0x00, 0x00
1231	};
1232
1233	spin_lock_irqsave(&xpad->odata_lock, flags);
1234
1235	packet->len = sizeof(mode_report_ack);
1236	memcpy(packet->data, mode_report_ack, packet->len);
1237	packet->data[2] = seq_num;
1238	packet->pending = true;
1239
1240	/* Reset the sequence so we send out the ack now */
1241	xpad->last_out_packet = -1;
1242	xpad_try_sending_next_out_packet(xpad);
1243
1244	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1245}
1246
1247#ifdef CONFIG_JOYSTICK_XPAD_FF
1248static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect)
1249{
1250	struct usb_xpad *xpad = input_get_drvdata(dev);
1251	struct xpad_output_packet *packet = &xpad->out_packets[XPAD_OUT_FF_IDX];
1252	__u16 strong;
1253	__u16 weak;
1254	int retval;
1255	unsigned long flags;
1256
1257	if (effect->type != FF_RUMBLE)
1258		return 0;
1259
1260	strong = effect->u.rumble.strong_magnitude;
1261	weak = effect->u.rumble.weak_magnitude;
1262
1263	spin_lock_irqsave(&xpad->odata_lock, flags);
1264
1265	switch (xpad->xtype) {
1266	case XTYPE_XBOX:
1267		packet->data[0] = 0x00;
1268		packet->data[1] = 0x06;
1269		packet->data[2] = 0x00;
1270		packet->data[3] = strong / 256;	/* left actuator */
1271		packet->data[4] = 0x00;
1272		packet->data[5] = weak / 256;	/* right actuator */
1273		packet->len = 6;
1274		packet->pending = true;
1275		break;
1276
1277	case XTYPE_XBOX360:
1278		packet->data[0] = 0x00;
1279		packet->data[1] = 0x08;
1280		packet->data[2] = 0x00;
1281		packet->data[3] = strong / 256;  /* left actuator? */
1282		packet->data[4] = weak / 256;	/* right actuator? */
1283		packet->data[5] = 0x00;
1284		packet->data[6] = 0x00;
1285		packet->data[7] = 0x00;
1286		packet->len = 8;
1287		packet->pending = true;
1288		break;
1289
1290	case XTYPE_XBOX360W:
1291		packet->data[0] = 0x00;
1292		packet->data[1] = 0x01;
1293		packet->data[2] = 0x0F;
1294		packet->data[3] = 0xC0;
1295		packet->data[4] = 0x00;
1296		packet->data[5] = strong / 256;
1297		packet->data[6] = weak / 256;
1298		packet->data[7] = 0x00;
1299		packet->data[8] = 0x00;
1300		packet->data[9] = 0x00;
1301		packet->data[10] = 0x00;
1302		packet->data[11] = 0x00;
1303		packet->len = 12;
1304		packet->pending = true;
1305		break;
1306
1307	case XTYPE_XBOXONE:
1308		packet->data[0] = 0x09; /* activate rumble */
1309		packet->data[1] = 0x00;
1310		packet->data[2] = xpad->odata_serial++;
1311		packet->data[3] = 0x09;
1312		packet->data[4] = 0x00;
1313		packet->data[5] = 0x0F;
1314		packet->data[6] = 0x00;
1315		packet->data[7] = 0x00;
1316		packet->data[8] = strong / 512;	/* left actuator */
1317		packet->data[9] = weak / 512;	/* right actuator */
1318		packet->data[10] = 0xFF; /* on period */
1319		packet->data[11] = 0x00; /* off period */
1320		packet->data[12] = 0xFF; /* repeat count */
1321		packet->len = 13;
1322		packet->pending = true;
1323		break;
1324
1325	default:
1326		dev_dbg(&xpad->dev->dev,
1327			"%s - rumble command sent to unsupported xpad type: %d\n",
1328			__func__, xpad->xtype);
1329		retval = -EINVAL;
1330		goto out;
1331	}
1332
1333	retval = xpad_try_sending_next_out_packet(xpad);
1334
1335out:
1336	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1337	return retval;
1338}
1339
1340static int xpad_init_ff(struct usb_xpad *xpad)
1341{
1342	if (xpad->xtype == XTYPE_UNKNOWN)
1343		return 0;
1344
1345	input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
1346
1347	return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect);
1348}
1349
1350#else
1351static int xpad_init_ff(struct usb_xpad *xpad) { return 0; }
1352#endif
1353
1354#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
1355#include <linux/leds.h>
1356#include <linux/idr.h>
1357
1358static DEFINE_IDA(xpad_pad_seq);
1359
1360struct xpad_led {
1361	char name[16];
1362	struct led_classdev led_cdev;
1363	struct usb_xpad *xpad;
1364};
1365
1366/*
1367 * set the LEDs on Xbox360 / Wireless Controllers
1368 * @param command
1369 *  0: off
1370 *  1: all blink, then previous setting
1371 *  2: 1/top-left blink, then on
1372 *  3: 2/top-right blink, then on
1373 *  4: 3/bottom-left blink, then on
1374 *  5: 4/bottom-right blink, then on
1375 *  6: 1/top-left on
1376 *  7: 2/top-right on
1377 *  8: 3/bottom-left on
1378 *  9: 4/bottom-right on
1379 * 10: rotate
1380 * 11: blink, based on previous setting
1381 * 12: slow blink, based on previous setting
1382 * 13: rotate with two lights
1383 * 14: persistent slow all blink
1384 * 15: blink once, then previous setting
1385 */
1386static void xpad_send_led_command(struct usb_xpad *xpad, int command)
1387{
1388	struct xpad_output_packet *packet =
1389			&xpad->out_packets[XPAD_OUT_LED_IDX];
1390	unsigned long flags;
1391
1392	command %= 16;
1393
1394	spin_lock_irqsave(&xpad->odata_lock, flags);
1395
1396	switch (xpad->xtype) {
1397	case XTYPE_XBOX360:
1398		packet->data[0] = 0x01;
1399		packet->data[1] = 0x03;
1400		packet->data[2] = command;
1401		packet->len = 3;
1402		packet->pending = true;
1403		break;
1404
1405	case XTYPE_XBOX360W:
1406		packet->data[0] = 0x00;
1407		packet->data[1] = 0x00;
1408		packet->data[2] = 0x08;
1409		packet->data[3] = 0x40 + command;
1410		packet->data[4] = 0x00;
1411		packet->data[5] = 0x00;
1412		packet->data[6] = 0x00;
1413		packet->data[7] = 0x00;
1414		packet->data[8] = 0x00;
1415		packet->data[9] = 0x00;
1416		packet->data[10] = 0x00;
1417		packet->data[11] = 0x00;
1418		packet->len = 12;
1419		packet->pending = true;
1420		break;
1421	}
1422
1423	xpad_try_sending_next_out_packet(xpad);
1424
1425	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1426}
1427
1428/*
1429 * Light up the segment corresponding to the pad number on
1430 * Xbox 360 Controllers.
1431 */
1432static void xpad_identify_controller(struct usb_xpad *xpad)
1433{
1434	led_set_brightness(&xpad->led->led_cdev, (xpad->pad_nr % 4) + 2);
1435}
1436
1437static void xpad_led_set(struct led_classdev *led_cdev,
1438			 enum led_brightness value)
1439{
1440	struct xpad_led *xpad_led = container_of(led_cdev,
1441						 struct xpad_led, led_cdev);
1442
1443	xpad_send_led_command(xpad_led->xpad, value);
1444}
1445
1446static int xpad_led_probe(struct usb_xpad *xpad)
1447{
1448	struct xpad_led *led;
1449	struct led_classdev *led_cdev;
1450	int error;
1451
1452	if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX360W)
1453		return 0;
1454
1455	xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL);
1456	if (!led)
1457		return -ENOMEM;
1458
1459	xpad->pad_nr = ida_simple_get(&xpad_pad_seq, 0, 0, GFP_KERNEL);
1460	if (xpad->pad_nr < 0) {
1461		error = xpad->pad_nr;
1462		goto err_free_mem;
1463	}
1464
1465	snprintf(led->name, sizeof(led->name), "xpad%d", xpad->pad_nr);
1466	led->xpad = xpad;
1467
1468	led_cdev = &led->led_cdev;
1469	led_cdev->name = led->name;
1470	led_cdev->brightness_set = xpad_led_set;
1471	led_cdev->flags = LED_CORE_SUSPENDRESUME;
1472
1473	error = led_classdev_register(&xpad->udev->dev, led_cdev);
1474	if (error)
1475		goto err_free_id;
1476
1477	xpad_identify_controller(xpad);
1478
1479	return 0;
1480
1481err_free_id:
1482	ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1483err_free_mem:
1484	kfree(led);
1485	xpad->led = NULL;
1486	return error;
1487}
1488
1489static void xpad_led_disconnect(struct usb_xpad *xpad)
1490{
1491	struct xpad_led *xpad_led = xpad->led;
1492
1493	if (xpad_led) {
1494		led_classdev_unregister(&xpad_led->led_cdev);
1495		ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1496		kfree(xpad_led);
1497	}
1498}
1499#else
1500static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
1501static void xpad_led_disconnect(struct usb_xpad *xpad) { }
1502#endif
1503
1504static int xpad_start_input(struct usb_xpad *xpad)
1505{
1506	int error;
1507
1508	if (usb_submit_urb(xpad->irq_in, GFP_KERNEL))
1509		return -EIO;
1510
1511	if (xpad->xtype == XTYPE_XBOXONE) {
1512		error = xpad_start_xbox_one(xpad);
1513		if (error) {
1514			usb_kill_urb(xpad->irq_in);
1515			return error;
1516		}
1517	}
1518
1519	return 0;
1520}
1521
1522static void xpad_stop_input(struct usb_xpad *xpad)
1523{
1524	usb_kill_urb(xpad->irq_in);
1525}
1526
1527static void xpad360w_poweroff_controller(struct usb_xpad *xpad)
1528{
1529	unsigned long flags;
1530	struct xpad_output_packet *packet =
1531			&xpad->out_packets[XPAD_OUT_CMD_IDX];
1532
1533	spin_lock_irqsave(&xpad->odata_lock, flags);
1534
1535	packet->data[0] = 0x00;
1536	packet->data[1] = 0x00;
1537	packet->data[2] = 0x08;
1538	packet->data[3] = 0xC0;
1539	packet->data[4] = 0x00;
1540	packet->data[5] = 0x00;
1541	packet->data[6] = 0x00;
1542	packet->data[7] = 0x00;
1543	packet->data[8] = 0x00;
1544	packet->data[9] = 0x00;
1545	packet->data[10] = 0x00;
1546	packet->data[11] = 0x00;
1547	packet->len = 12;
1548	packet->pending = true;
1549
1550	/* Reset the sequence so we send out poweroff now */
1551	xpad->last_out_packet = -1;
1552	xpad_try_sending_next_out_packet(xpad);
1553
1554	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1555}
1556
1557static int xpad360w_start_input(struct usb_xpad *xpad)
1558{
1559	int error;
1560
1561	error = usb_submit_urb(xpad->irq_in, GFP_KERNEL);
1562	if (error)
1563		return -EIO;
1564
1565	/*
1566	 * Send presence packet.
1567	 * This will force the controller to resend connection packets.
1568	 * This is useful in the case we activate the module after the
1569	 * adapter has been plugged in, as it won't automatically
1570	 * send us info about the controllers.
1571	 */
1572	error = xpad_inquiry_pad_presence(xpad);
1573	if (error) {
1574		usb_kill_urb(xpad->irq_in);
1575		return error;
1576	}
1577
1578	return 0;
1579}
1580
1581static void xpad360w_stop_input(struct usb_xpad *xpad)
1582{
1583	usb_kill_urb(xpad->irq_in);
1584
1585	/* Make sure we are done with presence work if it was scheduled */
1586	flush_work(&xpad->work);
1587}
1588
1589static int xpad_open(struct input_dev *dev)
1590{
1591	struct usb_xpad *xpad = input_get_drvdata(dev);
1592
1593	return xpad_start_input(xpad);
1594}
1595
1596static void xpad_close(struct input_dev *dev)
1597{
1598	struct usb_xpad *xpad = input_get_drvdata(dev);
1599
1600	xpad_stop_input(xpad);
1601}
1602
1603static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs)
1604{
1605	struct usb_xpad *xpad = input_get_drvdata(input_dev);
 
1606
1607	switch (abs) {
1608	case ABS_X:
1609	case ABS_Y:
1610	case ABS_RX:
1611	case ABS_RY:	/* the two sticks */
1612		input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128);
1613		break;
1614	case ABS_Z:
1615	case ABS_RZ:	/* the triggers (if mapped to axes) */
1616		if (xpad->xtype == XTYPE_XBOXONE)
1617			input_set_abs_params(input_dev, abs, 0, 1023, 0, 0);
1618		else
1619			input_set_abs_params(input_dev, abs, 0, 255, 0, 0);
1620		break;
1621	case ABS_HAT0X:
1622	case ABS_HAT0Y:	/* the d-pad (only if dpad is mapped to axes */
1623		input_set_abs_params(input_dev, abs, -1, 1, 0, 0);
1624		break;
1625	default:
1626		input_set_abs_params(input_dev, abs, 0, 0, 0, 0);
1627		break;
1628	}
1629}
1630
1631static void xpad_deinit_input(struct usb_xpad *xpad)
1632{
1633	if (xpad->input_created) {
1634		xpad->input_created = false;
1635		xpad_led_disconnect(xpad);
1636		input_unregister_device(xpad->dev);
1637	}
1638}
1639
1640static int xpad_init_input(struct usb_xpad *xpad)
1641{
1642	struct input_dev *input_dev;
1643	int i, error;
1644
1645	input_dev = input_allocate_device();
1646	if (!input_dev)
1647		return -ENOMEM;
1648
1649	xpad->dev = input_dev;
1650	input_dev->name = xpad->name;
1651	input_dev->phys = xpad->phys;
1652	usb_to_input_id(xpad->udev, &input_dev->id);
1653
1654	if (xpad->xtype == XTYPE_XBOX360W) {
1655		/* x360w controllers and the receiver have different ids */
1656		input_dev->id.product = 0x02a1;
1657	}
1658
1659	input_dev->dev.parent = &xpad->intf->dev;
1660
1661	input_set_drvdata(input_dev, xpad);
1662
1663	if (xpad->xtype != XTYPE_XBOX360W) {
1664		input_dev->open = xpad_open;
1665		input_dev->close = xpad_close;
1666	}
1667
 
 
1668	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 
1669		/* set up axes */
1670		for (i = 0; xpad_abs[i] >= 0; i++)
1671			xpad_set_up_abs(input_dev, xpad_abs[i]);
1672	}
1673
1674	/* set up standard buttons */
1675	for (i = 0; xpad_common_btn[i] >= 0; i++)
1676		input_set_capability(input_dev, EV_KEY, xpad_common_btn[i]);
1677
1678	/* set up model-specific ones */
1679	if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W ||
1680	    xpad->xtype == XTYPE_XBOXONE) {
1681		for (i = 0; xpad360_btn[i] >= 0; i++)
1682			input_set_capability(input_dev, EV_KEY, xpad360_btn[i]);
1683		if (xpad->mapping & MAP_SELECT_BUTTON)
1684			input_set_capability(input_dev, EV_KEY, KEY_RECORD);
1685	} else {
1686		for (i = 0; xpad_btn[i] >= 0; i++)
1687			input_set_capability(input_dev, EV_KEY, xpad_btn[i]);
1688	}
1689
1690	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
1691		for (i = 0; xpad_btn_pad[i] >= 0; i++)
1692			input_set_capability(input_dev, EV_KEY,
1693					     xpad_btn_pad[i]);
1694	}
1695
1696	/*
1697	 * This should be a simple else block. However historically
1698	 * xbox360w has mapped DPAD to buttons while xbox360 did not. This
1699	 * made no sense, but now we can not just switch back and have to
1700	 * support both behaviors.
1701	 */
1702	if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
1703	    xpad->xtype == XTYPE_XBOX360W) {
1704		for (i = 0; xpad_abs_pad[i] >= 0; i++)
1705			xpad_set_up_abs(input_dev, xpad_abs_pad[i]);
1706	}
1707
1708	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
1709		for (i = 0; xpad_btn_triggers[i] >= 0; i++)
1710			input_set_capability(input_dev, EV_KEY,
1711					     xpad_btn_triggers[i]);
1712	} else {
1713		for (i = 0; xpad_abs_triggers[i] >= 0; i++)
1714			xpad_set_up_abs(input_dev, xpad_abs_triggers[i]);
1715	}
1716
1717	error = xpad_init_ff(xpad);
1718	if (error)
1719		goto err_free_input;
1720
1721	error = xpad_led_probe(xpad);
1722	if (error)
1723		goto err_destroy_ff;
1724
1725	error = input_register_device(xpad->dev);
1726	if (error)
1727		goto err_disconnect_led;
1728
1729	xpad->input_created = true;
1730	return 0;
1731
1732err_disconnect_led:
1733	xpad_led_disconnect(xpad);
1734err_destroy_ff:
1735	input_ff_destroy(input_dev);
1736err_free_input:
1737	input_free_device(input_dev);
1738	return error;
1739}
1740
1741static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)
1742{
1743	struct usb_device *udev = interface_to_usbdev(intf);
1744	struct usb_xpad *xpad;
1745	struct usb_endpoint_descriptor *ep_irq_in, *ep_irq_out;
1746	int i, error;
1747
1748	if (intf->cur_altsetting->desc.bNumEndpoints != 2)
1749		return -ENODEV;
1750
1751	for (i = 0; xpad_device[i].idVendor; i++) {
1752		if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) &&
1753		    (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct))
1754			break;
1755	}
1756
1757	xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
1758	if (!xpad)
1759		return -ENOMEM;
1760
1761	usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
1762	strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
1763
1764	xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN,
1765					 GFP_KERNEL, &xpad->idata_dma);
1766	if (!xpad->idata) {
1767		error = -ENOMEM;
1768		goto err_free_mem;
1769	}
1770
1771	xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
1772	if (!xpad->irq_in) {
1773		error = -ENOMEM;
1774		goto err_free_idata;
1775	}
1776
1777	xpad->udev = udev;
1778	xpad->intf = intf;
1779	xpad->mapping = xpad_device[i].mapping;
1780	xpad->xtype = xpad_device[i].xtype;
1781	xpad->name = xpad_device[i].name;
1782	INIT_WORK(&xpad->work, xpad_presence_work);
1783
1784	if (xpad->xtype == XTYPE_UNKNOWN) {
1785		if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
1786			if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
1787				xpad->xtype = XTYPE_XBOX360W;
1788			else if (intf->cur_altsetting->desc.bInterfaceProtocol == 208)
1789				xpad->xtype = XTYPE_XBOXONE;
1790			else
1791				xpad->xtype = XTYPE_XBOX360;
1792		} else {
1793			xpad->xtype = XTYPE_XBOX;
1794		}
1795
1796		if (dpad_to_buttons)
1797			xpad->mapping |= MAP_DPAD_TO_BUTTONS;
1798		if (triggers_to_buttons)
1799			xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS;
1800		if (sticks_to_null)
1801			xpad->mapping |= MAP_STICKS_TO_NULL;
1802	}
1803
1804	if (xpad->xtype == XTYPE_XBOXONE &&
1805	    intf->cur_altsetting->desc.bInterfaceNumber != 0) {
1806		/*
1807		 * The Xbox One controller lists three interfaces all with the
1808		 * same interface class, subclass and protocol. Differentiate by
1809		 * interface number.
1810		 */
1811		error = -ENODEV;
1812		goto err_free_in_urb;
1813	}
1814
1815	ep_irq_in = ep_irq_out = NULL;
1816
1817	for (i = 0; i < 2; i++) {
1818		struct usb_endpoint_descriptor *ep =
1819				&intf->cur_altsetting->endpoint[i].desc;
1820
1821		if (usb_endpoint_xfer_int(ep)) {
1822			if (usb_endpoint_dir_in(ep))
1823				ep_irq_in = ep;
1824			else
1825				ep_irq_out = ep;
1826		}
1827	}
1828
1829	if (!ep_irq_in || !ep_irq_out) {
1830		error = -ENODEV;
1831		goto err_free_in_urb;
1832	}
1833
1834	error = xpad_init_output(intf, xpad, ep_irq_out);
1835	if (error)
1836		goto err_free_in_urb;
1837
1838	usb_fill_int_urb(xpad->irq_in, udev,
1839			 usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
1840			 xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
1841			 xpad, ep_irq_in->bInterval);
1842	xpad->irq_in->transfer_dma = xpad->idata_dma;
1843	xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1844
1845	usb_set_intfdata(intf, xpad);
1846
1847	if (xpad->xtype == XTYPE_XBOX360W) {
1848		/*
1849		 * Submit the int URB immediately rather than waiting for open
1850		 * because we get status messages from the device whether
1851		 * or not any controllers are attached.  In fact, it's
1852		 * exactly the message that a controller has arrived that
1853		 * we're waiting for.
1854		 */
1855		error = xpad360w_start_input(xpad);
1856		if (error)
1857			goto err_deinit_output;
1858		/*
1859		 * Wireless controllers require RESET_RESUME to work properly
1860		 * after suspend. Ideally this quirk should be in usb core
1861		 * quirk list, but we have too many vendors producing these
1862		 * controllers and we'd need to maintain 2 identical lists
1863		 * here in this driver and in usb core.
1864		 */
1865		udev->quirks |= USB_QUIRK_RESET_RESUME;
1866	} else {
1867		error = xpad_init_input(xpad);
1868		if (error)
1869			goto err_deinit_output;
1870	}
1871	return 0;
1872
1873err_deinit_output:
1874	xpad_deinit_output(xpad);
1875err_free_in_urb:
1876	usb_free_urb(xpad->irq_in);
1877err_free_idata:
1878	usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
1879err_free_mem:
1880	kfree(xpad);
1881	return error;
1882}
1883
1884static void xpad_disconnect(struct usb_interface *intf)
1885{
1886	struct usb_xpad *xpad = usb_get_intfdata(intf);
1887
1888	if (xpad->xtype == XTYPE_XBOX360W)
1889		xpad360w_stop_input(xpad);
1890
1891	xpad_deinit_input(xpad);
1892
1893	/*
1894	 * Now that both input device and LED device are gone we can
1895	 * stop output URB.
1896	 */
1897	xpad_stop_output(xpad);
1898
1899	xpad_deinit_output(xpad);
1900
1901	usb_free_urb(xpad->irq_in);
1902	usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
1903			xpad->idata, xpad->idata_dma);
1904
1905	kfree(xpad);
1906
1907	usb_set_intfdata(intf, NULL);
1908}
1909
1910static int xpad_suspend(struct usb_interface *intf, pm_message_t message)
1911{
1912	struct usb_xpad *xpad = usb_get_intfdata(intf);
1913	struct input_dev *input = xpad->dev;
1914
1915	if (xpad->xtype == XTYPE_XBOX360W) {
1916		/*
1917		 * Wireless controllers always listen to input so
1918		 * they are notified when controller shows up
1919		 * or goes away.
1920		 */
1921		xpad360w_stop_input(xpad);
1922
1923		/*
1924		 * The wireless adapter is going off now, so the
1925		 * gamepads are going to become disconnected.
1926		 * Unless explicitly disabled, power them down
1927		 * so they don't just sit there flashing.
1928		 */
1929		if (auto_poweroff && xpad->pad_present)
1930			xpad360w_poweroff_controller(xpad);
1931	} else {
1932		mutex_lock(&input->mutex);
1933		if (input_device_enabled(input))
1934			xpad_stop_input(xpad);
1935		mutex_unlock(&input->mutex);
1936	}
1937
1938	xpad_stop_output(xpad);
1939
1940	return 0;
1941}
1942
1943static int xpad_resume(struct usb_interface *intf)
1944{
1945	struct usb_xpad *xpad = usb_get_intfdata(intf);
1946	struct input_dev *input = xpad->dev;
1947	int retval = 0;
1948
1949	if (xpad->xtype == XTYPE_XBOX360W) {
1950		retval = xpad360w_start_input(xpad);
1951	} else {
1952		mutex_lock(&input->mutex);
1953		if (input_device_enabled(input)) {
1954			retval = xpad_start_input(xpad);
1955		} else if (xpad->xtype == XTYPE_XBOXONE) {
1956			/*
1957			 * Even if there are no users, we'll send Xbox One pads
1958			 * the startup sequence so they don't sit there and
1959			 * blink until somebody opens the input device again.
1960			 */
1961			retval = xpad_start_xbox_one(xpad);
1962		}
1963		mutex_unlock(&input->mutex);
1964	}
1965
1966	return retval;
1967}
1968
1969static struct usb_driver xpad_driver = {
1970	.name		= "xpad",
1971	.probe		= xpad_probe,
1972	.disconnect	= xpad_disconnect,
1973	.suspend	= xpad_suspend,
1974	.resume		= xpad_resume,
1975	.reset_resume	= xpad_resume,
1976	.id_table	= xpad_table,
1977};
1978
1979module_usb_driver(xpad_driver);
1980
1981MODULE_AUTHOR("Marko Friedemann <mfr@bmx-chemnitz.de>");
1982MODULE_DESCRIPTION("X-Box pad driver");
1983MODULE_LICENSE("GPL");
v4.17
 
   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 *               2010 Christoph Fritz <chf.fritz@googlemail.com>
  13 *
  14 * This program is free software; you can redistribute it and/or
  15 * modify it under the terms of the GNU General Public License as
  16 * published by the Free Software Foundation; either version 2 of
  17 * the License, or (at your option) any later version.
  18 *
  19 * This program is distributed in the hope that it will be useful,
  20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 * GNU General Public License for more details.
  23 *
  24 * You should have received a copy of the GNU General Public License
  25 * along with this program; if not, write to the Free Software
  26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  27 *
  28 *
  29 * This driver is based on:
  30 *  - information from     http://euc.jp/periphs/xbox-controller.ja.html
  31 *  - the iForce driver    drivers/char/joystick/iforce.c
  32 *  - the skeleton-driver  drivers/usb/usb-skeleton.c
  33 *  - Xbox 360 information http://www.free60.org/wiki/Gamepad
  34 *  - Xbox One information https://github.com/quantus/xbox-one-controller-protocol
  35 *
  36 * Thanks to:
  37 *  - ITO Takayuki for providing essential xpad information on his website
  38 *  - Vojtech Pavlik     - iforce driver / input subsystem
  39 *  - Greg Kroah-Hartman - usb-skeleton driver
  40 *  - XBOX Linux project - extra USB id's
  41 *  - Pekka Pöyry (quantus) - Xbox One controller reverse engineering
  42 *
  43 * TODO:
  44 *  - fine tune axes (especially trigger axes)
  45 *  - fix "analog" buttons (reported as digital now)
  46 *  - get rumble working
  47 *  - need USB IDs for other dance pads
  48 *
  49 * History:
  50 *
  51 * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller"
  52 *
  53 * 2002-07-02 - 0.0.2 : basic working version
  54 *  - all axes and 9 of the 10 buttons work (german InterAct device)
  55 *  - the black button does not work
  56 *
  57 * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik
  58 *  - indentation fixes
  59 *  - usb + input init sequence fixes
  60 *
  61 * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3
  62 *  - verified the lack of HID and report descriptors
  63 *  - verified that ALL buttons WORK
  64 *  - fixed d-pad to axes mapping
  65 *
  66 * 2002-07-17 - 0.0.5 : simplified d-pad handling
  67 *
  68 * 2004-10-02 - 0.0.6 : DDR pad support
  69 *  - borrowed from the XBOX linux kernel
  70 *  - USB id's for commonly used dance pads are present
  71 *  - dance pads will map D-PAD to buttons, not axes
  72 *  - pass the module paramater 'dpad_to_buttons' to force
  73 *    the D-PAD to map to buttons if your pad is not detected
  74 *
  75 * Later changes can be tracked in SCM.
  76 */
  77
  78#include <linux/kernel.h>
  79#include <linux/input.h>
  80#include <linux/rcupdate.h>
  81#include <linux/slab.h>
  82#include <linux/stat.h>
  83#include <linux/module.h>
  84#include <linux/usb/input.h>
  85#include <linux/usb/quirks.h>
  86
  87#define XPAD_PKT_LEN 64
  88
  89/* xbox d-pads should map to buttons, as is required for DDR pads
  90   but we map them to axes when possible to simplify things */
 
 
  91#define MAP_DPAD_TO_BUTTONS		(1 << 0)
  92#define MAP_TRIGGERS_TO_BUTTONS		(1 << 1)
  93#define MAP_STICKS_TO_NULL		(1 << 2)
 
  94#define DANCEPAD_MAP_CONFIG	(MAP_DPAD_TO_BUTTONS |			\
  95				MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
  96
  97#define XTYPE_XBOX        0
  98#define XTYPE_XBOX360     1
  99#define XTYPE_XBOX360W    2
 100#define XTYPE_XBOXONE     3
 101#define XTYPE_UNKNOWN     4
 102
 103static bool dpad_to_buttons;
 104module_param(dpad_to_buttons, bool, S_IRUGO);
 105MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
 106
 107static bool triggers_to_buttons;
 108module_param(triggers_to_buttons, bool, S_IRUGO);
 109MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads");
 110
 111static bool sticks_to_null;
 112module_param(sticks_to_null, bool, S_IRUGO);
 113MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads");
 114
 115static bool auto_poweroff = true;
 116module_param(auto_poweroff, bool, S_IWUSR | S_IRUGO);
 117MODULE_PARM_DESC(auto_poweroff, "Power off wireless controllers on suspend");
 118
 119static const struct xpad_device {
 120	u16 idVendor;
 121	u16 idProduct;
 122	char *name;
 123	u8 mapping;
 124	u8 xtype;
 125} xpad_device[] = {
 
 126	{ 0x044f, 0x0f00, "Thrustmaster Wheel", 0, XTYPE_XBOX },
 127	{ 0x044f, 0x0f03, "Thrustmaster Wheel", 0, XTYPE_XBOX },
 128	{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
 129	{ 0x044f, 0x0f10, "Thrustmaster Modena GT Wheel", 0, XTYPE_XBOX },
 130	{ 0x044f, 0xb326, "Thrustmaster Gamepad GP XID", 0, XTYPE_XBOX360 },
 131	{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
 132	{ 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
 133	{ 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
 134	{ 0x045e, 0x0288, "Microsoft Xbox Controller S v2", 0, XTYPE_XBOX },
 135	{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
 136	{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
 137	{ 0x045e, 0x028f, "Microsoft X-Box 360 pad v2", 0, XTYPE_XBOX360 },
 138	{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
 139	{ 0x045e, 0x02d1, "Microsoft X-Box One pad", 0, XTYPE_XBOXONE },
 140	{ 0x045e, 0x02dd, "Microsoft X-Box One pad (Firmware 2015)", 0, XTYPE_XBOXONE },
 141	{ 0x045e, 0x02e3, "Microsoft X-Box One Elite pad", 0, XTYPE_XBOXONE },
 142	{ 0x045e, 0x02ea, "Microsoft X-Box One S pad", 0, XTYPE_XBOXONE },
 143	{ 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
 
 144	{ 0x046d, 0xc21d, "Logitech Gamepad F310", 0, XTYPE_XBOX360 },
 145	{ 0x046d, 0xc21e, "Logitech Gamepad F510", 0, XTYPE_XBOX360 },
 146	{ 0x046d, 0xc21f, "Logitech Gamepad F710", 0, XTYPE_XBOX360 },
 147	{ 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
 148	{ 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
 149	{ 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX },
 150	{ 0x046d, 0xca8a, "Logitech Precision Vibration Feedback Wheel", 0, XTYPE_XBOX },
 151	{ 0x046d, 0xcaa3, "Logitech DriveFx Racing Wheel", 0, XTYPE_XBOX360 },
 152	{ 0x056e, 0x2004, "Elecom JC-U3613M", 0, XTYPE_XBOX360 },
 153	{ 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX },
 154	{ 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX },
 155	{ 0x05fe, 0x3030, "Chic Controller", 0, XTYPE_XBOX },
 156	{ 0x05fe, 0x3031, "Chic Controller", 0, XTYPE_XBOX },
 157	{ 0x062a, 0x0020, "Logic3 Xbox GamePad", 0, XTYPE_XBOX },
 158	{ 0x062a, 0x0033, "Competition Pro Steering Wheel", 0, XTYPE_XBOX },
 159	{ 0x06a3, 0x0200, "Saitek Racing Wheel", 0, XTYPE_XBOX },
 160	{ 0x06a3, 0x0201, "Saitek Adrenalin", 0, XTYPE_XBOX },
 161	{ 0x06a3, 0xf51a, "Saitek P3600", 0, XTYPE_XBOX360 },
 162	{ 0x0738, 0x4506, "Mad Catz 4506 Wireless Controller", 0, XTYPE_XBOX },
 163	{ 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX },
 164	{ 0x0738, 0x4520, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
 165	{ 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX },
 166	{ 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
 167	{ 0x0738, 0x4530, "Mad Catz Universal MC2 Racing Wheel and Pedals", 0, XTYPE_XBOX },
 168	{ 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX },
 169	{ 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 170	{ 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
 171	{ 0x0738, 0x4586, "Mad Catz MicroCon Wireless Controller", 0, XTYPE_XBOX },
 172	{ 0x0738, 0x4588, "Mad Catz Blaster", 0, XTYPE_XBOX },
 173	{ 0x0738, 0x45ff, "Mad Catz Beat Pad (w/ Handle)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 174	{ 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
 175	{ 0x0738, 0x4718, "Mad Catz Street Fighter IV FightStick SE", 0, XTYPE_XBOX360 },
 176	{ 0x0738, 0x4726, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
 177	{ 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 178	{ 0x0738, 0x4736, "Mad Catz MicroCon Gamepad", 0, XTYPE_XBOX360 },
 179	{ 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 180	{ 0x0738, 0x4740, "Mad Catz Beat Pad", 0, XTYPE_XBOX360 },
 181	{ 0x0738, 0x4743, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 182	{ 0x0738, 0x4758, "Mad Catz Arcade Game Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 183	{ 0x0738, 0x4a01, "Mad Catz FightStick TE 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 184	{ 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 185	{ 0x0738, 0x9871, "Mad Catz Portable Drum", 0, XTYPE_XBOX360 },
 186	{ 0x0738, 0xb726, "Mad Catz Xbox controller - MW2", 0, XTYPE_XBOX360 },
 187	{ 0x0738, 0xb738, "Mad Catz MVC2TE Stick 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 188	{ 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
 189	{ 0x0738, 0xcb02, "Saitek Cyborg Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
 190	{ 0x0738, 0xcb03, "Saitek P3200 Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
 191	{ 0x0738, 0xcb29, "Saitek Aviator Stick AV8R02", 0, XTYPE_XBOX360 },
 192	{ 0x0738, 0xf738, "Super SFIV FightStick TE S", 0, XTYPE_XBOX360 },
 193	{ 0x07ff, 0xffff, "Mad Catz GamePad", 0, XTYPE_XBOX360 },
 194	{ 0x0c12, 0x0005, "Intec wireless", 0, XTYPE_XBOX },
 195	{ 0x0c12, 0x8801, "Nyko Xbox Controller", 0, XTYPE_XBOX },
 196	{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
 197	{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
 198	{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
 199	{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
 200	{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
 201	{ 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 202	{ 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX },
 203	{ 0x0e4c, 0x1103, "Radica Gamester Reflex", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX },
 204	{ 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX },
 205	{ 0x0e4c, 0x3510, "Radica Gamester", 0, XTYPE_XBOX },
 206	{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
 207	{ 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
 208	{ 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
 209	{ 0x0e6f, 0x0008, "After Glow Pro Controller", 0, XTYPE_XBOX },
 210	{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 211	{ 0x0e6f, 0x0113, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 212	{ 0x0e6f, 0x011f, "Rock Candy Gamepad Wired Controller", 0, XTYPE_XBOX360 },
 213	{ 0x0e6f, 0x0131, "PDP EA Sports Controller", 0, XTYPE_XBOX360 },
 214	{ 0x0e6f, 0x0133, "Xbox 360 Wired Controller", 0, XTYPE_XBOX360 },
 215	{ 0x0e6f, 0x0139, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
 216	{ 0x0e6f, 0x013a, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 217	{ 0x0e6f, 0x0146, "Rock Candy Wired Controller for Xbox One", 0, XTYPE_XBOXONE },
 218	{ 0x0e6f, 0x0147, "PDP Marvel Xbox One Controller", 0, XTYPE_XBOXONE },
 219	{ 0x0e6f, 0x015c, "PDP Xbox One Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 220	{ 0x0e6f, 0x0161, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 221	{ 0x0e6f, 0x0162, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 222	{ 0x0e6f, 0x0163, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
 223	{ 0x0e6f, 0x0164, "PDP Battlefield One", 0, XTYPE_XBOXONE },
 224	{ 0x0e6f, 0x0165, "PDP Titanfall 2", 0, XTYPE_XBOXONE },
 225	{ 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
 226	{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 227	{ 0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 228	{ 0x0e6f, 0x0246, "Rock Candy Gamepad for Xbox One 2015", 0, XTYPE_XBOXONE },
 
 
 
 
 
 
 
 229	{ 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE },
 230	{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
 
 
 231	{ 0x0e6f, 0x0301, "Logic3 Controller", 0, XTYPE_XBOX360 },
 232	{ 0x0e6f, 0x0346, "Rock Candy Gamepad for Xbox One 2016", 0, XTYPE_XBOXONE },
 233	{ 0x0e6f, 0x0401, "Logic3 Controller", 0, XTYPE_XBOX360 },
 234	{ 0x0e6f, 0x0413, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 235	{ 0x0e6f, 0x0501, "PDP Xbox 360 Controller", 0, XTYPE_XBOX360 },
 236	{ 0x0e6f, 0xf900, "PDP Afterglow AX.1", 0, XTYPE_XBOX360 },
 237	{ 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
 238	{ 0x0e8f, 0x3008, "Generic xbox control (dealextreme)", 0, XTYPE_XBOX },
 239	{ 0x0f0d, 0x000a, "Hori Co. DOA4 FightStick", 0, XTYPE_XBOX360 },
 240	{ 0x0f0d, 0x000c, "Hori PadEX Turbo", 0, XTYPE_XBOX360 },
 241	{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 242	{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 243	{ 0x0f0d, 0x001b, "Hori Real Arcade Pro VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 244	{ 0x0f0d, 0x0063, "Hori Real Arcade Pro Hayabusa (USA) Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 245	{ 0x0f0d, 0x0067, "HORIPAD ONE", 0, XTYPE_XBOXONE },
 246	{ 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 247	{ 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX },
 248	{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
 249	{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
 250	{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
 
 
 251	{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
 
 252	{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 253	{ 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 },
 254	{ 0x12ab, 0x0303, "Mortal Kombat Klassic FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 255	{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 256	{ 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
 257	{ 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
 258	{ 0x1430, 0xf801, "RedOctane Controller", 0, XTYPE_XBOX360 },
 259	{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
 260	{ 0x1532, 0x0037, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 261	{ 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
 262	{ 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
 263	{ 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
 264	{ 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
 265	{ 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 },
 266	{ 0x162e, 0xbeef, "Joytech Neo-Se Take2", 0, XTYPE_XBOX360 },
 267	{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", 0, XTYPE_XBOX360 },
 268	{ 0x1689, 0xfd01, "Razer Onza Classic Edition", 0, XTYPE_XBOX360 },
 269	{ 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 
 270	{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
 271	{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 272	{ 0x1bad, 0x0130, "Ion Drum Rocker", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
 273	{ 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
 274	{ 0x1bad, 0xf018, "Mad Catz Street Fighter IV SE Fighting Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 275	{ 0x1bad, 0xf019, "Mad Catz Brawlstick for Xbox 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 276	{ 0x1bad, 0xf021, "Mad Cats Ghost Recon FS GamePad", 0, XTYPE_XBOX360 },
 277	{ 0x1bad, 0xf023, "MLG Pro Circuit Controller (Xbox)", 0, XTYPE_XBOX360 },
 278	{ 0x1bad, 0xf025, "Mad Catz Call Of Duty", 0, XTYPE_XBOX360 },
 279	{ 0x1bad, 0xf027, "Mad Catz FPS Pro", 0, XTYPE_XBOX360 },
 280	{ 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
 281	{ 0x1bad, 0xf02e, "Mad Catz Fightpad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 282	{ 0x1bad, 0xf030, "Mad Catz Xbox 360 MC2 MicroCon Racing Wheel", 0, XTYPE_XBOX360 },
 283	{ 0x1bad, 0xf036, "Mad Catz MicroCon GamePad Pro", 0, XTYPE_XBOX360 },
 284	{ 0x1bad, 0xf038, "Street Fighter IV FightStick TE", 0, XTYPE_XBOX360 },
 285	{ 0x1bad, 0xf039, "Mad Catz MvC2 TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 286	{ 0x1bad, 0xf03a, "Mad Catz SFxT Fightstick Pro", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 287	{ 0x1bad, 0xf03d, "Street Fighter IV Arcade Stick TE - Chun Li", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 288	{ 0x1bad, 0xf03e, "Mad Catz MLG FightStick TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 289	{ 0x1bad, 0xf03f, "Mad Catz FightStick SoulCaliber", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 290	{ 0x1bad, 0xf042, "Mad Catz FightStick TES+", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 291	{ 0x1bad, 0xf080, "Mad Catz FightStick TE2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 292	{ 0x1bad, 0xf501, "HoriPad EX2 Turbo", 0, XTYPE_XBOX360 },
 293	{ 0x1bad, 0xf502, "Hori Real Arcade Pro.VX SA", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 294	{ 0x1bad, 0xf503, "Hori Fighting Stick VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 295	{ 0x1bad, 0xf504, "Hori Real Arcade Pro. EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 296	{ 0x1bad, 0xf505, "Hori Fighting Stick EX2B", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 297	{ 0x1bad, 0xf506, "Hori Real Arcade Pro.EX Premium VLX", 0, XTYPE_XBOX360 },
 298	{ 0x1bad, 0xf900, "Harmonix Xbox 360 Controller", 0, XTYPE_XBOX360 },
 299	{ 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
 300	{ 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
 301	{ 0x1bad, 0xf904, "PDP Versus Fighting Pad", 0, XTYPE_XBOX360 },
 302	{ 0x1bad, 0xf906, "MortalKombat FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 303	{ 0x1bad, 0xfa01, "MadCatz GamePad", 0, XTYPE_XBOX360 },
 304	{ 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
 305	{ 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
 
 
 
 
 306	{ 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 307	{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
 308	{ 0x24c6, 0x5303, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
 309	{ 0x24c6, 0x530a, "Xbox 360 Pro EX Controller", 0, XTYPE_XBOX360 },
 310	{ 0x24c6, 0x531a, "PowerA Pro Ex", 0, XTYPE_XBOX360 },
 311	{ 0x24c6, 0x5397, "FUS1ON Tournament Controller", 0, XTYPE_XBOX360 },
 312	{ 0x24c6, 0x541a, "PowerA Xbox One Mini Wired Controller", 0, XTYPE_XBOXONE },
 313	{ 0x24c6, 0x542a, "Xbox ONE spectra", 0, XTYPE_XBOXONE },
 314	{ 0x24c6, 0x543a, "PowerA Xbox One wired controller", 0, XTYPE_XBOXONE },
 315	{ 0x24c6, 0x5500, "Hori XBOX 360 EX 2 with Turbo", 0, XTYPE_XBOX360 },
 316	{ 0x24c6, 0x5501, "Hori Real Arcade Pro VX-SA", 0, XTYPE_XBOX360 },
 317	{ 0x24c6, 0x5502, "Hori Fighting Stick VX Alt", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 318	{ 0x24c6, 0x5503, "Hori Fighting Edge", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 319	{ 0x24c6, 0x5506, "Hori SOULCALIBUR V Stick", 0, XTYPE_XBOX360 },
 320	{ 0x24c6, 0x550d, "Hori GEM Xbox controller", 0, XTYPE_XBOX360 },
 321	{ 0x24c6, 0x550e, "Hori Real Arcade Pro V Kai 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
 322	{ 0x24c6, 0x551a, "PowerA FUSION Pro Controller", 0, XTYPE_XBOXONE },
 323	{ 0x24c6, 0x561a, "PowerA FUSION Controller", 0, XTYPE_XBOXONE },
 324	{ 0x24c6, 0x5b00, "ThrustMaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
 325	{ 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 },
 326	{ 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
 327	{ 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 328	{ 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
 
 329	{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
 330	{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
 331	{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
 332};
 333
 334/* buttons shared with xbox and xbox360 */
 335static const signed short xpad_common_btn[] = {
 336	BTN_A, BTN_B, BTN_X, BTN_Y,			/* "analog" buttons */
 337	BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR,	/* start/back/sticks */
 338	-1						/* terminating entry */
 339};
 340
 341/* original xbox controllers only */
 342static const signed short xpad_btn[] = {
 343	BTN_C, BTN_Z,		/* "analog" buttons */
 344	-1			/* terminating entry */
 345};
 346
 347/* used when dpad is mapped to buttons */
 348static const signed short xpad_btn_pad[] = {
 349	BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2,		/* d-pad left, right */
 350	BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4,		/* d-pad up, down */
 351	-1				/* terminating entry */
 352};
 353
 354/* used when triggers are mapped to buttons */
 355static const signed short xpad_btn_triggers[] = {
 356	BTN_TL2, BTN_TR2,		/* triggers left/right */
 357	-1
 358};
 359
 360static const signed short xpad360_btn[] = {  /* buttons for x360 controller */
 361	BTN_TL, BTN_TR,		/* Button LB/RB */
 362	BTN_MODE,		/* The big X button */
 363	-1
 364};
 365
 366static const signed short xpad_abs[] = {
 367	ABS_X, ABS_Y,		/* left stick */
 368	ABS_RX, ABS_RY,		/* right stick */
 369	-1			/* terminating entry */
 370};
 371
 372/* used when dpad is mapped to axes */
 373static const signed short xpad_abs_pad[] = {
 374	ABS_HAT0X, ABS_HAT0Y,	/* d-pad axes */
 375	-1			/* terminating entry */
 376};
 377
 378/* used when triggers are mapped to axes */
 379static const signed short xpad_abs_triggers[] = {
 380	ABS_Z, ABS_RZ,		/* triggers left/right */
 381	-1
 382};
 383
 384/*
 385 * Xbox 360 has a vendor-specific class, so we cannot match it with only
 386 * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we
 387 * match against vendor id as well. Wired Xbox 360 devices have protocol 1,
 388 * wireless controllers have protocol 129.
 389 */
 390#define XPAD_XBOX360_VENDOR_PROTOCOL(vend,pr) \
 391	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
 392	.idVendor = (vend), \
 393	.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
 394	.bInterfaceSubClass = 93, \
 395	.bInterfaceProtocol = (pr)
 396#define XPAD_XBOX360_VENDOR(vend) \
 397	{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
 398	{ XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
 399
 400/* The Xbox One controller uses subclass 71 and protocol 208. */
 401#define XPAD_XBOXONE_VENDOR_PROTOCOL(vend, pr) \
 402	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
 403	.idVendor = (vend), \
 404	.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
 405	.bInterfaceSubClass = 71, \
 406	.bInterfaceProtocol = (pr)
 407#define XPAD_XBOXONE_VENDOR(vend) \
 408	{ XPAD_XBOXONE_VENDOR_PROTOCOL(vend, 208) }
 409
 410static const struct usb_device_id xpad_table[] = {
 411	{ USB_INTERFACE_INFO('X', 'B', 0) },	/* X-Box USB-IF not approved class */
 
 412	XPAD_XBOX360_VENDOR(0x044f),		/* Thrustmaster X-Box 360 controllers */
 413	XPAD_XBOX360_VENDOR(0x045e),		/* Microsoft X-Box 360 controllers */
 414	XPAD_XBOXONE_VENDOR(0x045e),		/* Microsoft X-Box One controllers */
 415	XPAD_XBOX360_VENDOR(0x046d),		/* Logitech X-Box 360 style controllers */
 416	XPAD_XBOX360_VENDOR(0x056e),		/* Elecom JC-U3613M */
 417	XPAD_XBOX360_VENDOR(0x06a3),		/* Saitek P3600 */
 418	XPAD_XBOX360_VENDOR(0x0738),		/* Mad Catz X-Box 360 controllers */
 419	{ USB_DEVICE(0x0738, 0x4540) },		/* Mad Catz Beat Pad */
 420	XPAD_XBOXONE_VENDOR(0x0738),		/* Mad Catz FightStick TE 2 */
 421	XPAD_XBOX360_VENDOR(0x07ff),		/* Mad Catz GamePad */
 422	XPAD_XBOX360_VENDOR(0x0e6f),		/* 0x0e6f X-Box 360 controllers */
 423	XPAD_XBOXONE_VENDOR(0x0e6f),		/* 0x0e6f X-Box One controllers */
 424	XPAD_XBOX360_VENDOR(0x0f0d),		/* Hori Controllers */
 425	XPAD_XBOXONE_VENDOR(0x0f0d),		/* Hori Controllers */
 
 426	XPAD_XBOX360_VENDOR(0x11c9),		/* Nacon GC100XF */
 
 427	XPAD_XBOX360_VENDOR(0x12ab),		/* X-Box 360 dance pads */
 428	XPAD_XBOX360_VENDOR(0x1430),		/* RedOctane X-Box 360 controllers */
 429	XPAD_XBOX360_VENDOR(0x146b),		/* BigBen Interactive Controllers */
 430	XPAD_XBOX360_VENDOR(0x1532),		/* Razer Sabertooth */
 431	XPAD_XBOXONE_VENDOR(0x1532),		/* Razer Wildcat */
 432	XPAD_XBOX360_VENDOR(0x15e4),		/* Numark X-Box 360 controllers */
 433	XPAD_XBOX360_VENDOR(0x162e),		/* Joytech X-Box 360 controllers */
 434	XPAD_XBOX360_VENDOR(0x1689),		/* Razer Onza */
 
 435	XPAD_XBOX360_VENDOR(0x1bad),		/* Harminix Rock Band Guitar and Drums */
 
 
 436	XPAD_XBOX360_VENDOR(0x24c6),		/* PowerA Controllers */
 437	XPAD_XBOXONE_VENDOR(0x24c6),		/* PowerA Controllers */
 
 
 
 438	{ }
 439};
 440
 441MODULE_DEVICE_TABLE(usb, xpad_table);
 442
 443struct xboxone_init_packet {
 444	u16 idVendor;
 445	u16 idProduct;
 446	const u8 *data;
 447	u8 len;
 448};
 449
 450#define XBOXONE_INIT_PKT(_vid, _pid, _data)		\
 451	{						\
 452		.idVendor	= (_vid),		\
 453		.idProduct	= (_pid),		\
 454		.data		= (_data),		\
 455		.len		= ARRAY_SIZE(_data),	\
 456	}
 457
 458
 459/*
 460 * This packet is required for all Xbox One pads with 2015
 461 * or later firmware installed (or present from the factory).
 462 */
 463static const u8 xboxone_fw2015_init[] = {
 464	0x05, 0x20, 0x00, 0x01, 0x00
 465};
 466
 467/*
 
 
 
 
 
 
 
 
 
 
 468 * This packet is required for the Titanfall 2 Xbox One pads
 469 * (0x0e6f:0x0165) to finish initialization and for Hori pads
 470 * (0x0f0d:0x0067) to make the analog sticks work.
 471 */
 472static const u8 xboxone_hori_init[] = {
 473	0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a,
 474	0x00, 0x00, 0x00, 0x80, 0x00
 475};
 476
 477/*
 478 * This packet is required for some of the PDP pads to start
 479 * sending input reports. These pads include: (0x0e6f:0x02ab),
 480 * (0x0e6f:0x02a4).
 481 */
 482static const u8 xboxone_pdp_init1[] = {
 483	0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14
 484};
 485
 486/*
 487 * This packet is required for some of the PDP pads to start
 488 * sending input reports. These pads include: (0x0e6f:0x02ab),
 489 * (0x0e6f:0x02a4).
 490 */
 491static const u8 xboxone_pdp_init2[] = {
 492	0x06, 0x20, 0x00, 0x02, 0x01, 0x00
 493};
 494
 495/*
 496 * A specific rumble packet is required for some PowerA pads to start
 497 * sending input reports. One of those pads is (0x24c6:0x543a).
 498 */
 499static const u8 xboxone_rumblebegin_init[] = {
 500	0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
 501	0x1D, 0x1D, 0xFF, 0x00, 0x00
 502};
 503
 504/*
 505 * A rumble packet with zero FF intensity will immediately
 506 * terminate the rumbling required to init PowerA pads.
 507 * This should happen fast enough that the motors don't
 508 * spin up to enough speed to actually vibrate the gamepad.
 509 */
 510static const u8 xboxone_rumbleend_init[] = {
 511	0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
 512	0x00, 0x00, 0x00, 0x00, 0x00
 513};
 514
 515/*
 516 * This specifies the selection of init packets that a gamepad
 517 * will be sent on init *and* the order in which they will be
 518 * sent. The correct sequence number will be added when the
 519 * packet is going to be sent.
 520 */
 521static const struct xboxone_init_packet xboxone_init_packets[] = {
 522	XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init),
 523	XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init),
 524	XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init),
 525	XBOXONE_INIT_PKT(0x0e6f, 0x02ab, xboxone_pdp_init1),
 526	XBOXONE_INIT_PKT(0x0e6f, 0x02ab, xboxone_pdp_init2),
 527	XBOXONE_INIT_PKT(0x0e6f, 0x02a4, xboxone_pdp_init1),
 528	XBOXONE_INIT_PKT(0x0e6f, 0x02a4, xboxone_pdp_init2),
 529	XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
 530	XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
 531	XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
 532	XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumbleend_init),
 533	XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumbleend_init),
 534	XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumbleend_init),
 535};
 536
 537struct xpad_output_packet {
 538	u8 data[XPAD_PKT_LEN];
 539	u8 len;
 540	bool pending;
 541};
 542
 543#define XPAD_OUT_CMD_IDX	0
 544#define XPAD_OUT_FF_IDX		1
 545#define XPAD_OUT_LED_IDX	(1 + IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF))
 546#define XPAD_NUM_OUT_PACKETS	(1 + \
 547				 IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF) + \
 548				 IS_ENABLED(CONFIG_JOYSTICK_XPAD_LEDS))
 549
 550struct usb_xpad {
 551	struct input_dev *dev;		/* input device interface */
 552	struct input_dev __rcu *x360w_dev;
 553	struct usb_device *udev;	/* usb device */
 554	struct usb_interface *intf;	/* usb interface */
 555
 556	bool pad_present;
 557	bool input_created;
 558
 559	struct urb *irq_in;		/* urb for interrupt in report */
 560	unsigned char *idata;		/* input data */
 561	dma_addr_t idata_dma;
 562
 563	struct urb *irq_out;		/* urb for interrupt out report */
 564	struct usb_anchor irq_out_anchor;
 565	bool irq_out_active;		/* we must not use an active URB */
 566	u8 odata_serial;		/* serial number for xbox one protocol */
 567	unsigned char *odata;		/* output data */
 568	dma_addr_t odata_dma;
 569	spinlock_t odata_lock;
 570
 571	struct xpad_output_packet out_packets[XPAD_NUM_OUT_PACKETS];
 572	int last_out_packet;
 573	int init_seq;
 574
 575#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
 576	struct xpad_led *led;
 577#endif
 578
 579	char phys[64];			/* physical device path */
 580
 581	int mapping;			/* map d-pad to buttons or to axes */
 582	int xtype;			/* type of xbox device */
 583	int pad_nr;			/* the order x360 pads were attached */
 584	const char *name;		/* name of the device */
 585	struct work_struct work;	/* init/remove device from callback */
 586};
 587
 588static int xpad_init_input(struct usb_xpad *xpad);
 589static void xpad_deinit_input(struct usb_xpad *xpad);
 590static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
 591
 592/*
 593 *	xpad_process_packet
 594 *
 595 *	Completes a request by converting the data into events for the
 596 *	input subsystem.
 597 *
 598 *	The used report descriptor was taken from ITO Takayukis website:
 599 *	 http://euc.jp/periphs/xbox-controller.ja.html
 600 */
 601static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 602{
 603	struct input_dev *dev = xpad->dev;
 604
 605	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 606		/* left stick */
 607		input_report_abs(dev, ABS_X,
 608				 (__s16) le16_to_cpup((__le16 *)(data + 12)));
 609		input_report_abs(dev, ABS_Y,
 610				 ~(__s16) le16_to_cpup((__le16 *)(data + 14)));
 611
 612		/* right stick */
 613		input_report_abs(dev, ABS_RX,
 614				 (__s16) le16_to_cpup((__le16 *)(data + 16)));
 615		input_report_abs(dev, ABS_RY,
 616				 ~(__s16) le16_to_cpup((__le16 *)(data + 18)));
 617	}
 618
 619	/* triggers left/right */
 620	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
 621		input_report_key(dev, BTN_TL2, data[10]);
 622		input_report_key(dev, BTN_TR2, data[11]);
 623	} else {
 624		input_report_abs(dev, ABS_Z, data[10]);
 625		input_report_abs(dev, ABS_RZ, data[11]);
 626	}
 627
 628	/* digital pad */
 629	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
 630		/* dpad as buttons (left, right, up, down) */
 631		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
 632		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
 633		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
 634		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
 635	} else {
 636		input_report_abs(dev, ABS_HAT0X,
 637				 !!(data[2] & 0x08) - !!(data[2] & 0x04));
 638		input_report_abs(dev, ABS_HAT0Y,
 639				 !!(data[2] & 0x02) - !!(data[2] & 0x01));
 640	}
 641
 642	/* start/back buttons and stick press left/right */
 643	input_report_key(dev, BTN_START,  data[2] & 0x10);
 644	input_report_key(dev, BTN_SELECT, data[2] & 0x20);
 645	input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
 646	input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
 647
 648	/* "analog" buttons A, B, X, Y */
 649	input_report_key(dev, BTN_A, data[4]);
 650	input_report_key(dev, BTN_B, data[5]);
 651	input_report_key(dev, BTN_X, data[6]);
 652	input_report_key(dev, BTN_Y, data[7]);
 653
 654	/* "analog" buttons black, white */
 655	input_report_key(dev, BTN_C, data[8]);
 656	input_report_key(dev, BTN_Z, data[9]);
 657
 658	input_sync(dev);
 659}
 660
 661/*
 662 *	xpad360_process_packet
 663 *
 664 *	Completes a request by converting the data into events for the
 665 *	input subsystem. It is version for xbox 360 controller
 666 *
 667 *	The used report descriptor was taken from:
 668 *		http://www.free60.org/wiki/Gamepad
 669 */
 670
 671static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
 672				   u16 cmd, unsigned char *data)
 673{
 674	/* valid pad data */
 675	if (data[0] != 0x00)
 676		return;
 677
 678	/* digital pad */
 679	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
 680		/* dpad as buttons (left, right, up, down) */
 681		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
 682		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
 683		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
 684		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
 685	}
 686
 687	/*
 688	 * This should be a simple else block. However historically
 689	 * xbox360w has mapped DPAD to buttons while xbox360 did not. This
 690	 * made no sense, but now we can not just switch back and have to
 691	 * support both behaviors.
 692	 */
 693	if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
 694	    xpad->xtype == XTYPE_XBOX360W) {
 695		input_report_abs(dev, ABS_HAT0X,
 696				 !!(data[2] & 0x08) - !!(data[2] & 0x04));
 697		input_report_abs(dev, ABS_HAT0Y,
 698				 !!(data[2] & 0x02) - !!(data[2] & 0x01));
 699	}
 700
 701	/* start/back buttons */
 702	input_report_key(dev, BTN_START,  data[2] & 0x10);
 703	input_report_key(dev, BTN_SELECT, data[2] & 0x20);
 704
 705	/* stick press left/right */
 706	input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
 707	input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
 708
 709	/* buttons A,B,X,Y,TL,TR and MODE */
 710	input_report_key(dev, BTN_A,	data[3] & 0x10);
 711	input_report_key(dev, BTN_B,	data[3] & 0x20);
 712	input_report_key(dev, BTN_X,	data[3] & 0x40);
 713	input_report_key(dev, BTN_Y,	data[3] & 0x80);
 714	input_report_key(dev, BTN_TL,	data[3] & 0x01);
 715	input_report_key(dev, BTN_TR,	data[3] & 0x02);
 716	input_report_key(dev, BTN_MODE,	data[3] & 0x04);
 717
 718	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 719		/* left stick */
 720		input_report_abs(dev, ABS_X,
 721				 (__s16) le16_to_cpup((__le16 *)(data + 6)));
 722		input_report_abs(dev, ABS_Y,
 723				 ~(__s16) le16_to_cpup((__le16 *)(data + 8)));
 724
 725		/* right stick */
 726		input_report_abs(dev, ABS_RX,
 727				 (__s16) le16_to_cpup((__le16 *)(data + 10)));
 728		input_report_abs(dev, ABS_RY,
 729				 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
 730	}
 731
 732	/* triggers left/right */
 733	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
 734		input_report_key(dev, BTN_TL2, data[4]);
 735		input_report_key(dev, BTN_TR2, data[5]);
 736	} else {
 737		input_report_abs(dev, ABS_Z, data[4]);
 738		input_report_abs(dev, ABS_RZ, data[5]);
 739	}
 740
 741	input_sync(dev);
 742}
 743
 744static void xpad_presence_work(struct work_struct *work)
 745{
 746	struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
 747	int error;
 748
 749	if (xpad->pad_present) {
 750		error = xpad_init_input(xpad);
 751		if (error) {
 752			/* complain only, not much else we can do here */
 753			dev_err(&xpad->dev->dev,
 754				"unable to init device: %d\n", error);
 755		} else {
 756			rcu_assign_pointer(xpad->x360w_dev, xpad->dev);
 757		}
 758	} else {
 759		RCU_INIT_POINTER(xpad->x360w_dev, NULL);
 760		synchronize_rcu();
 761		/*
 762		 * Now that we are sure xpad360w_process_packet is not
 763		 * using input device we can get rid of it.
 764		 */
 765		xpad_deinit_input(xpad);
 766	}
 767}
 768
 769/*
 770 * xpad360w_process_packet
 771 *
 772 * Completes a request by converting the data into events for the
 773 * input subsystem. It is version for xbox 360 wireless controller.
 774 *
 775 * Byte.Bit
 776 * 00.1 - Status change: The controller or headset has connected/disconnected
 777 *                       Bits 01.7 and 01.6 are valid
 778 * 01.7 - Controller present
 779 * 01.6 - Headset present
 780 * 01.1 - Pad state (Bytes 4+) valid
 781 *
 782 */
 783static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 784{
 785	struct input_dev *dev;
 786	bool present;
 787
 788	/* Presence change */
 789	if (data[0] & 0x08) {
 790		present = (data[1] & 0x80) != 0;
 791
 792		if (xpad->pad_present != present) {
 793			xpad->pad_present = present;
 794			schedule_work(&xpad->work);
 795		}
 796	}
 797
 798	/* Valid pad data */
 799	if (data[1] != 0x1)
 800		return;
 801
 802	rcu_read_lock();
 803	dev = rcu_dereference(xpad->x360w_dev);
 804	if (dev)
 805		xpad360_process_packet(xpad, dev, cmd, &data[4]);
 806	rcu_read_unlock();
 807}
 808
 809/*
 810 *	xpadone_process_packet
 811 *
 812 *	Completes a request by converting the data into events for the
 813 *	input subsystem. This version is for the Xbox One controller.
 814 *
 815 *	The report format was gleaned from
 816 *	https://github.com/kylelemons/xbox/blob/master/xbox.go
 817 */
 818static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
 819{
 820	struct input_dev *dev = xpad->dev;
 821
 822	/* the xbox button has its own special report */
 823	if (data[0] == 0X07) {
 824		/*
 825		 * The Xbox One S controller requires these reports to be
 826		 * acked otherwise it continues sending them forever and
 827		 * won't report further mode button events.
 828		 */
 829		if (data[1] == 0x30)
 830			xpadone_ack_mode_report(xpad, data[2]);
 831
 832		input_report_key(dev, BTN_MODE, data[4] & 0x01);
 833		input_sync(dev);
 834		return;
 835	}
 836	/* check invalid packet */
 837	else if (data[0] != 0X20)
 838		return;
 839
 840	/* menu/view buttons */
 841	input_report_key(dev, BTN_START,  data[4] & 0x04);
 842	input_report_key(dev, BTN_SELECT, data[4] & 0x08);
 
 
 843
 844	/* buttons A,B,X,Y */
 845	input_report_key(dev, BTN_A,	data[4] & 0x10);
 846	input_report_key(dev, BTN_B,	data[4] & 0x20);
 847	input_report_key(dev, BTN_X,	data[4] & 0x40);
 848	input_report_key(dev, BTN_Y,	data[4] & 0x80);
 849
 850	/* digital pad */
 851	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
 852		/* dpad as buttons (left, right, up, down) */
 853		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[5] & 0x04);
 854		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[5] & 0x08);
 855		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[5] & 0x01);
 856		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[5] & 0x02);
 857	} else {
 858		input_report_abs(dev, ABS_HAT0X,
 859				 !!(data[5] & 0x08) - !!(data[5] & 0x04));
 860		input_report_abs(dev, ABS_HAT0Y,
 861				 !!(data[5] & 0x02) - !!(data[5] & 0x01));
 862	}
 863
 864	/* TL/TR */
 865	input_report_key(dev, BTN_TL,	data[5] & 0x10);
 866	input_report_key(dev, BTN_TR,	data[5] & 0x20);
 867
 868	/* stick press left/right */
 869	input_report_key(dev, BTN_THUMBL, data[5] & 0x40);
 870	input_report_key(dev, BTN_THUMBR, data[5] & 0x80);
 871
 872	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
 873		/* left stick */
 874		input_report_abs(dev, ABS_X,
 875				 (__s16) le16_to_cpup((__le16 *)(data + 10)));
 876		input_report_abs(dev, ABS_Y,
 877				 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
 878
 879		/* right stick */
 880		input_report_abs(dev, ABS_RX,
 881				 (__s16) le16_to_cpup((__le16 *)(data + 14)));
 882		input_report_abs(dev, ABS_RY,
 883				 ~(__s16) le16_to_cpup((__le16 *)(data + 16)));
 884	}
 885
 886	/* triggers left/right */
 887	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
 888		input_report_key(dev, BTN_TL2,
 889				 (__u16) le16_to_cpup((__le16 *)(data + 6)));
 890		input_report_key(dev, BTN_TR2,
 891				 (__u16) le16_to_cpup((__le16 *)(data + 8)));
 892	} else {
 893		input_report_abs(dev, ABS_Z,
 894				 (__u16) le16_to_cpup((__le16 *)(data + 6)));
 895		input_report_abs(dev, ABS_RZ,
 896				 (__u16) le16_to_cpup((__le16 *)(data + 8)));
 897	}
 898
 899	input_sync(dev);
 900}
 901
 902static void xpad_irq_in(struct urb *urb)
 903{
 904	struct usb_xpad *xpad = urb->context;
 905	struct device *dev = &xpad->intf->dev;
 906	int retval, status;
 907
 908	status = urb->status;
 909
 910	switch (status) {
 911	case 0:
 912		/* success */
 913		break;
 914	case -ECONNRESET:
 915	case -ENOENT:
 916	case -ESHUTDOWN:
 917		/* this urb is terminated, clean up */
 918		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
 919			__func__, status);
 920		return;
 921	default:
 922		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
 923			__func__, status);
 924		goto exit;
 925	}
 926
 927	switch (xpad->xtype) {
 928	case XTYPE_XBOX360:
 929		xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
 930		break;
 931	case XTYPE_XBOX360W:
 932		xpad360w_process_packet(xpad, 0, xpad->idata);
 933		break;
 934	case XTYPE_XBOXONE:
 935		xpadone_process_packet(xpad, 0, xpad->idata);
 936		break;
 937	default:
 938		xpad_process_packet(xpad, 0, xpad->idata);
 939	}
 940
 941exit:
 942	retval = usb_submit_urb(urb, GFP_ATOMIC);
 943	if (retval)
 944		dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
 945			__func__, retval);
 946}
 947
 948/* Callers must hold xpad->odata_lock spinlock */
 949static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
 950{
 951	const struct xboxone_init_packet *init_packet;
 952
 953	if (xpad->xtype != XTYPE_XBOXONE)
 954		return false;
 955
 956	/* Perform initialization sequence for Xbox One pads that require it */
 957	while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
 958		init_packet = &xboxone_init_packets[xpad->init_seq++];
 959
 960		if (init_packet->idVendor != 0 &&
 961		    init_packet->idVendor != xpad->dev->id.vendor)
 962			continue;
 963
 964		if (init_packet->idProduct != 0 &&
 965		    init_packet->idProduct != xpad->dev->id.product)
 966			continue;
 967
 968		/* This packet applies to our device, so prepare to send it */
 969		memcpy(xpad->odata, init_packet->data, init_packet->len);
 970		xpad->irq_out->transfer_buffer_length = init_packet->len;
 971
 972		/* Update packet with current sequence number */
 973		xpad->odata[2] = xpad->odata_serial++;
 974		return true;
 975	}
 976
 977	return false;
 978}
 979
 980/* Callers must hold xpad->odata_lock spinlock */
 981static bool xpad_prepare_next_out_packet(struct usb_xpad *xpad)
 982{
 983	struct xpad_output_packet *pkt, *packet = NULL;
 984	int i;
 985
 986	/* We may have init packets to send before we can send user commands */
 987	if (xpad_prepare_next_init_packet(xpad))
 988		return true;
 989
 990	for (i = 0; i < XPAD_NUM_OUT_PACKETS; i++) {
 991		if (++xpad->last_out_packet >= XPAD_NUM_OUT_PACKETS)
 992			xpad->last_out_packet = 0;
 993
 994		pkt = &xpad->out_packets[xpad->last_out_packet];
 995		if (pkt->pending) {
 996			dev_dbg(&xpad->intf->dev,
 997				"%s - found pending output packet %d\n",
 998				__func__, xpad->last_out_packet);
 999			packet = pkt;
1000			break;
1001		}
1002	}
1003
1004	if (packet) {
1005		memcpy(xpad->odata, packet->data, packet->len);
1006		xpad->irq_out->transfer_buffer_length = packet->len;
1007		packet->pending = false;
1008		return true;
1009	}
1010
1011	return false;
1012}
1013
1014/* Callers must hold xpad->odata_lock spinlock */
1015static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)
1016{
1017	int error;
1018
1019	if (!xpad->irq_out_active && xpad_prepare_next_out_packet(xpad)) {
1020		usb_anchor_urb(xpad->irq_out, &xpad->irq_out_anchor);
1021		error = usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
1022		if (error) {
1023			dev_err(&xpad->intf->dev,
1024				"%s - usb_submit_urb failed with result %d\n",
1025				__func__, error);
1026			usb_unanchor_urb(xpad->irq_out);
1027			return -EIO;
1028		}
1029
1030		xpad->irq_out_active = true;
1031	}
1032
1033	return 0;
1034}
1035
1036static void xpad_irq_out(struct urb *urb)
1037{
1038	struct usb_xpad *xpad = urb->context;
1039	struct device *dev = &xpad->intf->dev;
1040	int status = urb->status;
1041	int error;
1042	unsigned long flags;
1043
1044	spin_lock_irqsave(&xpad->odata_lock, flags);
1045
1046	switch (status) {
1047	case 0:
1048		/* success */
1049		xpad->irq_out_active = xpad_prepare_next_out_packet(xpad);
1050		break;
1051
1052	case -ECONNRESET:
1053	case -ENOENT:
1054	case -ESHUTDOWN:
1055		/* this urb is terminated, clean up */
1056		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
1057			__func__, status);
1058		xpad->irq_out_active = false;
1059		break;
1060
1061	default:
1062		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
1063			__func__, status);
1064		break;
1065	}
1066
1067	if (xpad->irq_out_active) {
1068		usb_anchor_urb(urb, &xpad->irq_out_anchor);
1069		error = usb_submit_urb(urb, GFP_ATOMIC);
1070		if (error) {
1071			dev_err(dev,
1072				"%s - usb_submit_urb failed with result %d\n",
1073				__func__, error);
1074			usb_unanchor_urb(urb);
1075			xpad->irq_out_active = false;
1076		}
1077	}
1078
1079	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1080}
1081
1082static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad,
1083			struct usb_endpoint_descriptor *ep_irq_out)
1084{
1085	int error;
1086
1087	if (xpad->xtype == XTYPE_UNKNOWN)
1088		return 0;
1089
1090	init_usb_anchor(&xpad->irq_out_anchor);
1091
1092	xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN,
1093					 GFP_KERNEL, &xpad->odata_dma);
1094	if (!xpad->odata)
1095		return -ENOMEM;
1096
1097	spin_lock_init(&xpad->odata_lock);
1098
1099	xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
1100	if (!xpad->irq_out) {
1101		error = -ENOMEM;
1102		goto err_free_coherent;
1103	}
1104
1105	usb_fill_int_urb(xpad->irq_out, xpad->udev,
1106			 usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress),
1107			 xpad->odata, XPAD_PKT_LEN,
1108			 xpad_irq_out, xpad, ep_irq_out->bInterval);
1109	xpad->irq_out->transfer_dma = xpad->odata_dma;
1110	xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1111
1112	return 0;
1113
1114err_free_coherent:
1115	usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
1116	return error;
1117}
1118
1119static void xpad_stop_output(struct usb_xpad *xpad)
1120{
1121	if (xpad->xtype != XTYPE_UNKNOWN) {
1122		if (!usb_wait_anchor_empty_timeout(&xpad->irq_out_anchor,
1123						   5000)) {
1124			dev_warn(&xpad->intf->dev,
1125				 "timed out waiting for output URB to complete, killing\n");
1126			usb_kill_anchored_urbs(&xpad->irq_out_anchor);
1127		}
1128	}
1129}
1130
1131static void xpad_deinit_output(struct usb_xpad *xpad)
1132{
1133	if (xpad->xtype != XTYPE_UNKNOWN) {
1134		usb_free_urb(xpad->irq_out);
1135		usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
1136				xpad->odata, xpad->odata_dma);
1137	}
1138}
1139
1140static int xpad_inquiry_pad_presence(struct usb_xpad *xpad)
1141{
1142	struct xpad_output_packet *packet =
1143			&xpad->out_packets[XPAD_OUT_CMD_IDX];
1144	unsigned long flags;
1145	int retval;
1146
1147	spin_lock_irqsave(&xpad->odata_lock, flags);
1148
1149	packet->data[0] = 0x08;
1150	packet->data[1] = 0x00;
1151	packet->data[2] = 0x0F;
1152	packet->data[3] = 0xC0;
1153	packet->data[4] = 0x00;
1154	packet->data[5] = 0x00;
1155	packet->data[6] = 0x00;
1156	packet->data[7] = 0x00;
1157	packet->data[8] = 0x00;
1158	packet->data[9] = 0x00;
1159	packet->data[10] = 0x00;
1160	packet->data[11] = 0x00;
1161	packet->len = 12;
1162	packet->pending = true;
1163
1164	/* Reset the sequence so we send out presence first */
1165	xpad->last_out_packet = -1;
1166	retval = xpad_try_sending_next_out_packet(xpad);
1167
1168	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1169
1170	return retval;
1171}
1172
1173static int xpad_start_xbox_one(struct usb_xpad *xpad)
1174{
1175	unsigned long flags;
1176	int retval;
1177
1178	spin_lock_irqsave(&xpad->odata_lock, flags);
1179
1180	/*
1181	 * Begin the init sequence by attempting to send a packet.
1182	 * We will cycle through the init packet sequence before
1183	 * sending any packets from the output ring.
1184	 */
1185	xpad->init_seq = 0;
1186	retval = xpad_try_sending_next_out_packet(xpad);
1187
1188	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1189
1190	return retval;
1191}
1192
1193static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num)
1194{
1195	unsigned long flags;
1196	struct xpad_output_packet *packet =
1197			&xpad->out_packets[XPAD_OUT_CMD_IDX];
1198	static const u8 mode_report_ack[] = {
1199		0x01, 0x20, 0x00, 0x09, 0x00, 0x07, 0x20, 0x02,
1200		0x00, 0x00, 0x00, 0x00, 0x00
1201	};
1202
1203	spin_lock_irqsave(&xpad->odata_lock, flags);
1204
1205	packet->len = sizeof(mode_report_ack);
1206	memcpy(packet->data, mode_report_ack, packet->len);
1207	packet->data[2] = seq_num;
1208	packet->pending = true;
1209
1210	/* Reset the sequence so we send out the ack now */
1211	xpad->last_out_packet = -1;
1212	xpad_try_sending_next_out_packet(xpad);
1213
1214	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1215}
1216
1217#ifdef CONFIG_JOYSTICK_XPAD_FF
1218static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect)
1219{
1220	struct usb_xpad *xpad = input_get_drvdata(dev);
1221	struct xpad_output_packet *packet = &xpad->out_packets[XPAD_OUT_FF_IDX];
1222	__u16 strong;
1223	__u16 weak;
1224	int retval;
1225	unsigned long flags;
1226
1227	if (effect->type != FF_RUMBLE)
1228		return 0;
1229
1230	strong = effect->u.rumble.strong_magnitude;
1231	weak = effect->u.rumble.weak_magnitude;
1232
1233	spin_lock_irqsave(&xpad->odata_lock, flags);
1234
1235	switch (xpad->xtype) {
1236	case XTYPE_XBOX:
1237		packet->data[0] = 0x00;
1238		packet->data[1] = 0x06;
1239		packet->data[2] = 0x00;
1240		packet->data[3] = strong / 256;	/* left actuator */
1241		packet->data[4] = 0x00;
1242		packet->data[5] = weak / 256;	/* right actuator */
1243		packet->len = 6;
1244		packet->pending = true;
1245		break;
1246
1247	case XTYPE_XBOX360:
1248		packet->data[0] = 0x00;
1249		packet->data[1] = 0x08;
1250		packet->data[2] = 0x00;
1251		packet->data[3] = strong / 256;  /* left actuator? */
1252		packet->data[4] = weak / 256;	/* right actuator? */
1253		packet->data[5] = 0x00;
1254		packet->data[6] = 0x00;
1255		packet->data[7] = 0x00;
1256		packet->len = 8;
1257		packet->pending = true;
1258		break;
1259
1260	case XTYPE_XBOX360W:
1261		packet->data[0] = 0x00;
1262		packet->data[1] = 0x01;
1263		packet->data[2] = 0x0F;
1264		packet->data[3] = 0xC0;
1265		packet->data[4] = 0x00;
1266		packet->data[5] = strong / 256;
1267		packet->data[6] = weak / 256;
1268		packet->data[7] = 0x00;
1269		packet->data[8] = 0x00;
1270		packet->data[9] = 0x00;
1271		packet->data[10] = 0x00;
1272		packet->data[11] = 0x00;
1273		packet->len = 12;
1274		packet->pending = true;
1275		break;
1276
1277	case XTYPE_XBOXONE:
1278		packet->data[0] = 0x09; /* activate rumble */
1279		packet->data[1] = 0x00;
1280		packet->data[2] = xpad->odata_serial++;
1281		packet->data[3] = 0x09;
1282		packet->data[4] = 0x00;
1283		packet->data[5] = 0x0F;
1284		packet->data[6] = 0x00;
1285		packet->data[7] = 0x00;
1286		packet->data[8] = strong / 512;	/* left actuator */
1287		packet->data[9] = weak / 512;	/* right actuator */
1288		packet->data[10] = 0xFF; /* on period */
1289		packet->data[11] = 0x00; /* off period */
1290		packet->data[12] = 0xFF; /* repeat count */
1291		packet->len = 13;
1292		packet->pending = true;
1293		break;
1294
1295	default:
1296		dev_dbg(&xpad->dev->dev,
1297			"%s - rumble command sent to unsupported xpad type: %d\n",
1298			__func__, xpad->xtype);
1299		retval = -EINVAL;
1300		goto out;
1301	}
1302
1303	retval = xpad_try_sending_next_out_packet(xpad);
1304
1305out:
1306	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1307	return retval;
1308}
1309
1310static int xpad_init_ff(struct usb_xpad *xpad)
1311{
1312	if (xpad->xtype == XTYPE_UNKNOWN)
1313		return 0;
1314
1315	input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
1316
1317	return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect);
1318}
1319
1320#else
1321static int xpad_init_ff(struct usb_xpad *xpad) { return 0; }
1322#endif
1323
1324#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
1325#include <linux/leds.h>
1326#include <linux/idr.h>
1327
1328static DEFINE_IDA(xpad_pad_seq);
1329
1330struct xpad_led {
1331	char name[16];
1332	struct led_classdev led_cdev;
1333	struct usb_xpad *xpad;
1334};
1335
1336/**
1337 * set the LEDs on Xbox360 / Wireless Controllers
1338 * @param command
1339 *  0: off
1340 *  1: all blink, then previous setting
1341 *  2: 1/top-left blink, then on
1342 *  3: 2/top-right blink, then on
1343 *  4: 3/bottom-left blink, then on
1344 *  5: 4/bottom-right blink, then on
1345 *  6: 1/top-left on
1346 *  7: 2/top-right on
1347 *  8: 3/bottom-left on
1348 *  9: 4/bottom-right on
1349 * 10: rotate
1350 * 11: blink, based on previous setting
1351 * 12: slow blink, based on previous setting
1352 * 13: rotate with two lights
1353 * 14: persistent slow all blink
1354 * 15: blink once, then previous setting
1355 */
1356static void xpad_send_led_command(struct usb_xpad *xpad, int command)
1357{
1358	struct xpad_output_packet *packet =
1359			&xpad->out_packets[XPAD_OUT_LED_IDX];
1360	unsigned long flags;
1361
1362	command %= 16;
1363
1364	spin_lock_irqsave(&xpad->odata_lock, flags);
1365
1366	switch (xpad->xtype) {
1367	case XTYPE_XBOX360:
1368		packet->data[0] = 0x01;
1369		packet->data[1] = 0x03;
1370		packet->data[2] = command;
1371		packet->len = 3;
1372		packet->pending = true;
1373		break;
1374
1375	case XTYPE_XBOX360W:
1376		packet->data[0] = 0x00;
1377		packet->data[1] = 0x00;
1378		packet->data[2] = 0x08;
1379		packet->data[3] = 0x40 + command;
1380		packet->data[4] = 0x00;
1381		packet->data[5] = 0x00;
1382		packet->data[6] = 0x00;
1383		packet->data[7] = 0x00;
1384		packet->data[8] = 0x00;
1385		packet->data[9] = 0x00;
1386		packet->data[10] = 0x00;
1387		packet->data[11] = 0x00;
1388		packet->len = 12;
1389		packet->pending = true;
1390		break;
1391	}
1392
1393	xpad_try_sending_next_out_packet(xpad);
1394
1395	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1396}
1397
1398/*
1399 * Light up the segment corresponding to the pad number on
1400 * Xbox 360 Controllers.
1401 */
1402static void xpad_identify_controller(struct usb_xpad *xpad)
1403{
1404	led_set_brightness(&xpad->led->led_cdev, (xpad->pad_nr % 4) + 2);
1405}
1406
1407static void xpad_led_set(struct led_classdev *led_cdev,
1408			 enum led_brightness value)
1409{
1410	struct xpad_led *xpad_led = container_of(led_cdev,
1411						 struct xpad_led, led_cdev);
1412
1413	xpad_send_led_command(xpad_led->xpad, value);
1414}
1415
1416static int xpad_led_probe(struct usb_xpad *xpad)
1417{
1418	struct xpad_led *led;
1419	struct led_classdev *led_cdev;
1420	int error;
1421
1422	if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX360W)
1423		return 0;
1424
1425	xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL);
1426	if (!led)
1427		return -ENOMEM;
1428
1429	xpad->pad_nr = ida_simple_get(&xpad_pad_seq, 0, 0, GFP_KERNEL);
1430	if (xpad->pad_nr < 0) {
1431		error = xpad->pad_nr;
1432		goto err_free_mem;
1433	}
1434
1435	snprintf(led->name, sizeof(led->name), "xpad%d", xpad->pad_nr);
1436	led->xpad = xpad;
1437
1438	led_cdev = &led->led_cdev;
1439	led_cdev->name = led->name;
1440	led_cdev->brightness_set = xpad_led_set;
1441	led_cdev->flags = LED_CORE_SUSPENDRESUME;
1442
1443	error = led_classdev_register(&xpad->udev->dev, led_cdev);
1444	if (error)
1445		goto err_free_id;
1446
1447	xpad_identify_controller(xpad);
1448
1449	return 0;
1450
1451err_free_id:
1452	ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1453err_free_mem:
1454	kfree(led);
1455	xpad->led = NULL;
1456	return error;
1457}
1458
1459static void xpad_led_disconnect(struct usb_xpad *xpad)
1460{
1461	struct xpad_led *xpad_led = xpad->led;
1462
1463	if (xpad_led) {
1464		led_classdev_unregister(&xpad_led->led_cdev);
1465		ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1466		kfree(xpad_led);
1467	}
1468}
1469#else
1470static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
1471static void xpad_led_disconnect(struct usb_xpad *xpad) { }
1472#endif
1473
1474static int xpad_start_input(struct usb_xpad *xpad)
1475{
1476	int error;
1477
1478	if (usb_submit_urb(xpad->irq_in, GFP_KERNEL))
1479		return -EIO;
1480
1481	if (xpad->xtype == XTYPE_XBOXONE) {
1482		error = xpad_start_xbox_one(xpad);
1483		if (error) {
1484			usb_kill_urb(xpad->irq_in);
1485			return error;
1486		}
1487	}
1488
1489	return 0;
1490}
1491
1492static void xpad_stop_input(struct usb_xpad *xpad)
1493{
1494	usb_kill_urb(xpad->irq_in);
1495}
1496
1497static void xpad360w_poweroff_controller(struct usb_xpad *xpad)
1498{
1499	unsigned long flags;
1500	struct xpad_output_packet *packet =
1501			&xpad->out_packets[XPAD_OUT_CMD_IDX];
1502
1503	spin_lock_irqsave(&xpad->odata_lock, flags);
1504
1505	packet->data[0] = 0x00;
1506	packet->data[1] = 0x00;
1507	packet->data[2] = 0x08;
1508	packet->data[3] = 0xC0;
1509	packet->data[4] = 0x00;
1510	packet->data[5] = 0x00;
1511	packet->data[6] = 0x00;
1512	packet->data[7] = 0x00;
1513	packet->data[8] = 0x00;
1514	packet->data[9] = 0x00;
1515	packet->data[10] = 0x00;
1516	packet->data[11] = 0x00;
1517	packet->len = 12;
1518	packet->pending = true;
1519
1520	/* Reset the sequence so we send out poweroff now */
1521	xpad->last_out_packet = -1;
1522	xpad_try_sending_next_out_packet(xpad);
1523
1524	spin_unlock_irqrestore(&xpad->odata_lock, flags);
1525}
1526
1527static int xpad360w_start_input(struct usb_xpad *xpad)
1528{
1529	int error;
1530
1531	error = usb_submit_urb(xpad->irq_in, GFP_KERNEL);
1532	if (error)
1533		return -EIO;
1534
1535	/*
1536	 * Send presence packet.
1537	 * This will force the controller to resend connection packets.
1538	 * This is useful in the case we activate the module after the
1539	 * adapter has been plugged in, as it won't automatically
1540	 * send us info about the controllers.
1541	 */
1542	error = xpad_inquiry_pad_presence(xpad);
1543	if (error) {
1544		usb_kill_urb(xpad->irq_in);
1545		return error;
1546	}
1547
1548	return 0;
1549}
1550
1551static void xpad360w_stop_input(struct usb_xpad *xpad)
1552{
1553	usb_kill_urb(xpad->irq_in);
1554
1555	/* Make sure we are done with presence work if it was scheduled */
1556	flush_work(&xpad->work);
1557}
1558
1559static int xpad_open(struct input_dev *dev)
1560{
1561	struct usb_xpad *xpad = input_get_drvdata(dev);
1562
1563	return xpad_start_input(xpad);
1564}
1565
1566static void xpad_close(struct input_dev *dev)
1567{
1568	struct usb_xpad *xpad = input_get_drvdata(dev);
1569
1570	xpad_stop_input(xpad);
1571}
1572
1573static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs)
1574{
1575	struct usb_xpad *xpad = input_get_drvdata(input_dev);
1576	set_bit(abs, input_dev->absbit);
1577
1578	switch (abs) {
1579	case ABS_X:
1580	case ABS_Y:
1581	case ABS_RX:
1582	case ABS_RY:	/* the two sticks */
1583		input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128);
1584		break;
1585	case ABS_Z:
1586	case ABS_RZ:	/* the triggers (if mapped to axes) */
1587		if (xpad->xtype == XTYPE_XBOXONE)
1588			input_set_abs_params(input_dev, abs, 0, 1023, 0, 0);
1589		else
1590			input_set_abs_params(input_dev, abs, 0, 255, 0, 0);
1591		break;
1592	case ABS_HAT0X:
1593	case ABS_HAT0Y:	/* the d-pad (only if dpad is mapped to axes */
1594		input_set_abs_params(input_dev, abs, -1, 1, 0, 0);
1595		break;
 
 
 
1596	}
1597}
1598
1599static void xpad_deinit_input(struct usb_xpad *xpad)
1600{
1601	if (xpad->input_created) {
1602		xpad->input_created = false;
1603		xpad_led_disconnect(xpad);
1604		input_unregister_device(xpad->dev);
1605	}
1606}
1607
1608static int xpad_init_input(struct usb_xpad *xpad)
1609{
1610	struct input_dev *input_dev;
1611	int i, error;
1612
1613	input_dev = input_allocate_device();
1614	if (!input_dev)
1615		return -ENOMEM;
1616
1617	xpad->dev = input_dev;
1618	input_dev->name = xpad->name;
1619	input_dev->phys = xpad->phys;
1620	usb_to_input_id(xpad->udev, &input_dev->id);
1621
1622	if (xpad->xtype == XTYPE_XBOX360W) {
1623		/* x360w controllers and the receiver have different ids */
1624		input_dev->id.product = 0x02a1;
1625	}
1626
1627	input_dev->dev.parent = &xpad->intf->dev;
1628
1629	input_set_drvdata(input_dev, xpad);
1630
1631	if (xpad->xtype != XTYPE_XBOX360W) {
1632		input_dev->open = xpad_open;
1633		input_dev->close = xpad_close;
1634	}
1635
1636	__set_bit(EV_KEY, input_dev->evbit);
1637
1638	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
1639		__set_bit(EV_ABS, input_dev->evbit);
1640		/* set up axes */
1641		for (i = 0; xpad_abs[i] >= 0; i++)
1642			xpad_set_up_abs(input_dev, xpad_abs[i]);
1643	}
1644
1645	/* set up standard buttons */
1646	for (i = 0; xpad_common_btn[i] >= 0; i++)
1647		__set_bit(xpad_common_btn[i], input_dev->keybit);
1648
1649	/* set up model-specific ones */
1650	if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W ||
1651	    xpad->xtype == XTYPE_XBOXONE) {
1652		for (i = 0; xpad360_btn[i] >= 0; i++)
1653			__set_bit(xpad360_btn[i], input_dev->keybit);
 
 
1654	} else {
1655		for (i = 0; xpad_btn[i] >= 0; i++)
1656			__set_bit(xpad_btn[i], input_dev->keybit);
1657	}
1658
1659	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
1660		for (i = 0; xpad_btn_pad[i] >= 0; i++)
1661			__set_bit(xpad_btn_pad[i], input_dev->keybit);
 
1662	}
1663
1664	/*
1665	 * This should be a simple else block. However historically
1666	 * xbox360w has mapped DPAD to buttons while xbox360 did not. This
1667	 * made no sense, but now we can not just switch back and have to
1668	 * support both behaviors.
1669	 */
1670	if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
1671	    xpad->xtype == XTYPE_XBOX360W) {
1672		for (i = 0; xpad_abs_pad[i] >= 0; i++)
1673			xpad_set_up_abs(input_dev, xpad_abs_pad[i]);
1674	}
1675
1676	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
1677		for (i = 0; xpad_btn_triggers[i] >= 0; i++)
1678			__set_bit(xpad_btn_triggers[i], input_dev->keybit);
 
1679	} else {
1680		for (i = 0; xpad_abs_triggers[i] >= 0; i++)
1681			xpad_set_up_abs(input_dev, xpad_abs_triggers[i]);
1682	}
1683
1684	error = xpad_init_ff(xpad);
1685	if (error)
1686		goto err_free_input;
1687
1688	error = xpad_led_probe(xpad);
1689	if (error)
1690		goto err_destroy_ff;
1691
1692	error = input_register_device(xpad->dev);
1693	if (error)
1694		goto err_disconnect_led;
1695
1696	xpad->input_created = true;
1697	return 0;
1698
1699err_disconnect_led:
1700	xpad_led_disconnect(xpad);
1701err_destroy_ff:
1702	input_ff_destroy(input_dev);
1703err_free_input:
1704	input_free_device(input_dev);
1705	return error;
1706}
1707
1708static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)
1709{
1710	struct usb_device *udev = interface_to_usbdev(intf);
1711	struct usb_xpad *xpad;
1712	struct usb_endpoint_descriptor *ep_irq_in, *ep_irq_out;
1713	int i, error;
1714
1715	if (intf->cur_altsetting->desc.bNumEndpoints != 2)
1716		return -ENODEV;
1717
1718	for (i = 0; xpad_device[i].idVendor; i++) {
1719		if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) &&
1720		    (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct))
1721			break;
1722	}
1723
1724	xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
1725	if (!xpad)
1726		return -ENOMEM;
1727
1728	usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
1729	strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
1730
1731	xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN,
1732					 GFP_KERNEL, &xpad->idata_dma);
1733	if (!xpad->idata) {
1734		error = -ENOMEM;
1735		goto err_free_mem;
1736	}
1737
1738	xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
1739	if (!xpad->irq_in) {
1740		error = -ENOMEM;
1741		goto err_free_idata;
1742	}
1743
1744	xpad->udev = udev;
1745	xpad->intf = intf;
1746	xpad->mapping = xpad_device[i].mapping;
1747	xpad->xtype = xpad_device[i].xtype;
1748	xpad->name = xpad_device[i].name;
1749	INIT_WORK(&xpad->work, xpad_presence_work);
1750
1751	if (xpad->xtype == XTYPE_UNKNOWN) {
1752		if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
1753			if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
1754				xpad->xtype = XTYPE_XBOX360W;
1755			else if (intf->cur_altsetting->desc.bInterfaceProtocol == 208)
1756				xpad->xtype = XTYPE_XBOXONE;
1757			else
1758				xpad->xtype = XTYPE_XBOX360;
1759		} else {
1760			xpad->xtype = XTYPE_XBOX;
1761		}
1762
1763		if (dpad_to_buttons)
1764			xpad->mapping |= MAP_DPAD_TO_BUTTONS;
1765		if (triggers_to_buttons)
1766			xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS;
1767		if (sticks_to_null)
1768			xpad->mapping |= MAP_STICKS_TO_NULL;
1769	}
1770
1771	if (xpad->xtype == XTYPE_XBOXONE &&
1772	    intf->cur_altsetting->desc.bInterfaceNumber != 0) {
1773		/*
1774		 * The Xbox One controller lists three interfaces all with the
1775		 * same interface class, subclass and protocol. Differentiate by
1776		 * interface number.
1777		 */
1778		error = -ENODEV;
1779		goto err_free_in_urb;
1780	}
1781
1782	ep_irq_in = ep_irq_out = NULL;
1783
1784	for (i = 0; i < 2; i++) {
1785		struct usb_endpoint_descriptor *ep =
1786				&intf->cur_altsetting->endpoint[i].desc;
1787
1788		if (usb_endpoint_xfer_int(ep)) {
1789			if (usb_endpoint_dir_in(ep))
1790				ep_irq_in = ep;
1791			else
1792				ep_irq_out = ep;
1793		}
1794	}
1795
1796	if (!ep_irq_in || !ep_irq_out) {
1797		error = -ENODEV;
1798		goto err_free_in_urb;
1799	}
1800
1801	error = xpad_init_output(intf, xpad, ep_irq_out);
1802	if (error)
1803		goto err_free_in_urb;
1804
1805	usb_fill_int_urb(xpad->irq_in, udev,
1806			 usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
1807			 xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
1808			 xpad, ep_irq_in->bInterval);
1809	xpad->irq_in->transfer_dma = xpad->idata_dma;
1810	xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1811
1812	usb_set_intfdata(intf, xpad);
1813
1814	if (xpad->xtype == XTYPE_XBOX360W) {
1815		/*
1816		 * Submit the int URB immediately rather than waiting for open
1817		 * because we get status messages from the device whether
1818		 * or not any controllers are attached.  In fact, it's
1819		 * exactly the message that a controller has arrived that
1820		 * we're waiting for.
1821		 */
1822		error = xpad360w_start_input(xpad);
1823		if (error)
1824			goto err_deinit_output;
1825		/*
1826		 * Wireless controllers require RESET_RESUME to work properly
1827		 * after suspend. Ideally this quirk should be in usb core
1828		 * quirk list, but we have too many vendors producing these
1829		 * controllers and we'd need to maintain 2 identical lists
1830		 * here in this driver and in usb core.
1831		 */
1832		udev->quirks |= USB_QUIRK_RESET_RESUME;
1833	} else {
1834		error = xpad_init_input(xpad);
1835		if (error)
1836			goto err_deinit_output;
1837	}
1838	return 0;
1839
1840err_deinit_output:
1841	xpad_deinit_output(xpad);
1842err_free_in_urb:
1843	usb_free_urb(xpad->irq_in);
1844err_free_idata:
1845	usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
1846err_free_mem:
1847	kfree(xpad);
1848	return error;
1849}
1850
1851static void xpad_disconnect(struct usb_interface *intf)
1852{
1853	struct usb_xpad *xpad = usb_get_intfdata(intf);
1854
1855	if (xpad->xtype == XTYPE_XBOX360W)
1856		xpad360w_stop_input(xpad);
1857
1858	xpad_deinit_input(xpad);
1859
1860	/*
1861	 * Now that both input device and LED device are gone we can
1862	 * stop output URB.
1863	 */
1864	xpad_stop_output(xpad);
1865
1866	xpad_deinit_output(xpad);
1867
1868	usb_free_urb(xpad->irq_in);
1869	usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
1870			xpad->idata, xpad->idata_dma);
1871
1872	kfree(xpad);
1873
1874	usb_set_intfdata(intf, NULL);
1875}
1876
1877static int xpad_suspend(struct usb_interface *intf, pm_message_t message)
1878{
1879	struct usb_xpad *xpad = usb_get_intfdata(intf);
1880	struct input_dev *input = xpad->dev;
1881
1882	if (xpad->xtype == XTYPE_XBOX360W) {
1883		/*
1884		 * Wireless controllers always listen to input so
1885		 * they are notified when controller shows up
1886		 * or goes away.
1887		 */
1888		xpad360w_stop_input(xpad);
1889
1890		/*
1891		 * The wireless adapter is going off now, so the
1892		 * gamepads are going to become disconnected.
1893		 * Unless explicitly disabled, power them down
1894		 * so they don't just sit there flashing.
1895		 */
1896		if (auto_poweroff && xpad->pad_present)
1897			xpad360w_poweroff_controller(xpad);
1898	} else {
1899		mutex_lock(&input->mutex);
1900		if (input->users)
1901			xpad_stop_input(xpad);
1902		mutex_unlock(&input->mutex);
1903	}
1904
1905	xpad_stop_output(xpad);
1906
1907	return 0;
1908}
1909
1910static int xpad_resume(struct usb_interface *intf)
1911{
1912	struct usb_xpad *xpad = usb_get_intfdata(intf);
1913	struct input_dev *input = xpad->dev;
1914	int retval = 0;
1915
1916	if (xpad->xtype == XTYPE_XBOX360W) {
1917		retval = xpad360w_start_input(xpad);
1918	} else {
1919		mutex_lock(&input->mutex);
1920		if (input->users) {
1921			retval = xpad_start_input(xpad);
1922		} else if (xpad->xtype == XTYPE_XBOXONE) {
1923			/*
1924			 * Even if there are no users, we'll send Xbox One pads
1925			 * the startup sequence so they don't sit there and
1926			 * blink until somebody opens the input device again.
1927			 */
1928			retval = xpad_start_xbox_one(xpad);
1929		}
1930		mutex_unlock(&input->mutex);
1931	}
1932
1933	return retval;
1934}
1935
1936static struct usb_driver xpad_driver = {
1937	.name		= "xpad",
1938	.probe		= xpad_probe,
1939	.disconnect	= xpad_disconnect,
1940	.suspend	= xpad_suspend,
1941	.resume		= xpad_resume,
1942	.reset_resume	= xpad_resume,
1943	.id_table	= xpad_table,
1944};
1945
1946module_usb_driver(xpad_driver);
1947
1948MODULE_AUTHOR("Marko Friedemann <mfr@bmx-chemnitz.de>");
1949MODULE_DESCRIPTION("X-Box pad driver");
1950MODULE_LICENSE("GPL");