HID: fix oops in hid_check_keys_pressed()
[sfrench/cifs-2.6.git] / drivers / hid / hid-core.c
index b96fbd5dab55cfc94db63c760ea3e4ae96e7633d..8551693d645fc602fe5f3bf3ccd1352fefc439c2 100644 (file)
@@ -1293,6 +1293,7 @@ static const struct hid_device_id hid_blacklist[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
@@ -1819,14 +1820,24 @@ void hid_unregister_driver(struct hid_driver *hdrv)
 }
 EXPORT_SYMBOL_GPL(hid_unregister_driver);
 
-#ifdef CONFIG_HID_COMPAT
-static void hid_compat_load(struct work_struct *ws)
+int hid_check_keys_pressed(struct hid_device *hid)
 {
-       request_module("hid-dummy");
+       struct hid_input *hidinput;
+       int i;
+
+       if (!(hid->claimed & HID_CLAIMED_INPUT))
+               return 0;
+
+       list_for_each_entry(hidinput, &hid->inputs, list) {
+               for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++)
+                       if (hidinput->input->key[i])
+                               return 1;
+       }
+
+       return 0;
 }
-static DECLARE_WORK(hid_compat_work, hid_compat_load);
-static struct workqueue_struct *hid_compat_wq;
-#endif
+
+EXPORT_SYMBOL_GPL(hid_check_keys_pressed);
 
 static int __init hid_init(void)
 {
@@ -1842,15 +1853,6 @@ static int __init hid_init(void)
        if (ret)
                goto err_bus;
 
-#ifdef CONFIG_HID_COMPAT
-       hid_compat_wq = create_singlethread_workqueue("hid_compat");
-       if (!hid_compat_wq) {
-               hidraw_exit();
-               goto err;
-       }
-       queue_work(hid_compat_wq, &hid_compat_work);
-#endif
-
        return 0;
 err_bus:
        bus_unregister(&hid_bus_type);
@@ -1860,9 +1862,6 @@ err:
 
 static void __exit hid_exit(void)
 {
-#ifdef CONFIG_HID_COMPAT
-       destroy_workqueue(hid_compat_wq);
-#endif
        hidraw_exit();
        bus_unregister(&hid_bus_type);
 }