diff options
Diffstat (limited to 'drivers/input/gameport/gameport.c')
| -rw-r--r-- | drivers/input/gameport/gameport.c | 98 |
1 files changed, 40 insertions, 58 deletions
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index ac11be08585..7e18bcf05a6 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | * the Free Software Foundation. | 11 | * the Free Software Foundation. |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
| 15 | |||
| 14 | #include <linux/stddef.h> | 16 | #include <linux/stddef.h> |
| 15 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 16 | #include <linux/ioport.h> | 18 | #include <linux/ioport.h> |
| @@ -190,9 +192,8 @@ static int gameport_bind_driver(struct gameport *gameport, struct gameport_drive | |||
| 190 | 192 | ||
| 191 | error = device_bind_driver(&gameport->dev); | 193 | error = device_bind_driver(&gameport->dev); |
| 192 | if (error) { | 194 | if (error) { |
| 193 | printk(KERN_WARNING | 195 | dev_warn(&gameport->dev, |
| 194 | "gameport: device_bind_driver() failed " | 196 | "device_bind_driver() failed for %s (%s) and %s, error: %d\n", |
| 195 | "for %s (%s) and %s, error: %d\n", | ||
| 196 | gameport->phys, gameport->name, | 197 | gameport->phys, gameport->name, |
| 197 | drv->description, error); | 198 | drv->description, error); |
| 198 | drv->disconnect(gameport); | 199 | drv->disconnect(gameport); |
| @@ -209,9 +210,9 @@ static void gameport_find_driver(struct gameport *gameport) | |||
| 209 | 210 | ||
| 210 | error = device_attach(&gameport->dev); | 211 | error = device_attach(&gameport->dev); |
| 211 | if (error < 0) | 212 | if (error < 0) |
| 212 | printk(KERN_WARNING | 213 | dev_warn(&gameport->dev, |
| 213 | "gameport: device_attach() failed for %s (%s), error: %d\n", | 214 | "device_attach() failed for %s (%s), error: %d\n", |
| 214 | gameport->phys, gameport->name, error); | 215 | gameport->phys, gameport->name, error); |
| 215 | } | 216 | } |
| 216 | 217 | ||
| 217 | 218 | ||
| @@ -262,17 +263,14 @@ static int gameport_queue_event(void *object, struct module *owner, | |||
| 262 | 263 | ||
| 263 | event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); | 264 | event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); |
| 264 | if (!event) { | 265 | if (!event) { |
| 265 | printk(KERN_ERR | 266 | pr_err("Not enough memory to queue event %d\n", event_type); |
| 266 | "gameport: Not enough memory to queue event %d\n", | ||
| 267 | event_type); | ||
| 268 | retval = -ENOMEM; | 267 | retval = -ENOMEM; |
| 269 | goto out; | 268 | goto out; |
| 270 | } | 269 | } |
| 271 | 270 | ||
| 272 | if (!try_module_get(owner)) { | 271 | if (!try_module_get(owner)) { |
| 273 | printk(KERN_WARNING | 272 | pr_warning("Can't get module reference, dropping event %d\n", |
| 274 | "gameport: Can't get module reference, dropping event %d\n", | 273 | event_type); |
| 275 | event_type); | ||
| 276 | kfree(event); | 274 | kfree(event); |
| 277 | retval = -EINVAL; | 275 | retval = -EINVAL; |
| 278 | goto out; | 276 | goto out; |
| @@ -298,14 +296,12 @@ static void gameport_free_event(struct gameport_event *event) | |||
| 298 | 296 | ||
| 299 | static void gameport_remove_duplicate_events(struct gameport_event *event) | 297 | static void gameport_remove_duplicate_events(struct gameport_event *event) |
| 300 | { | 298 | { |
| 301 | struct list_head *node, *next; | 299 | struct gameport_event *e, *next; |
| 302 | struct gameport_event *e; | ||
| 303 | unsigned long flags; | 300 | unsigned long flags; |
| 304 | 301 | ||
| 305 | spin_lock_irqsave(&gameport_event_lock, flags); | 302 | spin_lock_irqsave(&gameport_event_lock, flags); |
| 306 | 303 | ||
| 307 | list_for_each_safe(node, next, &gameport_event_list) { | 304 | list_for_each_entry_safe(e, next, &gameport_event_list, node) { |
| 308 | e = list_entry(node, struct gameport_event, node); | ||
| 309 | if (event->object == e->object) { | 305 | if (event->object == e->object) { |
| 310 | /* | 306 | /* |
| 311 | * If this event is of different type we should not | 307 | * If this event is of different type we should not |
| @@ -315,7 +311,7 @@ static void gameport_remove_duplicate_events(struct gameport_event *event) | |||
| 315 | if (event->type != e->type) | 311 | if (event->type != e->type) |
| 316 | break; | 312 | break; |
| 317 | 313 | ||
| 318 | list_del_init(node); | 314 | list_del_init(&e->node); |
| 319 | gameport_free_event(e); | 315 | gameport_free_event(e); |
| 320 | } | 316 | } |
| 321 | } | 317 | } |
| @@ -325,23 +321,18 @@ static void gameport_remove_duplicate_events(struct gameport_event *event) | |||
| 325 | 321 | ||
| 326 | static struct gameport_event *gameport_get_event(void) | 322 | static struct gameport_event *gameport_get_event(void) |
| 327 | { | 323 | { |
| 328 | struct gameport_event *event; | 324 | struct gameport_event *event = NULL; |
| 329 | struct list_head *node; | ||
| 330 | unsigned long flags; | 325 | unsigned long flags; |
| 331 | 326 | ||
| 332 | spin_lock_irqsave(&gameport_event_lock, flags); | 327 | spin_lock_irqsave(&gameport_event_lock, flags); |
| 333 | 328 | ||
| 334 | if (list_empty(&gameport_event_list)) { | 329 | if (!list_empty(&gameport_event_list)) { |
| 335 | spin_unlock_irqrestore(&gameport_event_lock, flags); | 330 | event = list_first_entry(&gameport_event_list, |
| 336 | return NULL; | 331 | struct gameport_event, node); |
| 332 | list_del_init(&event->node); | ||
| 337 | } | 333 | } |
| 338 | 334 | ||
| 339 | node = gameport_event_list.next; | ||
| 340 | event = list_entry(node, struct gameport_event, node); | ||
| 341 | list_del_init(node); | ||
| 342 | |||
| 343 | spin_unlock_irqrestore(&gameport_event_lock, flags); | 335 | spin_unlock_irqrestore(&gameport_event_lock, flags); |
| 344 | |||
| 345 | return event; | 336 | return event; |
| 346 | } | 337 | } |
| 347 | 338 | ||
| @@ -360,16 +351,14 @@ static void gameport_handle_event(void) | |||
| 360 | if ((event = gameport_get_event())) { | 351 | if ((event = gameport_get_event())) { |
| 361 | 352 | ||
| 362 | switch (event->type) { | 353 | switch (event->type) { |
| 363 | case GAMEPORT_REGISTER_PORT: | ||
| 364 | gameport_add_port(event->object); | ||
| 365 | break; | ||
| 366 | 354 | ||
| 367 | case GAMEPORT_ATTACH_DRIVER: | 355 | case GAMEPORT_REGISTER_PORT: |
| 368 | gameport_attach_driver(event->object); | 356 | gameport_add_port(event->object); |
| 369 | break; | 357 | break; |
| 370 | 358 | ||
| 371 | default: | 359 | case GAMEPORT_ATTACH_DRIVER: |
| 372 | break; | 360 | gameport_attach_driver(event->object); |
| 361 | break; | ||
| 373 | } | 362 | } |
| 374 | 363 | ||
| 375 | gameport_remove_duplicate_events(event); | 364 | gameport_remove_duplicate_events(event); |
| @@ -385,16 +374,14 @@ static void gameport_handle_event(void) | |||
| 385 | */ | 374 | */ |
| 386 | static void gameport_remove_pending_events(void *object) | 375 | static void gameport_remove_pending_events(void *object) |
| 387 | { | 376 | { |
| 388 | struct list_head *node, *next; | 377 | struct gameport_event *event, *next; |
| 389 | struct gameport_event *event; | ||
| 390 | unsigned long flags; | 378 | unsigned long flags; |
| 391 | 379 | ||
| 392 | spin_lock_irqsave(&gameport_event_lock, flags); | 380 | spin_lock_irqsave(&gameport_event_lock, flags); |
| 393 | 381 | ||
| 394 | list_for_each_safe(node, next, &gameport_event_list) { | 382 | list_for_each_entry_safe(event, next, &gameport_event_list, node) { |
| 395 | event = list_entry(node, struct gameport_event, node); | ||
| 396 | if (event->object == object) { | 383 | if (event->object == object) { |
| 397 | list_del_init(node); | 384 | list_del_init(&event->node); |
| 398 | gameport_free_event(event); | 385 | gameport_free_event(event); |
| 399 | } | 386 | } |
| 400 | } | 387 | } |
| @@ -441,7 +428,6 @@ static int gameport_thread(void *nothing) | |||
| 441 | kthread_should_stop() || !list_empty(&gameport_event_list)); | 428 | kthread_should_stop() || !list_empty(&gameport_event_list)); |
| 442 | } while (!kthread_should_stop()); | 429 | } while (!kthread_should_stop()); |
| 443 | 430 | ||
| 444 | printk(KERN_DEBUG "gameport: kgameportd exiting\n"); | ||
| 445 | return 0; | 431 | return 0; |
| 446 | } | 432 | } |
| 447 | 433 | ||
| @@ -453,6 +439,7 @@ static int gameport_thread(void *nothing) | |||
| 453 | static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf) | 439 | static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf) |
| 454 | { | 440 | { |
| 455 | struct gameport *gameport = to_gameport_port(dev); | 441 | struct gameport *gameport = to_gameport_port(dev); |
| 442 | |||
| 456 | return sprintf(buf, "%s\n", gameport->name); | 443 | return sprintf(buf, "%s\n", gameport->name); |
| 457 | } | 444 | } |
| 458 | 445 | ||
| @@ -521,7 +508,8 @@ static void gameport_init_port(struct gameport *gameport) | |||
| 521 | 508 | ||
| 522 | mutex_init(&gameport->drv_mutex); | 509 | mutex_init(&gameport->drv_mutex); |
| 523 | device_initialize(&gameport->dev); | 510 | device_initialize(&gameport->dev); |
| 524 | dev_set_name(&gameport->dev, "gameport%lu", (unsigned long)atomic_inc_return(&gameport_no) - 1); | 511 | dev_set_name(&gameport->dev, "gameport%lu", |
| 512 | (unsigned long)atomic_inc_return(&gameport_no) - 1); | ||
| 525 | gameport->dev.bus = &gameport_bus; | 513 | gameport->dev.bus = &gameport_bus; |
| 526 | gameport->dev.release = gameport_release_port; | 514 | gameport->dev.release = gameport_release_port; |
| 527 | if (gameport->parent) | 515 | if (gameport->parent) |
| @@ -550,19 +538,17 @@ static void gameport_add_port(struct gameport *gameport) | |||
| 550 | list_add_tail(&gameport->node, &gameport_list); | 538 | list_add_tail(&gameport->node, &gameport_list); |
| 551 | 539 | ||
| 552 | if (gameport->io) | 540 | if (gameport->io) |
| 553 | printk(KERN_INFO "gameport: %s is %s, io %#x, speed %dkHz\n", | 541 | dev_info(&gameport->dev, "%s is %s, io %#x, speed %dkHz\n", |
| 554 | gameport->name, gameport->phys, gameport->io, gameport->speed); | 542 | gameport->name, gameport->phys, gameport->io, gameport->speed); |
| 555 | else | 543 | else |
| 556 | printk(KERN_INFO "gameport: %s is %s, speed %dkHz\n", | 544 | dev_info(&gameport->dev, "%s is %s, speed %dkHz\n", |
| 557 | gameport->name, gameport->phys, gameport->speed); | 545 | gameport->name, gameport->phys, gameport->speed); |
| 558 | 546 | ||
| 559 | error = device_add(&gameport->dev); | 547 | error = device_add(&gameport->dev); |
| 560 | if (error) | 548 | if (error) |
| 561 | printk(KERN_ERR | 549 | dev_err(&gameport->dev, |
| 562 | "gameport: device_add() failed for %s (%s), error: %d\n", | 550 | "device_add() failed for %s (%s), error: %d\n", |
| 563 | gameport->phys, gameport->name, error); | 551 | gameport->phys, gameport->name, error); |
| 564 | else | ||
| 565 | gameport->registered = 1; | ||
| 566 | } | 552 | } |
| 567 | 553 | ||
| 568 | /* | 554 | /* |
| @@ -584,10 +570,8 @@ static void gameport_destroy_port(struct gameport *gameport) | |||
| 584 | gameport->parent = NULL; | 570 | gameport->parent = NULL; |
| 585 | } | 571 | } |
| 586 | 572 | ||
| 587 | if (gameport->registered) { | 573 | if (device_is_registered(&gameport->dev)) |
| 588 | device_del(&gameport->dev); | 574 | device_del(&gameport->dev); |
| 589 | gameport->registered = 0; | ||
| 590 | } | ||
| 591 | 575 | ||
| 592 | list_del_init(&gameport->node); | 576 | list_del_init(&gameport->node); |
| 593 | 577 | ||
| @@ -705,8 +689,7 @@ static void gameport_attach_driver(struct gameport_driver *drv) | |||
| 705 | 689 | ||
| 706 | error = driver_attach(&drv->driver); | 690 | error = driver_attach(&drv->driver); |
| 707 | if (error) | 691 | if (error) |
| 708 | printk(KERN_ERR | 692 | pr_err("driver_attach() failed for %s, error: %d\n", |
| 709 | "gameport: driver_attach() failed for %s, error: %d\n", | ||
| 710 | drv->driver.name, error); | 693 | drv->driver.name, error); |
| 711 | } | 694 | } |
| 712 | 695 | ||
| @@ -727,8 +710,7 @@ int __gameport_register_driver(struct gameport_driver *drv, struct module *owner | |||
| 727 | 710 | ||
| 728 | error = driver_register(&drv->driver); | 711 | error = driver_register(&drv->driver); |
| 729 | if (error) { | 712 | if (error) { |
| 730 | printk(KERN_ERR | 713 | pr_err("driver_register() failed for %s, error: %d\n", |
| 731 | "gameport: driver_register() failed for %s, error: %d\n", | ||
| 732 | drv->driver.name, error); | 714 | drv->driver.name, error); |
| 733 | return error; | 715 | return error; |
| 734 | } | 716 | } |
| @@ -828,7 +810,7 @@ static int __init gameport_init(void) | |||
| 828 | 810 | ||
| 829 | error = bus_register(&gameport_bus); | 811 | error = bus_register(&gameport_bus); |
| 830 | if (error) { | 812 | if (error) { |
| 831 | printk(KERN_ERR "gameport: failed to register gameport bus, error: %d\n", error); | 813 | pr_err("failed to register gameport bus, error: %d\n", error); |
| 832 | return error; | 814 | return error; |
| 833 | } | 815 | } |
| 834 | 816 | ||
| @@ -836,7 +818,7 @@ static int __init gameport_init(void) | |||
| 836 | if (IS_ERR(gameport_task)) { | 818 | if (IS_ERR(gameport_task)) { |
| 837 | bus_unregister(&gameport_bus); | 819 | bus_unregister(&gameport_bus); |
| 838 | error = PTR_ERR(gameport_task); | 820 | error = PTR_ERR(gameport_task); |
| 839 | printk(KERN_ERR "gameport: Failed to start kgameportd, error: %d\n", error); | 821 | pr_err("Failed to start kgameportd, error: %d\n", error); |
| 840 | return error; | 822 | return error; |
| 841 | } | 823 | } |
| 842 | 824 | ||
