diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-04-03 09:08:57 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-04-03 09:08:57 -0400 |
commit | 76467874b83835129dc454e3a7a8e5d1186101b0 (patch) | |
tree | 162129f0c36c35be4aa323cf00626db0e804c3fc /drivers/input/gameport/gameport.c | |
parent | 8628de0583504138551a05ad44ca388467f0f552 (diff) | |
parent | 6246b6128bbe34d0752f119cf7c5111c85fe481d (diff) |
Merge branch 'master'
Diffstat (limited to 'drivers/input/gameport/gameport.c')
-rw-r--r-- | drivers/input/gameport/gameport.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index b765a155c008..36644bff379d 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
23 | #include <linux/kthread.h> | 23 | #include <linux/kthread.h> |
24 | #include <linux/sched.h> /* HZ */ | 24 | #include <linux/sched.h> /* HZ */ |
25 | #include <linux/mutex.h> | ||
25 | 26 | ||
26 | /*#include <asm/io.h>*/ | 27 | /*#include <asm/io.h>*/ |
27 | 28 | ||
@@ -43,10 +44,10 @@ EXPORT_SYMBOL(gameport_start_polling); | |||
43 | EXPORT_SYMBOL(gameport_stop_polling); | 44 | EXPORT_SYMBOL(gameport_stop_polling); |
44 | 45 | ||
45 | /* | 46 | /* |
46 | * gameport_sem protects entire gameport subsystem and is taken | 47 | * gameport_mutex protects entire gameport subsystem and is taken |
47 | * every time gameport port or driver registrered or unregistered. | 48 | * every time gameport port or driver registrered or unregistered. |
48 | */ | 49 | */ |
49 | static DECLARE_MUTEX(gameport_sem); | 50 | static DEFINE_MUTEX(gameport_mutex); |
50 | 51 | ||
51 | static LIST_HEAD(gameport_list); | 52 | static LIST_HEAD(gameport_list); |
52 | 53 | ||
@@ -265,6 +266,7 @@ static void gameport_queue_event(void *object, struct module *owner, | |||
265 | if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) { | 266 | if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) { |
266 | if (!try_module_get(owner)) { | 267 | if (!try_module_get(owner)) { |
267 | printk(KERN_WARNING "gameport: Can't get module reference, dropping event %d\n", event_type); | 268 | printk(KERN_WARNING "gameport: Can't get module reference, dropping event %d\n", event_type); |
269 | kfree(event); | ||
268 | goto out; | 270 | goto out; |
269 | } | 271 | } |
270 | 272 | ||
@@ -342,7 +344,7 @@ static void gameport_handle_event(void) | |||
342 | struct gameport_event *event; | 344 | struct gameport_event *event; |
343 | struct gameport_driver *gameport_drv; | 345 | struct gameport_driver *gameport_drv; |
344 | 346 | ||
345 | down(&gameport_sem); | 347 | mutex_lock(&gameport_mutex); |
346 | 348 | ||
347 | /* | 349 | /* |
348 | * Note that we handle only one event here to give swsusp | 350 | * Note that we handle only one event here to give swsusp |
@@ -379,7 +381,7 @@ static void gameport_handle_event(void) | |||
379 | gameport_free_event(event); | 381 | gameport_free_event(event); |
380 | } | 382 | } |
381 | 383 | ||
382 | up(&gameport_sem); | 384 | mutex_unlock(&gameport_mutex); |
383 | } | 385 | } |
384 | 386 | ||
385 | /* | 387 | /* |
@@ -464,7 +466,7 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut | |||
464 | struct device_driver *drv; | 466 | struct device_driver *drv; |
465 | int retval; | 467 | int retval; |
466 | 468 | ||
467 | retval = down_interruptible(&gameport_sem); | 469 | retval = mutex_lock_interruptible(&gameport_mutex); |
468 | if (retval) | 470 | if (retval) |
469 | return retval; | 471 | return retval; |
470 | 472 | ||
@@ -484,7 +486,7 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut | |||
484 | retval = -EINVAL; | 486 | retval = -EINVAL; |
485 | } | 487 | } |
486 | 488 | ||
487 | up(&gameport_sem); | 489 | mutex_unlock(&gameport_mutex); |
488 | 490 | ||
489 | return retval; | 491 | return retval; |
490 | } | 492 | } |
@@ -521,7 +523,7 @@ static void gameport_init_port(struct gameport *gameport) | |||
521 | 523 | ||
522 | __module_get(THIS_MODULE); | 524 | __module_get(THIS_MODULE); |
523 | 525 | ||
524 | init_MUTEX(&gameport->drv_sem); | 526 | mutex_init(&gameport->drv_mutex); |
525 | device_initialize(&gameport->dev); | 527 | device_initialize(&gameport->dev); |
526 | snprintf(gameport->dev.bus_id, sizeof(gameport->dev.bus_id), | 528 | snprintf(gameport->dev.bus_id, sizeof(gameport->dev.bus_id), |
527 | "gameport%lu", (unsigned long)atomic_inc_return(&gameport_no) - 1); | 529 | "gameport%lu", (unsigned long)atomic_inc_return(&gameport_no) - 1); |
@@ -661,10 +663,10 @@ void __gameport_register_port(struct gameport *gameport, struct module *owner) | |||
661 | */ | 663 | */ |
662 | void gameport_unregister_port(struct gameport *gameport) | 664 | void gameport_unregister_port(struct gameport *gameport) |
663 | { | 665 | { |
664 | down(&gameport_sem); | 666 | mutex_lock(&gameport_mutex); |
665 | gameport_disconnect_port(gameport); | 667 | gameport_disconnect_port(gameport); |
666 | gameport_destroy_port(gameport); | 668 | gameport_destroy_port(gameport); |
667 | up(&gameport_sem); | 669 | mutex_unlock(&gameport_mutex); |
668 | } | 670 | } |
669 | 671 | ||
670 | 672 | ||
@@ -717,7 +719,7 @@ void gameport_unregister_driver(struct gameport_driver *drv) | |||
717 | { | 719 | { |
718 | struct gameport *gameport; | 720 | struct gameport *gameport; |
719 | 721 | ||
720 | down(&gameport_sem); | 722 | mutex_lock(&gameport_mutex); |
721 | drv->ignore = 1; /* so gameport_find_driver ignores it */ | 723 | drv->ignore = 1; /* so gameport_find_driver ignores it */ |
722 | 724 | ||
723 | start_over: | 725 | start_over: |
@@ -731,7 +733,7 @@ start_over: | |||
731 | } | 733 | } |
732 | 734 | ||
733 | driver_unregister(&drv->driver); | 735 | driver_unregister(&drv->driver); |
734 | up(&gameport_sem); | 736 | mutex_unlock(&gameport_mutex); |
735 | } | 737 | } |
736 | 738 | ||
737 | static int gameport_bus_match(struct device *dev, struct device_driver *drv) | 739 | static int gameport_bus_match(struct device *dev, struct device_driver *drv) |
@@ -743,9 +745,9 @@ static int gameport_bus_match(struct device *dev, struct device_driver *drv) | |||
743 | 745 | ||
744 | static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv) | 746 | static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv) |
745 | { | 747 | { |
746 | down(&gameport->drv_sem); | 748 | mutex_lock(&gameport->drv_mutex); |
747 | gameport->drv = drv; | 749 | gameport->drv = drv; |
748 | up(&gameport->drv_sem); | 750 | mutex_unlock(&gameport->drv_mutex); |
749 | } | 751 | } |
750 | 752 | ||
751 | int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode) | 753 | int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode) |
@@ -796,5 +798,5 @@ static void __exit gameport_exit(void) | |||
796 | kthread_stop(gameport_task); | 798 | kthread_stop(gameport_task); |
797 | } | 799 | } |
798 | 800 | ||
799 | module_init(gameport_init); | 801 | subsys_initcall(gameport_init); |
800 | module_exit(gameport_exit); | 802 | module_exit(gameport_exit); |