aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorJiri Slaby <jirislaby@gmail.com>2008-07-04 17:06:45 -0400
committerJiri Kosina <jkosina@suse.cz>2008-10-14 17:50:56 -0400
commit606bd0a8616a0e59021cb2997e942513f24f641d (patch)
treef4884ef8d1beb2c13eaa3af45512c7b43def30ae /drivers/hid
parent6edfa8dc33803a49ad936ead9840e453bee6ca3b (diff)
HID: move logitech FF processing
Merge the logitech force feedback processing directly into logitech driver from the usbhid core. Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/Kconfig24
-rw-r--r--drivers/hid/Makefile8
-rw-r--r--drivers/hid/hid-core.c7
-rw-r--r--drivers/hid/hid-ids.h7
-rw-r--r--drivers/hid/hid-lg.c (renamed from drivers/hid/hid-logitech.c)31
-rw-r--r--drivers/hid/hid-lg.h18
-rw-r--r--drivers/hid/hid-lg2ff.c (renamed from drivers/hid/usbhid/hid-lg2ff.c)6
-rw-r--r--drivers/hid/hid-lgff.c (renamed from drivers/hid/usbhid/hid-lgff.c)6
-rw-r--r--drivers/hid/usbhid/Kconfig24
-rw-r--r--drivers/hid/usbhid/Makefile6
-rw-r--r--drivers/hid/usbhid/hid-core.c1
-rw-r--r--drivers/hid/usbhid/hid-ff.c12
12 files changed, 102 insertions, 48 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 1ab067ee7e6c..4319af320adf 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -160,6 +160,30 @@ config HID_LOGITECH
160 Support for some Logitech devices which breaks less or more 160 Support for some Logitech devices which breaks less or more
161 HID specification. 161 HID specification.
162 162
163config LOGITECH_FF
164 bool "Logitech force feedback"
165 depends on HID_LOGITECH
166 select INPUT_FF_MEMLESS
167 help
168 Say Y here if you have one of these devices:
169 - Logitech WingMan Cordless RumblePad
170 - Logitech WingMan Cordless RumblePad 2
171 - Logitech WingMan Force 3D
172 - Logitech Formula Force EX
173 - Logitech MOMO Force wheel
174
175 and if you want to enable force feedback for them.
176 Note: if you say N here, this device will still be supported, but without
177 force feedback.
178
179config LOGIRUMBLEPAD2_FF
180 bool "Logitech Rumblepad 2 force feedback"
181 depends on HID_LOGITECH
182 select INPUT_FF_MEMLESS
183 help
184 Say Y here if you want to enable force feedback support for Logitech
185 Rumblepad 2 devices.
186
163config HID_MICROSOFT 187config HID_MICROSOFT
164 tristate "Microsoft" 188 tristate "Microsoft"
165 default m 189 default m
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 4a756c6e3a95..300ee00913bc 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -12,6 +12,14 @@ ifdef CONFIG_HID_COMPAT
12obj-m += hid-dummy.o 12obj-m += hid-dummy.o
13endif 13endif
14 14
15hid-logitech-objs := hid-lg.o
16ifdef CONFIG_LOGITECH_FF
17 hid-logitech-objs += hid-lgff.o
18endif
19ifdef CONFIG_LOGIRUMBLEPAD2_FF
20 hid-logitech-objs += hid-lg2ff.o
21endif
22
15obj-$(CONFIG_HID_A4TECH) += hid-a4tech.o 23obj-$(CONFIG_HID_A4TECH) += hid-a4tech.o
16obj-$(CONFIG_HID_APPLE) += hid-apple.o 24obj-$(CONFIG_HID_APPLE) += hid-apple.o
17obj-$(CONFIG_HID_BELKIN) += hid-belkin.o 25obj-$(CONFIG_HID_BELKIN) += hid-belkin.o
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 699547ce257f..6a730df336b4 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1262,6 +1262,13 @@ static const struct hid_device_id hid_blacklist[] = {
1262 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150) }, 1262 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150) },
1263 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) }, 1263 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
1264 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) }, 1264 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) },
1265 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
1266 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) },
1267 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) },
1268 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
1269 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
1270 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
1271 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
1265 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, 1272 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
1266 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) }, 1273 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
1267 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) }, 1274 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) },
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 678f7c3f341d..e2fd52ca68b7 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -263,8 +263,14 @@
263#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 263#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
264#define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 264#define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110
265#define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f 265#define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f
266#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD 0xc211
266#define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215 267#define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215
268#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218
269#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219
270#define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283
271#define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286
267#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 272#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
273#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295
268#define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a 274#define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a
269#define USB_DEVICE_ID_LOGITECH_KBD 0xc311 275#define USB_DEVICE_ID_LOGITECH_KBD 0xc311
270#define USB_DEVICE_ID_S510_RECEIVER 0xc50c 276#define USB_DEVICE_ID_S510_RECEIVER 0xc50c
@@ -274,6 +280,7 @@
274#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704 280#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
275#define USB_DEVICE_ID_DINOVO_EDGE 0xc714 281#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
276#define USB_DEVICE_ID_DINOVO_MINI 0xc71f 282#define USB_DEVICE_ID_DINOVO_MINI 0xc71f
283#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 0xca03
277 284
278#define USB_VENDOR_ID_MCC 0x09db 285#define USB_VENDOR_ID_MCC 0x09db
279#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 286#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
diff --git a/drivers/hid/hid-logitech.c b/drivers/hid/hid-lg.c
index df27f9aadf26..406d8c82abf1 100644
--- a/drivers/hid/hid-logitech.c
+++ b/drivers/hid/hid-lg.c
@@ -21,6 +21,7 @@
21#include <linux/module.h> 21#include <linux/module.h>
22 22
23#include "hid-ids.h" 23#include "hid-ids.h"
24#include "hid-lg.h"
24 25
25#define LG_RDESC 0x001 26#define LG_RDESC 0x001
26#define LG_BAD_RELATIVE_KEYS 0x002 27#define LG_BAD_RELATIVE_KEYS 0x002
@@ -31,6 +32,8 @@
31#define LG_WIRELESS 0x040 32#define LG_WIRELESS 0x040
32#define LG_INVERT_HWHEEL 0x080 33#define LG_INVERT_HWHEEL 0x080
33#define LG_NOGET 0x100 34#define LG_NOGET 0x100
35#define LG_FF 0x200
36#define LG_FF2 0x400
34 37
35/* 38/*
36 * Certain Logitech keyboards send in report #3 keys which are far 39 * Certain Logitech keyboards send in report #3 keys which are far
@@ -222,6 +225,7 @@ static int lg_event(struct hid_device *hdev, struct hid_field *field,
222static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id) 225static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
223{ 226{
224 unsigned long quirks = id->driver_data; 227 unsigned long quirks = id->driver_data;
228 unsigned int connect_mask = HID_CONNECT_DEFAULT;
225 int ret; 229 int ret;
226 230
227 hid_set_drvdata(hdev, (void *)quirks); 231 hid_set_drvdata(hdev, (void *)quirks);
@@ -235,7 +239,10 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
235 goto err_free; 239 goto err_free;
236 } 240 }
237 241
238 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 242 if (quirks & (LG_FF | LG_FF2))
243 connect_mask &= ~HID_CONNECT_FF;
244
245 ret = hid_hw_start(hdev, connect_mask);
239 if (ret) { 246 if (ret) {
240 dev_err(&hdev->dev, "hw start failed\n"); 247 dev_err(&hdev->dev, "hw start failed\n");
241 goto err_free; 248 goto err_free;
@@ -244,6 +251,11 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
244 if (quirks & LG_RESET_LEDS) 251 if (quirks & LG_RESET_LEDS)
245 usbhid_set_leds(hdev); 252 usbhid_set_leds(hdev);
246 253
254 if (quirks & LG_FF)
255 lgff_init(hdev);
256 if (quirks & LG_FF2)
257 lg2ff_init(hdev);
258
247 return 0; 259 return 0;
248err_free: 260err_free:
249 return ret; 261 return ret;
@@ -283,7 +295,22 @@ static const struct hid_device_id lg_devices[] = {
283 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D), 295 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D),
284 .driver_data = LG_NOGET }, 296 .driver_data = LG_NOGET },
285 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL), 297 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL),
286 .driver_data = LG_NOGET }, 298 .driver_data = LG_NOGET | LG_FF },
299
300 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD),
301 .driver_data = LG_FF },
302 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2),
303 .driver_data = LG_FF },
304 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D),
305 .driver_data = LG_FF },
306 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO),
307 .driver_data = LG_FF },
308 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL),
309 .driver_data = LG_FF },
310 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2),
311 .driver_data = LG_FF },
312 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2),
313 .driver_data = LG_FF2 },
287 { } 314 { }
288}; 315};
289MODULE_DEVICE_TABLE(hid, lg_devices); 316MODULE_DEVICE_TABLE(hid, lg_devices);
diff --git a/drivers/hid/hid-lg.h b/drivers/hid/hid-lg.h
new file mode 100644
index 000000000000..27ae750ca878
--- /dev/null
+++ b/drivers/hid/hid-lg.h
@@ -0,0 +1,18 @@
1#ifndef __HID_LG_H
2#define __HID_LG_H
3
4#include <linux/autoconf.h>
5
6#ifdef CONFIG_LOGITECH_FF
7int lgff_init(struct hid_device *hdev);
8#else
9static inline int lgff_init(struct hid_device *hdev) { return -1; }
10#endif
11
12#ifdef CONFIG_LOGIRUMBLEPAD2_FF
13int lg2ff_init(struct hid_device *hdev);
14#else
15static inline int lg2ff_init(struct hid_device *hdev) { return -1; }
16#endif
17
18#endif
diff --git a/drivers/hid/usbhid/hid-lg2ff.c b/drivers/hid/hid-lg2ff.c
index d469bd0061c9..b2e9a67aa652 100644
--- a/drivers/hid/usbhid/hid-lg2ff.c
+++ b/drivers/hid/hid-lg2ff.c
@@ -24,7 +24,9 @@
24#include <linux/input.h> 24#include <linux/input.h>
25#include <linux/usb.h> 25#include <linux/usb.h>
26#include <linux/hid.h> 26#include <linux/hid.h>
27#include "usbhid.h" 27
28#include "usbhid/usbhid.h"
29#include "hid-lg.h"
28 30
29struct lg2ff_device { 31struct lg2ff_device {
30 struct hid_report *report; 32 struct hid_report *report;
@@ -57,7 +59,7 @@ static int play_effect(struct input_dev *dev, void *data,
57 return 0; 59 return 0;
58} 60}
59 61
60int hid_lg2ff_init(struct hid_device *hid) 62int lg2ff_init(struct hid_device *hid)
61{ 63{
62 struct lg2ff_device *lg2ff; 64 struct lg2ff_device *lg2ff;
63 struct hid_report *report; 65 struct hid_report *report;
diff --git a/drivers/hid/usbhid/hid-lgff.c b/drivers/hid/hid-lgff.c
index 4b7ab6a46d93..e379c167ac9e 100644
--- a/drivers/hid/usbhid/hid-lgff.c
+++ b/drivers/hid/hid-lgff.c
@@ -30,7 +30,9 @@
30#include <linux/input.h> 30#include <linux/input.h>
31#include <linux/usb.h> 31#include <linux/usb.h>
32#include <linux/hid.h> 32#include <linux/hid.h>
33#include "usbhid.h" 33
34#include "usbhid/usbhid.h"
35#include "hid-lg.h"
34 36
35struct dev_type { 37struct dev_type {
36 u16 idVendor; 38 u16 idVendor;
@@ -100,7 +102,7 @@ static int hid_lgff_play(struct input_dev *dev, void *data, struct ff_effect *ef
100 return 0; 102 return 0;
101} 103}
102 104
103int hid_lgff_init(struct hid_device* hid) 105int lgff_init(struct hid_device* hid)
104{ 106{
105 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); 107 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
106 struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; 108 struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
diff --git a/drivers/hid/usbhid/Kconfig b/drivers/hid/usbhid/Kconfig
index 177bfa1a3e5b..0e7e2e6d975e 100644
--- a/drivers/hid/usbhid/Kconfig
+++ b/drivers/hid/usbhid/Kconfig
@@ -44,30 +44,6 @@ config HID_PID
44 feedback for it. Microsoft Sidewinder Force Feedback 2 is one of such 44 feedback for it. Microsoft Sidewinder Force Feedback 2 is one of such
45 devices. 45 devices.
46 46
47config LOGITECH_FF
48 bool "Logitech devices support"
49 depends on HID_FF
50 select INPUT_FF_MEMLESS if USB_HID
51 help
52 Say Y here if you have one of these devices:
53 - Logitech WingMan Cordless RumblePad
54 - Logitech WingMan Cordless RumblePad 2
55 - Logitech WingMan Force 3D
56 - Logitech Formula Force EX
57 - Logitech MOMO Force wheel
58
59 and if you want to enable force feedback for them.
60 Note: if you say N here, this device will still be supported, but without
61 force feedback.
62
63config LOGIRUMBLEPAD2_FF
64 bool "Logitech Rumblepad 2 support"
65 depends on HID_FF
66 select INPUT_FF_MEMLESS if USB_HID
67 help
68 Say Y here if you want to enable force feedback support for Logitech
69 Rumblepad 2 devices.
70
71config PANTHERLORD_FF 47config PANTHERLORD_FF
72 bool "PantherLord/GreenAsia based device support" 48 bool "PantherLord/GreenAsia based device support"
73 depends on HID_FF 49 depends on HID_FF
diff --git a/drivers/hid/usbhid/Makefile b/drivers/hid/usbhid/Makefile
index 00a7b7090192..224c62dc6a32 100644
--- a/drivers/hid/usbhid/Makefile
+++ b/drivers/hid/usbhid/Makefile
@@ -13,12 +13,6 @@ endif
13ifeq ($(CONFIG_HID_PID),y) 13ifeq ($(CONFIG_HID_PID),y)
14 usbhid-objs += hid-pidff.o 14 usbhid-objs += hid-pidff.o
15endif 15endif
16ifeq ($(CONFIG_LOGITECH_FF),y)
17 usbhid-objs += hid-lgff.o
18endif
19ifeq ($(CONFIG_LOGIRUMBLEPAD2_FF),y)
20 usbhid-objs += hid-lg2ff.o
21endif
22ifeq ($(CONFIG_PANTHERLORD_FF),y) 16ifeq ($(CONFIG_PANTHERLORD_FF),y)
23 usbhid-objs += hid-plff.o 17 usbhid-objs += hid-plff.o
24endif 18endif
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 402ace751271..4ec10aa618db 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -444,6 +444,7 @@ void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, uns
444 444
445 spin_unlock_irqrestore(&usbhid->ctrllock, flags); 445 spin_unlock_irqrestore(&usbhid->ctrllock, flags);
446} 446}
447EXPORT_SYMBOL_GPL(usbhid_submit_report);
447 448
448static int usb_hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) 449static int usb_hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
449{ 450{
diff --git a/drivers/hid/usbhid/hid-ff.c b/drivers/hid/usbhid/hid-ff.c
index 1d0dac52f166..8891f60d3beb 100644
--- a/drivers/hid/usbhid/hid-ff.c
+++ b/drivers/hid/usbhid/hid-ff.c
@@ -50,18 +50,6 @@ struct hid_ff_initializer {
50 * be a PID device 50 * be a PID device
51 */ 51 */
52static struct hid_ff_initializer inits[] = { 52static struct hid_ff_initializer inits[] = {
53#ifdef CONFIG_LOGITECH_FF
54 { 0x46d, 0xc211, hid_lgff_init }, /* Logitech Cordless rumble pad */
55 { 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */
56 { 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */
57 { 0x46d, 0xc286, hid_lgff_init }, /* Logitech Force 3D Pro Joystick */
58 { 0x46d, 0xc294, hid_lgff_init }, /* Logitech Formula Force EX */
59 { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */
60 { 0x46d, 0xca03, hid_lgff_init }, /* Logitech MOMO force wheel */
61#endif
62#ifdef CONFIG_LOGIRUMBLEPAD2_FF
63 { 0x46d, 0xc218, hid_lg2ff_init }, /* Logitech Rumblepad 2 */
64#endif
65#ifdef CONFIG_PANTHERLORD_FF 53#ifdef CONFIG_PANTHERLORD_FF
66 { 0x810, 0x0001, hid_plff_init }, /* "Twin USB Joystick" */ 54 { 0x810, 0x0001, hid_plff_init }, /* "Twin USB Joystick" */
67 { 0xe8f, 0x0003, hid_plff_init }, /* "GreenAsia Inc. USB Joystick " */ 55 { 0xe8f, 0x0003, hid_plff_init }, /* "GreenAsia Inc. USB Joystick " */