diff options
-rw-r--r-- | drivers/hid/hid-ntrig.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index dffffa763bd7..9fae2ebdd758 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
@@ -110,6 +110,36 @@ static int ntrig_version_string(unsigned char *raw, char *buf) | |||
110 | return sprintf(buf, "%u.%u.%u.%u.%u", a, b, c, d, e); | 110 | return sprintf(buf, "%u.%u.%u.%u.%u", a, b, c, d, e); |
111 | } | 111 | } |
112 | 112 | ||
113 | static inline int ntrig_get_mode(struct hid_device *hdev) | ||
114 | { | ||
115 | struct hid_report *report = hdev->report_enum[HID_FEATURE_REPORT]. | ||
116 | report_id_hash[0x0d]; | ||
117 | |||
118 | if (!report) | ||
119 | return -EINVAL; | ||
120 | |||
121 | usbhid_submit_report(hdev, report, USB_DIR_IN); | ||
122 | usbhid_wait_io(hdev); | ||
123 | return (int)report->field[0]->value[0]; | ||
124 | } | ||
125 | |||
126 | static inline void ntrig_set_mode(struct hid_device *hdev, const int mode) | ||
127 | { | ||
128 | struct hid_report *report; | ||
129 | __u8 mode_commands[4] = { 0xe, 0xf, 0x1b, 0x10 }; | ||
130 | |||
131 | if (mode < 0 || mode > 3) | ||
132 | return; | ||
133 | |||
134 | report = hdev->report_enum[HID_FEATURE_REPORT]. | ||
135 | report_id_hash[mode_commands[mode]]; | ||
136 | |||
137 | if (!report) | ||
138 | return; | ||
139 | |||
140 | usbhid_submit_report(hdev, report, USB_DIR_IN); | ||
141 | } | ||
142 | |||
113 | static void ntrig_report_version(struct hid_device *hdev) | 143 | static void ntrig_report_version(struct hid_device *hdev) |
114 | { | 144 | { |
115 | int ret; | 145 | int ret; |
@@ -905,8 +935,19 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
905 | 935 | ||
906 | /* This is needed for devices with more recent firmware versions */ | 936 | /* This is needed for devices with more recent firmware versions */ |
907 | report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0x0a]; | 937 | report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0x0a]; |
908 | if (report) | 938 | if (report) { |
909 | usbhid_submit_report(hdev, report, USB_DIR_OUT); | 939 | /* Let the device settle to ensure the wakeup message gets |
940 | * through */ | ||
941 | usbhid_wait_io(hdev); | ||
942 | usbhid_submit_report(hdev, report, USB_DIR_IN); | ||
943 | |||
944 | /* | ||
945 | * Sanity check: if the current mode is invalid reset it to | ||
946 | * something reasonable. | ||
947 | */ | ||
948 | if (ntrig_get_mode(hdev) >= 4) | ||
949 | ntrig_set_mode(hdev, 3); | ||
950 | } | ||
910 | 951 | ||
911 | ntrig_report_version(hdev); | 952 | ntrig_report_version(hdev); |
912 | 953 | ||