diff options
| author | Dmitry Torokhov <dtor@insightbb.com> | 2007-04-10 00:40:48 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-04-27 13:57:30 -0400 |
| commit | 79580057de60867f535b7e7ec17c85709853d6bf (patch) | |
| tree | 8030db5da8fa478e452d02dff7f7ff9500328f98 /drivers/input/gameport | |
| parent | 70f256fda1649fbb3deea37e86342f6139a0a82c (diff) | |
Input: gameport - do not touch bus's rwsem
The subsystem rwsem is not used by the driver core at all, so there is
no point in trying to access it.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/input/gameport')
| -rw-r--r-- | drivers/input/gameport/gameport.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index a00fe470a829..bd686a2a517d 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
| @@ -190,16 +190,14 @@ static void gameport_run_poll_handler(unsigned long d) | |||
| 190 | * Basic gameport -> driver core mappings | 190 | * Basic gameport -> driver core mappings |
| 191 | */ | 191 | */ |
| 192 | 192 | ||
| 193 | static void gameport_bind_driver(struct gameport *gameport, struct gameport_driver *drv) | 193 | static int gameport_bind_driver(struct gameport *gameport, struct gameport_driver *drv) |
| 194 | { | 194 | { |
| 195 | int error; | 195 | int error; |
| 196 | 196 | ||
| 197 | down_write(&gameport_bus.subsys.rwsem); | ||
| 198 | |||
| 199 | gameport->dev.driver = &drv->driver; | 197 | gameport->dev.driver = &drv->driver; |
| 200 | if (drv->connect(gameport, drv)) { | 198 | if (drv->connect(gameport, drv)) { |
| 201 | gameport->dev.driver = NULL; | 199 | gameport->dev.driver = NULL; |
| 202 | goto out; | 200 | return -ENODEV; |
| 203 | } | 201 | } |
| 204 | 202 | ||
| 205 | error = device_bind_driver(&gameport->dev); | 203 | error = device_bind_driver(&gameport->dev); |
| @@ -211,31 +209,21 @@ static void gameport_bind_driver(struct gameport *gameport, struct gameport_driv | |||
| 211 | drv->description, error); | 209 | drv->description, error); |
| 212 | drv->disconnect(gameport); | 210 | drv->disconnect(gameport); |
| 213 | gameport->dev.driver = NULL; | 211 | gameport->dev.driver = NULL; |
| 214 | goto out; | 212 | return error; |
| 215 | } | 213 | } |
| 216 | 214 | ||
| 217 | out: | 215 | return 0; |
| 218 | up_write(&gameport_bus.subsys.rwsem); | ||
| 219 | } | ||
| 220 | |||
| 221 | static void gameport_release_driver(struct gameport *gameport) | ||
| 222 | { | ||
| 223 | down_write(&gameport_bus.subsys.rwsem); | ||
| 224 | device_release_driver(&gameport->dev); | ||
| 225 | up_write(&gameport_bus.subsys.rwsem); | ||
| 226 | } | 216 | } |
| 227 | 217 | ||
| 228 | static void gameport_find_driver(struct gameport *gameport) | 218 | static void gameport_find_driver(struct gameport *gameport) |
| 229 | { | 219 | { |
| 230 | int error; | 220 | int error; |
| 231 | 221 | ||
| 232 | down_write(&gameport_bus.subsys.rwsem); | ||
| 233 | error = device_attach(&gameport->dev); | 222 | error = device_attach(&gameport->dev); |
| 234 | if (error < 0) | 223 | if (error < 0) |
| 235 | printk(KERN_WARNING | 224 | printk(KERN_WARNING |
| 236 | "gameport: device_attach() failed for %s (%s), error: %d\n", | 225 | "gameport: device_attach() failed for %s (%s), error: %d\n", |
| 237 | gameport->phys, gameport->name, error); | 226 | gameport->phys, gameport->name, error); |
| 238 | up_write(&gameport_bus.subsys.rwsem); | ||
| 239 | } | 227 | } |
| 240 | 228 | ||
| 241 | 229 | ||
| @@ -483,13 +471,12 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut | |||
| 483 | { | 471 | { |
| 484 | struct gameport *gameport = to_gameport_port(dev); | 472 | struct gameport *gameport = to_gameport_port(dev); |
| 485 | struct device_driver *drv; | 473 | struct device_driver *drv; |
| 486 | int retval; | 474 | int error; |
| 487 | 475 | ||
| 488 | retval = mutex_lock_interruptible(&gameport_mutex); | 476 | error = mutex_lock_interruptible(&gameport_mutex); |
| 489 | if (retval) | 477 | if (error) |
| 490 | return retval; | 478 | return error; |
| 491 | 479 | ||
| 492 | retval = count; | ||
| 493 | if (!strncmp(buf, "none", count)) { | 480 | if (!strncmp(buf, "none", count)) { |
| 494 | gameport_disconnect_port(gameport); | 481 | gameport_disconnect_port(gameport); |
| 495 | } else if (!strncmp(buf, "reconnect", count)) { | 482 | } else if (!strncmp(buf, "reconnect", count)) { |
| @@ -499,15 +486,15 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut | |||
| 499 | gameport_find_driver(gameport); | 486 | gameport_find_driver(gameport); |
| 500 | } else if ((drv = driver_find(buf, &gameport_bus)) != NULL) { | 487 | } else if ((drv = driver_find(buf, &gameport_bus)) != NULL) { |
| 501 | gameport_disconnect_port(gameport); | 488 | gameport_disconnect_port(gameport); |
| 502 | gameport_bind_driver(gameport, to_gameport_driver(drv)); | 489 | error = gameport_bind_driver(gameport, to_gameport_driver(drv)); |
| 503 | put_driver(drv); | 490 | put_driver(drv); |
| 504 | } else { | 491 | } else { |
| 505 | retval = -EINVAL; | 492 | error = -EINVAL; |
| 506 | } | 493 | } |
| 507 | 494 | ||
| 508 | mutex_unlock(&gameport_mutex); | 495 | mutex_unlock(&gameport_mutex); |
| 509 | 496 | ||
| 510 | return retval; | 497 | return error ? error : count; |
| 511 | } | 498 | } |
| 512 | 499 | ||
| 513 | static struct device_attribute gameport_device_attrs[] = { | 500 | static struct device_attribute gameport_device_attrs[] = { |
| @@ -655,7 +642,7 @@ static void gameport_disconnect_port(struct gameport *gameport) | |||
| 655 | do { | 642 | do { |
| 656 | parent = s->parent; | 643 | parent = s->parent; |
| 657 | 644 | ||
| 658 | gameport_release_driver(s); | 645 | device_release_driver(&s->dev); |
| 659 | gameport_destroy_port(s); | 646 | gameport_destroy_port(s); |
| 660 | } while ((s = parent) != gameport); | 647 | } while ((s = parent) != gameport); |
| 661 | } | 648 | } |
| @@ -663,7 +650,7 @@ static void gameport_disconnect_port(struct gameport *gameport) | |||
| 663 | /* | 650 | /* |
| 664 | * Ok, no children left, now disconnect this port | 651 | * Ok, no children left, now disconnect this port |
| 665 | */ | 652 | */ |
| 666 | gameport_release_driver(gameport); | 653 | device_release_driver(&gameport->dev); |
| 667 | } | 654 | } |
| 668 | 655 | ||
| 669 | void gameport_rescan(struct gameport *gameport) | 656 | void gameport_rescan(struct gameport *gameport) |
