Commit 02ae9a1a authored by Jiri Slaby's avatar Jiri Slaby Committed by Jiri Kosina

HID: add compat support

Add compat option to hid code to allow loading of all modules on
systems which don't allow autoloading because of old userspace.
Signed-off-by: default avatarJiri Slaby <jirislaby@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 8c19a515
...@@ -287,6 +287,13 @@ Who: Glauber Costa <gcosta@redhat.com> ...@@ -287,6 +287,13 @@ Who: Glauber Costa <gcosta@redhat.com>
--------------------------- ---------------------------
What: remove HID compat support
When: 2.6.29
Why: needed only as a temporary solution until distros fix themselves up
Who: Jiri Slaby <jirislaby@gmail.com>
---------------------------
What: /sys/o2cb symlink What: /sys/o2cb symlink
When: January 2010 When: January 2010
Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb
......
...@@ -70,6 +70,18 @@ source "drivers/hid/usbhid/Kconfig" ...@@ -70,6 +70,18 @@ source "drivers/hid/usbhid/Kconfig"
menu "Special HID drivers" menu "Special HID drivers"
depends on HID depends on HID
config HID_COMPAT
bool "Load all HID drivers on hid core load"
default y
---help---
Compatible option for older userspace. If you have system without udev
support of module loading through aliases and also old
module-init-tools which can't handle hid bus, choose Y here. Otherwise
say N. If you say N and your userspace is old enough, the only
functionality you loose is modules autoloading.
If unsure, say Y.
config HID_APPLE config HID_APPLE
tristate "Apple" tristate "Apple"
default m default m
......
...@@ -8,6 +8,10 @@ obj-$(CONFIG_HID) += hid.o ...@@ -8,6 +8,10 @@ obj-$(CONFIG_HID) += hid.o
hid-$(CONFIG_HID_DEBUG) += hid-debug.o hid-$(CONFIG_HID_DEBUG) += hid-debug.o
hid-$(CONFIG_HIDRAW) += hidraw.o hid-$(CONFIG_HIDRAW) += hidraw.o
ifdef CONFIG_HID_COMPAT
obj-m += hid-dummy.o
endif
obj-$(CONFIG_HID_APPLE) += hid-apple.o obj-$(CONFIG_HID_APPLE) += hid-apple.o
obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o
......
...@@ -477,3 +477,5 @@ static void apple_exit(void) ...@@ -477,3 +477,5 @@ static void apple_exit(void)
module_init(apple_init); module_init(apple_init);
module_exit(apple_exit); module_exit(apple_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
HID_COMPAT_LOAD_DRIVER(apple);
...@@ -1532,6 +1532,14 @@ void hid_unregister_driver(struct hid_driver *hdrv) ...@@ -1532,6 +1532,14 @@ void hid_unregister_driver(struct hid_driver *hdrv)
} }
EXPORT_SYMBOL_GPL(hid_unregister_driver); EXPORT_SYMBOL_GPL(hid_unregister_driver);
#ifdef CONFIG_HID_COMPAT
static void hid_compat_load(struct work_struct *ws)
{
request_module("hid-dummy");
}
static DECLARE_WORK(hid_compat_work, hid_compat_load);
#endif
static int __init hid_init(void) static int __init hid_init(void)
{ {
int ret; int ret;
...@@ -1546,6 +1554,10 @@ static int __init hid_init(void) ...@@ -1546,6 +1554,10 @@ static int __init hid_init(void)
if (ret) if (ret)
goto err_bus; goto err_bus;
#ifdef CONFIG_HID_COMPAT
schedule_work(&hid_compat_work);
#endif
return 0; return 0;
err_bus: err_bus:
bus_unregister(&hid_bus_type); bus_unregister(&hid_bus_type);
......
#include <linux/autoconf.h>
#include <linux/module.h>
#include <linux/hid.h>
static int __init hid_dummy_init(void)
{
#ifdef CONFIG_HID_APPLE_MODULE
HID_COMPAT_CALL_DRIVER(apple);
#endif
#ifdef CONFIG_HID_LOGITECH_MODULE
HID_COMPAT_CALL_DRIVER(logitech);
#endif
return -EIO;
}
module_init(hid_dummy_init);
MODULE_LICENSE("GPL");
...@@ -310,3 +310,5 @@ static void lg_exit(void) ...@@ -310,3 +310,5 @@ static void lg_exit(void)
module_init(lg_init); module_init(lg_init);
module_exit(lg_exit); module_exit(lg_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
HID_COMPAT_LOAD_DRIVER(logitech);
...@@ -790,10 +790,23 @@ dbg_hid(const char *fmt, ...) ...@@ -790,10 +790,23 @@ dbg_hid(const char *fmt, ...)
return 0; return 0;
} }
#define dbg_hid_line dbg_hid #define dbg_hid_line dbg_hid
#endif #endif /* HID_DEBUG */
#define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \ #define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \
__FILE__ , ## arg) __FILE__ , ## arg)
#endif #endif /* HID_FF */
#ifdef CONFIG_HID_COMPAT
#define HID_COMPAT_LOAD_DRIVER(name) \
void hid_compat_##name(void) { } \
EXPORT_SYMBOL(hid_compat_##name)
#else
#define HID_COMPAT_LOAD_DRIVER(name)
#endif /* HID_COMPAT */
#define HID_COMPAT_CALL_DRIVER(name) do { \
extern void hid_compat_##name(void); \
hid_compat_##name(); \
} while (0)
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment