Merge branches 'for-3.9/sony' and 'for-3.9/steelseries' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Thu, 21 Feb 2013 09:45:52 +0000 (10:45 +0100)
committerJiri Kosina <jkosina@suse.cz>
Thu, 21 Feb 2013 09:45:52 +0000 (10:45 +0100)
Conflicts:
drivers/hid/hid-core.c

1  2  3 
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-sony.c

diff --combined drivers/hid/Kconfig
index 3d5294531ba5e348289510627223b00deb8e5945,e7d6a13ec6a623ab1d4123d80a4aae37bb76aaa9,6d5d2667750c270622a0d2b097c5c0bc3ca8ac21..f25666d722177e6f1298d67f352b555b905babf4
@@@@ -596,6 -596,6 -596,12 +596,12 @@@@ config HID_SPEEDLIN
        ---help---
        Support for Speedlink Vicious and Divine Cezanne mouse.
   
++ config HID_STEELSERIES
++      tristate "Steelseries SRW-S1 steering wheel support"
++      depends on USB_HID
++      ---help---
++      Support for Steelseries SRW-S1 steering wheel
++ 
   config HID_SUNPLUS
        tristate "Sunplus wireless desktop"
        depends on USB_HID
@@@@ -655,16 -655,6 -661,6 +661,16 @@@@ config HID_TOPSEE
        Say Y if you have a TopSeed Cyberlink or BTC Emprex or Conceptronic
        CLLRCMCE remote control.
   
 ++config HID_THINGM
 ++     tristate "ThingM blink(1) USB RGB LED"
 ++     depends on USB_HID
 ++     depends on LEDS_CLASS
 ++     ---help---
 ++     Support for the ThingM blink(1) USB RGB LED. This driver registers a
 ++     Linux LED class instance, plus additional sysfs attributes to control
 ++     RGB colors, fade time and playing. The device is exposed through hidraw
 ++     to access other functions.
 ++
   config HID_THRUSTMASTER
        tristate "ThrustMaster devices support"
        depends on USB_HID
@@@@ -729,7 -719,7 -725,7 +735,7 @@@@ config HID_ZYDACRO
   
   config HID_SENSOR_HUB
        tristate "HID Sensors framework support"
 --     depends on USB_HID
 ++     depends on USB_HID && GENERIC_HARDIRQS
        select MFD_CORE
        default n
        -- help---
diff --combined drivers/hid/Makefile
index 93017043f6f8a6e5257d1a7be0be45db02559f81,b62215716b2fd66fda16b0084f077927a8c3f02f,247f2b81677a374bd9f9b4eb89901e436ebae950..72d1b0bc0a97398a9e0294c4f391553b979b9ffa
@@@@ -101,9 -101,8 -101,9 +101,10 @@@@ obj-$(CONFIG_HID_SAMSUNG)        += hid-samsun
   obj-$(CONFIG_HID_SMARTJOYPLUS)       += hid-sjoy.o
   obj-$(CONFIG_HID_SONY)               += hid-sony.o
   obj-$(CONFIG_HID_SPEEDLINK)  += hid-speedlink.o
++ obj-$(CONFIG_HID_STEELSERIES)        += hid-steelseries.o
   obj-$(CONFIG_HID_SUNPLUS)    += hid-sunplus.o
   obj-$(CONFIG_HID_GREENASIA)  += hid-gaff.o
 ++obj-$(CONFIG_HID_THINGM)     += hid-thingm.o
   obj-$(CONFIG_HID_THRUSTMASTER)       += hid-tmff.o
   obj-$(CONFIG_HID_TIVO)               += hid-tivo.o
   obj-$(CONFIG_HID_TOPSEED)    += hid-topseed.o
