diff options
-rw-r--r-- | Documentation/feature-removal-schedule.txt | 7 | ||||
-rw-r--r-- | drivers/hid/Kconfig | 12 | ||||
-rw-r--r-- | drivers/hid/Makefile | 4 | ||||
-rw-r--r-- | drivers/hid/hid-apple.c | 2 | ||||
-rw-r--r-- | drivers/hid/hid-core.c | 12 | ||||
-rw-r--r-- | drivers/hid/hid-dummy.c | 18 | ||||
-rw-r--r-- | drivers/hid/hid-logitech.c | 2 | ||||
-rw-r--r-- | include/linux/hid.h | 17 |
8 files changed, 72 insertions, 2 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index cc8093c15cf5..4d2566a7d168 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -287,6 +287,13 @@ Who: Glauber Costa <gcosta@redhat.com> | |||
287 | 287 | ||
288 | --------------------------- | 288 | --------------------------- |
289 | 289 | ||
290 | What: remove HID compat support | ||
291 | When: 2.6.29 | ||
292 | Why: needed only as a temporary solution until distros fix themselves up | ||
293 | Who: Jiri Slaby <jirislaby@gmail.com> | ||
294 | |||
295 | --------------------------- | ||
296 | |||
290 | What: /sys/o2cb symlink | 297 | What: /sys/o2cb symlink |
291 | When: January 2010 | 298 | When: January 2010 |
292 | Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb | 299 | Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb |
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 41283fff5145..d9d1a5671d95 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
@@ -70,6 +70,18 @@ source "drivers/hid/usbhid/Kconfig" | |||
70 | menu "Special HID drivers" | 70 | menu "Special HID drivers" |
71 | depends on HID | 71 | depends on HID |
72 | 72 | ||
73 | config HID_COMPAT | ||
74 | bool "Load all HID drivers on hid core load" | ||
75 | default y | ||
76 | ---help--- | ||
77 | Compatible option for older userspace. If you have system without udev | ||
78 | support of module loading through aliases and also old | ||
79 | module-init-tools which can't handle hid bus, choose Y here. Otherwise | ||
80 | say N. If you say N and your userspace is old enough, the only | ||
81 | functionality you loose is modules autoloading. | ||
82 | |||
83 | If unsure, say Y. | ||
84 | |||
73 | config HID_APPLE | 85 | config HID_APPLE |
74 | tristate "Apple" | 86 | tristate "Apple" |
75 | default m | 87 | default m |
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 4a14821ceefa..8e053eca4742 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile | |||
@@ -8,6 +8,10 @@ obj-$(CONFIG_HID) += hid.o | |||
8 | hid-$(CONFIG_HID_DEBUG) += hid-debug.o | 8 | hid-$(CONFIG_HID_DEBUG) += hid-debug.o |
9 | hid-$(CONFIG_HIDRAW) += hidraw.o | 9 | hid-$(CONFIG_HIDRAW) += hidraw.o |
10 | 10 | ||
11 | ifdef CONFIG_HID_COMPAT | ||
12 | obj-m += hid-dummy.o | ||
13 | endif | ||
14 | |||
11 | obj-$(CONFIG_HID_APPLE) += hid-apple.o | 15 | obj-$(CONFIG_HID_APPLE) += hid-apple.o |
12 | obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o | 16 | obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o |
13 | 17 | ||
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 5642e2c685fc..2a68661fcea8 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -477,3 +477,5 @@ static void apple_exit(void) | |||
477 | module_init(apple_init); | 477 | module_init(apple_init); |
478 | module_exit(apple_exit); | 478 | module_exit(apple_exit); |
479 | MODULE_LICENSE("GPL"); | 479 | MODULE_LICENSE("GPL"); |
480 | |||
481 | HID_COMPAT_LOAD_DRIVER(apple); | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 8e3c264c9b2b..397e1b2ffe5a 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1532,6 +1532,14 @@ void hid_unregister_driver(struct hid_driver *hdrv) | |||
1532 | } | 1532 | } |
1533 | EXPORT_SYMBOL_GPL(hid_unregister_driver); | 1533 | EXPORT_SYMBOL_GPL(hid_unregister_driver); |
1534 | 1534 | ||
1535 | #ifdef CONFIG_HID_COMPAT | ||
1536 | static void hid_compat_load(struct work_struct *ws) | ||
1537 | { | ||
1538 | request_module("hid-dummy"); | ||
1539 | } | ||
1540 | static DECLARE_WORK(hid_compat_work, hid_compat_load); | ||
1541 | #endif | ||
1542 | |||
1535 | static int __init hid_init(void) | 1543 | static int __init hid_init(void) |
1536 | { | 1544 | { |
1537 | int ret; | 1545 | int ret; |
@@ -1546,6 +1554,10 @@ static int __init hid_init(void) | |||
1546 | if (ret) | 1554 | if (ret) |
1547 | goto err_bus; | 1555 | goto err_bus; |
1548 | 1556 | ||
1557 | #ifdef CONFIG_HID_COMPAT | ||
1558 | schedule_work(&hid_compat_work); | ||
1559 | #endif | ||
1560 | |||
1549 | return 0; | 1561 | return 0; |
1550 | err_bus: | 1562 | err_bus: |
1551 | bus_unregister(&hid_bus_type); | 1563 | bus_unregister(&hid_bus_type); |
diff --git a/drivers/hid/hid-dummy.c b/drivers/hid/hid-dummy.c new file mode 100644 index 000000000000..b76c44efe1b8 --- /dev/null +++ b/drivers/hid/hid-dummy.c | |||
@@ -0,0 +1,18 @@ | |||
1 | #include <linux/autoconf.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/hid.h> | ||
4 | |||
5 | static int __init hid_dummy_init(void) | ||
6 | { | ||
7 | #ifdef CONFIG_HID_APPLE_MODULE | ||
8 | HID_COMPAT_CALL_DRIVER(apple); | ||
9 | #endif | ||
10 | #ifdef CONFIG_HID_LOGITECH_MODULE | ||
11 | HID_COMPAT_CALL_DRIVER(logitech); | ||
12 | #endif | ||
13 | |||
14 | return -EIO; | ||
15 | } | ||
16 | module_init(hid_dummy_init); | ||
17 | |||
18 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/hid/hid-logitech.c b/drivers/hid/hid-logitech.c index 395e42ffb4d5..b2aaebe1ac05 100644 --- a/drivers/hid/hid-logitech.c +++ b/drivers/hid/hid-logitech.c | |||
@@ -310,3 +310,5 @@ static void lg_exit(void) | |||
310 | module_init(lg_init); | 310 | module_init(lg_init); |
311 | module_exit(lg_exit); | 311 | module_exit(lg_exit); |
312 | MODULE_LICENSE("GPL"); | 312 | MODULE_LICENSE("GPL"); |
313 | |||
314 | HID_COMPAT_LOAD_DRIVER(logitech); | ||
diff --git a/include/linux/hid.h b/include/linux/hid.h index 75cc1531dd84..60e44e6b86e6 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -790,10 +790,23 @@ dbg_hid(const char *fmt, ...) | |||
790 | return 0; | 790 | return 0; |
791 | } | 791 | } |
792 | #define dbg_hid_line dbg_hid | 792 | #define dbg_hid_line dbg_hid |
793 | #endif | 793 | #endif /* HID_DEBUG */ |
794 | 794 | ||
795 | #define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \ | 795 | #define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \ |
796 | __FILE__ , ## arg) | 796 | __FILE__ , ## arg) |
797 | #endif | 797 | #endif /* HID_FF */ |
798 | |||
799 | #ifdef CONFIG_HID_COMPAT | ||
800 | #define HID_COMPAT_LOAD_DRIVER(name) \ | ||
801 | void hid_compat_##name(void) { } \ | ||
802 | EXPORT_SYMBOL(hid_compat_##name) | ||
803 | #else | ||
804 | #define HID_COMPAT_LOAD_DRIVER(name) | ||
805 | #endif /* HID_COMPAT */ | ||
806 | #define HID_COMPAT_CALL_DRIVER(name) do { \ | ||
807 | extern void hid_compat_##name(void); \ | ||
808 | hid_compat_##name(); \ | ||
809 | } while (0) | ||
810 | |||
798 | #endif | 811 | #endif |
799 | 812 | ||