diff options
author | Stefan Achatz <erazor_de@users.sourceforge.net> | 2011-01-30 07:38:23 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-02-03 10:37:27 -0500 |
commit | 5772f63613ce0a6777e82a7e8fb553e49da27719 (patch) | |
tree | 83c066e175d38323bccd4fd511c45dada6ba8ec0 /drivers/hid/hid-roccat-arvo.c | |
parent | a28764ef80dd5aef657f810a9c295ccda421c823 (diff) |
HID: roccat: Introduce module hid-roccat-common
Module hid-roccat-common contains functions used by roccat device driver
modules to reduce code duplication.
At the moment it contains just two wrapper methods for usb_control_msg
that ensure that the buffer used for transfer is dma capable which wasn't
the case before.
The kconfig option is not visible to the user but will be selected by the
device specific drivers.
Signed-off-by: Stefan Achatz <erazor_de@users.sourceforge.net>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-roccat-arvo.c')
-rw-r--r-- | drivers/hid/hid-roccat-arvo.c | 148 |
1 files changed, 41 insertions, 107 deletions
diff --git a/drivers/hid/hid-roccat-arvo.c b/drivers/hid/hid-roccat-arvo.c index ebf3c15f1a7e..d72ee4186d11 100644 --- a/drivers/hid/hid-roccat-arvo.c +++ b/drivers/hid/hid-roccat-arvo.c | |||
@@ -19,41 +19,15 @@ | |||
19 | #include <linux/device.h> | 19 | #include <linux/device.h> |
20 | #include <linux/input.h> | 20 | #include <linux/input.h> |
21 | #include <linux/hid.h> | 21 | #include <linux/hid.h> |
22 | #include <linux/usb.h> | ||
23 | #include <linux/module.h> | 22 | #include <linux/module.h> |
24 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
25 | #include "hid-ids.h" | 24 | #include "hid-ids.h" |
26 | #include "hid-roccat.h" | 25 | #include "hid-roccat.h" |
26 | #include "hid-roccat-common.h" | ||
27 | #include "hid-roccat-arvo.h" | 27 | #include "hid-roccat-arvo.h" |
28 | 28 | ||
29 | static struct class *arvo_class; | 29 | static struct class *arvo_class; |
30 | 30 | ||
31 | static int arvo_receive(struct usb_device *usb_dev, uint usb_command, | ||
32 | void *buf, uint size) | ||
33 | { | ||
34 | int len; | ||
35 | |||
36 | len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0), | ||
37 | USB_REQ_CLEAR_FEATURE, | ||
38 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | ||
39 | usb_command, 0, buf, size, USB_CTRL_SET_TIMEOUT); | ||
40 | |||
41 | return (len != size) ? -EIO : 0; | ||
42 | } | ||
43 | |||
44 | static int arvo_send(struct usb_device *usb_dev, uint usb_command, | ||
45 | void const *buf, uint size) | ||
46 | { | ||
47 | int len; | ||
48 | |||
49 | len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), | ||
50 | USB_REQ_SET_CONFIGURATION, | ||
51 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, | ||
52 | usb_command, 0, (void *)buf, size, USB_CTRL_SET_TIMEOUT); | ||
53 | |||
54 | return (len != size) ? -EIO : 0; | ||
55 | } | ||
56 | |||
57 | static ssize_t arvo_sysfs_show_mode_key(struct device *dev, | 31 | static ssize_t arvo_sysfs_show_mode_key(struct device *dev, |
58 | struct device_attribute *attr, char *buf) | 32 | struct device_attribute *attr, char *buf) |
59 | { | 33 | { |
@@ -61,24 +35,17 @@ static ssize_t arvo_sysfs_show_mode_key(struct device *dev, | |||
61 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); | 35 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); |
62 | struct usb_device *usb_dev = | 36 | struct usb_device *usb_dev = |
63 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); | 37 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); |
64 | struct arvo_mode_key *temp_buf; | 38 | struct arvo_mode_key temp_buf; |
65 | int retval; | 39 | int retval; |
66 | 40 | ||
67 | temp_buf = kmalloc(sizeof(struct arvo_mode_key), GFP_KERNEL); | ||
68 | if (!temp_buf) | ||
69 | return -ENOMEM; | ||
70 | |||
71 | mutex_lock(&arvo->arvo_lock); | 41 | mutex_lock(&arvo->arvo_lock); |
72 | retval = arvo_receive(usb_dev, ARVO_USB_COMMAND_MODE_KEY, | 42 | retval = roccat_common_receive(usb_dev, ARVO_USB_COMMAND_MODE_KEY, |
73 | temp_buf, sizeof(struct arvo_mode_key)); | 43 | &temp_buf, sizeof(struct arvo_mode_key)); |
74 | mutex_unlock(&arvo->arvo_lock); | 44 | mutex_unlock(&arvo->arvo_lock); |
75 | if (retval) | 45 | if (retval) |
76 | goto out; | 46 | return retval; |
77 | 47 | ||
78 | retval = snprintf(buf, PAGE_SIZE, "%d\n", temp_buf->state); | 48 | return snprintf(buf, PAGE_SIZE, "%d\n", temp_buf.state); |
79 | out: | ||
80 | kfree(temp_buf); | ||
81 | return retval; | ||
82 | } | 49 | } |
83 | 50 | ||
84 | static ssize_t arvo_sysfs_set_mode_key(struct device *dev, | 51 | static ssize_t arvo_sysfs_set_mode_key(struct device *dev, |
@@ -88,32 +55,25 @@ static ssize_t arvo_sysfs_set_mode_key(struct device *dev, | |||
88 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); | 55 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); |
89 | struct usb_device *usb_dev = | 56 | struct usb_device *usb_dev = |
90 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); | 57 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); |
91 | struct arvo_mode_key *temp_buf; | 58 | struct arvo_mode_key temp_buf; |
92 | unsigned long state; | 59 | unsigned long state; |
93 | int retval; | 60 | int retval; |
94 | 61 | ||
95 | temp_buf = kmalloc(sizeof(struct arvo_mode_key), GFP_KERNEL); | ||
96 | if (!temp_buf) | ||
97 | return -ENOMEM; | ||
98 | |||
99 | retval = strict_strtoul(buf, 10, &state); | 62 | retval = strict_strtoul(buf, 10, &state); |
100 | if (retval) | 63 | if (retval) |
101 | goto out; | 64 | return retval; |
102 | 65 | ||
103 | temp_buf->command = ARVO_COMMAND_MODE_KEY; | 66 | temp_buf.command = ARVO_COMMAND_MODE_KEY; |
104 | temp_buf->state = state; | 67 | temp_buf.state = state; |
105 | 68 | ||
106 | mutex_lock(&arvo->arvo_lock); | 69 | mutex_lock(&arvo->arvo_lock); |
107 | retval = arvo_send(usb_dev, ARVO_USB_COMMAND_MODE_KEY, | 70 | retval = roccat_common_send(usb_dev, ARVO_USB_COMMAND_MODE_KEY, |
108 | temp_buf, sizeof(struct arvo_mode_key)); | 71 | &temp_buf, sizeof(struct arvo_mode_key)); |
109 | mutex_unlock(&arvo->arvo_lock); | 72 | mutex_unlock(&arvo->arvo_lock); |
110 | if (retval) | 73 | if (retval) |
111 | goto out; | 74 | return retval; |
112 | 75 | ||
113 | retval = size; | 76 | return size; |
114 | out: | ||
115 | kfree(temp_buf); | ||
116 | return retval; | ||
117 | } | 77 | } |
118 | 78 | ||
119 | static ssize_t arvo_sysfs_show_key_mask(struct device *dev, | 79 | static ssize_t arvo_sysfs_show_key_mask(struct device *dev, |
@@ -123,24 +83,17 @@ static ssize_t arvo_sysfs_show_key_mask(struct device *dev, | |||
123 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); | 83 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); |
124 | struct usb_device *usb_dev = | 84 | struct usb_device *usb_dev = |
125 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); | 85 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); |
126 | struct arvo_key_mask *temp_buf; | 86 | struct arvo_key_mask temp_buf; |
127 | int retval; | 87 | int retval; |
128 | 88 | ||
129 | temp_buf = kmalloc(sizeof(struct arvo_key_mask), GFP_KERNEL); | ||
130 | if (!temp_buf) | ||
131 | return -ENOMEM; | ||
132 | |||
133 | mutex_lock(&arvo->arvo_lock); | 89 | mutex_lock(&arvo->arvo_lock); |
134 | retval = arvo_receive(usb_dev, ARVO_USB_COMMAND_KEY_MASK, | 90 | retval = roccat_common_receive(usb_dev, ARVO_USB_COMMAND_KEY_MASK, |
135 | temp_buf, sizeof(struct arvo_key_mask)); | 91 | &temp_buf, sizeof(struct arvo_key_mask)); |
136 | mutex_unlock(&arvo->arvo_lock); | 92 | mutex_unlock(&arvo->arvo_lock); |
137 | if (retval) | 93 | if (retval) |
138 | goto out; | 94 | return retval; |
139 | 95 | ||
140 | retval = snprintf(buf, PAGE_SIZE, "%d\n", temp_buf->key_mask); | 96 | return snprintf(buf, PAGE_SIZE, "%d\n", temp_buf.key_mask); |
141 | out: | ||
142 | kfree(temp_buf); | ||
143 | return retval; | ||
144 | } | 97 | } |
145 | 98 | ||
146 | static ssize_t arvo_sysfs_set_key_mask(struct device *dev, | 99 | static ssize_t arvo_sysfs_set_key_mask(struct device *dev, |
@@ -150,52 +103,40 @@ static ssize_t arvo_sysfs_set_key_mask(struct device *dev, | |||
150 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); | 103 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); |
151 | struct usb_device *usb_dev = | 104 | struct usb_device *usb_dev = |
152 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); | 105 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); |
153 | struct arvo_key_mask *temp_buf; | 106 | struct arvo_key_mask temp_buf; |
154 | unsigned long key_mask; | 107 | unsigned long key_mask; |
155 | int retval; | 108 | int retval; |
156 | 109 | ||
157 | temp_buf = kmalloc(sizeof(struct arvo_key_mask), GFP_KERNEL); | ||
158 | if (!temp_buf) | ||
159 | return -ENOMEM; | ||
160 | |||
161 | retval = strict_strtoul(buf, 10, &key_mask); | 110 | retval = strict_strtoul(buf, 10, &key_mask); |
162 | if (retval) | 111 | if (retval) |
163 | goto out; | 112 | return retval; |
164 | 113 | ||
165 | temp_buf->command = ARVO_COMMAND_KEY_MASK; | 114 | temp_buf.command = ARVO_COMMAND_KEY_MASK; |
166 | temp_buf->key_mask = key_mask; | 115 | temp_buf.key_mask = key_mask; |
167 | 116 | ||
168 | mutex_lock(&arvo->arvo_lock); | 117 | mutex_lock(&arvo->arvo_lock); |
169 | retval = arvo_send(usb_dev, ARVO_USB_COMMAND_KEY_MASK, | 118 | retval = roccat_common_send(usb_dev, ARVO_USB_COMMAND_KEY_MASK, |
170 | temp_buf, sizeof(struct arvo_key_mask)); | 119 | &temp_buf, sizeof(struct arvo_key_mask)); |
171 | mutex_unlock(&arvo->arvo_lock); | 120 | mutex_unlock(&arvo->arvo_lock); |
172 | if (retval) | 121 | if (retval) |
173 | goto out; | 122 | return retval; |
174 | 123 | ||
175 | retval = size; | 124 | return size; |
176 | out: | ||
177 | kfree(temp_buf); | ||
178 | return retval; | ||
179 | } | 125 | } |
180 | 126 | ||
181 | /* retval is 1-5 on success, < 0 on error */ | 127 | /* retval is 1-5 on success, < 0 on error */ |
182 | static int arvo_get_actual_profile(struct usb_device *usb_dev) | 128 | static int arvo_get_actual_profile(struct usb_device *usb_dev) |
183 | { | 129 | { |
184 | struct arvo_actual_profile *temp_buf; | 130 | struct arvo_actual_profile temp_buf; |
185 | int retval; | 131 | int retval; |
186 | 132 | ||
187 | temp_buf = kmalloc(sizeof(struct arvo_actual_profile), GFP_KERNEL); | 133 | retval = roccat_common_receive(usb_dev, ARVO_USB_COMMAND_ACTUAL_PROFILE, |
188 | if (!temp_buf) | 134 | &temp_buf, sizeof(struct arvo_actual_profile)); |
189 | return -ENOMEM; | ||
190 | |||
191 | retval = arvo_receive(usb_dev, ARVO_USB_COMMAND_ACTUAL_PROFILE, | ||
192 | temp_buf, sizeof(struct arvo_actual_profile)); | ||
193 | 135 | ||
194 | if (!retval) | 136 | if (retval) |
195 | retval = temp_buf->actual_profile; | 137 | return retval; |
196 | 138 | ||
197 | kfree(temp_buf); | 139 | return temp_buf.actual_profile; |
198 | return retval; | ||
199 | } | 140 | } |
200 | 141 | ||
201 | static ssize_t arvo_sysfs_show_actual_profile(struct device *dev, | 142 | static ssize_t arvo_sysfs_show_actual_profile(struct device *dev, |
@@ -214,32 +155,25 @@ static ssize_t arvo_sysfs_set_actual_profile(struct device *dev, | |||
214 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); | 155 | hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); |
215 | struct usb_device *usb_dev = | 156 | struct usb_device *usb_dev = |
216 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); | 157 | interface_to_usbdev(to_usb_interface(dev->parent->parent)); |
217 | struct arvo_actual_profile *temp_buf; | 158 | struct arvo_actual_profile temp_buf; |
218 | unsigned long profile; | 159 | unsigned long profile; |
219 | int retval; | 160 | int retval; |
220 | 161 | ||
221 | temp_buf = kmalloc(sizeof(struct arvo_actual_profile), GFP_KERNEL); | ||
222 | if (!temp_buf) | ||
223 | return -ENOMEM; | ||
224 | |||
225 | retval = strict_strtoul(buf, 10, &profile); | 162 | retval = strict_strtoul(buf, 10, &profile); |
226 | if (retval) | 163 | if (retval) |
227 | goto out; | 164 | return retval; |
228 | 165 | ||
229 | temp_buf->command = ARVO_COMMAND_ACTUAL_PROFILE; | 166 | temp_buf.command = ARVO_COMMAND_ACTUAL_PROFILE; |
230 | temp_buf->actual_profile = profile; | 167 | temp_buf.actual_profile = profile; |
231 | 168 | ||
232 | mutex_lock(&arvo->arvo_lock); | 169 | mutex_lock(&arvo->arvo_lock); |
233 | retval = arvo_send(usb_dev, ARVO_USB_COMMAND_ACTUAL_PROFILE, | 170 | retval = roccat_common_send(usb_dev, ARVO_USB_COMMAND_ACTUAL_PROFILE, |
234 | temp_buf, sizeof(struct arvo_actual_profile)); | 171 | &temp_buf, sizeof(struct arvo_actual_profile)); |
235 | if (!retval) { | 172 | if (!retval) { |
236 | arvo->actual_profile = profile; | 173 | arvo->actual_profile = profile; |
237 | retval = size; | 174 | retval = size; |
238 | } | 175 | } |
239 | mutex_unlock(&arvo->arvo_lock); | 176 | mutex_unlock(&arvo->arvo_lock); |
240 | |||
241 | out: | ||
242 | kfree(temp_buf); | ||
243 | return retval; | 177 | return retval; |
244 | } | 178 | } |
245 | 179 | ||
@@ -257,7 +191,7 @@ static ssize_t arvo_sysfs_write(struct file *fp, | |||
257 | return -EINVAL; | 191 | return -EINVAL; |
258 | 192 | ||
259 | mutex_lock(&arvo->arvo_lock); | 193 | mutex_lock(&arvo->arvo_lock); |
260 | retval = arvo_send(usb_dev, command, buf, real_size); | 194 | retval = roccat_common_send(usb_dev, command, buf, real_size); |
261 | mutex_unlock(&arvo->arvo_lock); | 195 | mutex_unlock(&arvo->arvo_lock); |
262 | 196 | ||
263 | return (retval ? retval : real_size); | 197 | return (retval ? retval : real_size); |
@@ -280,7 +214,7 @@ static ssize_t arvo_sysfs_read(struct file *fp, | |||
280 | return -EINVAL; | 214 | return -EINVAL; |
281 | 215 | ||
282 | mutex_lock(&arvo->arvo_lock); | 216 | mutex_lock(&arvo->arvo_lock); |
283 | retval = arvo_receive(usb_dev, command, buf, real_size); | 217 | retval = roccat_common_receive(usb_dev, command, buf, real_size); |
284 | mutex_unlock(&arvo->arvo_lock); | 218 | mutex_unlock(&arvo->arvo_lock); |
285 | 219 | ||
286 | return (retval ? retval : real_size); | 220 | return (retval ? retval : real_size); |