diff --combined drivers/hid/hid-core.c
index 6e904155ded51332e1852a0f60ced082012847ee,1651728b5aa444528b0e7c7342ad75c645a9434a,65cda7f958224a67e4c5d154d5962c9593c6e9d9..ff75cabf7393f3d29c8b05c77f11cf2b8828a132
@@@@ -729,7 -729,7 -729,7 +729,7 @@@@ static int hid_scan_report(struct hid_d
                        item.type == HID_ITEM_TYPE_MAIN &&
                        item.tag == HID_MAIN_ITEM_TAG_BEGIN_COLLECTION &&
                        (item_udata(&item) & 0xff) == HID_COLLECTION_PHYSICAL &&
 --                     hid->bus == BUS_USB)
 ++                     (hid->bus == BUS_USB || hid->bus == BUS_I2C))
                        hid->group = HID_GROUP_SENSOR_HUB;
        }
   
@@@@ -1195,7 -1195,6 -1195,6 +1195,7 @@@@ int hid_report_raw_event(struct hid_dev
   {
        struct hid_report_enum *report_enum = hid->report_enum + type;
        struct hid_report *report;
 ++     struct hid_driver *hdrv;
        unsigned int a;
        int rsize, csize = size;
        u8 *cdata = data;
        if (hid->claimed != HID_CLAIMED_HIDRAW) {
                for (a = 0; a < report->maxfield; a++)
                        hid_input_field(hid, report->field[a], cdata, interrupt);
 ++             hdrv = hid->driver;
 ++             if (hdrv && hdrv->report)
 ++                     hdrv->report(hid, report);
        }
   
        if (hid->claimed & HID_CLAIMED_INPUT)
@@@@ -1603,7 -1599,6 -1599,6 +1603,7 @@@@ static const struct hid_device_id hid_h
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) },
 ++     { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
 ++     { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) },
@@@@ -2234,14 -2229,6 -2229,6 +2235,14 @@@@ bool hid_ignore(struct hid_device *hdev
                    hdev->type != HID_TYPE_USBMOUSE)
                        return true;
                break;
 ++     case USB_VENDOR_ID_VELLEMAN:
 ++             /* These are not HID devices.  They are handled by comedi. */
 ++             if ((hdev->product >= USB_DEVICE_ID_VELLEMAN_K8055_FIRST &&
 ++                  hdev->product <= USB_DEVICE_ID_VELLEMAN_K8055_LAST) ||
 ++                 (hdev->product >= USB_DEVICE_ID_VELLEMAN_K8061_FIRST &&
 ++                  hdev->product <= USB_DEVICE_ID_VELLEMAN_K8061_LAST))
 ++                     return true;
 ++             break;
        }
   
        if (hdev->type == HID_TYPE_USBMOUSE &&
diff --combined drivers/hid/hid-ids.h
index d15ed561136cb948f3889e2dbe52c07afaf56ff8,50ac9097db2ff561bf9a7c4ebc5b1e7e42d0f1f4,f5976f380e1f41e89d8d9fe5ea234590d8aef349..6e5c2ffa8d96430f22c6fe9d52d63c60e8e5dfd3
   #define USB_VENDOR_ID_EZKEY          0x0518
   #define USB_DEVICE_ID_BTC_8193               0x0002
   
 ++#define USB_VENDOR_ID_FORMOSA          0x147a
 ++#define USB_DEVICE_ID_FORMOSA_IR_RECEIVER      0xe03e
 ++
   #define USB_VENDOR_ID_FREESCALE              0x15A2
   #define USB_DEVICE_ID_FREESCALE_MX28 0x004F
   
   #define USB_VENDOR_ID_JESS           0x0c45
   #define USB_DEVICE_ID_JESS_YUREX     0x1010
   
 ++#define USB_VENDOR_ID_JESS2          0x0f30
 ++#define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111
 ++
   #define USB_VENDOR_ID_KBGEAR         0x084e
   #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO       0x1001
   
   #define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D   0xc283
   #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO   0xc286
   #define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940    0xc287
 --#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
   #define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG   0xc293
 ++#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
   #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL    0xc295
   #define USB_DEVICE_ID_LOGITECH_DFP_WHEEL     0xc298
   #define USB_DEVICE_ID_LOGITECH_G25_WHEEL     0xc299
   #define USB_VENDOR_ID_NEC            0x073e
   #define USB_DEVICE_ID_NEC_USB_GAME_PAD       0x0301
   
 ++#define USB_VENDOR_ID_NEXIO          0x1870
 ++#define USB_DEVICE_ID_NEXIO_MULTITOUCH_420   0x010d
 ++
   #define USB_VENDOR_ID_NEXTWINDOW     0x1926
   #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003
   
   
   #define USB_VENDOR_ID_SONY                   0x054c
   #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE    0x024b
+ +#define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE    0x0374
   #define USB_DEVICE_ID_SONY_PS3_BDREMOTE              0x0306
   #define USB_DEVICE_ID_SONY_PS3_CONTROLLER    0x0268
   #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER     0x042f
   #define USB_VENDOR_ID_STANTUM_SITRONIX               0x1403
   #define USB_DEVICE_ID_MTP_SITRONIX           0x5001
   
++ #define USB_VENDOR_ID_STEELSERIES    0x1038
++ #define USB_DEVICE_ID_STEELSERIES_SRWS1      0x1410
++ 
   #define USB_VENDOR_ID_SUN            0x0430
   #define USB_DEVICE_ID_RARITAN_KVM_DONGLE     0xcdab
   
   #define USB_DEVICE_ID_SYNAPTICS_WTP  0x0010
   #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013
   
 ++#define USB_VENDOR_ID_THINGM         0x27b8
 ++#define USB_DEVICE_ID_BLINK1         0x01ed
 ++
   #define USB_VENDOR_ID_THRUSTMASTER   0x044f
   
   #define USB_VENDOR_ID_TIVO           0x150a
   #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709  0x0709
   #define USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19  0x0a19
   
 ++#define USB_VENDOR_ID_VELLEMAN               0x10cf
 ++#define USB_DEVICE_ID_VELLEMAN_K8055_FIRST   0x5500
 ++#define USB_DEVICE_ID_VELLEMAN_K8055_LAST    0x5503
 ++#define USB_DEVICE_ID_VELLEMAN_K8061_FIRST   0x8061
 ++#define USB_DEVICE_ID_VELLEMAN_K8061_LAST    0x8068
 ++
   #define USB_VENDOR_ID_VERNIER                0x08f7
   #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
   #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
diff --combined drivers/hid/hid-sony.c
index 23fc762e8633e06a4298fb9bb06d1439a4046a49,9769c0030bcc9d84990752ccc734a37a198c46df,7f33ebf299c220fae74806f2d3aa44dd73c2507a..312098e4af4f092bd40b38e6f2bb79a3d3769d8b
@@@@ -33,6 -33,28 -33,6 +33,28 @@@@ static const u8 sixaxis_rdesc_fixup[] 
        0x03, 0x46, 0xFF, 0x03, 0x09, 0x01, 0x81, 0x02
   };
   
+ +static const u8 sixaxis_rdesc_fixup2[] = {
+ +     0x05, 0x01, 0x09, 0x04, 0xa1, 0x01, 0xa1, 0x02,
+ +     0x85, 0x01, 0x75, 0x08, 0x95, 0x01, 0x15, 0x00,
+ +     0x26, 0xff, 0x00, 0x81, 0x03, 0x75, 0x01, 0x95,
+ +     0x13, 0x15, 0x00, 0x25, 0x01, 0x35, 0x00, 0x45,
+ +     0x01, 0x05, 0x09, 0x19, 0x01, 0x29, 0x13, 0x81,
+ +     0x02, 0x75, 0x01, 0x95, 0x0d, 0x06, 0x00, 0xff,
+ +     0x81, 0x03, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
+ +     0x01, 0x09, 0x01, 0xa1, 0x00, 0x75, 0x08, 0x95,
+ +     0x04, 0x35, 0x00, 0x46, 0xff, 0x00, 0x09, 0x30,
+ +     0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x81, 0x02,
+ +     0xc0, 0x05, 0x01, 0x95, 0x13, 0x09, 0x01, 0x81,
+ +     0x02, 0x95, 0x0c, 0x81, 0x01, 0x75, 0x10, 0x95,
+ +     0x04, 0x26, 0xff, 0x03, 0x46, 0xff, 0x03, 0x09,
+ +     0x01, 0x81, 0x02, 0xc0, 0xa1, 0x02, 0x85, 0x02,
+ +     0x75, 0x08, 0x95, 0x30, 0x09, 0x01, 0xb1, 0x02,
+ +     0xc0, 0xa1, 0x02, 0x85, 0xee, 0x75, 0x08, 0x95,
+ +     0x30, 0x09, 0x01, 0xb1, 0x02, 0xc0, 0xa1, 0x02,
+ +     0x85, 0xef, 0x75, 0x08, 0x95, 0x30, 0x09, 0x01,
+ +     0xb1, 0x02, 0xc0, 0xc0,
+ +};
+ +
   struct sony_sc {
        unsigned long quirks;
   };
@@@@ -43,9 -65,19 -43,9 +65,19 @@@@ static __u8 *sony_report_fixup(struct h
   {
        struct sony_sc *sc = hid_get_drvdata(hdev);
   
- -     if ((sc->quirks & VAIO_RDESC_CONSTANT) &&
- -                     *rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) {
- -             hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n");
+ +     /*
+ +      * Some Sony RF receivers wrongly declare the mouse pointer as a
+ +      * a constant non-data variable.
+ +      */
+ +     if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 &&
+ +         /* usage page: generic desktop controls */
+ +         /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */
+ +         /* usage: mouse */
+ +         rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
+ +         /* input (usage page for x,y axes): constant, variable, relative */
+ +         rdesc[54] == 0x81 && rdesc[55] == 0x07) {
+ +             hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n");
+ +             /* input: data, variable, relative */
                rdesc[55] = 0x06;
        }
   
                hid_info(hdev, "Fixing up Sony Sixaxis report descriptor\n");
                memcpy((void *)&rdesc[83], (void *)&sixaxis_rdesc_fixup,
                        sizeof(sixaxis_rdesc_fixup));
+ +     } else if (sc->quirks & SIXAXIS_CONTROLLER_USB &&
+ +                *rsize > sizeof(sixaxis_rdesc_fixup2)) {
+ +             hid_info(hdev, "Sony Sixaxis clone detected. Using original report descriptor (size: %d clone; %d new)\n",
+ +                      *rsize, (int)sizeof(sixaxis_rdesc_fixup2));
+ +             *rsize = sizeof(sixaxis_rdesc_fixup2);
+ +             memcpy(rdesc, &sixaxis_rdesc_fixup2, *rsize);
        }
        return rdesc;
   }
@@@@ -217,6 -255,8 -217,6 +255,8 @@@@ static const struct hid_device_id sony_
                .driver_data = SIXAXIS_CONTROLLER_BT },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
                .driver_data = VAIO_RDESC_CONSTANT },
+ +     { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE),
+ +             .driver_data = VAIO_RDESC_CONSTANT },
        { }
   };
   MODULE_DEVICE_TABLE(hid, sony_devices);
@@@@ -229,6 -269,17 -229,17 +269,6 @@@@ static struct hid_driver sony_driver = 
        .report_fixup = sony_report_fixup,
        .raw_event = sony_raw_event
   };
 ++module_hid_driver(sony_driver);
   
 --static int __init sony_init(void)
 --{
 --     return hid_register_driver(&sony_driver);
 --}
 --
 --static void __exit sony_exit(void)
 --{
 --     hid_unregister_driver(&sony_driver);
 --}
 --
 --module_init(sony_init);
 --module_exit(sony_exit);
   MODULE_LICENSE("GPL");