aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2012-04-23 06:07:07 -0400
committerJiri Kosina <jkosina@suse.cz>2012-05-01 06:54:55 -0400
commit8215d557e5f3a70e50e07c857d35c250fee62a73 (patch)
tree1ba7ffa5bddacacc9bff64a049e0ca091d43b65d /drivers
parent4fa3a5837b8427faab9b064b1948795eb77b9f8d (diff)
HID: Create a common generic driver
Move the hid drivers of the bus drivers to a common generic hid driver, and make it a proper module. This ought to simplify device handling moving forward. Cc: Gustavo Padovan <gustavo@padovan.org> Signed-off-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hid/Kconfig12
-rw-r--r--drivers/hid/Makefile2
-rw-r--r--drivers/hid/hid-generic.c53
-rw-r--r--drivers/hid/usbhid/hid-core.c16
4 files changed, 67 insertions, 16 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index ffddcba32af6..9a581e1a1903 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -60,6 +60,18 @@ source "drivers/hid/usbhid/Kconfig"
60menu "Special HID drivers" 60menu "Special HID drivers"
61 depends on HID 61 depends on HID
62 62
63config HID_GENERIC
64 tristate "Generic HID driver"
65 depends on HID
66 default y
67 ---help---
68 Support for generic HID devices.
69
70 To compile this driver as a module, choose M here: the module
71 will be called hid-generic.
72
73 If unsure, say Y.
74
63config HID_A4TECH 75config HID_A4TECH
64 tristate "A4 tech mice" if EXPERT 76 tristate "A4 tech mice" if EXPERT
65 depends on USB_HID 77 depends on USB_HID
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 22f1d16cd79c..a04cffa4784f 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -9,6 +9,8 @@ endif
9 9
10obj-$(CONFIG_HID) += hid.o 10obj-$(CONFIG_HID) += hid.o
11 11
12obj-$(CONFIG_HID_GENERIC) += hid-generic.o
13
12hid-$(CONFIG_HIDRAW) += hidraw.o 14hid-$(CONFIG_HIDRAW) += hidraw.o
13 15
14hid-logitech-y := hid-lg.o 16hid-logitech-y := hid-lg.o
diff --git a/drivers/hid/hid-generic.c b/drivers/hid/hid-generic.c
new file mode 100644
index 000000000000..a8b3148e03a2
--- /dev/null
+++ b/drivers/hid/hid-generic.c
@@ -0,0 +1,53 @@
1/*
2 * HID support for Linux
3 *
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2007-2008 Oliver Neukum
8 * Copyright (c) 2006-2012 Jiri Kosina
9 * Copyright (c) 2012 Henrik Rydberg
10 */
11
12/*
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU General Public License as published by the Free
15 * Software Foundation; either version 2 of the License, or (at your option)
16 * any later version.
17 */
18
19#include <linux/module.h>
20#include <linux/slab.h>
21#include <linux/kernel.h>
22#include <asm/unaligned.h>
23#include <asm/byteorder.h>
24
25#include <linux/hid.h>
26
27static const struct hid_device_id hid_table[] = {
28 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_GENERIC, HID_ANY_ID, HID_ANY_ID) },
29 { }
30};
31MODULE_DEVICE_TABLE(hid, hid_table);
32
33static struct hid_driver hid_generic = {
34 .name = "hid-generic",
35 .id_table = hid_table,
36};
37
38static int __init hid_init(void)
39{
40 return hid_register_driver(&hid_generic);
41}
42
43static void __exit hid_exit(void)
44{
45 hid_unregister_driver(&hid_generic);
46}
47
48module_init(hid_init);
49module_exit(hid_exit);
50
51MODULE_AUTHOR("Henrik Rydberg");
52MODULE_DESCRIPTION("HID generic driver");
53MODULE_LICENSE("GPL");
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 9abf718318ca..9cba5006b5ed 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1504,28 +1504,15 @@ static struct usb_driver hid_driver = {
1504 .supports_autosuspend = 1, 1504 .supports_autosuspend = 1,
1505}; 1505};
1506 1506
1507static const struct hid_device_id hid_usb_table[] = {
1508 { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, HID_ANY_ID, HID_ANY_ID) },
1509 { }
1510};
1511
1512struct usb_interface *usbhid_find_interface(int minor) 1507struct usb_interface *usbhid_find_interface(int minor)
1513{ 1508{
1514 return usb_find_interface(&hid_driver, minor); 1509 return usb_find_interface(&hid_driver, minor);
1515} 1510}
1516 1511
1517static struct hid_driver hid_usb_driver = {
1518 .name = "generic-usb",
1519 .id_table = hid_usb_table,
1520};
1521
1522static int __init hid_init(void) 1512static int __init hid_init(void)
1523{ 1513{
1524 int retval = -ENOMEM; 1514 int retval = -ENOMEM;
1525 1515
1526 retval = hid_register_driver(&hid_usb_driver);
1527 if (retval)
1528 goto hid_register_fail;
1529 retval = usbhid_quirks_init(quirks_param); 1516 retval = usbhid_quirks_init(quirks_param);
1530 if (retval) 1517 if (retval)
1531 goto usbhid_quirks_init_fail; 1518 goto usbhid_quirks_init_fail;
@@ -1538,8 +1525,6 @@ static int __init hid_init(void)
1538usb_register_fail: 1525usb_register_fail:
1539 usbhid_quirks_exit(); 1526 usbhid_quirks_exit();
1540usbhid_quirks_init_fail: 1527usbhid_quirks_init_fail:
1541 hid_unregister_driver(&hid_usb_driver);
1542hid_register_fail:
1543 return retval; 1528 return retval;
1544} 1529}
1545 1530
@@ -1547,7 +1532,6 @@ static void __exit hid_exit(void)
1547{ 1532{
1548 usb_deregister(&hid_driver); 1533 usb_deregister(&hid_driver);
1549 usbhid_quirks_exit(); 1534 usbhid_quirks_exit();
1550 hid_unregister_driver(&hid_usb_driver);
1551} 1535}
1552 1536
1553module_init(hid_init); 1537module_init(hid_init);