]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
HID: automatically call usbhid_set_leds in usbhid driver
authorAlan Stern <stern@rowland.harvard.edu>
Thu, 30 Oct 2008 22:58:51 +0000 (23:58 +0100)
committerJiri Kosina <jkosina@suse.cz>
Sun, 4 Jan 2009 00:00:50 +0000 (01:00 +0100)
This patch (as1146c) makes usbhid automatically call usbhid_set_leds()
for any device that supports the keyboard boot protocol.

In theory this should be perfectly safe.  BIOSes send the LED output
report as part of their normal device initialization, so any keyboard
device supporting the boot protocol has to be able to handle it.

As a side effect, the hid-dell and hid-bright drivers are no longer
needed, and the Logitech keyboard driver can be removed from hid-lg.

CC: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-bright.c [deleted file]
drivers/hid/hid-core.c
drivers/hid/hid-dell.c [deleted file]
drivers/hid/hid-ids.h
drivers/hid/hid-lg.c
drivers/hid/usbhid/hid-core.c

index b4fd8ca701a44d4ff32d3f2bedb6b3c8b706f72d..65b577eaf823ebdeb398de4164762574ed853fe8 100644 (file)
@@ -107,13 +107,6 @@ config HID_BELKIN
        ---help---
        Support for Belkin Flip KVM and Wireless keyboard.
 
-config HID_BRIGHT
-       tristate "Bright" if EMBEDDED
-       depends on USB_HID
-       default y
-       ---help---
-       Support for Bright ABNT-2 keyboard.
-
 config HID_CHERRY
        tristate "Cherry" if EMBEDDED
        depends on USB_HID
@@ -135,14 +128,6 @@ config HID_CYPRESS
        ---help---
        Support for cypress mouse and barcode readers.
 
-config HID_DELL
-       tristate "Dell" if EMBEDDED
-       depends on USB_HID
-       default y
-       ---help---
-       Support for quirky Dell HID hardware that require
-       special LED handling (W7658 and SK8115 models)
-
 config HID_EZKEY
        tristate "Ezkey" if EMBEDDED
        depends on USB_HID
index b09e43e7413e2ebc2fce3b7ffe5c6c7f708fff94..e2294a8b2a68211234987290d22731784c600c8b 100644 (file)
@@ -23,11 +23,9 @@ endif
 obj-$(CONFIG_HID_A4TECH)       += hid-a4tech.o
 obj-$(CONFIG_HID_APPLE)                += hid-apple.o
 obj-$(CONFIG_HID_BELKIN)       += hid-belkin.o
-obj-$(CONFIG_HID_BRIGHT)       += hid-bright.o
 obj-$(CONFIG_HID_CHERRY)       += hid-cherry.o
 obj-$(CONFIG_HID_CHICONY)      += hid-chicony.o
 obj-$(CONFIG_HID_CYPRESS)      += hid-cypress.o
-obj-$(CONFIG_HID_DELL)         += hid-dell.o
 obj-$(CONFIG_HID_EZKEY)                += hid-ezkey.o
 obj-$(CONFIG_HID_GYRATION)     += hid-gyration.o
 obj-$(CONFIG_HID_LOGITECH)     += hid-logitech.o
