Commit | Line | Data |
---|---|---|
5772f636 SA |
1 | /* |
2 | * Roccat common functions for device specific drivers | |
3 | * | |
4 | * Copyright (c) 2011 Stefan Achatz <erazor_de@users.sourceforge.net> | |
5 | */ | |
6 | ||
7 | /* | |
8 | * This program is free software; you can redistribute it and/or modify it | |
9 | * under the terms of the GNU General Public License as published by the Free | |
10 | * Software Foundation; either version 2 of the License, or (at your option) | |
11 | * any later version. | |
12 | */ | |
13 | ||
1edd5b42 | 14 | #include <linux/hid.h> |
5772f636 | 15 | #include <linux/slab.h> |
8f86a2c3 | 16 | #include <linux/module.h> |
5772f636 SA |
17 | #include "hid-roccat-common.h" |
18 | ||
1edd5b42 SA |
19 | static inline uint16_t roccat_common_feature_report(uint8_t report_id) |
20 | { | |
21 | return 0x300 | report_id; | |
22 | } | |
23 | ||
24 | int roccat_common_receive(struct usb_device *usb_dev, uint report_id, | |
5772f636 SA |
25 | void *data, uint size) |
26 | { | |
27 | char *buf; | |
28 | int len; | |
29 | ||
30 | buf = kmalloc(size, GFP_KERNEL); | |
31 | if (buf == NULL) | |
32 | return -ENOMEM; | |
33 | ||
34 | len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0), | |
1edd5b42 | 35 | HID_REQ_GET_REPORT, |
5772f636 | 36 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
1edd5b42 SA |
37 | roccat_common_feature_report(report_id), |
38 | 0, buf, size, USB_CTRL_SET_TIMEOUT); | |
5772f636 SA |
39 | |
40 | memcpy(data, buf, size); | |
41 | kfree(buf); | |
42 | return ((len < 0) ? len : ((len != size) ? -EIO : 0)); | |
43 | } | |
44 | EXPORT_SYMBOL_GPL(roccat_common_receive); | |
45 | ||
1edd5b42 | 46 | int roccat_common_send(struct usb_device *usb_dev, uint report_id, |
5772f636 SA |
47 | void const *data, uint size) |
48 | { | |
49 | char *buf; | |
50 | int len; | |
51 | ||
4c33a885 | 52 | buf = kmemdup(data, size, GFP_KERNEL); |
5772f636 SA |
53 | if (buf == NULL) |
54 | return -ENOMEM; | |
55 | ||
5772f636 | 56 | len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), |
1edd5b42 | 57 | HID_REQ_SET_REPORT, |
5772f636 | 58 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, |
1edd5b42 SA |
59 | roccat_common_feature_report(report_id), |
60 | 0, buf, size, USB_CTRL_SET_TIMEOUT); | |
5772f636 SA |
61 | |
62 | kfree(buf); | |
63 | return ((len < 0) ? len : ((len != size) ? -EIO : 0)); | |
64 | } | |
65 | EXPORT_SYMBOL_GPL(roccat_common_send); | |
66 | ||
67 | MODULE_AUTHOR("Stefan Achatz"); | |
68 | MODULE_DESCRIPTION("USB Roccat common driver"); | |
69 | MODULE_LICENSE("GPL v2"); |