Lines Matching refs:gameport
48 static void gameport_add_port(struct gameport *gameport);
50 static void gameport_reconnect_port(struct gameport *gameport);
51 static void gameport_disconnect_port(struct gameport *gameport);
82 static int gameport_measure_speed(struct gameport *gameport) in gameport_measure_speed() argument
88 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in gameport_measure_speed()
97 gameport_read(gameport); in gameport_measure_speed()
107 gameport_close(gameport); in gameport_measure_speed()
114 static int old_gameport_measure_speed(struct gameport *gameport) in old_gameport_measure_speed() argument
121 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in old_gameport_measure_speed()
129 for (t = 0; t < 50; t++) gameport_read(gameport); in old_gameport_measure_speed()
137 gameport_close(gameport); in old_gameport_measure_speed()
145 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in old_gameport_measure_speed()
153 for (t = 0; t < 50; t++) gameport_read(gameport); in old_gameport_measure_speed()
160 gameport_close(gameport); in old_gameport_measure_speed()
168 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in old_gameport_measure_speed()
172 j = jiffies; while (j == jiffies) { t++; gameport_read(gameport); } in old_gameport_measure_speed()
174 gameport_close(gameport); in old_gameport_measure_speed()
180 void gameport_start_polling(struct gameport *gameport) in gameport_start_polling() argument
182 spin_lock(&gameport->timer_lock); in gameport_start_polling()
184 if (!gameport->poll_cnt++) { in gameport_start_polling()
185 BUG_ON(!gameport->poll_handler); in gameport_start_polling()
186 BUG_ON(!gameport->poll_interval); in gameport_start_polling()
187 mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval)); in gameport_start_polling()
190 spin_unlock(&gameport->timer_lock); in gameport_start_polling()
194 void gameport_stop_polling(struct gameport *gameport) in gameport_stop_polling() argument
196 spin_lock(&gameport->timer_lock); in gameport_stop_polling()
198 if (!--gameport->poll_cnt) in gameport_stop_polling()
199 del_timer(&gameport->poll_timer); in gameport_stop_polling()
201 spin_unlock(&gameport->timer_lock); in gameport_stop_polling()
207 struct gameport *gameport = (struct gameport *)d; in gameport_run_poll_handler() local
209 gameport->poll_handler(gameport); in gameport_run_poll_handler()
210 if (gameport->poll_cnt) in gameport_run_poll_handler()
211 mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval)); in gameport_run_poll_handler()
218 static int gameport_bind_driver(struct gameport *gameport, struct gameport_driver *drv) in gameport_bind_driver() argument
222 gameport->dev.driver = &drv->driver; in gameport_bind_driver()
223 if (drv->connect(gameport, drv)) { in gameport_bind_driver()
224 gameport->dev.driver = NULL; in gameport_bind_driver()
228 error = device_bind_driver(&gameport->dev); in gameport_bind_driver()
230 dev_warn(&gameport->dev, in gameport_bind_driver()
232 gameport->phys, gameport->name, in gameport_bind_driver()
234 drv->disconnect(gameport); in gameport_bind_driver()
235 gameport->dev.driver = NULL; in gameport_bind_driver()
242 static void gameport_find_driver(struct gameport *gameport) in gameport_find_driver() argument
246 error = device_attach(&gameport->dev); in gameport_find_driver()
248 dev_warn(&gameport->dev, in gameport_find_driver()
250 gameport->phys, gameport->name, error); in gameport_find_driver()
436 static struct gameport *gameport_get_pending_child(struct gameport *parent) in gameport_get_pending_child()
439 struct gameport *gameport, *child = NULL; in gameport_get_pending_child() local
446 gameport = event->object; in gameport_get_pending_child()
447 if (gameport->parent == parent) { in gameport_get_pending_child()
448 child = gameport; in gameport_get_pending_child()
464 struct gameport *gameport = to_gameport_port(dev); in gameport_description_show() local
466 return sprintf(buf, "%s\n", gameport->name); in gameport_description_show()
472 struct gameport *gameport = to_gameport_port(dev); in drvctl_store() local
481 gameport_disconnect_port(gameport); in drvctl_store()
483 gameport_reconnect_port(gameport); in drvctl_store()
485 gameport_disconnect_port(gameport); in drvctl_store()
486 gameport_find_driver(gameport); in drvctl_store()
488 gameport_disconnect_port(gameport); in drvctl_store()
489 error = gameport_bind_driver(gameport, to_gameport_driver(drv)); in drvctl_store()
509 struct gameport *gameport = to_gameport_port(dev); in gameport_release_port() local
511 kfree(gameport); in gameport_release_port()
515 void gameport_set_phys(struct gameport *gameport, const char *fmt, ...) in gameport_set_phys() argument
520 vsnprintf(gameport->phys, sizeof(gameport->phys), fmt, args); in gameport_set_phys()
528 static void gameport_init_port(struct gameport *gameport) in gameport_init_port() argument
534 mutex_init(&gameport->drv_mutex); in gameport_init_port()
535 device_initialize(&gameport->dev); in gameport_init_port()
536 dev_set_name(&gameport->dev, "gameport%lu", in gameport_init_port()
538 gameport->dev.bus = &gameport_bus; in gameport_init_port()
539 gameport->dev.release = gameport_release_port; in gameport_init_port()
540 if (gameport->parent) in gameport_init_port()
541 gameport->dev.parent = &gameport->parent->dev; in gameport_init_port()
543 INIT_LIST_HEAD(&gameport->node); in gameport_init_port()
544 spin_lock_init(&gameport->timer_lock); in gameport_init_port()
545 init_timer(&gameport->poll_timer); in gameport_init_port()
546 gameport->poll_timer.function = gameport_run_poll_handler; in gameport_init_port()
547 gameport->poll_timer.data = (unsigned long)gameport; in gameport_init_port()
554 static void gameport_add_port(struct gameport *gameport) in gameport_add_port() argument
558 if (gameport->parent) in gameport_add_port()
559 gameport->parent->child = gameport; in gameport_add_port()
561 gameport->speed = use_ktime ? in gameport_add_port()
562 gameport_measure_speed(gameport) : in gameport_add_port()
563 old_gameport_measure_speed(gameport); in gameport_add_port()
565 list_add_tail(&gameport->node, &gameport_list); in gameport_add_port()
567 if (gameport->io) in gameport_add_port()
568 dev_info(&gameport->dev, "%s is %s, io %#x, speed %dkHz\n", in gameport_add_port()
569 gameport->name, gameport->phys, gameport->io, gameport->speed); in gameport_add_port()
571 dev_info(&gameport->dev, "%s is %s, speed %dkHz\n", in gameport_add_port()
572 gameport->name, gameport->phys, gameport->speed); in gameport_add_port()
574 error = device_add(&gameport->dev); in gameport_add_port()
576 dev_err(&gameport->dev, in gameport_add_port()
578 gameport->phys, gameport->name, error); in gameport_add_port()
585 static void gameport_destroy_port(struct gameport *gameport) in gameport_destroy_port() argument
587 struct gameport *child; in gameport_destroy_port()
589 child = gameport_get_pending_child(gameport); in gameport_destroy_port()
595 if (gameport->parent) { in gameport_destroy_port()
596 gameport->parent->child = NULL; in gameport_destroy_port()
597 gameport->parent = NULL; in gameport_destroy_port()
600 if (device_is_registered(&gameport->dev)) in gameport_destroy_port()
601 device_del(&gameport->dev); in gameport_destroy_port()
603 list_del_init(&gameport->node); in gameport_destroy_port()
605 gameport_remove_pending_events(gameport); in gameport_destroy_port()
606 put_device(&gameport->dev); in gameport_destroy_port()
612 static void gameport_reconnect_port(struct gameport *gameport) in gameport_reconnect_port() argument
615 if (!gameport->drv || !gameport->drv->reconnect || gameport->drv->reconnect(gameport)) { in gameport_reconnect_port()
616 gameport_disconnect_port(gameport); in gameport_reconnect_port()
617 gameport_find_driver(gameport); in gameport_reconnect_port()
621 gameport = gameport->child; in gameport_reconnect_port()
622 } while (gameport); in gameport_reconnect_port()
629 static void gameport_disconnect_port(struct gameport *gameport) in gameport_disconnect_port() argument
631 struct gameport *s, *parent; in gameport_disconnect_port()
633 if (gameport->child) { in gameport_disconnect_port()
639 for (s = gameport; s->child; s = s->child) in gameport_disconnect_port()
647 } while ((s = parent) != gameport); in gameport_disconnect_port()
653 device_release_driver(&gameport->dev); in gameport_disconnect_port()
660 void __gameport_register_port(struct gameport *gameport, struct module *owner) in __gameport_register_port() argument
662 gameport_init_port(gameport); in __gameport_register_port()
663 gameport_queue_event(gameport, owner, GAMEPORT_REGISTER_PORT); in __gameport_register_port()
670 void gameport_unregister_port(struct gameport *gameport) in gameport_unregister_port() argument
673 gameport_disconnect_port(gameport); in gameport_unregister_port()
674 gameport_destroy_port(gameport); in gameport_unregister_port()
699 struct gameport *gameport = to_gameport_port(dev); in gameport_driver_probe() local
702 drv->connect(gameport, drv); in gameport_driver_probe()
703 return gameport->drv ? 0 : -ENODEV; in gameport_driver_probe()
708 struct gameport *gameport = to_gameport_port(dev); in gameport_driver_remove() local
711 drv->disconnect(gameport); in gameport_driver_remove()
763 struct gameport *gameport; in gameport_unregister_driver() local
771 list_for_each_entry(gameport, &gameport_list, node) { in gameport_unregister_driver()
772 if (gameport->drv == drv) { in gameport_unregister_driver()
773 gameport_disconnect_port(gameport); in gameport_unregister_driver()
774 gameport_find_driver(gameport); in gameport_unregister_driver()
802 static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv) in gameport_set_drv() argument
804 mutex_lock(&gameport->drv_mutex); in gameport_set_drv()
805 gameport->drv = drv; in gameport_set_drv()
806 mutex_unlock(&gameport->drv_mutex); in gameport_set_drv()
809 int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode) in gameport_open() argument
811 if (gameport->open) { in gameport_open()
812 if (gameport->open(gameport, mode)) { in gameport_open()
820 gameport_set_drv(gameport, drv); in gameport_open()
825 void gameport_close(struct gameport *gameport) in gameport_close() argument
827 del_timer_sync(&gameport->poll_timer); in gameport_close()
828 gameport->poll_handler = NULL; in gameport_close()
829 gameport->poll_interval = 0; in gameport_close()
830 gameport_set_drv(gameport, NULL); in gameport_close()
831 if (gameport->close) in gameport_close()
832 gameport->close(gameport); in gameport_close()