diff --git a/drivers/hid/hid-bright.c b/drivers/hid/hid-bright.c
deleted file mode 100644 (file)
index 38517a1..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  HID driver for some bright "special" devices
- *
- *  Copyright (c) 2008 Mauro Carvalho Chehab <mchehab@redhat.com>
- *
- * Based on hid-dell driver
- */
-
-/*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- */
-
-#include <linux/device.h>
-#include <linux/hid.h>
-#include <linux/module.h>
-
-#include "hid-ids.h"
-
-static int bright_probe(struct hid_device *hdev, const struct hid_device_id *id)
-{
-       int ret;
-
-       ret = hid_parse(hdev);
-       if (ret) {
-               dev_err(&hdev->dev, "parse failed\n");
-               goto err_free;
-       }
-
-       ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
-       if (ret) {
-               dev_err(&hdev->dev, "hw start failed\n");
-               goto err_free;
-       }
-
-       usbhid_set_leds(hdev);
-
-       return 0;
-err_free:
-       return ret;
-}
-
-static const struct hid_device_id bright_devices[] = {
-       { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) },
-       { }
-};
-MODULE_DEVICE_TABLE(hid, bright_devices);
-
-static struct hid_driver bright_driver = {
-       .name = "bright",
-       .id_table = bright_devices,
-       .probe = bright_probe,
-};
-
-static int bright_init(void)
-{
-       return hid_register_driver(&bright_driver);
-}
-
-static void bright_exit(void)
-{
-       hid_unregister_driver(&bright_driver);
-}
-
-module_init(bright_init);
-module_exit(bright_exit);
-MODULE_LICENSE("GPL");
-
-HID_COMPAT_LOAD_DRIVER(bright);
index 839de38a43c7c5f81a2628bc3b3b9acfdfc4ad01..8be30037cffe05dc7dcac3dbb0e9bfdd9ef537f2 100644 (file)
@@ -1256,16 +1256,12 @@ static const struct hid_device_id hid_blacklist[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
@@ -1279,7 +1275,6 @@ static const struct hid_device_id hid_blacklist[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
diff --git a/drivers/hid/hid-dell.c b/drivers/hid/hid-dell.c
deleted file mode 100644 (file)
index f547430..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  HID driver for some dell "special" devices
- *
- *  Copyright (c) 1999 Andreas Gal
- *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
- *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
- *  Copyright (c) 2006-2007 Jiri Kosina
- *  Copyright (c) 2007 Paul Walmsley
- *  Copyright (c) 2008 Jiri Slaby
- */
-
-/*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- */
-
-#include <linux/device.h>
-#include <linux/hid.h>
-#include <linux/module.h>
-
-#include "hid-ids.h"
-
-static int dell_probe(struct hid_device *hdev, const struct hid_device_id *id)
-{
-       int ret;
-
-       ret = hid_parse(hdev);
-       if (ret) {
-               dev_err(&hdev->dev, "parse failed\n");
-               goto err_free;
-       }
-
-       ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
-       if (ret) {
-               dev_err(&hdev->dev, "hw start failed\n");
-               goto err_free;
-       }
-
-       usbhid_set_leds(hdev);
-
-       return 0;
-err_free:
-       return ret;
-}
-
-static const struct hid_device_id dell_devices[] = {
-       { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) },
-       { }
-};
-MODULE_DEVICE_TABLE(hid, dell_devices);
-
-static struct hid_driver dell_driver = {
-       .name = "dell",
-       .id_table = dell_devices,
-       .probe = dell_probe,
-};
-
-static int dell_init(void)
-{
-       return hid_register_driver(&dell_driver);
-}
-
-static void dell_exit(void)
-{
-       hid_unregister_driver(&dell_driver);
-}
-
-module_init(dell_init);
-module_exit(dell_exit);
-MODULE_LICENSE("GPL");
-
-HID_COMPAT_LOAD_DRIVER(dell);
index 39289699c32fbd5b640e5bd9c440990bf5f2a97c..aae2ceca0bce18394774c7f35c41eb64b757d068 100644 (file)
 #define USB_VENDOR_ID_BELKIN           0x050d
 #define USB_DEVICE_ID_FLIP_KVM         0x3201
 
-#define USB_VENDOR_ID_BRIGHT           0x1241
-#define USB_DEVICE_ID_BRIGHT_ABNT2     0x1503
-
 #define USB_VENDOR_ID_BERKSHIRE                0x0c98
 #define USB_DEVICE_ID_BERKSHIRE_PCWD   0x1140
 
 #define USB_DEVICE_ID_CYPRESS_BARCODE_1        0xde61
 #define USB_DEVICE_ID_CYPRESS_BARCODE_2        0xde64
 
-#define USB_VENDOR_ID_DELL             0x413c
-#define USB_DEVICE_ID_DELL_W7658       0x2005
-#define USB_DEVICE_ID_DELL_SK8115      0x2105
-
 #define USB_VENDOR_ID_DELORME          0x1163
 #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
 #define USB_DEVICE_ID_DELORME_EM_LT20  0x0200
 
 #define USB_VENDOR_ID_GENERAL_TOUCH    0x0dfc
 
-#define USB_VENDOR_ID_GENERIC_13BA     0x13ba
-#define USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE   0x0017
-
 #define USB_VENDOR_ID_GLAB             0x06c2
 #define USB_DEVICE_ID_4_PHIDGETSERVO_30        0x0038
 #define USB_DEVICE_ID_1_PHIDGETSERVO_30        0x0039
 #define USB_DEVICE_ID_LOGITECH_WHEEL   0xc294
 #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL      0xc295
 #define USB_DEVICE_ID_LOGITECH_ELITE_KBD       0xc30a
-#define USB_DEVICE_ID_LOGITECH_KBD     0xc311
 #define USB_DEVICE_ID_S510_RECEIVER    0xc50c
 #define USB_DEVICE_ID_S510_RECEIVER_2  0xc517
 #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500  0xc512
index 2bae340eafe2829b3fd97302d36a66b8b100f95f..83e07c9f4144d01de82813ece5077a0f4ed76257 100644 (file)
@@ -26,7 +26,6 @@
 #define LG_RDESC               0x001
 #define LG_BAD_RELATIVE_KEYS   0x002
 #define LG_DUPLICATE_USAGES    0x004
-#define LG_RESET_LEDS          0x008
 #define LG_EXPANDED_KEYMAP     0x010
 #define LG_IGNORE_DOUBLED_WHEEL        0x020
 #define LG_WIRELESS            0x040
@@ -248,9 +247,6 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
                goto err_free;
        }
 
-       if (quirks & LG_RESET_LEDS)
-               usbhid_set_leds(hdev);
-
        if (quirks & LG_FF)
                lgff_init(hdev);
        if (quirks & LG_FF2)
@@ -279,9 +275,6 @@ static const struct hid_device_id lg_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI),
                .driver_data = LG_DUPLICATE_USAGES },
 
-       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD),
-               .driver_data = LG_RESET_LEDS },
-
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD),
                .driver_data = LG_IGNORE_DOUBLED_WHEEL | LG_EXPANDED_KEYMAP },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500),
index 2afc8617f5919ec28add338ac3197cd5c7c36998..6383145b58401d8f8940ccdf36d2e5a927a0f207 100644 (file)
@@ -874,6 +874,15 @@ static int usbhid_start(struct hid_device *hid)
 
        set_bit(HID_STARTED, &usbhid->iofl);
 
+       /* Some keyboards don't work until their LEDs have been set.
+        * Since BIOSes do set the LEDs, it must be safe for any device
+        * that supports the keyboard boot protocol.
+        */
+       if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT &&
+                       interface->desc.bInterfaceProtocol ==
+                               USB_INTERFACE_PROTOCOL_KEYBOARD)
+               usbhid_set_leds(hid);
+
        return 0;
 
 fail: