0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 #include <linux/kernel.h>
0065 #include <linux/input.h>
0066 #include <linux/rcupdate.h>
0067 #include <linux/slab.h>
0068 #include <linux/stat.h>
0069 #include <linux/module.h>
0070 #include <linux/usb/input.h>
0071 #include <linux/usb/quirks.h>
0072
0073 #define XPAD_PKT_LEN 64
0074
0075
0076
0077
0078
0079 #define MAP_DPAD_TO_BUTTONS (1 << 0)
0080 #define MAP_TRIGGERS_TO_BUTTONS (1 << 1)
0081 #define MAP_STICKS_TO_NULL (1 << 2)
0082 #define MAP_SELECT_BUTTON (1 << 3)
0083 #define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \
0084 MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
0085
0086 #define XTYPE_XBOX 0
0087 #define XTYPE_XBOX360 1
0088 #define XTYPE_XBOX360W 2
0089 #define XTYPE_XBOXONE 3
0090 #define XTYPE_UNKNOWN 4
0091
0092 static bool dpad_to_buttons;
0093 module_param(dpad_to_buttons, bool, S_IRUGO);
0094 MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
0095
0096 static bool triggers_to_buttons;
0097 module_param(triggers_to_buttons, bool, S_IRUGO);
0098 MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads");
0099
0100 static bool sticks_to_null;
0101 module_param(sticks_to_null, bool, S_IRUGO);
0102 MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads");
0103
0104 static bool auto_poweroff = true;
0105 module_param(auto_poweroff, bool, S_IWUSR | S_IRUGO);
0106 MODULE_PARM_DESC(auto_poweroff, "Power off wireless controllers on suspend");
0107
0108 static const struct xpad_device {
0109 u16 idVendor;
0110 u16 idProduct;
0111 char *name;
0112 u8 mapping;
0113 u8 xtype;
0114 } xpad_device[] = {
0115 { 0x0079, 0x18d4, "GPD Win 2 X-Box Controller", 0, XTYPE_XBOX360 },
0116 { 0x044f, 0x0f00, "Thrustmaster Wheel", 0, XTYPE_XBOX },
0117 { 0x044f, 0x0f03, "Thrustmaster Wheel", 0, XTYPE_XBOX },
0118 { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
0119 { 0x044f, 0x0f10, "Thrustmaster Modena GT Wheel", 0, XTYPE_XBOX },
0120 { 0x044f, 0xb326, "Thrustmaster Gamepad GP XID", 0, XTYPE_XBOX360 },
0121 { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
0122 { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
0123 { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
0124 { 0x045e, 0x0288, "Microsoft Xbox Controller S v2", 0, XTYPE_XBOX },
0125 { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
0126 { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
0127 { 0x045e, 0x028f, "Microsoft X-Box 360 pad v2", 0, XTYPE_XBOX360 },
0128 { 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
0129 { 0x045e, 0x02d1, "Microsoft X-Box One pad", 0, XTYPE_XBOXONE },
0130 { 0x045e, 0x02dd, "Microsoft X-Box One pad (Firmware 2015)", 0, XTYPE_XBOXONE },
0131 { 0x045e, 0x02e3, "Microsoft X-Box One Elite pad", 0, XTYPE_XBOXONE },
0132 { 0x045e, 0x02ea, "Microsoft X-Box One S pad", 0, XTYPE_XBOXONE },
0133 { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
0134 { 0x045e, 0x0b12, "Microsoft Xbox Series S|X Controller", MAP_SELECT_BUTTON, XTYPE_XBOXONE },
0135 { 0x046d, 0xc21d, "Logitech Gamepad F310", 0, XTYPE_XBOX360 },
0136 { 0x046d, 0xc21e, "Logitech Gamepad F510", 0, XTYPE_XBOX360 },
0137 { 0x046d, 0xc21f, "Logitech Gamepad F710", 0, XTYPE_XBOX360 },
0138 { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
0139 { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
0140 { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX },
0141 { 0x046d, 0xca8a, "Logitech Precision Vibration Feedback Wheel", 0, XTYPE_XBOX },
0142 { 0x046d, 0xcaa3, "Logitech DriveFx Racing Wheel", 0, XTYPE_XBOX360 },
0143 { 0x056e, 0x2004, "Elecom JC-U3613M", 0, XTYPE_XBOX360 },
0144 { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX },
0145 { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX },
0146 { 0x05fe, 0x3030, "Chic Controller", 0, XTYPE_XBOX },
0147 { 0x05fe, 0x3031, "Chic Controller", 0, XTYPE_XBOX },
0148 { 0x062a, 0x0020, "Logic3 Xbox GamePad", 0, XTYPE_XBOX },
0149 { 0x062a, 0x0033, "Competition Pro Steering Wheel", 0, XTYPE_XBOX },
0150 { 0x06a3, 0x0200, "Saitek Racing Wheel", 0, XTYPE_XBOX },
0151 { 0x06a3, 0x0201, "Saitek Adrenalin", 0, XTYPE_XBOX },
0152 { 0x06a3, 0xf51a, "Saitek P3600", 0, XTYPE_XBOX360 },
0153 { 0x0738, 0x4506, "Mad Catz 4506 Wireless Controller", 0, XTYPE_XBOX },
0154 { 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX },
0155 { 0x0738, 0x4520, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
0156 { 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX },
0157 { 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
0158 { 0x0738, 0x4530, "Mad Catz Universal MC2 Racing Wheel and Pedals", 0, XTYPE_XBOX },
0159 { 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX },
0160 { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0161 { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
0162 { 0x0738, 0x4586, "Mad Catz MicroCon Wireless Controller", 0, XTYPE_XBOX },
0163 { 0x0738, 0x4588, "Mad Catz Blaster", 0, XTYPE_XBOX },
0164 { 0x0738, 0x45ff, "Mad Catz Beat Pad (w/ Handle)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0165 { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
0166 { 0x0738, 0x4718, "Mad Catz Street Fighter IV FightStick SE", 0, XTYPE_XBOX360 },
0167 { 0x0738, 0x4726, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
0168 { 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0169 { 0x0738, 0x4736, "Mad Catz MicroCon Gamepad", 0, XTYPE_XBOX360 },
0170 { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0171 { 0x0738, 0x4740, "Mad Catz Beat Pad", 0, XTYPE_XBOX360 },
0172 { 0x0738, 0x4743, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0173 { 0x0738, 0x4758, "Mad Catz Arcade Game Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0174 { 0x0738, 0x4a01, "Mad Catz FightStick TE 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
0175 { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0176 { 0x0738, 0x9871, "Mad Catz Portable Drum", 0, XTYPE_XBOX360 },
0177 { 0x0738, 0xb726, "Mad Catz Xbox controller - MW2", 0, XTYPE_XBOX360 },
0178 { 0x0738, 0xb738, "Mad Catz MVC2TE Stick 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0179 { 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
0180 { 0x0738, 0xcb02, "Saitek Cyborg Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
0181 { 0x0738, 0xcb03, "Saitek P3200 Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
0182 { 0x0738, 0xcb29, "Saitek Aviator Stick AV8R02", 0, XTYPE_XBOX360 },
0183 { 0x0738, 0xf738, "Super SFIV FightStick TE S", 0, XTYPE_XBOX360 },
0184 { 0x07ff, 0xffff, "Mad Catz GamePad", 0, XTYPE_XBOX360 },
0185 { 0x0c12, 0x0005, "Intec wireless", 0, XTYPE_XBOX },
0186 { 0x0c12, 0x8801, "Nyko Xbox Controller", 0, XTYPE_XBOX },
0187 { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
0188 { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
0189 { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
0190 { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
0191 { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
0192 { 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0193 { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX },
0194 { 0x0e4c, 0x1103, "Radica Gamester Reflex", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX },
0195 { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX },
0196 { 0x0e4c, 0x3510, "Radica Gamester", 0, XTYPE_XBOX },
0197 { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
0198 { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
0199 { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
0200 { 0x0e6f, 0x0008, "After Glow Pro Controller", 0, XTYPE_XBOX },
0201 { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
0202 { 0x0e6f, 0x0113, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
0203 { 0x0e6f, 0x011f, "Rock Candy Gamepad Wired Controller", 0, XTYPE_XBOX360 },
0204 { 0x0e6f, 0x0131, "PDP EA Sports Controller", 0, XTYPE_XBOX360 },
0205 { 0x0e6f, 0x0133, "Xbox 360 Wired Controller", 0, XTYPE_XBOX360 },
0206 { 0x0e6f, 0x0139, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
0207 { 0x0e6f, 0x013a, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0208 { 0x0e6f, 0x0146, "Rock Candy Wired Controller for Xbox One", 0, XTYPE_XBOXONE },
0209 { 0x0e6f, 0x0147, "PDP Marvel Xbox One Controller", 0, XTYPE_XBOXONE },
0210 { 0x0e6f, 0x015c, "PDP Xbox One Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
0211 { 0x0e6f, 0x0161, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0212 { 0x0e6f, 0x0162, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0213 { 0x0e6f, 0x0163, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0214 { 0x0e6f, 0x0164, "PDP Battlefield One", 0, XTYPE_XBOXONE },
0215 { 0x0e6f, 0x0165, "PDP Titanfall 2", 0, XTYPE_XBOXONE },
0216 { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
0217 { 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
0218 { 0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
0219 { 0x0e6f, 0x0246, "Rock Candy Gamepad for Xbox One 2015", 0, XTYPE_XBOXONE },
0220 { 0x0e6f, 0x02a0, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0221 { 0x0e6f, 0x02a1, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0222 { 0x0e6f, 0x02a2, "PDP Wired Controller for Xbox One - Crimson Red", 0, XTYPE_XBOXONE },
0223 { 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
0224 { 0x0e6f, 0x02a6, "PDP Wired Controller for Xbox One - Camo Series", 0, XTYPE_XBOXONE },
0225 { 0x0e6f, 0x02a7, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0226 { 0x0e6f, 0x02a8, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
0227 { 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE },
0228 { 0x0e6f, 0x02ad, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
0229 { 0x0e6f, 0x02b3, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
0230 { 0x0e6f, 0x02b8, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
0231 { 0x0e6f, 0x0301, "Logic3 Controller", 0, XTYPE_XBOX360 },
0232 { 0x0e6f, 0x0346, "Rock Candy Gamepad for Xbox One 2016", 0, XTYPE_XBOXONE },
0233 { 0x0e6f, 0x0401, "Logic3 Controller", 0, XTYPE_XBOX360 },
0234 { 0x0e6f, 0x0413, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
0235 { 0x0e6f, 0x0501, "PDP Xbox 360 Controller", 0, XTYPE_XBOX360 },
0236 { 0x0e6f, 0xf900, "PDP Afterglow AX.1", 0, XTYPE_XBOX360 },
0237 { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
0238 { 0x0e8f, 0x3008, "Generic xbox control (dealextreme)", 0, XTYPE_XBOX },
0239 { 0x0f0d, 0x000a, "Hori Co. DOA4 FightStick", 0, XTYPE_XBOX360 },
0240 { 0x0f0d, 0x000c, "Hori PadEX Turbo", 0, XTYPE_XBOX360 },
0241 { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0242 { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0243 { 0x0f0d, 0x001b, "Hori Real Arcade Pro VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0244 { 0x0f0d, 0x0063, "Hori Real Arcade Pro Hayabusa (USA) Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
0245 { 0x0f0d, 0x0067, "HORIPAD ONE", 0, XTYPE_XBOXONE },
0246 { 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
0247 { 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX },
0248 { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
0249 { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
0250 { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
0251 { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
0252 { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
0253 { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
0254 { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
0255 { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
0256 { 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 },
0257 { 0x12ab, 0x0303, "Mortal Kombat Klassic FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0258 { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0259 { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
0260 { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
0261 { 0x1430, 0xf801, "RedOctane Controller", 0, XTYPE_XBOX360 },
0262 { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
0263 { 0x1532, 0x0037, "Razer Sabertooth", 0, XTYPE_XBOX360 },
0264 { 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
0265 { 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
0266 { 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
0267 { 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
0268 { 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 },
0269 { 0x162e, 0xbeef, "Joytech Neo-Se Take2", 0, XTYPE_XBOX360 },
0270 { 0x1689, 0xfd00, "Razer Onza Tournament Edition", 0, XTYPE_XBOX360 },
0271 { 0x1689, 0xfd01, "Razer Onza Classic Edition", 0, XTYPE_XBOX360 },
0272 { 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
0273 { 0x1949, 0x041a, "Amazon Game Controller", 0, XTYPE_XBOX360 },
0274 { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
0275 { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
0276 { 0x1bad, 0x0130, "Ion Drum Rocker", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
0277 { 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
0278 { 0x1bad, 0xf018, "Mad Catz Street Fighter IV SE Fighting Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0279 { 0x1bad, 0xf019, "Mad Catz Brawlstick for Xbox 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0280 { 0x1bad, 0xf021, "Mad Cats Ghost Recon FS GamePad", 0, XTYPE_XBOX360 },
0281 { 0x1bad, 0xf023, "MLG Pro Circuit Controller (Xbox)", 0, XTYPE_XBOX360 },
0282 { 0x1bad, 0xf025, "Mad Catz Call Of Duty", 0, XTYPE_XBOX360 },
0283 { 0x1bad, 0xf027, "Mad Catz FPS Pro", 0, XTYPE_XBOX360 },
0284 { 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
0285 { 0x1bad, 0xf02e, "Mad Catz Fightpad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0286 { 0x1bad, 0xf030, "Mad Catz Xbox 360 MC2 MicroCon Racing Wheel", 0, XTYPE_XBOX360 },
0287 { 0x1bad, 0xf036, "Mad Catz MicroCon GamePad Pro", 0, XTYPE_XBOX360 },
0288 { 0x1bad, 0xf038, "Street Fighter IV FightStick TE", 0, XTYPE_XBOX360 },
0289 { 0x1bad, 0xf039, "Mad Catz MvC2 TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0290 { 0x1bad, 0xf03a, "Mad Catz SFxT Fightstick Pro", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0291 { 0x1bad, 0xf03d, "Street Fighter IV Arcade Stick TE - Chun Li", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0292 { 0x1bad, 0xf03e, "Mad Catz MLG FightStick TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0293 { 0x1bad, 0xf03f, "Mad Catz FightStick SoulCaliber", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0294 { 0x1bad, 0xf042, "Mad Catz FightStick TES+", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0295 { 0x1bad, 0xf080, "Mad Catz FightStick TE2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0296 { 0x1bad, 0xf501, "HoriPad EX2 Turbo", 0, XTYPE_XBOX360 },
0297 { 0x1bad, 0xf502, "Hori Real Arcade Pro.VX SA", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0298 { 0x1bad, 0xf503, "Hori Fighting Stick VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0299 { 0x1bad, 0xf504, "Hori Real Arcade Pro. EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0300 { 0x1bad, 0xf505, "Hori Fighting Stick EX2B", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0301 { 0x1bad, 0xf506, "Hori Real Arcade Pro.EX Premium VLX", 0, XTYPE_XBOX360 },
0302 { 0x1bad, 0xf900, "Harmonix Xbox 360 Controller", 0, XTYPE_XBOX360 },
0303 { 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
0304 { 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
0305 { 0x1bad, 0xf904, "PDP Versus Fighting Pad", 0, XTYPE_XBOX360 },
0306 { 0x1bad, 0xf906, "MortalKombat FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0307 { 0x1bad, 0xfa01, "MadCatz GamePad", 0, XTYPE_XBOX360 },
0308 { 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
0309 { 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
0310 { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
0311 { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
0312 { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
0313 { 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
0314 { 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0315 { 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
0316 { 0x24c6, 0x5303, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
0317 { 0x24c6, 0x530a, "Xbox 360 Pro EX Controller", 0, XTYPE_XBOX360 },
0318 { 0x24c6, 0x531a, "PowerA Pro Ex", 0, XTYPE_XBOX360 },
0319 { 0x24c6, 0x5397, "FUS1ON Tournament Controller", 0, XTYPE_XBOX360 },
0320 { 0x24c6, 0x541a, "PowerA Xbox One Mini Wired Controller", 0, XTYPE_XBOXONE },
0321 { 0x24c6, 0x542a, "Xbox ONE spectra", 0, XTYPE_XBOXONE },
0322 { 0x24c6, 0x543a, "PowerA Xbox One wired controller", 0, XTYPE_XBOXONE },
0323 { 0x24c6, 0x5500, "Hori XBOX 360 EX 2 with Turbo", 0, XTYPE_XBOX360 },
0324 { 0x24c6, 0x5501, "Hori Real Arcade Pro VX-SA", 0, XTYPE_XBOX360 },
0325 { 0x24c6, 0x5502, "Hori Fighting Stick VX Alt", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0326 { 0x24c6, 0x5503, "Hori Fighting Edge", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0327 { 0x24c6, 0x5506, "Hori SOULCALIBUR V Stick", 0, XTYPE_XBOX360 },
0328 { 0x24c6, 0x550d, "Hori GEM Xbox controller", 0, XTYPE_XBOX360 },
0329 { 0x24c6, 0x550e, "Hori Real Arcade Pro V Kai 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
0330 { 0x24c6, 0x551a, "PowerA FUSION Pro Controller", 0, XTYPE_XBOXONE },
0331 { 0x24c6, 0x561a, "PowerA FUSION Controller", 0, XTYPE_XBOXONE },
0332 { 0x24c6, 0x5b00, "ThrustMaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
0333 { 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 },
0334 { 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
0335 { 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 },
0336 { 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
0337 { 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 },
0338 { 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
0339 { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
0340 { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
0341 };
0342
0343
0344 static const signed short xpad_common_btn[] = {
0345 BTN_A, BTN_B, BTN_X, BTN_Y,
0346 BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR,
0347 -1
0348 };
0349
0350
0351 static const signed short xpad_btn[] = {
0352 BTN_C, BTN_Z,
0353 -1
0354 };
0355
0356
0357 static const signed short xpad_btn_pad[] = {
0358 BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2,
0359 BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4,
0360 -1
0361 };
0362
0363
0364 static const signed short xpad_btn_triggers[] = {
0365 BTN_TL2, BTN_TR2,
0366 -1
0367 };
0368
0369 static const signed short xpad360_btn[] = {
0370 BTN_TL, BTN_TR,
0371 BTN_MODE,
0372 -1
0373 };
0374
0375 static const signed short xpad_abs[] = {
0376 ABS_X, ABS_Y,
0377 ABS_RX, ABS_RY,
0378 -1
0379 };
0380
0381
0382 static const signed short xpad_abs_pad[] = {
0383 ABS_HAT0X, ABS_HAT0Y,
0384 -1
0385 };
0386
0387
0388 static const signed short xpad_abs_triggers[] = {
0389 ABS_Z, ABS_RZ,
0390 -1
0391 };
0392
0393
0394
0395
0396
0397
0398
0399 #define XPAD_XBOX360_VENDOR_PROTOCOL(vend, pr) \
0400 .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
0401 .idVendor = (vend), \
0402 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
0403 .bInterfaceSubClass = 93, \
0404 .bInterfaceProtocol = (pr)
0405 #define XPAD_XBOX360_VENDOR(vend) \
0406 { XPAD_XBOX360_VENDOR_PROTOCOL((vend), 1) }, \
0407 { XPAD_XBOX360_VENDOR_PROTOCOL((vend), 129) }
0408
0409
0410 #define XPAD_XBOXONE_VENDOR_PROTOCOL(vend, pr) \
0411 .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
0412 .idVendor = (vend), \
0413 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
0414 .bInterfaceSubClass = 71, \
0415 .bInterfaceProtocol = (pr)
0416 #define XPAD_XBOXONE_VENDOR(vend) \
0417 { XPAD_XBOXONE_VENDOR_PROTOCOL((vend), 208) }
0418
0419 static const struct usb_device_id xpad_table[] = {
0420 { USB_INTERFACE_INFO('X', 'B', 0) },
0421 XPAD_XBOX360_VENDOR(0x0079),
0422 XPAD_XBOX360_VENDOR(0x044f),
0423 XPAD_XBOX360_VENDOR(0x045e),
0424 XPAD_XBOXONE_VENDOR(0x045e),
0425 XPAD_XBOX360_VENDOR(0x046d),
0426 XPAD_XBOX360_VENDOR(0x056e),
0427 XPAD_XBOX360_VENDOR(0x06a3),
0428 XPAD_XBOX360_VENDOR(0x0738),
0429 { USB_DEVICE(0x0738, 0x4540) },
0430 XPAD_XBOXONE_VENDOR(0x0738),
0431 XPAD_XBOX360_VENDOR(0x07ff),
0432 XPAD_XBOX360_VENDOR(0x0e6f),
0433 XPAD_XBOXONE_VENDOR(0x0e6f),
0434 XPAD_XBOX360_VENDOR(0x0f0d),
0435 XPAD_XBOXONE_VENDOR(0x0f0d),
0436 XPAD_XBOX360_VENDOR(0x1038),
0437 XPAD_XBOX360_VENDOR(0x11c9),
0438 XPAD_XBOX360_VENDOR(0x1209),
0439 XPAD_XBOX360_VENDOR(0x12ab),
0440 XPAD_XBOX360_VENDOR(0x1430),
0441 XPAD_XBOX360_VENDOR(0x146b),
0442 XPAD_XBOX360_VENDOR(0x1532),
0443 XPAD_XBOXONE_VENDOR(0x1532),
0444 XPAD_XBOX360_VENDOR(0x15e4),
0445 XPAD_XBOX360_VENDOR(0x162e),
0446 XPAD_XBOX360_VENDOR(0x1689),
0447 XPAD_XBOX360_VENDOR(0x1949),
0448 XPAD_XBOX360_VENDOR(0x1bad),
0449 XPAD_XBOX360_VENDOR(0x20d6),
0450 XPAD_XBOXONE_VENDOR(0x20d6),
0451 XPAD_XBOX360_VENDOR(0x24c6),
0452 XPAD_XBOXONE_VENDOR(0x24c6),
0453 XPAD_XBOXONE_VENDOR(0x2e24),
0454 XPAD_XBOX360_VENDOR(0x2f24),
0455 XPAD_XBOX360_VENDOR(0x3285),
0456 { }
0457 };
0458
0459 MODULE_DEVICE_TABLE(usb, xpad_table);
0460
0461 struct xboxone_init_packet {
0462 u16 idVendor;
0463 u16 idProduct;
0464 const u8 *data;
0465 u8 len;
0466 };
0467
0468 #define XBOXONE_INIT_PKT(_vid, _pid, _data) \
0469 { \
0470 .idVendor = (_vid), \
0471 .idProduct = (_pid), \
0472 .data = (_data), \
0473 .len = ARRAY_SIZE(_data), \
0474 }
0475
0476
0477
0478
0479
0480
0481 static const u8 xboxone_fw2015_init[] = {
0482 0x05, 0x20, 0x00, 0x01, 0x00
0483 };
0484
0485
0486
0487
0488
0489
0490
0491 static const u8 xboxone_s_init[] = {
0492 0x05, 0x20, 0x00, 0x0f, 0x06
0493 };
0494
0495
0496
0497
0498
0499
0500 static const u8 xboxone_hori_init[] = {
0501 0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a,
0502 0x00, 0x00, 0x00, 0x80, 0x00
0503 };
0504
0505
0506
0507
0508
0509
0510 static const u8 xboxone_pdp_init1[] = {
0511 0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14
0512 };
0513
0514
0515
0516
0517
0518
0519 static const u8 xboxone_pdp_init2[] = {
0520 0x06, 0x20, 0x00, 0x02, 0x01, 0x00
0521 };
0522
0523
0524
0525
0526
0527 static const u8 xboxone_rumblebegin_init[] = {
0528 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
0529 0x1D, 0x1D, 0xFF, 0x00, 0x00
0530 };
0531
0532
0533
0534
0535
0536
0537
0538 static const u8 xboxone_rumbleend_init[] = {
0539 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
0540 0x00, 0x00, 0x00, 0x00, 0x00
0541 };
0542
0543
0544
0545
0546
0547
0548
0549 static const struct xboxone_init_packet xboxone_init_packets[] = {
0550 XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init),
0551 XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init),
0552 XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init),
0553 XBOXONE_INIT_PKT(0x045e, 0x02ea, xboxone_s_init),
0554 XBOXONE_INIT_PKT(0x045e, 0x0b00, xboxone_s_init),
0555 XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init1),
0556 XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init2),
0557 XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
0558 XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
0559 XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
0560 XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumbleend_init),
0561 XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumbleend_init),
0562 XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumbleend_init),
0563 };
0564
0565 struct xpad_output_packet {
0566 u8 data[XPAD_PKT_LEN];
0567 u8 len;
0568 bool pending;
0569 };
0570
0571 #define XPAD_OUT_CMD_IDX 0
0572 #define XPAD_OUT_FF_IDX 1
0573 #define XPAD_OUT_LED_IDX (1 + IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF))
0574 #define XPAD_NUM_OUT_PACKETS (1 + \
0575 IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF) + \
0576 IS_ENABLED(CONFIG_JOYSTICK_XPAD_LEDS))
0577
0578 struct usb_xpad {
0579 struct input_dev *dev;
0580 struct input_dev __rcu *x360w_dev;
0581 struct usb_device *udev;
0582 struct usb_interface *intf;
0583
0584 bool pad_present;
0585 bool input_created;
0586
0587 struct urb *irq_in;
0588 unsigned char *idata;
0589 dma_addr_t idata_dma;
0590
0591 struct urb *irq_out;
0592 struct usb_anchor irq_out_anchor;
0593 bool irq_out_active;
0594 u8 odata_serial;
0595 unsigned char *odata;
0596 dma_addr_t odata_dma;
0597 spinlock_t odata_lock;
0598
0599 struct xpad_output_packet out_packets[XPAD_NUM_OUT_PACKETS];
0600 int last_out_packet;
0601 int init_seq;
0602
0603 #if defined(CONFIG_JOYSTICK_XPAD_LEDS)
0604 struct xpad_led *led;
0605 #endif
0606
0607 char phys[64];
0608
0609 int mapping;
0610 int xtype;
0611 int pad_nr;
0612 const char *name;
0613 struct work_struct work;
0614 };
0615
0616 static int xpad_init_input(struct usb_xpad *xpad);
0617 static void xpad_deinit_input(struct usb_xpad *xpad);
0618 static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629 static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
0630 {
0631 struct input_dev *dev = xpad->dev;
0632
0633 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
0634
0635 input_report_abs(dev, ABS_X,
0636 (__s16) le16_to_cpup((__le16 *)(data + 12)));
0637 input_report_abs(dev, ABS_Y,
0638 ~(__s16) le16_to_cpup((__le16 *)(data + 14)));
0639
0640
0641 input_report_abs(dev, ABS_RX,
0642 (__s16) le16_to_cpup((__le16 *)(data + 16)));
0643 input_report_abs(dev, ABS_RY,
0644 ~(__s16) le16_to_cpup((__le16 *)(data + 18)));
0645 }
0646
0647
0648 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
0649 input_report_key(dev, BTN_TL2, data[10]);
0650 input_report_key(dev, BTN_TR2, data[11]);
0651 } else {
0652 input_report_abs(dev, ABS_Z, data[10]);
0653 input_report_abs(dev, ABS_RZ, data[11]);
0654 }
0655
0656
0657 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
0658
0659 input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
0660 input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
0661 input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
0662 input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
0663 } else {
0664 input_report_abs(dev, ABS_HAT0X,
0665 !!(data[2] & 0x08) - !!(data[2] & 0x04));
0666 input_report_abs(dev, ABS_HAT0Y,
0667 !!(data[2] & 0x02) - !!(data[2] & 0x01));
0668 }
0669
0670
0671 input_report_key(dev, BTN_START, data[2] & 0x10);
0672 input_report_key(dev, BTN_SELECT, data[2] & 0x20);
0673 input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
0674 input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
0675
0676
0677 input_report_key(dev, BTN_A, data[4]);
0678 input_report_key(dev, BTN_B, data[5]);
0679 input_report_key(dev, BTN_X, data[6]);
0680 input_report_key(dev, BTN_Y, data[7]);
0681
0682
0683 input_report_key(dev, BTN_C, data[8]);
0684 input_report_key(dev, BTN_Z, data[9]);
0685
0686 input_sync(dev);
0687 }
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699 static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
0700 u16 cmd, unsigned char *data)
0701 {
0702
0703 if (data[0] != 0x00)
0704 return;
0705
0706
0707 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
0708
0709 input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
0710 input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
0711 input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
0712 input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
0713 }
0714
0715
0716
0717
0718
0719
0720
0721 if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
0722 xpad->xtype == XTYPE_XBOX360W) {
0723 input_report_abs(dev, ABS_HAT0X,
0724 !!(data[2] & 0x08) - !!(data[2] & 0x04));
0725 input_report_abs(dev, ABS_HAT0Y,
0726 !!(data[2] & 0x02) - !!(data[2] & 0x01));
0727 }
0728
0729
0730 input_report_key(dev, BTN_START, data[2] & 0x10);
0731 input_report_key(dev, BTN_SELECT, data[2] & 0x20);
0732
0733
0734 input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
0735 input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
0736
0737
0738 input_report_key(dev, BTN_A, data[3] & 0x10);
0739 input_report_key(dev, BTN_B, data[3] & 0x20);
0740 input_report_key(dev, BTN_X, data[3] & 0x40);
0741 input_report_key(dev, BTN_Y, data[3] & 0x80);
0742 input_report_key(dev, BTN_TL, data[3] & 0x01);
0743 input_report_key(dev, BTN_TR, data[3] & 0x02);
0744 input_report_key(dev, BTN_MODE, data[3] & 0x04);
0745
0746 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
0747
0748 input_report_abs(dev, ABS_X,
0749 (__s16) le16_to_cpup((__le16 *)(data + 6)));
0750 input_report_abs(dev, ABS_Y,
0751 ~(__s16) le16_to_cpup((__le16 *)(data + 8)));
0752
0753
0754 input_report_abs(dev, ABS_RX,
0755 (__s16) le16_to_cpup((__le16 *)(data + 10)));
0756 input_report_abs(dev, ABS_RY,
0757 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
0758 }
0759
0760
0761 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
0762 input_report_key(dev, BTN_TL2, data[4]);
0763 input_report_key(dev, BTN_TR2, data[5]);
0764 } else {
0765 input_report_abs(dev, ABS_Z, data[4]);
0766 input_report_abs(dev, ABS_RZ, data[5]);
0767 }
0768
0769 input_sync(dev);
0770 }
0771
0772 static void xpad_presence_work(struct work_struct *work)
0773 {
0774 struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
0775 int error;
0776
0777 if (xpad->pad_present) {
0778 error = xpad_init_input(xpad);
0779 if (error) {
0780
0781 dev_err(&xpad->dev->dev,
0782 "unable to init device: %d\n", error);
0783 } else {
0784 rcu_assign_pointer(xpad->x360w_dev, xpad->dev);
0785 }
0786 } else {
0787 RCU_INIT_POINTER(xpad->x360w_dev, NULL);
0788 synchronize_rcu();
0789
0790
0791
0792
0793 xpad_deinit_input(xpad);
0794 }
0795 }
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811 static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
0812 {
0813 struct input_dev *dev;
0814 bool present;
0815
0816
0817 if (data[0] & 0x08) {
0818 present = (data[1] & 0x80) != 0;
0819
0820 if (xpad->pad_present != present) {
0821 xpad->pad_present = present;
0822 schedule_work(&xpad->work);
0823 }
0824 }
0825
0826
0827 if (data[1] != 0x1)
0828 return;
0829
0830 rcu_read_lock();
0831 dev = rcu_dereference(xpad->x360w_dev);
0832 if (dev)
0833 xpad360_process_packet(xpad, dev, cmd, &data[4]);
0834 rcu_read_unlock();
0835 }
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846 static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
0847 {
0848 struct input_dev *dev = xpad->dev;
0849
0850
0851 if (data[0] == 0X07) {
0852
0853
0854
0855
0856
0857 if (data[1] == 0x30)
0858 xpadone_ack_mode_report(xpad, data[2]);
0859
0860 input_report_key(dev, BTN_MODE, data[4] & 0x01);
0861 input_sync(dev);
0862 return;
0863 }
0864
0865 else if (data[0] != 0X20)
0866 return;
0867
0868
0869 input_report_key(dev, BTN_START, data[4] & 0x04);
0870 input_report_key(dev, BTN_SELECT, data[4] & 0x08);
0871 if (xpad->mapping & MAP_SELECT_BUTTON)
0872 input_report_key(dev, KEY_RECORD, data[22] & 0x01);
0873
0874
0875 input_report_key(dev, BTN_A, data[4] & 0x10);
0876 input_report_key(dev, BTN_B, data[4] & 0x20);
0877 input_report_key(dev, BTN_X, data[4] & 0x40);
0878 input_report_key(dev, BTN_Y, data[4] & 0x80);
0879
0880
0881 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
0882
0883 input_report_key(dev, BTN_TRIGGER_HAPPY1, data[5] & 0x04);
0884 input_report_key(dev, BTN_TRIGGER_HAPPY2, data[5] & 0x08);
0885 input_report_key(dev, BTN_TRIGGER_HAPPY3, data[5] & 0x01);
0886 input_report_key(dev, BTN_TRIGGER_HAPPY4, data[5] & 0x02);
0887 } else {
0888 input_report_abs(dev, ABS_HAT0X,
0889 !!(data[5] & 0x08) - !!(data[5] & 0x04));
0890 input_report_abs(dev, ABS_HAT0Y,
0891 !!(data[5] & 0x02) - !!(data[5] & 0x01));
0892 }
0893
0894
0895 input_report_key(dev, BTN_TL, data[5] & 0x10);
0896 input_report_key(dev, BTN_TR, data[5] & 0x20);
0897
0898
0899 input_report_key(dev, BTN_THUMBL, data[5] & 0x40);
0900 input_report_key(dev, BTN_THUMBR, data[5] & 0x80);
0901
0902 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
0903
0904 input_report_abs(dev, ABS_X,
0905 (__s16) le16_to_cpup((__le16 *)(data + 10)));
0906 input_report_abs(dev, ABS_Y,
0907 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
0908
0909
0910 input_report_abs(dev, ABS_RX,
0911 (__s16) le16_to_cpup((__le16 *)(data + 14)));
0912 input_report_abs(dev, ABS_RY,
0913 ~(__s16) le16_to_cpup((__le16 *)(data + 16)));
0914 }
0915
0916
0917 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
0918 input_report_key(dev, BTN_TL2,
0919 (__u16) le16_to_cpup((__le16 *)(data + 6)));
0920 input_report_key(dev, BTN_TR2,
0921 (__u16) le16_to_cpup((__le16 *)(data + 8)));
0922 } else {
0923 input_report_abs(dev, ABS_Z,
0924 (__u16) le16_to_cpup((__le16 *)(data + 6)));
0925 input_report_abs(dev, ABS_RZ,
0926 (__u16) le16_to_cpup((__le16 *)(data + 8)));
0927 }
0928
0929 input_sync(dev);
0930 }
0931
0932 static void xpad_irq_in(struct urb *urb)
0933 {
0934 struct usb_xpad *xpad = urb->context;
0935 struct device *dev = &xpad->intf->dev;
0936 int retval, status;
0937
0938 status = urb->status;
0939
0940 switch (status) {
0941 case 0:
0942
0943 break;
0944 case -ECONNRESET:
0945 case -ENOENT:
0946 case -ESHUTDOWN:
0947
0948 dev_dbg(dev, "%s - urb shutting down with status: %d\n",
0949 __func__, status);
0950 return;
0951 default:
0952 dev_dbg(dev, "%s - nonzero urb status received: %d\n",
0953 __func__, status);
0954 goto exit;
0955 }
0956
0957 switch (xpad->xtype) {
0958 case XTYPE_XBOX360:
0959 xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
0960 break;
0961 case XTYPE_XBOX360W:
0962 xpad360w_process_packet(xpad, 0, xpad->idata);
0963 break;
0964 case XTYPE_XBOXONE:
0965 xpadone_process_packet(xpad, 0, xpad->idata);
0966 break;
0967 default:
0968 xpad_process_packet(xpad, 0, xpad->idata);
0969 }
0970
0971 exit:
0972 retval = usb_submit_urb(urb, GFP_ATOMIC);
0973 if (retval)
0974 dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
0975 __func__, retval);
0976 }
0977
0978
0979 static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
0980 {
0981 const struct xboxone_init_packet *init_packet;
0982
0983 if (xpad->xtype != XTYPE_XBOXONE)
0984 return false;
0985
0986
0987 while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
0988 init_packet = &xboxone_init_packets[xpad->init_seq++];
0989
0990 if (init_packet->idVendor != 0 &&
0991 init_packet->idVendor != xpad->dev->id.vendor)
0992 continue;
0993
0994 if (init_packet->idProduct != 0 &&
0995 init_packet->idProduct != xpad->dev->id.product)
0996 continue;
0997
0998
0999 memcpy(xpad->odata, init_packet->data, init_packet->len);
1000 xpad->irq_out->transfer_buffer_length = init_packet->len;
1001
1002
1003 xpad->odata[2] = xpad->odata_serial++;
1004 return true;
1005 }
1006
1007 return false;
1008 }
1009
1010
1011 static bool xpad_prepare_next_out_packet(struct usb_xpad *xpad)
1012 {
1013 struct xpad_output_packet *pkt, *packet = NULL;
1014 int i;
1015
1016
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
1045 static 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
1066 static 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
1079 xpad->irq_out_active = xpad_prepare_next_out_packet(xpad);
1080 break;
1081
1082 case -ECONNRESET:
1083 case -ENOENT:
1084 case -ESHUTDOWN:
1085
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
1112 static 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
1144 err_free_coherent:
1145 usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
1146 return error;
1147 }
1148
1149 static 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
1161 static 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
1170 static 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
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
1203 static 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
1212
1213
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
1223 static 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
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
1248 static 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;
1271 packet->data[4] = 0x00;
1272 packet->data[5] = weak / 256;
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;
1282 packet->data[4] = weak / 256;
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;
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;
1317 packet->data[9] = weak / 512;
1318 packet->data[10] = 0xFF;
1319 packet->data[11] = 0x00;
1320 packet->data[12] = 0xFF;
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
1335 out:
1336 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1337 return retval;
1338 }
1339
1340 static 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
1351 static 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
1358 static DEFINE_IDA(xpad_pad_seq);
1359
1360 struct xpad_led {
1361 char name[16];
1362 struct led_classdev led_cdev;
1363 struct usb_xpad *xpad;
1364 };
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386 static 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
1430
1431
1432 static void xpad_identify_controller(struct usb_xpad *xpad)
1433 {
1434 led_set_brightness(&xpad->led->led_cdev, (xpad->pad_nr % 4) + 2);
1435 }
1436
1437 static 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
1446 static 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
1481 err_free_id:
1482 ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1483 err_free_mem:
1484 kfree(led);
1485 xpad->led = NULL;
1486 return error;
1487 }
1488
1489 static 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
1500 static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
1501 static void xpad_led_disconnect(struct usb_xpad *xpad) { }
1502 #endif
1503
1504 static 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
1522 static void xpad_stop_input(struct usb_xpad *xpad)
1523 {
1524 usb_kill_urb(xpad->irq_in);
1525 }
1526
1527 static 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
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
1557 static 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
1567
1568
1569
1570
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
1581 static void xpad360w_stop_input(struct usb_xpad *xpad)
1582 {
1583 usb_kill_urb(xpad->irq_in);
1584
1585
1586 flush_work(&xpad->work);
1587 }
1588
1589 static 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
1596 static 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
1603 static 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:
1612 input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128);
1613 break;
1614 case ABS_Z:
1615 case ABS_RZ:
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:
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
1631 static 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
1640 static 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
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
1670 for (i = 0; xpad_abs[i] >= 0; i++)
1671 xpad_set_up_abs(input_dev, xpad_abs[i]);
1672 }
1673
1674
1675 for (i = 0; xpad_common_btn[i] >= 0; i++)
1676 input_set_capability(input_dev, EV_KEY, xpad_common_btn[i]);
1677
1678
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
1698
1699
1700
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
1732 err_disconnect_led:
1733 xpad_led_disconnect(xpad);
1734 err_destroy_ff:
1735 input_ff_destroy(input_dev);
1736 err_free_input:
1737 input_free_device(input_dev);
1738 return error;
1739 }
1740
1741 static 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
1808
1809
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
1850
1851
1852
1853
1854
1855 error = xpad360w_start_input(xpad);
1856 if (error)
1857 goto err_deinit_output;
1858
1859
1860
1861
1862
1863
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
1873 err_deinit_output:
1874 xpad_deinit_output(xpad);
1875 err_free_in_urb:
1876 usb_free_urb(xpad->irq_in);
1877 err_free_idata:
1878 usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
1879 err_free_mem:
1880 kfree(xpad);
1881 return error;
1882 }
1883
1884 static 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
1895
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
1910 static 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
1918
1919
1920
1921 xpad360w_stop_input(xpad);
1922
1923
1924
1925
1926
1927
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
1943 static 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
1958
1959
1960
1961 retval = xpad_start_xbox_one(xpad);
1962 }
1963 mutex_unlock(&input->mutex);
1964 }
1965
1966 return retval;
1967 }
1968
1969 static 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
1979 module_usb_driver(xpad_driver);
1980
1981 MODULE_AUTHOR("Marko Friedemann <mfr@bmx-chemnitz.de>");
1982 MODULE_DESCRIPTION("X-Box pad driver");
1983 MODULE_LICENSE("GPL");