]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/hid/hid-roccat-kone.c
MIPS: Replace deprecated spinlock initialization
[mv-sheeva.git] / drivers / hid / hid-roccat-kone.c
1 /*
2  * Roccat Kone driver for Linux
3  *
4  * Copyright (c) 2010 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
14 /*
15  * Roccat Kone is a gamer mouse which consists of a mouse part and a keyboard
16  * part. The keyboard part enables the mouse to execute stored macros with mixed
17  * key- and button-events.
18  *
19  * TODO implement on-the-fly polling-rate change
20  *      The windows driver has the ability to change the polling rate of the
21  *      device on the press of a mousebutton.
22  *      Is it possible to remove and reinstall the urb in raw-event- or any
23  *      other handler, or to defer this action to be executed somewhere else?
24  *
25  * TODO is it possible to overwrite group for sysfs attributes via udev?
26  */
27
28 #include <linux/device.h>
29 #include <linux/input.h>
30 #include <linux/hid.h>
31 #include <linux/usb.h>
32 #include <linux/module.h>
33 #include <linux/slab.h>
34 #include "hid-ids.h"
35 #include "hid-roccat.h"
36 #include "hid-roccat-kone.h"
37
38 static uint profile_numbers[5] = {0, 1, 2, 3, 4};
39
40 /* kone_class is used for creating sysfs attributes via roccat char device */
41 static struct class *kone_class;
42
43 static void kone_set_settings_checksum(struct kone_settings *settings)
44 {
45         uint16_t checksum = 0;
46         unsigned char *address = (unsigned char *)settings;
47         int i;
48
49         for (i = 0; i < sizeof(struct kone_settings) - 2; ++i, ++address)
50                 checksum += *address;
51         settings->checksum = cpu_to_le16(checksum);
52 }
53
54 /*
55  * Checks success after writing data to mouse
56  * On success returns 0
57  * On failure returns errno
58  */
59 static int kone_check_write(struct usb_device *usb_dev)
60 {
61         int len;
62         unsigned char *data;
63
64         data = kmalloc(1, GFP_KERNEL);
65         if (!data)
66                 return -ENOMEM;
67
68         do {
69                 /*
70                  * Mouse needs 50 msecs until it says ok, but there are
71                  * 30 more msecs needed for next write to work.
72                  */
73                 msleep(80);
74
75                 len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
76                                 USB_REQ_CLEAR_FEATURE,
77                                 USB_TYPE_CLASS | USB_RECIP_INTERFACE |
78                                 USB_DIR_IN,
79                                 kone_command_confirm_write, 0, data, 1,
80                                 USB_CTRL_SET_TIMEOUT);
81
82                 if (len != 1) {
83                         kfree(data);
84                         return -EIO;
85                 }
86
87                 /*
88                  * value of 3 seems to mean something like
89                  * "not finished yet, but it looks good"
90                  * So check again after a moment.
91                  */
92         } while (*data == 3);
93
94         if (*data == 1) { /* everything alright */
95                 kfree(data);
96                 return 0;
97         } else { /* unknown answer */
98                 hid_err(usb_dev, "got retval %d when checking write\n", *data);
99                 kfree(data);
100                 return -EIO;
101         }
102 }
103
104 /*
105  * Reads settings from mouse and stores it in @buf
106  * @buf has to be alloced with GFP_KERNEL
107  * On success returns 0
108  * On failure returns errno
109  */
110 static int kone_get_settings(struct usb_device *usb_dev,
111                 struct kone_settings *buf)
112 {
113         int len;
114
115         len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
116                         USB_REQ_CLEAR_FEATURE,
117                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
118                         kone_command_settings, 0, buf,
119                         sizeof(struct kone_settings), USB_CTRL_SET_TIMEOUT);
120
121         if (len != sizeof(struct kone_settings))
122                 return -EIO;
123
124         return 0;
125 }
126
127 /*
128  * Writes settings from @buf to mouse
129  * On success returns 0
130  * On failure returns errno
131  */
132 static int kone_set_settings(struct usb_device *usb_dev,
133                 struct kone_settings const *settings)
134 {
135         int len;
136
137         len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
138                         USB_REQ_SET_CONFIGURATION,
139                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
140                         kone_command_settings, 0, (char *)settings,
141                         sizeof(struct kone_settings),
142                         USB_CTRL_SET_TIMEOUT);
143
144         if (len != sizeof(struct kone_settings))
145                 return -EIO;
146
147         if (kone_check_write(usb_dev))
148                 return -EIO;
149
150         return 0;
151 }
152
153 /*
154  * Reads profile data from mouse and stores it in @buf
155  * @number: profile number to read
156  * On success returns 0
157  * On failure returns errno
158  */
159 static int kone_get_profile(struct usb_device *usb_dev,
160                 struct kone_profile *buf, int number)
161 {
162         int len;
163
164         if (number < 1 || number > 5)
165                 return -EINVAL;
166
167         len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
168                         USB_REQ_CLEAR_FEATURE,
169                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
170                         kone_command_profile, number, buf,
171                         sizeof(struct kone_profile), USB_CTRL_SET_TIMEOUT);
172
173         if (len != sizeof(struct kone_profile))
174                 return -EIO;
175
176         return 0;
177 }
178
179 /*
180  * Writes profile data to mouse.
181  * @number: profile number to write
182  * On success returns 0
183  * On failure returns errno
184  */
185 static int kone_set_profile(struct usb_device *usb_dev,
186                 struct kone_profile const *profile, int number)
187 {
188         int len;
189
190         if (number < 1 || number > 5)
191                 return -EINVAL;
192
193         len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
194                         USB_REQ_SET_CONFIGURATION,
195                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
196                         kone_command_profile, number, (char *)profile,
197                         sizeof(struct kone_profile),
198                         USB_CTRL_SET_TIMEOUT);
199
200         if (len != sizeof(struct kone_profile))
201                 return len;
202
203         if (kone_check_write(usb_dev))
204                 return -EIO;
205
206         return 0;
207 }
208
209 /*
210  * Reads value of "fast-clip-weight" and stores it in @result
211  * On success returns 0
212  * On failure returns errno
213  */
214 static int kone_get_weight(struct usb_device *usb_dev, int *result)
215 {
216         int len;
217         uint8_t *data;
218
219         data = kmalloc(1, GFP_KERNEL);
220         if (!data)
221                 return -ENOMEM;
222
223         len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
224                         USB_REQ_CLEAR_FEATURE,
225                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
226                         kone_command_weight, 0, data, 1, USB_CTRL_SET_TIMEOUT);
227
228         if (len != 1) {
229                 kfree(data);
230                 return -EIO;
231         }
232         *result = (int)*data;
233         kfree(data);
234         return 0;
235 }
236
237 /*
238  * Reads firmware_version of mouse and stores it in @result
239  * On success returns 0
240  * On failure returns errno
241  */
242 static int kone_get_firmware_version(struct usb_device *usb_dev, int *result)
243 {
244         int len;
245         unsigned char *data;
246
247         data = kmalloc(2, GFP_KERNEL);
248         if (!data)
249                 return -ENOMEM;
250
251         len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
252                         USB_REQ_CLEAR_FEATURE,
253                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
254                         kone_command_firmware_version, 0, data, 2,
255                         USB_CTRL_SET_TIMEOUT);
256
257         if (len != 2) {
258                 kfree(data);
259                 return -EIO;
260         }
261         *result = le16_to_cpu(*data);
262         kfree(data);
263         return 0;
264 }
265
266 static ssize_t kone_sysfs_read_settings(struct file *fp, struct kobject *kobj,
267                 struct bin_attribute *attr, char *buf,
268                 loff_t off, size_t count) {
269         struct device *dev =
270                         container_of(kobj, struct device, kobj)->parent->parent;
271         struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
272
273         if (off >= sizeof(struct kone_settings))
274                 return 0;
275
276         if (off + count > sizeof(struct kone_settings))
277                 count = sizeof(struct kone_settings) - off;
278
279         mutex_lock(&kone->kone_lock);
280         memcpy(buf, ((char const *)&kone->settings) + off, count);
281         mutex_unlock(&kone->kone_lock);
282
283         return count;
284 }
285
286 /*
287  * Writing settings automatically activates startup_profile.
288  * This function keeps values in kone_device up to date and assumes that in
289  * case of error the old data is still valid
290  */
291 static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,
292                 struct bin_attribute *attr, char *buf,
293                 loff_t off, size_t count) {
294         struct device *dev =
295                         container_of(kobj, struct device, kobj)->parent->parent;
296         struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
297         struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
298         int retval = 0, difference;
299
300         /* I need to get my data in one piece */
301         if (off != 0 || count != sizeof(struct kone_settings))
302                 return -EINVAL;
303
304         mutex_lock(&kone->kone_lock);
305         difference = memcmp(buf, &kone->settings, sizeof(struct kone_settings));
306         if (difference) {
307                 retval = kone_set_settings(usb_dev,
308                                 (struct kone_settings const *)buf);
309                 if (!retval)
310                         memcpy(&kone->settings, buf,
311                                         sizeof(struct kone_settings));
312         }
313         mutex_unlock(&kone->kone_lock);
314
315         if (retval)
316                 return retval;
317
318         /*
319          * If we get here, treat settings as okay and update actual values
320          * according to startup_profile
321          */
322         kone->actual_profile = kone->settings.startup_profile;
323         kone->actual_dpi = kone->profiles[kone->actual_profile - 1].startup_dpi;
324
325         return sizeof(struct kone_settings);
326 }
327
328 static ssize_t kone_sysfs_read_profilex(struct file *fp,
329                 struct kobject *kobj, struct bin_attribute *attr,
330                 char *buf, loff_t off, size_t count) {
331         struct device *dev =
332                         container_of(kobj, struct device, kobj)->parent->parent;
333         struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
334
335         if (off >= sizeof(struct kone_profile))
336                 return 0;
337
338         if (off + count > sizeof(struct kone_profile))
339                 count = sizeof(struct kone_profile) - off;
340
341         mutex_lock(&kone->kone_lock);
342         memcpy(buf, ((char const *)&kone->profiles[*(uint *)(attr->private)]) + off, count);
343         mutex_unlock(&kone->kone_lock);
344
345         return count;
346 }
347
348 /* Writes data only if different to stored data */
349 static ssize_t kone_sysfs_write_profilex(struct file *fp,
350                 struct kobject *kobj, struct bin_attribute *attr,
351                 char *buf, loff_t off, size_t count) {
352         struct device *dev =
353                         container_of(kobj, struct device, kobj)->parent->parent;
354         struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev));
355         struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
356         struct kone_profile *profile;
357         int retval = 0, difference;
358
359         /* I need to get my data in one piece */
360         if (off != 0 || count != sizeof(struct kone_profile))
361                 return -EINVAL;
362
363         profile = &kone->profiles[*(uint *)(attr->private)];
364
365         mutex_lock(&kone->kone_lock);
366         difference = memcmp(buf, profile, sizeof(struct kone_profile));
367         if (difference) {
368                 retval = kone_set_profile(usb_dev,
369                                 (struct kone_profile const *)buf,
370                                 *(uint *)(attr->private) + 1);
371                 if (!retval)
372                         memcpy(profile, buf, sizeof(struct kone_profile));
373         }
374         mutex_unlock(&kone->kone_lock);
375
376         if (retval)
377                 return retval;
378
379         return sizeof(struct kone_profile);
380 }
381
382 static ssize_t kone_sysfs_show_actual_profile(struct device *dev,
383                 struct device_attribute *attr, char *buf)
384 {
385         struct kone_device *kone =
386                         hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
387         return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_profile);
388 }
389
390 static ssize_t kone_sysfs_show_actual_dpi(struct device *dev,
391                 struct device_attribute *attr, char *buf)
392 {
393         struct kone_device *kone =
394                         hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
395         return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_dpi);
396 }
397
398 /* weight is read each time, since we don't get informed when it's changed */
399 static ssize_t kone_sysfs_show_weight(struct device *dev,
400                 struct device_attribute *attr, char *buf)
401 {
402         struct kone_device *kone;
403         struct usb_device *usb_dev;
404         int weight = 0;
405         int retval;
406
407         dev = dev->parent->parent;
408         kone = hid_get_drvdata(dev_get_drvdata(dev));
409         usb_dev = interface_to_usbdev(to_usb_interface(dev));
410
411         mutex_lock(&kone->kone_lock);
412         retval = kone_get_weight(usb_dev, &weight);
413         mutex_unlock(&kone->kone_lock);
414
415         if (retval)
416                 return retval;
417         return snprintf(buf, PAGE_SIZE, "%d\n", weight);
418 }
419
420 static ssize_t kone_sysfs_show_firmware_version(struct device *dev,
421                 struct device_attribute *attr, char *buf)
422 {
423         struct kone_device *kone =
424                         hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
425         return snprintf(buf, PAGE_SIZE, "%d\n", kone->firmware_version);
426 }
427
428 static ssize_t kone_sysfs_show_tcu(struct device *dev,
429                 struct device_attribute *attr, char *buf)
430 {
431         struct kone_device *kone =
432                         hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
433         return snprintf(buf, PAGE_SIZE, "%d\n", kone->settings.tcu);
434 }
435
436 static int kone_tcu_command(struct usb_device *usb_dev, int number)
437 {
438         int len;
439         char *value;
440
441         value = kmalloc(1, GFP_KERNEL);
442         if (!value)
443                 return -ENOMEM;
444
445         *value = number;
446
447         len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
448                         USB_REQ_SET_CONFIGURATION,
449                         USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
450                         kone_command_calibrate, 0, value, 1,
451                         USB_CTRL_SET_TIMEOUT);
452
453         kfree(value);
454         return ((len != 1) ? -EIO : 0);
455 }
456
457 /*
458  * Calibrating the tcu is the only action that changes settings data inside the
459  * mouse, so this data needs to be reread
460  */
461 static ssize_t kone_sysfs_set_tcu(struct device *dev,
462                 struct device_attribute *attr, char const *buf, size_t size)
463 {
464         struct kone_device *kone;
465         struct usb_device *usb_dev;
466         int retval;
467         unsigned long state;
468
469         dev = dev->parent->parent;
470         kone = hid_get_drvdata(dev_get_drvdata(dev));
471         usb_dev = interface_to_usbdev(to_usb_interface(dev));
472
473         retval = strict_strtoul(buf, 10, &state);
474         if (retval)
475                 return retval;
476
477         if (state != 0 && state != 1)
478                 return -EINVAL;
479
480         mutex_lock(&kone->kone_lock);
481
482         if (state == 1) { /* state activate */
483                 retval = kone_tcu_command(usb_dev, 1);
484                 if (retval)
485                         goto exit_unlock;
486                 retval = kone_tcu_command(usb_dev, 2);
487                 if (retval)
488                         goto exit_unlock;
489                 ssleep(5); /* tcu needs this time for calibration */
490                 retval = kone_tcu_command(usb_dev, 3);
491                 if (retval)
492                         goto exit_unlock;
493                 retval = kone_tcu_command(usb_dev, 0);
494                 if (retval)
495                         goto exit_unlock;
496                 retval = kone_tcu_command(usb_dev, 4);
497                 if (retval)
498                         goto exit_unlock;
499                 /*
500                  * Kone needs this time to settle things.
501                  * Reading settings too early will result in invalid data.
502                  * Roccat's driver waits 1 sec, maybe this time could be
503                  * shortened.
504                  */
505                 ssleep(1);
506         }
507
508         /* calibration changes values in settings, so reread */
509         retval = kone_get_settings(usb_dev, &kone->settings);
510         if (retval)
511                 goto exit_no_settings;
512
513         /* only write settings back if activation state is different */
514         if (kone->settings.tcu != state) {
515                 kone->settings.tcu = state;
516                 kone_set_settings_checksum(&kone->settings);
517
518                 retval = kone_set_settings(usb_dev, &kone->settings);
519                 if (retval) {
520                         hid_err(usb_dev, "couldn't set tcu state\n");
521                         /*
522                          * try to reread valid settings into buffer overwriting
523                          * first error code
524                          */
525                         retval = kone_get_settings(usb_dev, &kone->settings);
526                         if (retval)
527                                 goto exit_no_settings;
528                         goto exit_unlock;
529                 }
530         }
531
532         retval = size;
533 exit_no_settings:
534         hid_err(usb_dev, "couldn't read settings\n");
535 exit_unlock:
536         mutex_unlock(&kone->kone_lock);
537         return retval;
538 }
539
540 static ssize_t kone_sysfs_show_startup_profile(struct device *dev,
541                 struct device_attribute *attr, char *buf)
542 {
543         struct kone_device *kone =
544                         hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
545         return snprintf(buf, PAGE_SIZE, "%d\n", kone->settings.startup_profile);
546 }
547
548 static ssize_t kone_sysfs_set_startup_profile(struct device *dev,
549                 struct device_attribute *attr, char const *buf, size_t size)
550 {
551         struct kone_device *kone;
552         struct usb_device *usb_dev;
553         int retval;
554         unsigned long new_startup_profile;
555
556         dev = dev->parent->parent;
557         kone = hid_get_drvdata(dev_get_drvdata(dev));
558         usb_dev = interface_to_usbdev(to_usb_interface(dev));
559
560         retval = strict_strtoul(buf, 10, &new_startup_profile);
561         if (retval)
562                 return retval;
563
564         if (new_startup_profile  < 1 || new_startup_profile > 5)
565                 return -EINVAL;
566
567         mutex_lock(&kone->kone_lock);
568
569         kone->settings.startup_profile = new_startup_profile;
570         kone_set_settings_checksum(&kone->settings);
571
572         retval = kone_set_settings(usb_dev, &kone->settings);
573
574         mutex_unlock(&kone->kone_lock);
575
576         if (retval)
577                 return retval;
578
579         /* changing the startup profile immediately activates this profile */
580         kone->actual_profile = new_startup_profile;
581         kone->actual_dpi = kone->profiles[kone->actual_profile - 1].startup_dpi;
582
583         return size;
584 }
585
586 static struct device_attribute kone_attributes[] = {
587         /*
588          * Read actual dpi settings.
589          * Returns raw value for further processing. Refer to enum
590          * kone_polling_rates to get real value.
591          */
592         __ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL),
593         __ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL),
594
595         /*
596          * The mouse can be equipped with one of four supplied weights from 5
597          * to 20 grams which are recognized and its value can be read out.
598          * This returns the raw value reported by the mouse for easy evaluation
599          * by software. Refer to enum kone_weights to get corresponding real
600          * weight.
601          */
602         __ATTR(weight, 0440, kone_sysfs_show_weight, NULL),
603
604         /*
605          * Prints firmware version stored in mouse as integer.
606          * The raw value reported by the mouse is returned for easy evaluation,
607          * to get the real version number the decimal point has to be shifted 2
608          * positions to the left. E.g. a value of 138 means 1.38.
609          */
610         __ATTR(firmware_version, 0440,
611                         kone_sysfs_show_firmware_version, NULL),
612
613         /*
614          * Prints state of Tracking Control Unit as number where 0 = off and
615          * 1 = on. Writing 0 deactivates tcu and writing 1 calibrates and
616          * activates the tcu
617          */
618         __ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu),
619
620         /* Prints and takes the number of the profile the mouse starts with */
621         __ATTR(startup_profile, 0660,
622                         kone_sysfs_show_startup_profile,
623                         kone_sysfs_set_startup_profile),
624         __ATTR_NULL
625 };
626
627 static struct bin_attribute kone_bin_attributes[] = {
628         {
629                 .attr = { .name = "settings", .mode = 0660 },
630                 .size = sizeof(struct kone_settings),
631                 .read = kone_sysfs_read_settings,
632                 .write = kone_sysfs_write_settings
633         },
634         {
635                 .attr = { .name = "profile1", .mode = 0660 },
636                 .size = sizeof(struct kone_profile),
637                 .read = kone_sysfs_read_profilex,
638                 .write = kone_sysfs_write_profilex,
639                 .private = &profile_numbers[0]
640         },
641         {
642                 .attr = { .name = "profile2", .mode = 0660 },
643                 .size = sizeof(struct kone_profile),
644                 .read = kone_sysfs_read_profilex,
645                 .write = kone_sysfs_write_profilex,
646                 .private = &profile_numbers[1]
647         },
648         {
649                 .attr = { .name = "profile3", .mode = 0660 },
650                 .size = sizeof(struct kone_profile),
651                 .read = kone_sysfs_read_profilex,
652                 .write = kone_sysfs_write_profilex,
653                 .private = &profile_numbers[2]
654         },
655         {
656                 .attr = { .name = "profile4", .mode = 0660 },
657                 .size = sizeof(struct kone_profile),
658                 .read = kone_sysfs_read_profilex,
659                 .write = kone_sysfs_write_profilex,
660                 .private = &profile_numbers[3]
661         },
662         {
663                 .attr = { .name = "profile5", .mode = 0660 },
664                 .size = sizeof(struct kone_profile),
665                 .read = kone_sysfs_read_profilex,
666                 .write = kone_sysfs_write_profilex,
667                 .private = &profile_numbers[4]
668         },
669         __ATTR_NULL
670 };
671
672 static int kone_init_kone_device_struct(struct usb_device *usb_dev,
673                 struct kone_device *kone)
674 {
675         uint i;
676         int retval;
677
678         mutex_init(&kone->kone_lock);
679
680         for (i = 0; i < 5; ++i) {
681                 retval = kone_get_profile(usb_dev, &kone->profiles[i], i + 1);
682                 if (retval)
683                         return retval;
684         }
685
686         retval = kone_get_settings(usb_dev, &kone->settings);
687         if (retval)
688                 return retval;
689
690         retval = kone_get_firmware_version(usb_dev, &kone->firmware_version);
691         if (retval)
692                 return retval;
693
694         kone->actual_profile = kone->settings.startup_profile;
695         kone->actual_dpi = kone->profiles[kone->actual_profile].startup_dpi;
696
697         return 0;
698 }
699
700 /*
701  * Since IGNORE_MOUSE quirk moved to hid-apple, there is no way to bind only to
702  * mousepart if usb_hid is compiled into the kernel and kone is compiled as
703  * module.
704  * Secial behaviour is bound only to mousepart since only mouseevents contain
705  * additional notifications.
706  */
707 static int kone_init_specials(struct hid_device *hdev)
708 {
709         struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
710         struct usb_device *usb_dev = interface_to_usbdev(intf);
711         struct kone_device *kone;
712         int retval;
713
714         if (intf->cur_altsetting->desc.bInterfaceProtocol
715                         == USB_INTERFACE_PROTOCOL_MOUSE) {
716
717                 kone = kzalloc(sizeof(*kone), GFP_KERNEL);
718                 if (!kone) {
719                         hid_err(hdev, "can't alloc device descriptor\n");
720                         return -ENOMEM;
721                 }
722                 hid_set_drvdata(hdev, kone);
723
724                 retval = kone_init_kone_device_struct(usb_dev, kone);
725                 if (retval) {
726                         hid_err(hdev, "couldn't init struct kone_device\n");
727                         goto exit_free;
728                 }
729
730                 retval = roccat_connect(kone_class, hdev);
731                 if (retval < 0) {
732                         hid_err(hdev, "couldn't init char dev\n");
733                         /* be tolerant about not getting chrdev */
734                 } else {
735                         kone->roccat_claimed = 1;
736                         kone->chrdev_minor = retval;
737                 }
738         } else {
739                 hid_set_drvdata(hdev, NULL);
740         }
741
742         return 0;
743 exit_free:
744         kfree(kone);
745         return retval;
746 }
747
748 static void kone_remove_specials(struct hid_device *hdev)
749 {
750         struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
751         struct kone_device *kone;
752
753         if (intf->cur_altsetting->desc.bInterfaceProtocol
754                         == USB_INTERFACE_PROTOCOL_MOUSE) {
755                 kone = hid_get_drvdata(hdev);
756                 if (kone->roccat_claimed)
757                         roccat_disconnect(kone->chrdev_minor);
758                 kfree(hid_get_drvdata(hdev));
759         }
760 }
761
762 static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id)
763 {
764         int retval;
765
766         retval = hid_parse(hdev);
767         if (retval) {
768                 hid_err(hdev, "parse failed\n");
769                 goto exit;
770         }
771
772         retval = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
773         if (retval) {
774                 hid_err(hdev, "hw start failed\n");
775                 goto exit;
776         }
777
778         retval = kone_init_specials(hdev);
779         if (retval) {
780                 hid_err(hdev, "couldn't install mouse\n");
781                 goto exit_stop;
782         }
783
784         return 0;
785
786 exit_stop:
787         hid_hw_stop(hdev);
788 exit:
789         return retval;
790 }
791
792 static void kone_remove(struct hid_device *hdev)
793 {
794         kone_remove_specials(hdev);
795         hid_hw_stop(hdev);
796 }
797
798 /* handle special events and keep actual profile and dpi values up to date */
799 static void kone_keep_values_up_to_date(struct kone_device *kone,
800                 struct kone_mouse_event const *event)
801 {
802         switch (event->event) {
803         case kone_mouse_event_switch_profile:
804         case kone_mouse_event_osd_profile:
805                 kone->actual_profile = event->value;
806                 kone->actual_dpi = kone->profiles[kone->actual_profile - 1].
807                                 startup_dpi;
808                 break;
809         case kone_mouse_event_switch_dpi:
810         case kone_mouse_event_osd_dpi:
811                 kone->actual_dpi = event->value;
812                 break;
813         }
814 }
815
816 static void kone_report_to_chrdev(struct kone_device const *kone,
817                 struct kone_mouse_event const *event)
818 {
819         struct kone_roccat_report roccat_report;
820
821         switch (event->event) {
822         case kone_mouse_event_switch_profile:
823         case kone_mouse_event_switch_dpi:
824         case kone_mouse_event_osd_profile:
825         case kone_mouse_event_osd_dpi:
826                 roccat_report.event = event->event;
827                 roccat_report.value = event->value;
828                 roccat_report.key = 0;
829                 roccat_report_event(kone->chrdev_minor,
830                                 (uint8_t *)&roccat_report,
831                                 sizeof(struct kone_roccat_report));
832                 break;
833         case kone_mouse_event_call_overlong_macro:
834                 if (event->value == kone_keystroke_action_press) {
835                         roccat_report.event = kone_mouse_event_call_overlong_macro;
836                         roccat_report.value = kone->actual_profile;
837                         roccat_report.key = event->macro_key;
838                         roccat_report_event(kone->chrdev_minor,
839                                         (uint8_t *)&roccat_report,
840                                         sizeof(struct kone_roccat_report));
841                 }
842                 break;
843         }
844
845 }
846
847 /*
848  * Is called for keyboard- and mousepart.
849  * Only mousepart gets informations about special events in its extended event
850  * structure.
851  */
852 static int kone_raw_event(struct hid_device *hdev, struct hid_report *report,
853                 u8 *data, int size)
854 {
855         struct kone_device *kone = hid_get_drvdata(hdev);
856         struct kone_mouse_event *event = (struct kone_mouse_event *)data;
857
858         /* keyboard events are always processed by default handler */
859         if (size != sizeof(struct kone_mouse_event))
860                 return 0;
861
862         /*
863          * Firmware 1.38 introduced new behaviour for tilt and special buttons.
864          * Pressed button is reported in each movement event.
865          * Workaround sends only one event per press.
866          */
867         if (memcmp(&kone->last_mouse_event.tilt, &event->tilt, 5))
868                 memcpy(&kone->last_mouse_event, event,
869                                 sizeof(struct kone_mouse_event));
870         else
871                 memset(&event->tilt, 0, 5);
872
873         kone_keep_values_up_to_date(kone, event);
874
875         if (kone->roccat_claimed)
876                 kone_report_to_chrdev(kone, event);
877
878         return 0; /* always do further processing */
879 }
880
881 static const struct hid_device_id kone_devices[] = {
882         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
883         { }
884 };
885
886 MODULE_DEVICE_TABLE(hid, kone_devices);
887
888 static struct hid_driver kone_driver = {
889                 .name = "kone",
890                 .id_table = kone_devices,
891                 .probe = kone_probe,
892                 .remove = kone_remove,
893                 .raw_event = kone_raw_event
894 };
895
896 static int __init kone_init(void)
897 {
898         int retval;
899
900         /* class name has to be same as driver name */
901         kone_class = class_create(THIS_MODULE, "kone");
902         if (IS_ERR(kone_class))
903                 return PTR_ERR(kone_class);
904         kone_class->dev_attrs = kone_attributes;
905         kone_class->dev_bin_attrs = kone_bin_attributes;
906
907         retval = hid_register_driver(&kone_driver);
908         if (retval)
909                 class_destroy(kone_class);
910         return retval;
911 }
912
913 static void __exit kone_exit(void)
914 {
915         class_destroy(kone_class);
916         hid_unregister_driver(&kone_driver);
917 }
918
919 module_init(kone_init);
920 module_exit(kone_exit);
921
922 MODULE_AUTHOR("Stefan Achatz");
923 MODULE_DESCRIPTION("USB Roccat Kone driver");
924 MODULE_LICENSE("GPL v2");