linux/drivers/hid/hid-sony.c
<<
>>
Prefs
   1/*
   2 *  HID driver for Sony / PS2 / PS3 BD devices.
   3 *
   4 *  Copyright (c) 1999 Andreas Gal
   5 *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
   6 *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
   7 *  Copyright (c) 2008 Jiri Slaby
   8 *  Copyright (c) 2012 David Dillow <dave@thedillows.org>
   9 *  Copyright (c) 2006-2013 Jiri Kosina
  10 *  Copyright (c) 2013 Colin Leitner <colin.leitner@gmail.com>
  11 */
  12
  13/*
  14 * This program is free software; you can redistribute it and/or modify it
  15 * under the terms of the GNU General Public License as published by the Free
  16 * Software Foundation; either version 2 of the License, or (at your option)
  17 * any later version.
  18 */
  19
  20/*
  21 * NOTE: in order for the Sony PS3 BD Remote Control to be found by
  22 * a Bluetooth host, the key combination Start+Enter has to be kept pressed
  23 * for about 7 seconds with the Bluetooth Host Controller in discovering mode.
  24 *
  25 * There will be no PIN request from the device.
  26 */
  27
  28#include <linux/device.h>
  29#include <linux/hid.h>
  30#include <linux/module.h>
  31#include <linux/slab.h>
  32#include <linux/leds.h>
  33#include <linux/power_supply.h>
  34#include <linux/spinlock.h>
  35#include <linux/list.h>
  36#include <linux/input/mt.h>
  37
  38#include "hid-ids.h"
  39
  40#define VAIO_RDESC_CONSTANT       BIT(0)
  41#define SIXAXIS_CONTROLLER_USB    BIT(1)
  42#define SIXAXIS_CONTROLLER_BT     BIT(2)
  43#define BUZZ_CONTROLLER           BIT(3)
  44#define PS3REMOTE                 BIT(4)
  45#define DUALSHOCK4_CONTROLLER_USB BIT(5)
  46#define DUALSHOCK4_CONTROLLER_BT  BIT(6)
  47
  48#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
  49#define DUALSHOCK4_CONTROLLER (DUALSHOCK4_CONTROLLER_USB |\
  50                                DUALSHOCK4_CONTROLLER_BT)
  51#define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER | BUZZ_CONTROLLER |\
  52                                DUALSHOCK4_CONTROLLER)
  53#define SONY_BATTERY_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
  54#define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER | DUALSHOCK4_CONTROLLER)
  55
  56#define MAX_LEDS 4
  57
  58static const u8 sixaxis_rdesc_fixup[] = {
  59        0x95, 0x13, 0x09, 0x01, 0x81, 0x02, 0x95, 0x0C,
  60        0x81, 0x01, 0x75, 0x10, 0x95, 0x04, 0x26, 0xFF,
  61        0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
  62};
  63
  64static const u8 sixaxis_rdesc_fixup2[] = {
  65        0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
  66        0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
  67        0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
  68        0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
  69        0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
  70        0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
  71        0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
  72        0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
  73        0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
  74        0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
  75        0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
  76        0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
  77        0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
  78        0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
  79        0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
  80        0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
  81        0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
  82        0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
  83        0xb1, 0x02, 0xc0, 0xc0,
  84};
  85
  86/*
  87 * The default descriptor doesn't provide mapping for the accelerometers
  88 * or orientation sensors.  This fixed descriptor maps the accelerometers
  89 * to usage values 0x40, 0x41 and 0x42 and maps the orientation sensors
  90 * to usage values 0x43, 0x44 and 0x45.
  91 */
  92static u8 dualshock4_usb_rdesc[] = {
  93        0x05, 0x01,         /*  Usage Page (Desktop),               */
  94        0x09, 0x05,         /*  Usage (Gamepad),                    */
  95        0xA1, 0x01,         /*  Collection (Application),           */
  96        0x85, 0x01,         /*      Report ID (1),                  */
  97        0x09, 0x30,         /*      Usage (X),                      */
  98        0x09, 0x31,         /*      Usage (Y),                      */
  99        0x09, 0x32,         /*      Usage (Z),                      */
 100        0x09, 0x35,         /*      Usage (Rz),                     */
 101        0x15, 0x00,         /*      Logical Minimum (0),            */
 102        0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
 103        0x75, 0x08,         /*      Report Size (8),                */
 104        0x95, 0x04,         /*      Report Count (4),               */
 105        0x81, 0x02,         /*      Input (Variable),               */
 106        0x09, 0x39,         /*      Usage (Hat Switch),             */
 107        0x15, 0x00,         /*      Logical Minimum (0),            */
 108        0x25, 0x07,         /*      Logical Maximum (7),            */
 109        0x35, 0x00,         /*      Physical Minimum (0),           */
 110        0x46, 0x3B, 0x01,   /*      Physical Maximum (315),         */
 111        0x65, 0x14,         /*      Unit (Degrees),                 */
 112        0x75, 0x04,         /*      Report Size (4),                */
 113        0x95, 0x01,         /*      Report Count (1),               */
 114        0x81, 0x42,         /*      Input (Variable, Null State),   */
 115        0x65, 0x00,         /*      Unit,                           */
 116        0x05, 0x09,         /*      Usage Page (Button),            */
 117        0x19, 0x01,         /*      Usage Minimum (01h),            */
 118        0x29, 0x0E,         /*      Usage Maximum (0Eh),            */
 119        0x15, 0x00,         /*      Logical Minimum (0),            */
 120        0x25, 0x01,         /*      Logical Maximum (1),            */
 121        0x75, 0x01,         /*      Report Size (1),                */
 122        0x95, 0x0E,         /*      Report Count (14),              */
 123        0x81, 0x02,         /*      Input (Variable),               */
 124        0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
 125        0x09, 0x20,         /*      Usage (20h),                    */
 126        0x75, 0x06,         /*      Report Size (6),                */
 127        0x95, 0x01,         /*      Report Count (1),               */
 128        0x15, 0x00,         /*      Logical Minimum (0),            */
 129        0x25, 0x7F,         /*      Logical Maximum (127),          */
 130        0x81, 0x02,         /*      Input (Variable),               */
 131        0x05, 0x01,         /*      Usage Page (Desktop),           */
 132        0x09, 0x33,         /*      Usage (Rx),                     */
 133        0x09, 0x34,         /*      Usage (Ry),                     */
 134        0x15, 0x00,         /*      Logical Minimum (0),            */
 135        0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
 136        0x75, 0x08,         /*      Report Size (8),                */
 137        0x95, 0x02,         /*      Report Count (2),               */
 138        0x81, 0x02,         /*      Input (Variable),               */
 139        0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
 140        0x09, 0x21,         /*      Usage (21h),                    */
 141        0x95, 0x03,         /*      Report Count (3),               */
 142        0x81, 0x02,         /*      Input (Variable),               */
 143        0x05, 0x01,         /*      Usage Page (Desktop),           */
 144        0x19, 0x40,         /*      Usage Minimum (40h),            */
 145        0x29, 0x42,         /*      Usage Maximum (42h),            */
 146        0x16, 0x00, 0x80,   /*      Logical Minimum (-32768),       */
 147        0x26, 0x00, 0x7F,   /*      Logical Maximum (32767),        */
 148        0x75, 0x10,         /*      Report Size (16),               */
 149        0x95, 0x03,         /*      Report Count (3),               */
 150        0x81, 0x02,         /*      Input (Variable),               */
 151        0x19, 0x43,         /*      Usage Minimum (43h),            */
 152        0x29, 0x45,         /*      Usage Maximum (45h),            */
 153        0x16, 0xFF, 0xBF,   /*      Logical Minimum (-16385),       */
 154        0x26, 0x00, 0x40,   /*      Logical Maximum (16384),        */
 155        0x95, 0x03,         /*      Report Count (3),               */
 156        0x81, 0x02,         /*      Input (Variable),               */
 157        0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
 158        0x09, 0x21,         /*      Usage (21h),                    */
 159        0x15, 0x00,         /*      Logical Minimum (0),            */
 160        0x25, 0xFF,         /*      Logical Maximum (255),          */
 161        0x75, 0x08,         /*      Report Size (8),                */
 162        0x95, 0x27,         /*      Report Count (39),              */
 163        0x81, 0x02,         /*      Input (Variable),               */
 164        0x85, 0x05,         /*      Report ID (5),                  */
 165        0x09, 0x22,         /*      Usage (22h),                    */
 166        0x95, 0x1F,         /*      Report Count (31),              */
 167        0x91, 0x02,         /*      Output (Variable),              */
 168        0x85, 0x04,         /*      Report ID (4),                  */
 169        0x09, 0x23,         /*      Usage (23h),                    */
 170        0x95, 0x24,         /*      Report Count (36),              */
 171        0xB1, 0x02,         /*      Feature (Variable),             */
 172        0x85, 0x02,         /*      Report ID (2),                  */
 173        0x09, 0x24,         /*      Usage (24h),                    */
 174        0x95, 0x24,         /*      Report Count (36),              */
 175        0xB1, 0x02,         /*      Feature (Variable),             */
 176        0x85, 0x08,         /*      Report ID (8),                  */
 177        0x09, 0x25,         /*      Usage (25h),                    */
 178        0x95, 0x03,         /*      Report Count (3),               */
 179        0xB1, 0x02,         /*      Feature (Variable),             */
 180        0x85, 0x10,         /*      Report ID (16),                 */
 181        0x09, 0x26,         /*      Usage (26h),                    */
 182        0x95, 0x04,         /*      Report Count (4),               */
 183        0xB1, 0x02,         /*      Feature (Variable),             */
 184        0x85, 0x11,         /*      Report ID (17),                 */
 185        0x09, 0x27,         /*      Usage (27h),                    */
 186        0x95, 0x02,         /*      Report Count (2),               */
 187        0xB1, 0x02,         /*      Feature (Variable),             */
 188        0x85, 0x12,         /*      Report ID (18),                 */
 189        0x06, 0x02, 0xFF,   /*      Usage Page (FF02h),             */
 190        0x09, 0x21,         /*      Usage (21h),                    */
 191        0x95, 0x0F,         /*      Report Count (15),              */
 192        0xB1, 0x02,         /*      Feature (Variable),             */
 193        0x85, 0x13,         /*      Report ID (19),                 */
 194        0x09, 0x22,         /*      Usage (22h),                    */
 195        0x95, 0x16,         /*      Report Count (22),              */
 196        0xB1, 0x02,         /*      Feature (Variable),             */
 197        0x85, 0x14,         /*      Report ID (20),                 */
 198        0x06, 0x05, 0xFF,   /*      Usage Page (FF05h),             */
 199        0x09, 0x20,         /*      Usage (20h),                    */
 200        0x95, 0x10,         /*      Report Count (16),              */
 201        0xB1, 0x02,         /*      Feature (Variable),             */
 202        0x85, 0x15,         /*      Report ID (21),                 */
 203        0x09, 0x21,         /*      Usage (21h),                    */
 204        0x95, 0x2C,         /*      Report Count (44),              */
 205        0xB1, 0x02,         /*      Feature (Variable),             */
 206        0x06, 0x80, 0xFF,   /*      Usage Page (FF80h),             */
 207        0x85, 0x80,         /*      Report ID (128),                */
 208        0x09, 0x20,         /*      Usage (20h),                    */
 209        0x95, 0x06,         /*      Report Count (6),               */
 210        0xB1, 0x02,         /*      Feature (Variable),             */
 211        0x85, 0x81,         /*      Report ID (129),                */
 212        0x09, 0x21,         /*      Usage (21h),                    */
 213        0x95, 0x06,         /*      Report Count (6),               */
 214        0xB1, 0x02,         /*      Feature (Variable),             */
 215        0x85, 0x82,         /*      Report ID (130),                */
 216        0x09, 0x22,         /*      Usage (22h),                    */
 217        0x95, 0x05,         /*      Report Count (5),               */
 218        0xB1, 0x02,         /*      Feature (Variable),             */
 219        0x85, 0x83,         /*      Report ID (131),                */
 220        0x09, 0x23,         /*      Usage (23h),                    */
 221        0x95, 0x01,         /*      Report Count (1),               */
 222        0xB1, 0x02,         /*      Feature (Variable),             */
 223        0x85, 0x84,         /*      Report ID (132),                */
 224        0x09, 0x24,         /*      Usage (24h),                    */
 225        0x95, 0x04,         /*      Report Count (4),               */
 226        0xB1, 0x02,         /*      Feature (Variable),             */
 227        0x85, 0x85,         /*      Report ID (133),                */
 228        0x09, 0x25,         /*      Usage (25h),                    */
 229        0x95, 0x06,         /*      Report Count (6),               */
 230        0xB1, 0x02,         /*      Feature (Variable),             */
 231        0x85, 0x86,         /*      Report ID (134),                */
 232        0x09, 0x26,         /*      Usage (26h),                    */
 233        0x95, 0x06,         /*      Report Count (6),               */
 234        0xB1, 0x02,         /*      Feature (Variable),             */
 235        0x85, 0x87,         /*      Report ID (135),                */
 236        0x09, 0x27,         /*      Usage (27h),                    */
 237        0x95, 0x23,         /*      Report Count (35),              */
 238        0xB1, 0x02,         /*      Feature (Variable),             */
 239        0x85, 0x88,         /*      Report ID (136),                */
 240        0x09, 0x28,         /*      Usage (28h),                    */
 241        0x95, 0x22,         /*      Report Count (34),              */
 242        0xB1, 0x02,         /*      Feature (Variable),             */
 243        0x85, 0x89,         /*      Report ID (137),                */
 244        0x09, 0x29,         /*      Usage (29h),                    */
 245        0x95, 0x02,         /*      Report Count (2),               */
 246        0xB1, 0x02,         /*      Feature (Variable),             */
 247        0x85, 0x90,         /*      Report ID (144),                */
 248        0x09, 0x30,         /*      Usage (30h),                    */
 249        0x95, 0x05,         /*      Report Count (5),               */
 250        0xB1, 0x02,         /*      Feature (Variable),             */
 251        0x85, 0x91,         /*      Report ID (145),                */
 252        0x09, 0x31,         /*      Usage (31h),                    */
 253        0x95, 0x03,         /*      Report Count (3),               */
 254        0xB1, 0x02,         /*      Feature (Variable),             */
 255        0x85, 0x92,         /*      Report ID (146),                */
 256        0x09, 0x32,         /*      Usage (32h),                    */
 257        0x95, 0x03,         /*      Report Count (3),               */
 258        0xB1, 0x02,         /*      Feature (Variable),             */
 259        0x85, 0x93,         /*      Report ID (147),                */
 260        0x09, 0x33,         /*      Usage (33h),                    */
 261        0x95, 0x0C,         /*      Report Count (12),              */
 262        0xB1, 0x02,         /*      Feature (Variable),             */
 263        0x85, 0xA0,         /*      Report ID (160),                */
 264        0x09, 0x40,         /*      Usage (40h),                    */
 265        0x95, 0x06,         /*      Report Count (6),               */
 266        0xB1, 0x02,         /*      Feature (Variable),             */
 267        0x85, 0xA1,         /*      Report ID (161),                */
 268        0x09, 0x41,         /*      Usage (41h),                    */
 269        0x95, 0x01,         /*      Report Count (1),               */
 270        0xB1, 0x02,         /*      Feature (Variable),             */
 271        0x85, 0xA2,         /*      Report ID (162),                */
 272        0x09, 0x42,         /*      Usage (42h),                    */
 273        0x95, 0x01,         /*      Report Count (1),               */
 274        0xB1, 0x02,         /*      Feature (Variable),             */
 275        0x85, 0xA3,         /*      Report ID (163),                */
 276        0x09, 0x43,         /*      Usage (43h),                    */
 277        0x95, 0x30,         /*      Report Count (48),              */
 278        0xB1, 0x02,         /*      Feature (Variable),             */
 279        0x85, 0xA4,         /*      Report ID (164),                */
 280        0x09, 0x44,         /*      Usage (44h),                    */
 281        0x95, 0x0D,         /*      Report Count (13),              */
 282        0xB1, 0x02,         /*      Feature (Variable),             */
 283        0x85, 0xA5,         /*      Report ID (165),                */
 284        0x09, 0x45,         /*      Usage (45h),                    */
 285        0x95, 0x15,         /*      Report Count (21),              */
 286        0xB1, 0x02,         /*      Feature (Variable),             */
 287        0x85, 0xA6,         /*      Report ID (166),                */
 288        0x09, 0x46,         /*      Usage (46h),                    */
 289        0x95, 0x15,         /*      Report Count (21),              */
 290        0xB1, 0x02,         /*      Feature (Variable),             */
 291        0x85, 0xF0,         /*      Report ID (240),                */
 292        0x09, 0x47,         /*      Usage (47h),                    */
 293        0x95, 0x3F,         /*      Report Count (63),              */
 294        0xB1, 0x02,         /*      Feature (Variable),             */
 295        0x85, 0xF1,         /*      Report ID (241),                */
 296        0x09, 0x48,         /*      Usage (48h),                    */
 297        0x95, 0x3F,         /*      Report Count (63),              */
 298        0xB1, 0x02,         /*      Feature (Variable),             */
 299        0x85, 0xF2,         /*      Report ID (242),                */
 300        0x09, 0x49,         /*      Usage (49h),                    */
 301        0x95, 0x0F,         /*      Report Count (15),              */
 302        0xB1, 0x02,         /*      Feature (Variable),             */
 303        0x85, 0xA7,         /*      Report ID (167),                */
 304        0x09, 0x4A,         /*      Usage (4Ah),                    */
 305        0x95, 0x01,         /*      Report Count (1),               */
 306        0xB1, 0x02,         /*      Feature (Variable),             */
 307        0x85, 0xA8,         /*      Report ID (168),                */
 308        0x09, 0x4B,         /*      Usage (4Bh),                    */
 309        0x95, 0x01,         /*      Report Count (1),               */
 310        0xB1, 0x02,         /*      Feature (Variable),             */
 311        0x85, 0xA9,         /*      Report ID (169),                */
 312        0x09, 0x4C,         /*      Usage (4Ch),                    */
 313        0x95, 0x08,         /*      Report Count (8),               */
 314        0xB1, 0x02,         /*      Feature (Variable),             */
 315        0x85, 0xAA,         /*      Report ID (170),                */
 316        0x09, 0x4E,         /*      Usage (4Eh),                    */
 317        0x95, 0x01,         /*      Report Count (1),               */
 318        0xB1, 0x02,         /*      Feature (Variable),             */
 319        0x85, 0xAB,         /*      Report ID (171),                */
 320        0x09, 0x4F,         /*      Usage (4Fh),                    */
 321        0x95, 0x39,         /*      Report Count (57),              */
 322        0xB1, 0x02,         /*      Feature (Variable),             */
 323        0x85, 0xAC,         /*      Report ID (172),                */
 324        0x09, 0x50,         /*      Usage (50h),                    */
 325        0x95, 0x39,         /*      Report Count (57),              */
 326        0xB1, 0x02,         /*      Feature (Variable),             */
 327        0x85, 0xAD,         /*      Report ID (173),                */
 328        0x09, 0x51,         /*      Usage (51h),                    */
 329        0x95, 0x0B,         /*      Report Count (11),              */
 330        0xB1, 0x02,         /*      Feature (Variable),             */
 331        0x85, 0xAE,         /*      Report ID (174),                */
 332        0x09, 0x52,         /*      Usage (52h),                    */
 333        0x95, 0x01,         /*      Report Count (1),               */
 334        0xB1, 0x02,         /*      Feature (Variable),             */
 335        0x85, 0xAF,         /*      Report ID (175),                */
 336        0x09, 0x53,         /*      Usage (53h),                    */
 337        0x95, 0x02,         /*      Report Count (2),               */
 338        0xB1, 0x02,         /*      Feature (Variable),             */
 339        0x85, 0xB0,         /*      Report ID (176),                */
 340        0x09, 0x54,         /*      Usage (54h),                    */
 341        0x95, 0x3F,         /*      Report Count (63),              */
 342        0xB1, 0x02,         /*      Feature (Variable),             */
 343        0xC0                /*  End Collection                      */
 344};
 345
 346/*
 347 * The default behavior of the Dualshock 4 is to send reports using report
 348 * type 1 when running over Bluetooth. However, as soon as it receives a
 349 * report of type 17 to set the LEDs or rumble it starts returning it's state
 350 * in report 17 instead of 1.  Since report 17 is undefined in the default HID
 351 * descriptor the button and axis definitions must be moved to report 17 or
 352 * the HID layer won't process the received input once a report is sent.
 353 */
 354static u8 dualshock4_bt_rdesc[] = {
 355        0x05, 0x01,         /*  Usage Page (Desktop),               */
 356        0x09, 0x05,         /*  Usage (Gamepad),                    */
 357        0xA1, 0x01,         /*  Collection (Application),           */
 358        0x85, 0x01,         /*      Report ID (1),                  */
 359        0x75, 0x08,         /*      Report Size (8),                */
 360        0x95, 0x0A,         /*      Report Count (9),               */
 361        0x81, 0x02,         /*      Input (Variable),               */
 362        0x06, 0x04, 0xFF,   /*      Usage Page (FF04h),             */
 363        0x85, 0x02,         /*      Report ID (2),                  */
 364        0x09, 0x24,         /*      Usage (24h),                    */
 365        0x95, 0x24,         /*      Report Count (36),              */
 366        0xB1, 0x02,         /*      Feature (Variable),             */
 367        0x85, 0xA3,         /*      Report ID (163),                */
 368        0x09, 0x25,         /*      Usage (25h),                    */
 369        0x95, 0x30,         /*      Report Count (48),              */
 370        0xB1, 0x02,         /*      Feature (Variable),             */
 371        0x85, 0x05,         /*      Report ID (5),                  */
 372        0x09, 0x26,         /*      Usage (26h),                    */
 373        0x95, 0x28,         /*      Report Count (40),              */
 374        0xB1, 0x02,         /*      Feature (Variable),             */
 375        0x85, 0x06,         /*      Report ID (6),                  */
 376        0x09, 0x27,         /*      Usage (27h),                    */
 377        0x95, 0x34,         /*      Report Count (52),              */
 378        0xB1, 0x02,         /*      Feature (Variable),             */
 379        0x85, 0x07,         /*      Report ID (7),                  */
 380        0x09, 0x28,         /*      Usage (28h),                    */
 381        0x95, 0x30,         /*      Report Count (48),              */
 382        0xB1, 0x02,         /*      Feature (Variable),             */
 383        0x85, 0x08,         /*      Report ID (8),                  */
 384        0x09, 0x29,         /*      Usage (29h),                    */
 385        0x95, 0x2F,         /*      Report Count (47),              */
 386        0xB1, 0x02,         /*      Feature (Variable),             */
 387        0x06, 0x03, 0xFF,   /*      Usage Page (FF03h),             */
 388        0x85, 0x03,         /*      Report ID (3),                  */
 389        0x09, 0x21,         /*      Usage (21h),                    */
 390        0x95, 0x26,         /*      Report Count (38),              */
 391        0xB1, 0x02,         /*      Feature (Variable),             */
 392        0x85, 0x04,         /*      Report ID (4),                  */
 393        0x09, 0x22,         /*      Usage (22h),                    */
 394        0x95, 0x2E,         /*      Report Count (46),              */
 395        0xB1, 0x02,         /*      Feature (Variable),             */
 396        0x85, 0xF0,         /*      Report ID (240),                */
 397        0x09, 0x47,         /*      Usage (47h),                    */
 398        0x95, 0x3F,         /*      Report Count (63),              */
 399        0xB1, 0x02,         /*      Feature (Variable),             */
 400        0x85, 0xF1,         /*      Report ID (241),                */
 401        0x09, 0x48,         /*      Usage (48h),                    */
 402        0x95, 0x3F,         /*      Report Count (63),              */
 403        0xB1, 0x02,         /*      Feature (Variable),             */
 404        0x85, 0xF2,         /*      Report ID (242),                */
 405        0x09, 0x49,         /*      Usage (49h),                    */
 406        0x95, 0x0F,         /*      Report Count (15),              */
 407        0xB1, 0x02,         /*      Feature (Variable),             */
 408        0x85, 0x11,         /*      Report ID (17),                 */
 409        0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
 410        0x09, 0x20,         /*      Usage (20h),                    */
 411        0x95, 0x02,         /*      Report Count (2),               */
 412        0x81, 0x02,         /*      Input (Variable),               */
 413        0x05, 0x01,         /*      Usage Page (Desktop),           */
 414        0x09, 0x30,         /*      Usage (X),                      */
 415        0x09, 0x31,         /*      Usage (Y),                      */
 416        0x09, 0x32,         /*      Usage (Z),                      */
 417        0x09, 0x35,         /*      Usage (Rz),                     */
 418        0x15, 0x00,         /*      Logical Minimum (0),            */
 419        0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
 420        0x75, 0x08,         /*      Report Size (8),                */
 421        0x95, 0x04,         /*      Report Count (4),               */
 422        0x81, 0x02,         /*      Input (Variable),               */
 423        0x09, 0x39,         /*      Usage (Hat Switch),             */
 424        0x15, 0x00,         /*      Logical Minimum (0),            */
 425        0x25, 0x07,         /*      Logical Maximum (7),            */
 426        0x75, 0x04,         /*      Report Size (4),                */
 427        0x95, 0x01,         /*      Report Count (1),               */
 428        0x81, 0x42,         /*      Input (Variable, Null State),   */
 429        0x05, 0x09,         /*      Usage Page (Button),            */
 430        0x19, 0x01,         /*      Usage Minimum (01h),            */
 431        0x29, 0x0E,         /*      Usage Maximum (0Eh),            */
 432        0x15, 0x00,         /*      Logical Minimum (0),            */
 433        0x25, 0x01,         /*      Logical Maximum (1),            */
 434        0x75, 0x01,         /*      Report Size (1),                */
 435        0x95, 0x0E,         /*      Report Count (14),              */
 436        0x81, 0x02,         /*      Input (Variable),               */
 437        0x75, 0x06,         /*      Report Size (6),                */
 438        0x95, 0x01,         /*      Report Count (1),               */
 439        0x81, 0x01,         /*      Input (Constant),               */
 440        0x05, 0x01,         /*      Usage Page (Desktop),           */
 441        0x09, 0x33,         /*      Usage (Rx),                     */
 442        0x09, 0x34,         /*      Usage (Ry),                     */
 443        0x15, 0x00,         /*      Logical Minimum (0),            */
 444        0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
 445        0x75, 0x08,         /*      Report Size (8),                */
 446        0x95, 0x02,         /*      Report Count (2),               */
 447        0x81, 0x02,         /*      Input (Variable),               */
 448        0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
 449        0x09, 0x20,         /*      Usage (20h),                    */
 450        0x95, 0x03,         /*      Report Count (3),               */
 451        0x81, 0x02,         /*      Input (Variable),               */
 452        0x05, 0x01,         /*      Usage Page (Desktop),           */
 453        0x19, 0x40,         /*      Usage Minimum (40h),            */
 454        0x29, 0x42,         /*      Usage Maximum (42h),            */
 455        0x16, 0x00, 0x80,   /*      Logical Minimum (-32768),       */
 456        0x26, 0x00, 0x7F,   /*      Logical Maximum (32767),        */
 457        0x75, 0x10,         /*      Report Size (16),               */
 458        0x95, 0x03,         /*      Report Count (3),               */
 459        0x81, 0x02,         /*      Input (Variable),               */
 460        0x19, 0x43,         /*      Usage Minimum (43h),            */
 461        0x29, 0x45,         /*      Usage Maximum (45h),            */
 462        0x16, 0xFF, 0xBF,   /*      Logical Minimum (-16385),       */
 463        0x26, 0x00, 0x40,   /*      Logical Maximum (16384),        */
 464        0x95, 0x03,         /*      Report Count (3),               */
 465        0x81, 0x02,         /*      Input (Variable),               */
 466        0x06, 0x00, 0xFF,   /*      Usage Page (FF00h),             */
 467        0x09, 0x20,         /*      Usage (20h),                    */
 468        0x15, 0x00,         /*      Logical Minimum (0),            */
 469        0x26, 0xFF, 0x00,   /*      Logical Maximum (255),          */
 470        0x75, 0x08,         /*      Report Size (8),                */
 471        0x95, 0x31,         /*      Report Count (51),              */
 472        0x81, 0x02,         /*      Input (Variable),               */
 473        0x09, 0x21,         /*      Usage (21h),                    */
 474        0x75, 0x08,         /*      Report Size (8),                */
 475        0x95, 0x4D,         /*      Report Count (77),              */
 476        0x91, 0x02,         /*      Output (Variable),              */
 477        0x85, 0x12,         /*      Report ID (18),                 */
 478        0x09, 0x22,         /*      Usage (22h),                    */
 479        0x95, 0x8D,         /*      Report Count (141),             */
 480        0x81, 0x02,         /*      Input (Variable),               */
 481        0x09, 0x23,         /*      Usage (23h),                    */
 482        0x91, 0x02,         /*      Output (Variable),              */
 483        0x85, 0x13,         /*      Report ID (19),                 */
 484        0x09, 0x24,         /*      Usage (24h),                    */
 485        0x95, 0xCD,         /*      Report Count (205),             */
 486        0x81, 0x02,         /*      Input (Variable),               */
 487        0x09, 0x25,         /*      Usage (25h),                    */
 488        0x91, 0x02,         /*      Output (Variable),              */
 489        0x85, 0x14,         /*      Report ID (20),                 */
 490        0x09, 0x26,         /*      Usage (26h),                    */
 491        0x96, 0x0D, 0x01,   /*      Report Count (269),             */
 492        0x81, 0x02,         /*      Input (Variable),               */
 493        0x09, 0x27,         /*      Usage (27h),                    */
 494        0x91, 0x02,         /*      Output (Variable),              */
 495        0x85, 0x15,         /*      Report ID (21),                 */
 496        0x09, 0x28,         /*      Usage (28h),                    */
 497        0x96, 0x4D, 0x01,   /*      Report Count (333),             */
 498        0x81, 0x02,         /*      Input (Variable),               */
 499        0x09, 0x29,         /*      Usage (29h),                    */
 500        0x91, 0x02,         /*      Output (Variable),              */
 501        0x85, 0x16,         /*      Report ID (22),                 */
 502        0x09, 0x2A,         /*      Usage (2Ah),                    */
 503        0x96, 0x8D, 0x01,   /*      Report Count (397),             */
 504        0x81, 0x02,         /*      Input (Variable),               */
 505        0x09, 0x2B,         /*      Usage (2Bh),                    */
 506        0x91, 0x02,         /*      Output (Variable),              */
 507        0x85, 0x17,         /*      Report ID (23),                 */
 508        0x09, 0x2C,         /*      Usage (2Ch),                    */
 509        0x96, 0xCD, 0x01,   /*      Report Count (461),             */
 510        0x81, 0x02,         /*      Input (Variable),               */
 511        0x09, 0x2D,         /*      Usage (2Dh),                    */
 512        0x91, 0x02,         /*      Output (Variable),              */
 513        0x85, 0x18,         /*      Report ID (24),                 */
 514        0x09, 0x2E,         /*      Usage (2Eh),                    */
 515        0x96, 0x0D, 0x02,   /*      Report Count (525),             */
 516        0x81, 0x02,         /*      Input (Variable),               */
 517        0x09, 0x2F,         /*      Usage (2Fh),                    */
 518        0x91, 0x02,         /*      Output (Variable),              */
 519        0x85, 0x19,         /*      Report ID (25),                 */
 520        0x09, 0x30,         /*      Usage (30h),                    */
 521        0x96, 0x22, 0x02,   /*      Report Count (546),             */
 522        0x81, 0x02,         /*      Input (Variable),               */
 523        0x09, 0x31,         /*      Usage (31h),                    */
 524        0x91, 0x02,         /*      Output (Variable),              */
 525        0x06, 0x80, 0xFF,   /*      Usage Page (FF80h),             */
 526        0x85, 0x82,         /*      Report ID (130),                */
 527        0x09, 0x22,         /*      Usage (22h),                    */
 528        0x95, 0x3F,         /*      Report Count (63),              */
 529        0xB1, 0x02,         /*      Feature (Variable),             */
 530        0x85, 0x83,         /*      Report ID (131),                */
 531        0x09, 0x23,         /*      Usage (23h),                    */
 532        0xB1, 0x02,         /*      Feature (Variable),             */
 533        0x85, 0x84,         /*      Report ID (132),                */
 534        0x09, 0x24,         /*      Usage (24h),                    */
 535        0xB1, 0x02,         /*      Feature (Variable),             */
 536        0x85, 0x90,         /*      Report ID (144),                */
 537        0x09, 0x30,         /*      Usage (30h),                    */
 538        0xB1, 0x02,         /*      Feature (Variable),             */
 539        0x85, 0x91,         /*      Report ID (145),                */
 540        0x09, 0x31,         /*      Usage (31h),                    */
 541        0xB1, 0x02,         /*      Feature (Variable),             */
 542        0x85, 0x92,         /*      Report ID (146),                */
 543        0x09, 0x32,         /*      Usage (32h),                    */
 544        0xB1, 0x02,         /*      Feature (Variable),             */
 545        0x85, 0x93,         /*      Report ID (147),                */
 546        0x09, 0x33,         /*      Usage (33h),                    */
 547        0xB1, 0x02,         /*      Feature (Variable),             */
 548        0x85, 0xA0,         /*      Report ID (160),                */
 549        0x09, 0x40,         /*      Usage (40h),                    */
 550        0xB1, 0x02,         /*      Feature (Variable),             */
 551        0x85, 0xA4,         /*      Report ID (164),                */
 552        0x09, 0x44,         /*      Usage (44h),                    */
 553        0xB1, 0x02,         /*      Feature (Variable),             */
 554        0xC0                /*  End Collection                      */
 555};
 556
 557static __u8 ps3remote_rdesc[] = {
 558        0x05, 0x01,          /* GUsagePage Generic Desktop */
 559        0x09, 0x05,          /* LUsage 0x05 [Game Pad] */
 560        0xA1, 0x01,          /* MCollection Application (mouse, keyboard) */
 561
 562         /* Use collection 1 for joypad buttons */
 563         0xA1, 0x02,         /* MCollection Logical (interrelated data) */
 564
 565          /* Ignore the 1st byte, maybe it is used for a controller
 566           * number but it's not needed for correct operation */
 567          0x75, 0x08,        /* GReportSize 0x08 [8] */
 568          0x95, 0x01,        /* GReportCount 0x01 [1] */
 569          0x81, 0x01,        /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
 570
 571          /* Bytes from 2nd to 4th are a bitmap for joypad buttons, for these
 572           * buttons multiple keypresses are allowed */
 573          0x05, 0x09,        /* GUsagePage Button */
 574          0x19, 0x01,        /* LUsageMinimum 0x01 [Button 1 (primary/trigger)] */
 575          0x29, 0x18,        /* LUsageMaximum 0x18 [Button 24] */
 576          0x14,              /* GLogicalMinimum [0] */
 577          0x25, 0x01,        /* GLogicalMaximum 0x01 [1] */
 578          0x75, 0x01,        /* GReportSize 0x01 [1] */
 579          0x95, 0x18,        /* GReportCount 0x18 [24] */
 580          0x81, 0x02,        /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
 581
 582          0xC0,              /* MEndCollection */
 583
 584         /* Use collection 2 for remote control buttons */
 585         0xA1, 0x02,         /* MCollection Logical (interrelated data) */
 586
 587          /* 5th byte is used for remote control buttons */
 588          0x05, 0x09,        /* GUsagePage Button */
 589          0x18,              /* LUsageMinimum [No button pressed] */
 590          0x29, 0xFE,        /* LUsageMaximum 0xFE [Button 254] */
 591          0x14,              /* GLogicalMinimum [0] */
 592          0x26, 0xFE, 0x00,  /* GLogicalMaximum 0x00FE [254] */
 593          0x75, 0x08,        /* GReportSize 0x08 [8] */
 594          0x95, 0x01,        /* GReportCount 0x01 [1] */
 595          0x80,              /* MInput  */
 596
 597          /* Ignore bytes from 6th to 11th, 6th to 10th are always constant at
 598           * 0xff and 11th is for press indication */
 599          0x75, 0x08,        /* GReportSize 0x08 [8] */
 600          0x95, 0x06,        /* GReportCount 0x06 [6] */
 601          0x81, 0x01,        /* MInput 0x01 (Const[0] Arr[1] Abs[2]) */
 602
 603          /* 12th byte is for battery strength */
 604          0x05, 0x06,        /* GUsagePage Generic Device Controls */
 605          0x09, 0x20,        /* LUsage 0x20 [Battery Strength] */
 606          0x14,              /* GLogicalMinimum [0] */
 607          0x25, 0x05,        /* GLogicalMaximum 0x05 [5] */
 608          0x75, 0x08,        /* GReportSize 0x08 [8] */
 609          0x95, 0x01,        /* GReportCount 0x01 [1] */
 610          0x81, 0x02,        /* MInput 0x02 (Data[0] Var[1] Abs[2]) */
 611
 612          0xC0,              /* MEndCollection */
 613
 614         0xC0                /* MEndCollection [Game Pad] */
 615};
 616
 617static const unsigned int ps3remote_keymap_joypad_buttons[] = {
 618        [0x01] = KEY_SELECT,
 619        [0x02] = BTN_THUMBL,            /* L3 */
 620        [0x03] = BTN_THUMBR,            /* R3 */
 621        [0x04] = BTN_START,
 622        [0x05] = KEY_UP,
 623        [0x06] = KEY_RIGHT,
 624        [0x07] = KEY_DOWN,
 625        [0x08] = KEY_LEFT,
 626        [0x09] = BTN_TL2,               /* L2 */
 627        [0x0a] = BTN_TR2,               /* R2 */
 628        [0x0b] = BTN_TL,                /* L1 */
 629        [0x0c] = BTN_TR,                /* R1 */
 630        [0x0d] = KEY_OPTION,            /* options/triangle */
 631        [0x0e] = KEY_BACK,              /* back/circle */
 632        [0x0f] = BTN_0,                 /* cross */
 633        [0x10] = KEY_SCREEN,            /* view/square */
 634        [0x11] = KEY_HOMEPAGE,          /* PS button */
 635        [0x14] = KEY_ENTER,
 636};
 637static const unsigned int ps3remote_keymap_remote_buttons[] = {
 638        [0x00] = KEY_1,
 639        [0x01] = KEY_2,
 640        [0x02] = KEY_3,
 641        [0x03] = KEY_4,
 642        [0x04] = KEY_5,
 643        [0x05] = KEY_6,
 644        [0x06] = KEY_7,
 645        [0x07] = KEY_8,
 646        [0x08] = KEY_9,
 647        [0x09] = KEY_0,
 648        [0x0e] = KEY_ESC,               /* return */
 649        [0x0f] = KEY_CLEAR,
 650        [0x16] = KEY_EJECTCD,
 651        [0x1a] = KEY_MENU,              /* top menu */
 652        [0x28] = KEY_TIME,
 653        [0x30] = KEY_PREVIOUS,
 654        [0x31] = KEY_NEXT,
 655        [0x32] = KEY_PLAY,
 656        [0x33] = KEY_REWIND,            /* scan back */
 657        [0x34] = KEY_FORWARD,           /* scan forward */
 658        [0x38] = KEY_STOP,
 659        [0x39] = KEY_PAUSE,
 660        [0x40] = KEY_CONTEXT_MENU,      /* pop up/menu */
 661        [0x60] = KEY_FRAMEBACK,         /* slow/step back */
 662        [0x61] = KEY_FRAMEFORWARD,      /* slow/step forward */
 663        [0x63] = KEY_SUBTITLE,
 664        [0x64] = KEY_AUDIO,
 665        [0x65] = KEY_ANGLE,
 666        [0x70] = KEY_INFO,              /* display */
 667        [0x80] = KEY_BLUE,
 668        [0x81] = KEY_RED,
 669        [0x82] = KEY_GREEN,
 670        [0x83] = KEY_YELLOW,
 671};
 672
 673static const unsigned int buzz_keymap[] = {
 674        /*
 675         * The controller has 4 remote buzzers, each with one LED and 5
 676         * buttons.
 677         * 
 678         * We use the mapping chosen by the controller, which is:
 679         *
 680         * Key          Offset
 681         * -------------------
 682         * Buzz              1
 683         * Blue              5
 684         * Orange            4
 685         * Green             3
 686         * Yellow            2
 687         *
 688         * So, for example, the orange button on the third buzzer is mapped to
 689         * BTN_TRIGGER_HAPPY14
 690         */
 691        [ 1] = BTN_TRIGGER_HAPPY1,
 692        [ 2] = BTN_TRIGGER_HAPPY2,
 693        [ 3] = BTN_TRIGGER_HAPPY3,
 694        [ 4] = BTN_TRIGGER_HAPPY4,
 695        [ 5] = BTN_TRIGGER_HAPPY5,
 696        [ 6] = BTN_TRIGGER_HAPPY6,
 697        [ 7] = BTN_TRIGGER_HAPPY7,
 698        [ 8] = BTN_TRIGGER_HAPPY8,
 699        [ 9] = BTN_TRIGGER_HAPPY9,
 700        [10] = BTN_TRIGGER_HAPPY10,
 701        [11] = BTN_TRIGGER_HAPPY11,
 702        [12] = BTN_TRIGGER_HAPPY12,
 703        [13] = BTN_TRIGGER_HAPPY13,
 704        [14] = BTN_TRIGGER_HAPPY14,
 705        [15] = BTN_TRIGGER_HAPPY15,
 706        [16] = BTN_TRIGGER_HAPPY16,
 707        [17] = BTN_TRIGGER_HAPPY17,
 708        [18] = BTN_TRIGGER_HAPPY18,
 709        [19] = BTN_TRIGGER_HAPPY19,
 710        [20] = BTN_TRIGGER_HAPPY20,
 711};
 712
 713static enum power_supply_property sony_battery_props[] = {
 714        POWER_SUPPLY_PROP_PRESENT,
 715        POWER_SUPPLY_PROP_CAPACITY,
 716        POWER_SUPPLY_PROP_SCOPE,
 717        POWER_SUPPLY_PROP_STATUS,
 718};
 719
 720static spinlock_t sony_dev_list_lock;
 721static LIST_HEAD(sony_device_list);
 722
 723struct sony_sc {
 724        spinlock_t lock;
 725        struct list_head list_node;
 726        struct hid_device *hdev;
 727        struct led_classdev *leds[MAX_LEDS];
 728        unsigned long quirks;
 729        struct work_struct state_worker;
 730        struct power_supply battery;
 731
 732#ifdef CONFIG_SONY_FF
 733        __u8 left;
 734        __u8 right;
 735#endif
 736
 737        __u8 mac_address[6];
 738        __u8 worker_initialized;
 739        __u8 cable_state;
 740        __u8 battery_charging;
 741        __u8 battery_capacity;
 742        __u8 led_state[MAX_LEDS];
 743        __u8 led_count;
 744};
 745
 746static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
 747                             unsigned int *rsize)
 748{
 749        *rsize = sizeof(ps3remote_rdesc);
 750        return ps3remote_rdesc;
 751}
 752
 753static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
 754                             struct hid_field *field, struct hid_usage *usage,
 755                             unsigned long **bit, int *max)
 756{
 757        unsigned int key = usage->hid & HID_USAGE;
 758
 759        if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
 760                return -1;
 761
 762        switch (usage->collection_index) {
 763        case 1:
 764                if (key >= ARRAY_SIZE(ps3remote_keymap_joypad_buttons))
 765                        return -1;
 766
 767                key = ps3remote_keymap_joypad_buttons[key];
 768                if (!key)
 769                        return -1;
 770                break;
 771        case 2:
 772                if (key >= ARRAY_SIZE(ps3remote_keymap_remote_buttons))
 773                        return -1;
 774
 775                key = ps3remote_keymap_remote_buttons[key];
 776                if (!key)
 777                        return -1;
 778                break;
 779        default:
 780                return -1;
 781        }
 782
 783        hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
 784        return 1;
 785}
 786
 787
 788/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
 789static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 790                unsigned int *rsize)
 791{
 792        struct sony_sc *sc = hid_get_drvdata(hdev);
 793
 794        /*
 795         * Some Sony RF receivers wrongly declare the mouse pointer as a
 796         * a constant non-data variable.
 797         */
 798        if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
 799            /* usage page: generic desktop controls */
 800            /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
 801            /* usage: mouse */
 802            rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
 803            /* input (usage page for x,y axes): constant, variable, relative */
 804            rdesc[54] == 0x81 && rdesc[55] == 0x07) {
 805                hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
 806                /* input: data, variable, relative */
 807                rdesc[55] = 0x06;
 808        }
 809
 810        /*
 811         * The default Dualshock 4 USB descriptor doesn't assign
 812         * the gyroscope values to corresponding axes so we need a
 813         * modified one.
 814         */
 815        if ((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && *rsize == 467) {
 816                hid_info(hdev, "Using modified Dualshock 4 report descriptor with gyroscope axes\n");
 817                rdesc = dualshock4_usb_rdesc;
 818                *rsize = sizeof(dualshock4_usb_rdesc);
 819        } else if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) && *rsize == 357) {
 820                hid_info(hdev, "Using modified Dualshock 4 Bluetooth report descriptor\n");
 821                rdesc = dualshock4_bt_rdesc;
 822                *rsize = sizeof(dualshock4_bt_rdesc);
 823        }
 824
 825        /* The HID descriptor exposed over BT has a trailing zero byte */
 826        if ((((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize == 148) ||
 827                        ((sc->quirks & SIXAXIS_CONTROLLER_BT) && *rsize == 149)) &&
 828                        rdesc[83] == 0x75) {
 829                hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
 830                memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
 831                        sizeof(sixaxis_rdesc_fixup));
 832        } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
 833                   *rsize > sizeof(sixaxis_rdesc_fixup2)) {
 834                hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
 835                         *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
 836                *rsize = sizeof(sixaxis_rdesc_fixup2);
 837                memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
 838        }
 839
 840        if (sc->quirks & PS3REMOTE)
 841                return ps3remote_fixup(hdev, rdesc, rsize);
 842
 843        return rdesc;
 844}
 845
 846static void sixaxis_parse_report(struct sony_sc *sc, __u8 *rd, int size)
 847{
 848        static const __u8 sixaxis_battery_capacity[] = { 0, 1, 25, 50, 75, 100 };
 849        unsigned long flags;
 850        __u8 cable_state, battery_capacity, battery_charging;
 851
 852        /*
 853         * The sixaxis is charging if the battery value is 0xee
 854         * and it is fully charged if the value is 0xef.
 855         * It does not report the actual level while charging so it
 856         * is set to 100% while charging is in progress.
 857         */
 858        if (rd[30] >= 0xee) {
 859                battery_capacity = 100;
 860                battery_charging = !(rd[30] & 0x01);
 861        } else {
 862                __u8 index = rd[30] <= 5 ? rd[30] : 5;
 863                battery_capacity = sixaxis_battery_capacity[index];
 864                battery_charging = 0;
 865        }
 866        cable_state = !(rd[31] & 0x04);
 867
 868        spin_lock_irqsave(&sc->lock, flags);
 869        sc->cable_state = cable_state;
 870        sc->battery_capacity = battery_capacity;
 871        sc->battery_charging = battery_charging;
 872        spin_unlock_irqrestore(&sc->lock, flags);
 873}
 874
 875static void dualshock4_parse_report(struct sony_sc *sc, __u8 *rd, int size)
 876{
 877        struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
 878                                                struct hid_input, list);
 879        struct input_dev *input_dev = hidinput->input;
 880        unsigned long flags;
 881        int n, offset;
 882        __u8 cable_state, battery_capacity, battery_charging;
 883
 884        /*
 885         * Battery and touchpad data starts at byte 30 in the USB report and
 886         * 32 in Bluetooth report.
 887         */
 888        offset = (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ? 30 : 32;
 889
 890        /*
 891         * The lower 4 bits of byte 30 contain the battery level
 892         * and the 5th bit contains the USB cable state.
 893         */
 894        cable_state = (rd[offset] >> 4) & 0x01;
 895        battery_capacity = rd[offset] & 0x0F;
 896
 897        /*
 898         * When a USB power source is connected the battery level ranges from
 899         * 0 to 10, and when running on battery power it ranges from 0 to 9.
 900         * A battery level above 10 when plugged in means charge completed.
 901         */
 902        if (!cable_state || battery_capacity > 10)
 903                battery_charging = 0;
 904        else
 905                battery_charging = 1;
 906
 907        if (!cable_state)
 908                battery_capacity++;
 909        if (battery_capacity > 10)
 910                battery_capacity = 10;
 911
 912        battery_capacity *= 10;
 913
 914        spin_lock_irqsave(&sc->lock, flags);
 915        sc->cable_state = cable_state;
 916        sc->battery_capacity = battery_capacity;
 917        sc->battery_charging = battery_charging;
 918        spin_unlock_irqrestore(&sc->lock, flags);
 919
 920        offset += 5;
 921
 922        /*
 923         * The Dualshock 4 multi-touch trackpad data starts at offset 35 on USB
 924         * and 37 on Bluetooth.
 925         * The first 7 bits of the first byte is a counter and bit 8 is a touch
 926         * indicator that is 0 when pressed and 1 when not pressed.
 927         * The next 3 bytes are two 12 bit touch coordinates, X and Y.
 928         * The data for the second touch is in the same format and immediatly
 929         * follows the data for the first.
 930         */
 931        for (n = 0; n < 2; n++) {
 932                __u16 x, y;
 933
 934                x = rd[offset+1] | ((rd[offset+2] & 0xF) << 8);
 935                y = ((rd[offset+2] & 0xF0) >> 4) | (rd[offset+3] << 4);
 936
 937                input_mt_slot(input_dev, n);
 938                input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
 939                                        !(rd[offset] >> 7));
 940                input_report_abs(input_dev, ABS_MT_POSITION_X, x);
 941                input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
 942
 943                offset += 4;
 944        }
 945}
 946
 947static int sony_raw_event(struct hid_device *hdev, struct hid_report *report,
 948                __u8 *rd, int size)
 949{
 950        struct sony_sc *sc = hid_get_drvdata(hdev);
 951
 952        /*
 953         * Sixaxis HID report has acclerometers/gyro with MSByte first, this
 954         * has to be BYTE_SWAPPED before passing up to joystick interface
 955         */
 956        if ((sc->quirks & SIXAXIS_CONTROLLER) && rd[0] == 0x01 && size == 49) {
 957                swap(rd[41], rd[42]);
 958                swap(rd[43], rd[44]);
 959                swap(rd[45], rd[46]);
 960                swap(rd[47], rd[48]);
 961
 962                sixaxis_parse_report(sc, rd, size);
 963        } else if (((sc->quirks & DUALSHOCK4_CONTROLLER_USB) && rd[0] == 0x01 &&
 964                        size == 64) || ((sc->quirks & DUALSHOCK4_CONTROLLER_BT)
 965                        && rd[0] == 0x11 && size == 78)) {
 966                dualshock4_parse_report(sc, rd, size);
 967        }
 968
 969        return 0;
 970}
 971
 972static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
 973                        struct hid_field *field, struct hid_usage *usage,
 974                        unsigned long **bit, int *max)
 975{
 976        struct sony_sc *sc = hid_get_drvdata(hdev);
 977
 978        if (sc->quirks & BUZZ_CONTROLLER) {
 979                unsigned int key = usage->hid & HID_USAGE;
 980
 981                if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
 982                        return -1;
 983
 984                switch (usage->collection_index) {
 985                case 1:
 986                        if (key >= ARRAY_SIZE(buzz_keymap))
 987                                return -1;
 988
 989                        key = buzz_keymap[key];
 990                        if (!key)
 991                                return -1;
 992                        break;
 993                default:
 994                        return -1;
 995                }
 996
 997                hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
 998                return 1;
 999        }
1000
1001        if (sc->quirks & PS3REMOTE)
1002                return ps3remote_mapping(hdev, hi, field, usage, bit, max);
1003
1004        /* Let hid-core decide for the others */
1005        return 0;
1006}
1007
1008/*
1009 * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
1010 * to "operational".  Without this, the ps3 controller will not report any
1011 * events.
1012 */
1013static int sixaxis_set_operational_usb(struct hid_device *hdev)
1014{
1015        int ret;
1016        char *buf = kmalloc(18, GFP_KERNEL);
1017
1018        if (!buf)
1019                return -ENOMEM;
1020
1021        ret = hid_hw_raw_request(hdev, 0xf2, buf, 17, HID_FEATURE_REPORT,
1022                                 HID_REQ_GET_REPORT);
1023
1024        if (ret < 0)
1025                hid_err(hdev, "can't set operational mode\n");
1026
1027        kfree(buf);
1028
1029        return ret;
1030}
1031
1032static int sixaxis_set_operational_bt(struct hid_device *hdev)
1033{
1034        unsigned char buf[] = { 0xf4,  0x42, 0x03, 0x00, 0x00 };
1035        return hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
1036                                  HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
1037}
1038
1039/*
1040 * Requesting feature report 0x02 in Bluetooth mode changes the state of the
1041 * controller so that it sends full input reports of type 0x11.
1042 */
1043static int dualshock4_set_operational_bt(struct hid_device *hdev)
1044{
1045        __u8 buf[37] = { 0 };
1046
1047        return hid_hw_raw_request(hdev, 0x02, buf, sizeof(buf),
1048                                HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1049}
1050
1051static void buzz_set_leds(struct hid_device *hdev, const __u8 *leds)
1052{
1053        struct list_head *report_list =
1054                &hdev->report_enum[HID_OUTPUT_REPORT].report_list;
1055        struct hid_report *report = list_entry(report_list->next,
1056                struct hid_report, list);
1057        __s32 *value = report->field[0]->value;
1058
1059        value[0] = 0x00;
1060        value[1] = leds[0] ? 0xff : 0x00;
1061        value[2] = leds[1] ? 0xff : 0x00;
1062        value[3] = leds[2] ? 0xff : 0x00;
1063        value[4] = leds[3] ? 0xff : 0x00;
1064        value[5] = 0x00;
1065        value[6] = 0x00;
1066        hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1067}
1068
1069static void sony_set_leds(struct hid_device *hdev, const __u8 *leds, int count)
1070{
1071        struct sony_sc *drv_data = hid_get_drvdata(hdev);
1072        int n;
1073
1074        BUG_ON(count > MAX_LEDS);
1075
1076        if (drv_data->quirks & BUZZ_CONTROLLER && count == 4) {
1077                buzz_set_leds(hdev, leds);
1078        } else {
1079                for (n = 0; n < count; n++)
1080                        drv_data->led_state[n] = leds[n];
1081                schedule_work(&drv_data->state_worker);
1082        }
1083}
1084
1085static void sony_led_set_brightness(struct led_classdev *led,
1086                                    enum led_brightness value)
1087{
1088        struct device *dev = led->dev->parent;
1089        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1090        struct sony_sc *drv_data;
1091
1092        int n;
1093
1094        drv_data = hid_get_drvdata(hdev);
1095        if (!drv_data) {
1096                hid_err(hdev, "No device data\n");
1097                return;
1098        }
1099
1100        for (n = 0; n < drv_data->led_count; n++) {
1101                if (led == drv_data->leds[n]) {
1102                        if (value != drv_data->led_state[n]) {
1103                                drv_data->led_state[n] = value;
1104                                sony_set_leds(hdev, drv_data->led_state, drv_data->led_count);
1105                        }
1106                        break;
1107                }
1108        }
1109}
1110
1111static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
1112{
1113        struct device *dev = led->dev->parent;
1114        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1115        struct sony_sc *drv_data;
1116
1117        int n;
1118
1119        drv_data = hid_get_drvdata(hdev);
1120        if (!drv_data) {
1121                hid_err(hdev, "No device data\n");
1122                return LED_OFF;
1123        }
1124
1125        for (n = 0; n < drv_data->led_count; n++) {
1126                if (led == drv_data->leds[n])
1127                        return drv_data->led_state[n];
1128        }
1129
1130        return LED_OFF;
1131}
1132
1133static void sony_leds_remove(struct hid_device *hdev)
1134{
1135        struct sony_sc *drv_data;
1136        struct led_classdev *led;
1137        int n;
1138
1139        drv_data = hid_get_drvdata(hdev);
1140        BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
1141
1142        for (n = 0; n < drv_data->led_count; n++) {
1143                led = drv_data->leds[n];
1144                drv_data->leds[n] = NULL;
1145                if (!led)
1146                        continue;
1147                led_classdev_unregister(led);
1148                kfree(led);
1149        }
1150
1151        drv_data->led_count = 0;
1152}
1153
1154static int sony_leds_init(struct hid_device *hdev)
1155{
1156        struct sony_sc *drv_data;
1157        int n, ret = 0;
1158        int max_brightness;
1159        int use_colors;
1160        struct led_classdev *led;
1161        size_t name_sz;
1162        char *name;
1163        size_t name_len;
1164        const char *name_fmt;
1165        static const char * const color_str[] = { "red", "green", "blue" };
1166        static const __u8 initial_values[MAX_LEDS] = { 0x00, 0x00, 0x00, 0x00 };
1167
1168        drv_data = hid_get_drvdata(hdev);
1169        BUG_ON(!(drv_data->quirks & SONY_LED_SUPPORT));
1170
1171        if (drv_data->quirks & BUZZ_CONTROLLER) {
1172                drv_data->led_count = 4;
1173                max_brightness = 1;
1174                use_colors = 0;
1175                name_len = strlen("::buzz#");
1176                name_fmt = "%s::buzz%d";
1177                /* Validate expected report characteristics. */
1178                if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
1179                        return -ENODEV;
1180        } else if (drv_data->quirks & DUALSHOCK4_CONTROLLER) {
1181                drv_data->led_count = 3;
1182                max_brightness = 255;
1183                use_colors = 1;
1184                name_len = 0;
1185                name_fmt = "%s:%s";
1186        } else {
1187                drv_data->led_count = 4;
1188                max_brightness = 1;
1189                use_colors = 0;
1190                name_len = strlen("::sony#");
1191                name_fmt = "%s::sony%d";
1192        }
1193
1194        /*
1195         * Clear LEDs as we have no way of reading their initial state. This is
1196         * only relevant if the driver is loaded after somebody actively set the
1197         * LEDs to on
1198         */
1199        sony_set_leds(hdev, initial_values, drv_data->led_count);
1200
1201        name_sz = strlen(dev_name(&hdev->dev)) + name_len + 1;
1202
1203        for (n = 0; n < drv_data->led_count; n++) {
1204
1205                if (use_colors)
1206                        name_sz = strlen(dev_name(&hdev->dev)) + strlen(color_str[n]) + 2;
1207
1208                led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
1209                if (!led) {
1210                        hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
1211                        ret = -ENOMEM;
1212                        goto error_leds;
1213                }
1214
1215                name = (void *)(&led[1]);
1216                if (use_colors)
1217                        snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), color_str[n]);
1218                else
1219                        snprintf(name, name_sz, name_fmt, dev_name(&hdev->dev), n + 1);
1220                led->name = name;
1221                led->brightness = 0;
1222                led->max_brightness = max_brightness;
1223                led->brightness_get = sony_led_get_brightness;
1224                led->brightness_set = sony_led_set_brightness;
1225
1226                ret = led_classdev_register(&hdev->dev, led);
1227                if (ret) {
1228                        hid_err(hdev, "Failed to register LED %d\n", n);
1229                        kfree(led);
1230                        goto error_leds;
1231                }
1232
1233                drv_data->leds[n] = led;
1234        }
1235
1236        return ret;
1237
1238error_leds:
1239        sony_leds_remove(hdev);
1240
1241        return ret;
1242}
1243
1244static void sixaxis_state_worker(struct work_struct *work)
1245{
1246        struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1247        unsigned char buf[] = {
1248                0x01,
1249                0x00, 0xff, 0x00, 0xff, 0x00,
1250                0x00, 0x00, 0x00, 0x00, 0x00,
1251                0xff, 0x27, 0x10, 0x00, 0x32,
1252                0xff, 0x27, 0x10, 0x00, 0x32,
1253                0xff, 0x27, 0x10, 0x00, 0x32,
1254                0xff, 0x27, 0x10, 0x00, 0x32,
1255                0x00, 0x00, 0x00, 0x00, 0x00
1256        };
1257
1258#ifdef CONFIG_SONY_FF
1259        buf[3] = sc->right ? 1 : 0;
1260        buf[5] = sc->left;
1261#endif
1262
1263        buf[10] |= sc->led_state[0] << 1;
1264        buf[10] |= sc->led_state[1] << 2;
1265        buf[10] |= sc->led_state[2] << 3;
1266        buf[10] |= sc->led_state[3] << 4;
1267
1268        hid_hw_raw_request(sc->hdev, 0x01, buf, sizeof(buf), HID_OUTPUT_REPORT,
1269                        HID_REQ_SET_REPORT);
1270}
1271
1272static void dualshock4_state_worker(struct work_struct *work)
1273{
1274        struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1275        struct hid_device *hdev = sc->hdev;
1276        int offset;
1277
1278        __u8 buf[78] = { 0 };
1279
1280        if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1281                buf[0] = 0x05;
1282                buf[1] = 0x03;
1283                offset = 4;
1284        } else {
1285                buf[0] = 0x11;
1286                buf[1] = 0xB0;
1287                buf[3] = 0x0F;
1288                offset = 6;
1289        }
1290
1291#ifdef CONFIG_SONY_FF
1292        buf[offset++] = sc->right;
1293        buf[offset++] = sc->left;
1294#else
1295        offset += 2;
1296#endif
1297
1298        buf[offset++] = sc->led_state[0];
1299        buf[offset++] = sc->led_state[1];
1300        buf[offset++] = sc->led_state[2];
1301
1302        if (sc->quirks & DUALSHOCK4_CONTROLLER_USB)
1303                hid_hw_output_report(hdev, buf, 32);
1304        else
1305                hid_hw_raw_request(hdev, 0x11, buf, 78,
1306                                HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1307}
1308
1309#ifdef CONFIG_SONY_FF
1310static int sony_play_effect(struct input_dev *dev, void *data,
1311                            struct ff_effect *effect)
1312{
1313        struct hid_device *hid = input_get_drvdata(dev);
1314        struct sony_sc *sc = hid_get_drvdata(hid);
1315
1316        if (effect->type != FF_RUMBLE)
1317                return 0;
1318
1319        sc->left = effect->u.rumble.strong_magnitude / 256;
1320        sc->right = effect->u.rumble.weak_magnitude / 256;
1321
1322        schedule_work(&sc->state_worker);
1323        return 0;
1324}
1325
1326static int sony_init_ff(struct hid_device *hdev)
1327{
1328        struct hid_input *hidinput = list_entry(hdev->inputs.next,
1329                                                struct hid_input, list);
1330        struct input_dev *input_dev = hidinput->input;
1331
1332        input_set_capability(input_dev, EV_FF, FF_RUMBLE);
1333        return input_ff_create_memless(input_dev, NULL, sony_play_effect);
1334}
1335
1336#else
1337static int sony_init_ff(struct hid_device *hdev)
1338{
1339        return 0;
1340}
1341
1342#endif
1343
1344static int sony_battery_get_property(struct power_supply *psy,
1345                                     enum power_supply_property psp,
1346                                     union power_supply_propval *val)
1347{
1348        struct sony_sc *sc = container_of(psy, struct sony_sc, battery);
1349        unsigned long flags;
1350        int ret = 0;
1351        u8 battery_charging, battery_capacity, cable_state;
1352
1353        spin_lock_irqsave(&sc->lock, flags);
1354        battery_charging = sc->battery_charging;
1355        battery_capacity = sc->battery_capacity;
1356        cable_state = sc->cable_state;
1357        spin_unlock_irqrestore(&sc->lock, flags);
1358
1359        switch (psp) {
1360        case POWER_SUPPLY_PROP_PRESENT:
1361                val->intval = 1;
1362                break;
1363        case POWER_SUPPLY_PROP_SCOPE:
1364                val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1365                break;
1366        case POWER_SUPPLY_PROP_CAPACITY:
1367                val->intval = battery_capacity;
1368                break;
1369        case POWER_SUPPLY_PROP_STATUS:
1370                if (battery_charging)
1371                        val->intval = POWER_SUPPLY_STATUS_CHARGING;
1372                else
1373                        if (battery_capacity == 100 && cable_state)
1374                                val->intval = POWER_SUPPLY_STATUS_FULL;
1375                        else
1376                                val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1377                break;
1378        default:
1379                ret = -EINVAL;
1380                break;
1381        }
1382        return ret;
1383}
1384
1385static int sony_battery_probe(struct sony_sc *sc)
1386{
1387        static atomic_t power_id_seq = ATOMIC_INIT(0);
1388        unsigned long power_id;
1389        struct hid_device *hdev = sc->hdev;
1390        int ret;
1391
1392        /*
1393         * Set the default battery level to 100% to avoid low battery warnings
1394         * if the battery is polled before the first device report is received.
1395         */
1396        sc->battery_capacity = 100;
1397
1398        power_id = (unsigned long)atomic_inc_return(&power_id_seq);
1399
1400        sc->battery.properties = sony_battery_props;
1401        sc->battery.num_properties = ARRAY_SIZE(sony_battery_props);
1402        sc->battery.get_property = sony_battery_get_property;
1403        sc->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1404        sc->battery.use_for_apm = 0;
1405        sc->battery.name = kasprintf(GFP_KERNEL, "sony_controller_battery_%lu",
1406                                     power_id);
1407        if (!sc->battery.name)
1408                return -ENOMEM;
1409
1410        ret = power_supply_register(&hdev->dev, &sc->battery);
1411        if (ret) {
1412                hid_err(hdev, "Unable to register battery device\n");
1413                goto err_free;
1414        }
1415
1416        power_supply_powers(&sc->battery, &hdev->dev);
1417        return 0;
1418
1419err_free:
1420        kfree(sc->battery.name);
1421        sc->battery.name = NULL;
1422        return ret;
1423}
1424
1425static void sony_battery_remove(struct sony_sc *sc)
1426{
1427        if (!sc->battery.name)
1428                return;
1429
1430        power_supply_unregister(&sc->battery);
1431        kfree(sc->battery.name);
1432        sc->battery.name = NULL;
1433}
1434
1435static int sony_register_touchpad(struct sony_sc *sc, int touch_count,
1436                                        int w, int h)
1437{
1438        struct hid_input *hidinput = list_entry(sc->hdev->inputs.next,
1439                                                struct hid_input, list);
1440        struct input_dev *input_dev = hidinput->input;
1441        int ret;
1442
1443        ret = input_mt_init_slots(input_dev, touch_count, 0);
1444        if (ret < 0) {
1445                hid_err(sc->hdev, "Unable to initialize multi-touch slots\n");
1446                return ret;
1447        }
1448
1449        input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, w, 0, 0);
1450        input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, h, 0, 0);
1451
1452        return 0;
1453}
1454
1455/*
1456 * If a controller is plugged in via USB while already connected via Bluetooth
1457 * it will show up as two devices. A global list of connected controllers and
1458 * their MAC addresses is maintained to ensure that a device is only connected
1459 * once.
1460 */
1461static int sony_check_add_dev_list(struct sony_sc *sc)
1462{
1463        struct sony_sc *entry;
1464        unsigned long flags;
1465        int ret;
1466
1467        spin_lock_irqsave(&sony_dev_list_lock, flags);
1468
1469        list_for_each_entry(entry, &sony_device_list, list_node) {
1470                ret = memcmp(sc->mac_address, entry->mac_address,
1471                                sizeof(sc->mac_address));
1472                if (!ret) {
1473                        ret = -EEXIST;
1474                        hid_info(sc->hdev, "controller with MAC address %pMR already connected\n",
1475                                sc->mac_address);
1476                        goto unlock;
1477                }
1478        }
1479
1480        ret = 0;
1481        list_add(&(sc->list_node), &sony_device_list);
1482
1483unlock:
1484        spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1485        return ret;
1486}
1487
1488static void sony_remove_dev_list(struct sony_sc *sc)
1489{
1490        unsigned long flags;
1491
1492        if (sc->list_node.next) {
1493                spin_lock_irqsave(&sony_dev_list_lock, flags);
1494                list_del(&(sc->list_node));
1495                spin_unlock_irqrestore(&sony_dev_list_lock, flags);
1496        }
1497}
1498
1499static int sony_get_bt_devaddr(struct sony_sc *sc)
1500{
1501        int ret;
1502
1503        /* HIDP stores the device MAC address as a string in the uniq field. */
1504        ret = strlen(sc->hdev->uniq);
1505        if (ret != 17)
1506                return -EINVAL;
1507
1508        ret = sscanf(sc->hdev->uniq,
1509                "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1510                &sc->mac_address[5], &sc->mac_address[4], &sc->mac_address[3],
1511                &sc->mac_address[2], &sc->mac_address[1], &sc->mac_address[0]);
1512
1513        if (ret != 6)
1514                return -EINVAL;
1515
1516        return 0;
1517}
1518
1519static int sony_check_add(struct sony_sc *sc)
1520{
1521        int n, ret;
1522
1523        if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) ||
1524            (sc->quirks & SIXAXIS_CONTROLLER_BT)) {
1525                /*
1526                 * sony_get_bt_devaddr() attempts to parse the Bluetooth MAC
1527                 * address from the uniq string where HIDP stores it.
1528                 * As uniq cannot be guaranteed to be a MAC address in all cases
1529                 * a failure of this function should not prevent the connection.
1530                 */
1531                if (sony_get_bt_devaddr(sc) < 0) {
1532                        hid_warn(sc->hdev, "UNIQ does not contain a MAC address; duplicate check skipped\n");
1533                        return 0;
1534                }
1535        } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) {
1536                __u8 buf[7];
1537
1538                /*
1539                 * The MAC address of a DS4 controller connected via USB can be
1540                 * retrieved with feature report 0x81. The address begins at
1541                 * offset 1.
1542                 */
1543                ret = hid_hw_raw_request(sc->hdev, 0x81, buf, sizeof(buf),
1544                                HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1545
1546                if (ret != 7) {
1547                        hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
1548                        return ret < 0 ? ret : -EINVAL;
1549                }
1550
1551                memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
1552        } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1553                __u8 buf[18];
1554
1555                /*
1556                 * The MAC address of a Sixaxis controller connected via USB can
1557                 * be retrieved with feature report 0xf2. The address begins at
1558                 * offset 4.
1559                 */
1560                ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, sizeof(buf),
1561                                HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
1562
1563                if (ret != 18) {
1564                        hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n");
1565                        return ret < 0 ? ret : -EINVAL;
1566                }
1567
1568                /*
1569                 * The Sixaxis device MAC in the report is big-endian and must
1570                 * be byte-swapped.
1571                 */
1572                for (n = 0; n < 6; n++)
1573                        sc->mac_address[5-n] = buf[4+n];
1574        } else {
1575                return 0;
1576        }
1577
1578        return sony_check_add_dev_list(sc);
1579}
1580
1581
1582static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
1583{
1584        int ret;
1585        unsigned long quirks = id->driver_data;
1586        struct sony_sc *sc;
1587        unsigned int connect_mask = HID_CONNECT_DEFAULT;
1588
1589        sc = devm_kzalloc(&hdev->dev, sizeof(*sc), GFP_KERNEL);
1590        if (sc == NULL) {
1591                hid_err(hdev, "can't alloc sony descriptor\n");
1592                return -ENOMEM;
1593        }
1594
1595        sc->quirks = quirks;
1596        hid_set_drvdata(hdev, sc);
1597        sc->hdev = hdev;
1598
1599        ret = hid_parse(hdev);
1600        if (ret) {
1601                hid_err(hdev, "parse failed\n");
1602                return ret;
1603        }
1604
1605        if (sc->quirks & VAIO_RDESC_CONSTANT)
1606                connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1607        else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
1608                connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1609        else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
1610                connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1611
1612        ret = hid_hw_start(hdev, connect_mask);
1613        if (ret) {
1614                hid_err(hdev, "hw start failed\n");
1615                return ret;
1616        }
1617
1618        if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
1619                /*
1620                 * The Sony Sixaxis does not handle HID Output Reports on the
1621                 * Interrupt EP like it could, so we need to force HID Output
1622                 * Reports to use HID_REQ_SET_REPORT on the Control EP.
1623                 *
1624                 * There is also another issue about HID Output Reports via USB,
1625                 * the Sixaxis does not want the report_id as part of the data
1626                 * packet, so we have to discard buf[0] when sending the actual
1627                 * control message, even for numbered reports, humpf!
1628                 */
1629                hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1630                hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
1631                ret = sixaxis_set_operational_usb(hdev);
1632                sc->worker_initialized = 1;
1633                INIT_WORK(&sc->state_worker, sixaxis_state_worker);
1634        } else if (sc->quirks & SIXAXIS_CONTROLLER_BT) {
1635                /*
1636                 * The Sixaxis wants output reports sent on the ctrl endpoint
1637                 * when connected via Bluetooth.
1638                 */
1639                hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1640                ret = sixaxis_set_operational_bt(hdev);
1641                sc->worker_initialized = 1;
1642                INIT_WORK(&sc->state_worker, sixaxis_state_worker);
1643        } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
1644                if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
1645                        /*
1646                         * The DualShock 4 wants output reports sent on the ctrl
1647                         * endpoint when connected via Bluetooth.
1648                         */
1649                        hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
1650                        ret = dualshock4_set_operational_bt(hdev);
1651                        if (ret < 0) {
1652                                hid_err(hdev, "failed to set the Dualshock 4 operational mode\n");
1653                                goto err_stop;
1654                        }
1655                }
1656                /*
1657                 * The Dualshock 4 touchpad supports 2 touches and has a
1658                 * resolution of 1920x940.
1659                 */
1660                ret = sony_register_touchpad(sc, 2, 1920, 940);
1661                if (ret < 0)
1662                        goto err_stop;
1663
1664                sc->worker_initialized = 1;
1665                INIT_WORK(&sc->state_worker, dualshock4_state_worker);
1666        } else {
1667                ret = 0;
1668        }
1669
1670        if (ret < 0)
1671                goto err_stop;
1672
1673        ret = sony_check_add(sc);
1674        if (ret < 0)
1675                goto err_stop;
1676
1677        if (sc->quirks & SONY_LED_SUPPORT) {
1678                ret = sony_leds_init(hdev);
1679                if (ret < 0)
1680                        goto err_stop;
1681        }
1682
1683        if (sc->quirks & SONY_BATTERY_SUPPORT) {
1684                ret = sony_battery_probe(sc);
1685                if (ret < 0)
1686                        goto err_stop;
1687
1688                /* Open the device to receive reports with battery info */
1689                ret = hid_hw_open(hdev);
1690                if (ret < 0) {
1691                        hid_err(hdev, "hw open failed\n");
1692                        goto err_stop;
1693                }
1694        }
1695
1696        if (sc->quirks & SONY_FF_SUPPORT) {
1697                ret = sony_init_ff(hdev);
1698                if (ret < 0)
1699                        goto err_close;
1700        }
1701
1702        return 0;
1703err_close:
1704        hid_hw_close(hdev);
1705err_stop:
1706        if (sc->quirks & SONY_LED_SUPPORT)
1707                sony_leds_remove(hdev);
1708        if (sc->quirks & SONY_BATTERY_SUPPORT)
1709                sony_battery_remove(sc);
1710        if (sc->worker_initialized)
1711                cancel_work_sync(&sc->state_worker);
1712        sony_remove_dev_list(sc);
1713        hid_hw_stop(hdev);
1714        return ret;
1715}
1716
1717static void sony_remove(struct hid_device *hdev)
1718{
1719        struct sony_sc *sc = hid_get_drvdata(hdev);
1720
1721        if (sc->quirks & SONY_LED_SUPPORT)
1722                sony_leds_remove(hdev);
1723
1724        if (sc->quirks & SONY_BATTERY_SUPPORT) {
1725                hid_hw_close(hdev);
1726                sony_battery_remove(sc);
1727        }
1728
1729        if (sc->worker_initialized)
1730                cancel_work_sync(&sc->state_worker);
1731
1732        sony_remove_dev_list(sc);
1733
1734        hid_hw_stop(hdev);
1735}
1736
1737static const struct hid_device_id sony_devices[] = {
1738        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
1739                .driver_data = SIXAXIS_CONTROLLER_USB },
1740        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER),
1741                .driver_data = SIXAXIS_CONTROLLER_USB },
1742        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
1743                .driver_data = SIXAXIS_CONTROLLER_BT },
1744        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
1745                .driver_data = VAIO_RDESC_CONSTANT },
1746        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
1747                .driver_data = VAIO_RDESC_CONSTANT },
1748        /* Wired Buzz Controller. Reported as Sony Hub from its USB ID and as
1749         * Logitech joystick from the device descriptor. */
1750        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER),
1751                .driver_data = BUZZ_CONTROLLER },
1752        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER),
1753                .driver_data = BUZZ_CONTROLLER },
1754        /* PS3 BD Remote Control */
1755        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE),
1756                .driver_data = PS3REMOTE },
1757        /* Logitech Harmony Adapter for PS3 */
1758        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3),
1759                .driver_data = PS3REMOTE },
1760        /* Sony Dualshock 4 controllers for PS4 */
1761        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
1762                .driver_data = DUALSHOCK4_CONTROLLER_USB },
1763        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
1764                .driver_data = DUALSHOCK4_CONTROLLER_BT },
1765        { }
1766};
1767MODULE_DEVICE_TABLE(hid, sony_devices);
1768
1769static struct hid_driver sony_driver = {
1770        .name          = "sony",
1771        .id_table      = sony_devices,
1772        .input_mapping = sony_mapping,
1773        .probe         = sony_probe,
1774        .remove        = sony_remove,
1775        .report_fixup  = sony_report_fixup,
1776        .raw_event     = sony_raw_event
1777};
1778module_hid_driver(sony_driver);
1779
1780MODULE_LICENSE("GPL");
1781