diff options
Diffstat (limited to 'drivers/hid/hid-roccat-kone.c')
-rw-r--r-- | drivers/hid/hid-roccat-kone.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c index b6371d3fe0f9..17f2dc04f883 100644 --- a/drivers/hid/hid-roccat-kone.c +++ b/drivers/hid/hid-roccat-kone.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/module.h> | 37 | #include <linux/module.h> |
38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
39 | #include "hid-ids.h" | 39 | #include "hid-ids.h" |
40 | #include "hid-roccat.h" | ||
40 | #include "hid-roccat-kone.h" | 41 | #include "hid-roccat-kone.h" |
41 | 42 | ||
42 | static void kone_set_settings_checksum(struct kone_settings *settings) | 43 | static void kone_set_settings_checksum(struct kone_settings *settings) |
@@ -849,6 +850,16 @@ static int kone_init_specials(struct hid_device *hdev) | |||
849 | "couldn't init struct kone_device\n"); | 850 | "couldn't init struct kone_device\n"); |
850 | goto exit_free; | 851 | goto exit_free; |
851 | } | 852 | } |
853 | |||
854 | retval = roccat_connect(hdev); | ||
855 | if (retval < 0) { | ||
856 | dev_err(&hdev->dev, "couldn't init char dev\n"); | ||
857 | /* be tolerant about not getting chrdev */ | ||
858 | } else { | ||
859 | kone->roccat_claimed = 1; | ||
860 | kone->chrdev_minor = retval; | ||
861 | } | ||
862 | |||
852 | retval = kone_create_sysfs_attributes(intf); | 863 | retval = kone_create_sysfs_attributes(intf); |
853 | if (retval) { | 864 | if (retval) { |
854 | dev_err(&hdev->dev, "cannot create sysfs files\n"); | 865 | dev_err(&hdev->dev, "cannot create sysfs files\n"); |
@@ -868,10 +879,14 @@ exit_free: | |||
868 | static void kone_remove_specials(struct hid_device *hdev) | 879 | static void kone_remove_specials(struct hid_device *hdev) |
869 | { | 880 | { |
870 | struct usb_interface *intf = to_usb_interface(hdev->dev.parent); | 881 | struct usb_interface *intf = to_usb_interface(hdev->dev.parent); |
882 | struct kone_device *kone; | ||
871 | 883 | ||
872 | if (intf->cur_altsetting->desc.bInterfaceProtocol | 884 | if (intf->cur_altsetting->desc.bInterfaceProtocol |
873 | == USB_INTERFACE_PROTOCOL_MOUSE) { | 885 | == USB_INTERFACE_PROTOCOL_MOUSE) { |
874 | kone_remove_sysfs_attributes(intf); | 886 | kone_remove_sysfs_attributes(intf); |
887 | kone = hid_get_drvdata(hdev); | ||
888 | if (kone->roccat_claimed) | ||
889 | roccat_disconnect(kone->chrdev_minor); | ||
875 | kfree(hid_get_drvdata(hdev)); | 890 | kfree(hid_get_drvdata(hdev)); |
876 | } | 891 | } |
877 | } | 892 | } |
@@ -930,6 +945,37 @@ static void kone_keep_values_up_to_date(struct kone_device *kone, | |||
930 | } | 945 | } |
931 | } | 946 | } |
932 | 947 | ||
948 | static void kone_report_to_chrdev(struct kone_device const *kone, | ||
949 | struct kone_mouse_event const *event) | ||
950 | { | ||
951 | struct kone_roccat_report roccat_report; | ||
952 | |||
953 | switch (event->event) { | ||
954 | case kone_mouse_event_switch_profile: | ||
955 | case kone_mouse_event_switch_dpi: | ||
956 | case kone_mouse_event_osd_profile: | ||
957 | case kone_mouse_event_osd_dpi: | ||
958 | roccat_report.event = event->event; | ||
959 | roccat_report.value = event->value; | ||
960 | roccat_report.key = 0; | ||
961 | roccat_report_event(kone->chrdev_minor, | ||
962 | (uint8_t *)&roccat_report, | ||
963 | sizeof(struct kone_roccat_report)); | ||
964 | break; | ||
965 | case kone_mouse_event_call_overlong_macro: | ||
966 | if (event->value == kone_keystroke_action_press) { | ||
967 | roccat_report.event = kone_mouse_event_call_overlong_macro; | ||
968 | roccat_report.value = kone->actual_profile; | ||
969 | roccat_report.key = event->macro_key; | ||
970 | roccat_report_event(kone->chrdev_minor, | ||
971 | (uint8_t *)&roccat_report, | ||
972 | sizeof(struct kone_roccat_report)); | ||
973 | } | ||
974 | break; | ||
975 | } | ||
976 | |||
977 | } | ||
978 | |||
933 | /* | 979 | /* |
934 | * Is called for keyboard- and mousepart. | 980 | * Is called for keyboard- and mousepart. |
935 | * Only mousepart gets informations about special events in its extended event | 981 | * Only mousepart gets informations about special events in its extended event |
@@ -958,6 +1004,9 @@ static int kone_raw_event(struct hid_device *hdev, struct hid_report *report, | |||
958 | 1004 | ||
959 | kone_keep_values_up_to_date(kone, event); | 1005 | kone_keep_values_up_to_date(kone, event); |
960 | 1006 | ||
1007 | if (kone->roccat_claimed) | ||
1008 | kone_report_to_chrdev(kone, event); | ||
1009 | |||
961 | return 0; /* always do further processing */ | 1010 | return 0; /* always do further processing */ |
962 | } | 1011 | } |
963 | 1012 | ||