HID: ACRUX - activate the device immediately after binding
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 11 Mar 2011 08:27:34 +0000 (00:27 -0800)
committerJiri Kosina <jkosina@suse.cz>
Sat, 12 Mar 2011 20:47:18 +0000 (21:47 +0100)
This device does not tolerate delayed opening and goes into a coma if
we try to that. Ubuntu even has a crutch for udev that opened the device
upon seeing it for the first time, but it did not work if we happened to
boot with the device attached, since by the time userspace got around
opening the device it was too late. Let's start the device immediately
to deal with this issue.

Reported-by: Sergei Kolzun <x0r@dv-life.ru>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-axff.c
drivers/hid/hid-core.c

index 5fa0b952914c729d5d50bb5a266cca8d067efe9b..d942d421af51f48a19f461b2f60fa3c0787b4824 100644 (file)
@@ -68,9 +68,15 @@ config HID_A4TECH
        ---help---
        Support for A4 tech X5 and WOP-35 / Trust 450L mice.
 
-config HID_ACRUX_FF
-       tristate "ACRUX force feedback"
+config HID_ACRUX
+       tristate "ACRUX game controller support"
        depends on USB_HID
+       ---help---
+       Say Y here if you want to enable support for ACRUX game controllers.
+
+config HID_ACRUX_FF
+       tristate "ACRUX force feedback support"
+       depends on HID_ACRUX
        select INPUT_FF_MEMLESS
        ---help---
        Say Y here if you want to enable force feedback support for ACRUX
index 569647763d1bb8fbf2a060a3a7c0721250fd6425..125ba103eba08fe4e0e6531db372a793f56be62c 100644 (file)
@@ -27,7 +27,7 @@ endif
 
 obj-$(CONFIG_HID_3M_PCT)       += hid-3m-pct.o
 obj-$(CONFIG_HID_A4TECH)       += hid-a4tech.o
-obj-$(CONFIG_HID_ACRUX_FF)     += hid-axff.o
+obj-$(CONFIG_HID_ACRUX)                += hid-axff.o
 obj-$(CONFIG_HID_APPLE)                += hid-apple.o
 obj-$(CONFIG_HID_BELKIN)       += hid-belkin.o
 obj-$(CONFIG_HID_CANDO)                += hid-cando.o
index e5b961d6ff22084f74bd2f648572f4aab41a0759..b4554288de00bee40adb14d3318df8d4aa3c97b8 100644 (file)
@@ -33,6 +33,8 @@
 #include <linux/hid.h>
 
 #include "hid-ids.h"
+
+#ifdef CONFIG_HID_ACRUX_FF
 #include "usbhid/usbhid.h"
 
 struct axff_device {
@@ -109,6 +111,12 @@ err_free_mem:
        kfree(axff);
        return error;
 }
+#else
+static inline int axff_init(struct hid_device *hid)
+{
+       return 0;
+}
+#endif
 
 static int ax_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
@@ -139,9 +147,25 @@ static int ax_probe(struct hid_device *hdev, const struct hid_device_id *id)
                         error);
        }
 
+       /*
+        * We need to start polling device right away, otherwise
+        * it will go into a coma.
+        */
+       error = hid_hw_open(hdev);
+       if (error) {
+               dev_err(&hdev->dev, "hw open failed\n");
+               return error;
+       }
+
        return 0;
 }
 
+static void ax_remove(struct hid_device *hdev)
+{
+       hid_hw_close(hdev);
+       hid_hw_stop(hdev);
+}
+
 static const struct hid_device_id ax_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802), },
        { }
@@ -149,9 +173,10 @@ static const struct hid_device_id ax_devices[] = {
 MODULE_DEVICE_TABLE(hid, ax_devices);
 
 static struct hid_driver ax_driver = {
-       .name = "acrux",
-       .id_table = ax_devices,
-       .probe = ax_probe,
+       .name           = "acrux",
+       .id_table       = ax_devices,
+       .probe          = ax_probe,
+       .remove         = ax_remove,
 };
 
 static int __init ax_init(void)
index 570db37d574d448064e30662ddd1e5a069efda88..c650efb52a45774bb67e2519ed29f3517138320e 100644 (file)
@@ -1289,9 +1289,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
-#if defined(CONFIG_HID_ACRUX_FF) || defined(CONFIG_HID_ACRUX_FF_MODULE)
        { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
-#endif
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },