aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/gameport
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/gameport')
-rw-r--r--drivers/input/gameport/gameport.c30
-rw-r--r--drivers/input/gameport/ns558.c13
2 files changed, 22 insertions, 21 deletions
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c
index b765a15..36644bf 100644
--- a/drivers/input/gameport/gameport.c
+++ b/drivers/input/gameport/gameport.c
@@ -22,6 +22,7 @@
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/sched.h> /* HZ */
+#include <linux/mutex.h>
/*#include <asm/io.h>*/
@@ -43,10 +44,10 @@ EXPORT_SYMBOL(gameport_start_polling);
EXPORT_SYMBOL(gameport_stop_polling);
/*
- * gameport_sem protects entire gameport subsystem and is taken
+ * gameport_mutex protects entire gameport subsystem and is taken
* every time gameport port or driver registrered or unregistered.
*/
-static DECLARE_MUTEX(gameport_sem);
+static DEFINE_MUTEX(gameport_mutex);
static LIST_HEAD(gameport_list);
@@ -265,6 +266,7 @@ static void gameport_queue_event(void *object, struct module *owner,
if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) {
if (!try_module_get(owner)) {
printk(KERN_WARNING "gameport: Can't get module reference, dropping event %d\n", event_type);
+ kfree(event);
goto out;
}
@@ -342,7 +344,7 @@ static void gameport_handle_event(void)
struct gameport_event *event;
struct gameport_driver *gameport_drv;
- down(&gameport_sem);
+ mutex_lock(&gameport_mutex);
/*
* Note that we handle only one event here to give swsusp
@@ -379,7 +381,7 @@ static void gameport_handle_event(void)
gameport_free_event(event);
}
- up(&gameport_sem);
+ mutex_unlock(&gameport_mutex);
}
/*
@@ -464,7 +466,7 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut
struct device_driver *drv;
int retval;
- retval = down_interruptible(&gameport_sem);
+ retval = mutex_lock_interruptible(&gameport_mutex);
if (retval)
return retval;
@@ -484,7 +486,7 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut
retval = -EINVAL;
}
- up(&gameport_sem);
+ mutex_unlock(&gameport_mutex);
return retval;
}
@@ -521,7 +523,7 @@ static void gameport_init_port(struct gameport *gameport)
__module_get(THIS_MODULE);
- init_MUTEX(&gameport->drv_sem);
+ mutex_init(&gameport->drv_mutex);
device_initialize(&gameport->dev);
snprintf(gameport->dev.bus_id, sizeof(gameport->dev.bus_id),
"gameport%lu", (unsigned long)atomic_inc_return(&gameport_no) - 1);
@@ -661,10 +663,10 @@ void __gameport_register_port(struct gameport *gameport, struct module *owner)
*/
void gameport_unregister_port(struct gameport *gameport)
{
- down(&gameport_sem);
+ mutex_lock(&gameport_mutex);
gameport_disconnect_port(gameport);
gameport_destroy_port(gameport);
- up(&gameport_sem);
+ mutex_unlock(&gameport_mutex);
}
@@ -717,7 +719,7 @@ void gameport_unregister_driver(struct gameport_driver *drv)
{
struct gameport *gameport;
- down(&gameport_sem);
+ mutex_lock(&gameport_mutex);
drv->ignore = 1; /* so gameport_find_driver ignores it */
start_over:
@@ -731,7 +733,7 @@ start_over:
}
driver_unregister(&drv->driver);
- up(&gameport_sem);
+ mutex_unlock(&gameport_mutex);
}
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)
static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv)
{
- down(&gameport->drv_sem);
+ mutex_lock(&gameport->drv_mutex);
gameport->drv = drv;
- up(&gameport->drv_sem);
+ mutex_unlock(&gameport->drv_mutex);
}
int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode)
@@ -796,5 +798,5 @@ static void __exit gameport_exit(void)
kthread_stop(gameport_task);
}
-module_init(gameport_init);
+subsys_initcall(gameport_init);
module_exit(gameport_exit);
diff --git a/drivers/input/gameport/ns558.c b/drivers/input/gameport/ns558.c
index d2e55dc..3e2d28f 100644
--- a/drivers/input/gameport/ns558.c
+++ b/drivers/input/gameport/ns558.c
@@ -252,14 +252,14 @@ static struct pnp_driver ns558_pnp_driver;
#endif
-static int pnp_registered = 0;
-
static int __init ns558_init(void)
{
int i = 0;
+ int error;
- if (pnp_register_driver(&ns558_pnp_driver) >= 0)
- pnp_registered = 1;
+ error = pnp_register_driver(&ns558_pnp_driver);
+ if (error && error != -ENODEV) /* should be ENOSYS really */
+ return error;
/*
* Probe ISA ports after PnP, so that PnP ports that are already
@@ -270,7 +270,7 @@ static int __init ns558_init(void)
while (ns558_isa_portlist[i])
ns558_isa_probe(ns558_isa_portlist[i++]);
- return (list_empty(&ns558_list) && !pnp_registered) ? -ENODEV : 0;
+ return list_empty(&ns558_list) && error ? -ENODEV : 0;
}
static void __exit ns558_exit(void)
@@ -283,8 +283,7 @@ static void __exit ns558_exit(void)
kfree(ns558);
}
- if (pnp_registered)
- pnp_unregister_driver(&ns558_pnp_driver);
+ pnp_unregister_driver(&ns558_pnp_driver);
}
module_init(ns558_init);