diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-06-26 07:31:38 +0200 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-06-26 07:31:38 +0200 |
commit | 4854c7b27f0975a2b629f35ea3996d2968eb7c4f (patch) | |
tree | 4102bdb70289764a2058aff0f907b13d7cf0e0d1 /drivers/connector | |
parent | Input: fix accuracy of fixp-arith.h (diff) | |
parent | [PATCH] uclinux: use PER_LINUX_32BIT in binfmt_flat (diff) | |
download | linux-4854c7b27f0975a2b629f35ea3996d2968eb7c4f.tar.xz linux-4854c7b27f0975a2b629f35ea3996d2968eb7c4f.zip |
Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/connector')
-rw-r--r-- | drivers/connector/cn_proc.c | 1 | ||||
-rw-r--r-- | drivers/connector/cn_queue.c | 2 | ||||
-rw-r--r-- | drivers/connector/connector.c | 21 |
3 files changed, 14 insertions, 10 deletions
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index 4b4d7db1ff7b..498aa37bca22 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c @@ -26,6 +26,7 @@ #include <linux/kernel.h> #include <linux/ktime.h> #include <linux/init.h> +#include <linux/connector.h> #include <asm/atomic.h> #include <linux/cn_proc.h> diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c index 9f2f00d82917..05f8ce2cfb4a 100644 --- a/drivers/connector/cn_queue.c +++ b/drivers/connector/cn_queue.c @@ -127,7 +127,7 @@ void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id) if (found) { cn_queue_free_callback(cbq); - atomic_dec_and_test(&dev->refcnt); + atomic_dec(&dev->refcnt); } } diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 35897079a78d..b49bacfd8de8 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -121,6 +121,7 @@ nlmsg_failure: kfree_skb(skb); return -EINVAL; } +EXPORT_SYMBOL_GPL(cn_netlink_send); /* * Callback helper - queues work and setup destructor for given data. @@ -308,6 +309,9 @@ int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *)) int err; struct cn_dev *dev = &cdev; + if (!cn_already_initialized) + return -EAGAIN; + err = cn_queue_add_callback(dev->cbdev, name, id, callback); if (err) return err; @@ -316,6 +320,7 @@ int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *)) return 0; } +EXPORT_SYMBOL_GPL(cn_add_callback); /* * Callback remove routing - removes callback @@ -332,6 +337,7 @@ void cn_del_callback(struct cb_id *id) cn_queue_del_callback(dev->cbdev, id); cn_notify(id, 1); } +EXPORT_SYMBOL_GPL(cn_del_callback); /* * Checks two connector's control messages to be the same. @@ -435,7 +441,7 @@ static void cn_callback(void *data) mutex_unlock(¬ify_lock); } -static int __init cn_init(void) +static int __devinit cn_init(void) { struct cn_dev *dev = &cdev; int err; @@ -456,21 +462,22 @@ static int __init cn_init(void) sock_release(dev->nls->sk_socket); return -EINVAL; } + + cn_already_initialized = 1; err = cn_add_callback(&dev->id, "connector", &cn_callback); if (err) { + cn_already_initialized = 0; cn_queue_free_dev(dev->cbdev); if (dev->nls->sk_socket) sock_release(dev->nls->sk_socket); return -EINVAL; } - cn_already_initialized = 1; - return 0; } -static void __exit cn_fini(void) +static void __devexit cn_fini(void) { struct cn_dev *dev = &cdev; @@ -482,9 +489,5 @@ static void __exit cn_fini(void) sock_release(dev->nls->sk_socket); } -module_init(cn_init); +subsys_initcall(cn_init); module_exit(cn_fini); - -EXPORT_SYMBOL_GPL(cn_add_callback); -EXPORT_SYMBOL_GPL(cn_del_callback); -EXPORT_SYMBOL_GPL(cn_netlink_send); |