Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 46667
b: refs/heads/master
c: 4a1a4d8
h: refs/heads/master
i:
  46665: eff1a67
  46663: 35dbba1
v: v3
  • Loading branch information
Geoff Levand authored and Greg Kroah-Hartman committed Feb 7, 2007
1 parent 1545807 commit fedf7b1
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ad75a41085d80c8ce5e885962c15779935f8267e
refs/heads/master: 4a1a4d8b87389e35c3af04c0d0a95f6a0391b964
35 changes: 35 additions & 0 deletions trunk/drivers/usb/input/hid-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,9 @@ void usbhid_init_reports(struct hid_device *hid)
#define USB_VENDOR_ID_PANTHERLORD 0x0810
#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001

#define USB_VENDOR_ID_SONY 0x054c
#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268

/*
* Alphabetically sorted blacklist by quirk type.
*/
Expand Down Expand Up @@ -949,6 +952,8 @@ static const struct hid_blacklist {

{ USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },

{ USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER },

{ 0, 0 }
};

Expand Down Expand Up @@ -1013,6 +1018,32 @@ static void hid_fixup_cymotion_descriptor(char *rdesc, int rsize)
}
}

/*
* Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
* to "operational". Without this, the ps3 controller will not report any
* events.
*/
static void hid_fixup_sony_ps3_controller(struct usb_device *dev, int ifnum)
{
int result;
char *buf = kmalloc(18, GFP_KERNEL);

if (!buf)
return;

result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
HID_REQ_GET_REPORT,
USB_DIR_IN | USB_TYPE_CLASS |
USB_RECIP_INTERFACE,
(3 << 8) | 0xf2, ifnum, buf, 17,
USB_CTRL_GET_TIMEOUT);

if (result < 0)
err("%s failed: %d\n", __func__, result);

kfree(buf);
}

static struct hid_device *usb_hid_configure(struct usb_interface *intf)
{
struct usb_host_interface *interface = intf->cur_altsetting;
Expand Down Expand Up @@ -1303,6 +1334,10 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id)
if ((hid->claimed & HID_CLAIMED_INPUT))
hid_ff_init(hid);

if (hid->quirks & HID_QUIRK_SONY_PS3_CONTROLLER)
hid_fixup_sony_ps3_controller(interface_to_usbdev(intf),
intf->cur_altsetting->desc.bInterfaceNumber);

printk(KERN_INFO);

if (hid->claimed & HID_CLAIMED_INPUT)
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/hid.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ struct hid_item {
#define HID_QUIRK_BAD_RELATIVE_KEYS 0x00010000
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000
#define HID_QUIRK_IGNORE_MOUSE 0x00040000
#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00080000

/*
* This is the global environment of the parser. This information is
Expand Down

0 comments on commit fedf7b1

Please sign in to comment.