Lines Matching refs:gameport

44 static void gameport_add_port(struct gameport *gameport);
46 static void gameport_reconnect_port(struct gameport *gameport);
47 static void gameport_disconnect_port(struct gameport *gameport);
78 static int gameport_measure_speed(struct gameport *gameport) in gameport_measure_speed() argument
84 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in gameport_measure_speed()
93 gameport_read(gameport); in gameport_measure_speed()
103 gameport_close(gameport); in gameport_measure_speed()
110 static int old_gameport_measure_speed(struct gameport *gameport) in old_gameport_measure_speed() argument
117 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in old_gameport_measure_speed()
125 for (t = 0; t < 50; t++) gameport_read(gameport); in old_gameport_measure_speed()
133 gameport_close(gameport); in old_gameport_measure_speed()
141 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in old_gameport_measure_speed()
149 for (t = 0; t < 50; t++) gameport_read(gameport); in old_gameport_measure_speed()
156 gameport_close(gameport); in old_gameport_measure_speed()
164 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) in old_gameport_measure_speed()
168 j = jiffies; while (j == jiffies) { t++; gameport_read(gameport); } in old_gameport_measure_speed()
170 gameport_close(gameport); in old_gameport_measure_speed()
176 void gameport_start_polling(struct gameport *gameport) in gameport_start_polling() argument
178 spin_lock(&gameport->timer_lock); in gameport_start_polling()
180 if (!gameport->poll_cnt++) { in gameport_start_polling()
181 BUG_ON(!gameport->poll_handler); in gameport_start_polling()
182 BUG_ON(!gameport->poll_interval); in gameport_start_polling()
183 mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval)); in gameport_start_polling()
186 spin_unlock(&gameport->timer_lock); in gameport_start_polling()
190 void gameport_stop_polling(struct gameport *gameport) in gameport_stop_polling() argument
192 spin_lock(&gameport->timer_lock); in gameport_stop_polling()
194 if (!--gameport->poll_cnt) in gameport_stop_polling()
195 del_timer(&gameport->poll_timer); in gameport_stop_polling()
197 spin_unlock(&gameport->timer_lock); in gameport_stop_polling()
203 struct gameport *gameport = from_timer(gameport, t, poll_timer); in gameport_run_poll_handler() local
205 gameport->poll_handler(gameport); in gameport_run_poll_handler()
206 if (gameport->poll_cnt) in gameport_run_poll_handler()
207 mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval)); in gameport_run_poll_handler()
214 static int gameport_bind_driver(struct gameport *gameport, struct gameport_driver *drv) in gameport_bind_driver() argument
218 gameport->dev.driver = &drv->driver; in gameport_bind_driver()
219 if (drv->connect(gameport, drv)) { in gameport_bind_driver()
220 gameport->dev.driver = NULL; in gameport_bind_driver()
224 error = device_bind_driver(&gameport->dev); in gameport_bind_driver()
226 dev_warn(&gameport->dev, in gameport_bind_driver()
228 gameport->phys, gameport->name, in gameport_bind_driver()
230 drv->disconnect(gameport); in gameport_bind_driver()
231 gameport->dev.driver = NULL; in gameport_bind_driver()
238 static void gameport_find_driver(struct gameport *gameport) in gameport_find_driver() argument
242 error = device_attach(&gameport->dev); in gameport_find_driver()
244 dev_warn(&gameport->dev, in gameport_find_driver()
246 gameport->phys, gameport->name, error); in gameport_find_driver()
432 static struct gameport *gameport_get_pending_child(struct gameport *parent) in gameport_get_pending_child()
435 struct gameport *gameport, *child = NULL; in gameport_get_pending_child() local
442 gameport = event->object; in gameport_get_pending_child()
443 if (gameport->parent == parent) { in gameport_get_pending_child()
444 child = gameport; in gameport_get_pending_child()
460 struct gameport *gameport = to_gameport_port(dev); in gameport_description_show() local
462 return sprintf(buf, "%s\n", gameport->name); in gameport_description_show()
468 struct gameport *gameport = to_gameport_port(dev); in drvctl_store() local
477 gameport_disconnect_port(gameport); in drvctl_store()
479 gameport_reconnect_port(gameport); in drvctl_store()
481 gameport_disconnect_port(gameport); in drvctl_store()
482 gameport_find_driver(gameport); in drvctl_store()
484 gameport_disconnect_port(gameport); in drvctl_store()
485 error = gameport_bind_driver(gameport, to_gameport_driver(drv)); in drvctl_store()
505 struct gameport *gameport = to_gameport_port(dev); in gameport_release_port() local
507 kfree(gameport); in gameport_release_port()
511 void gameport_set_phys(struct gameport *gameport, const char *fmt, ...) in gameport_set_phys() argument
516 vsnprintf(gameport->phys, sizeof(gameport->phys), fmt, args); in gameport_set_phys()
524 static void gameport_init_port(struct gameport *gameport) in gameport_init_port() argument
530 mutex_init(&gameport->drv_mutex); in gameport_init_port()
531 device_initialize(&gameport->dev); in gameport_init_port()
532 dev_set_name(&gameport->dev, "gameport%lu", in gameport_init_port()
534 gameport->dev.bus = &gameport_bus; in gameport_init_port()
535 gameport->dev.release = gameport_release_port; in gameport_init_port()
536 if (gameport->parent) in gameport_init_port()
537 gameport->dev.parent = &gameport->parent->dev; in gameport_init_port()
539 INIT_LIST_HEAD(&gameport->node); in gameport_init_port()
540 spin_lock_init(&gameport->timer_lock); in gameport_init_port()
541 timer_setup(&gameport->poll_timer, gameport_run_poll_handler, 0); in gameport_init_port()
548 static void gameport_add_port(struct gameport *gameport) in gameport_add_port() argument
552 if (gameport->parent) in gameport_add_port()
553 gameport->parent->child = gameport; in gameport_add_port()
555 gameport->speed = use_ktime ? in gameport_add_port()
556 gameport_measure_speed(gameport) : in gameport_add_port()
557 old_gameport_measure_speed(gameport); in gameport_add_port()
559 list_add_tail(&gameport->node, &gameport_list); in gameport_add_port()
561 if (gameport->io) in gameport_add_port()
562 dev_info(&gameport->dev, "%s is %s, io %#x, speed %dkHz\n", in gameport_add_port()
563 gameport->name, gameport->phys, gameport->io, gameport->speed); in gameport_add_port()
565 dev_info(&gameport->dev, "%s is %s, speed %dkHz\n", in gameport_add_port()
566 gameport->name, gameport->phys, gameport->speed); in gameport_add_port()
568 error = device_add(&gameport->dev); in gameport_add_port()
570 dev_err(&gameport->dev, in gameport_add_port()
572 gameport->phys, gameport->name, error); in gameport_add_port()
579 static void gameport_destroy_port(struct gameport *gameport) in gameport_destroy_port() argument
581 struct gameport *child; in gameport_destroy_port()
583 child = gameport_get_pending_child(gameport); in gameport_destroy_port()
589 if (gameport->parent) { in gameport_destroy_port()
590 gameport->parent->child = NULL; in gameport_destroy_port()
591 gameport->parent = NULL; in gameport_destroy_port()
594 if (device_is_registered(&gameport->dev)) in gameport_destroy_port()
595 device_del(&gameport->dev); in gameport_destroy_port()
597 list_del_init(&gameport->node); in gameport_destroy_port()
599 gameport_remove_pending_events(gameport); in gameport_destroy_port()
600 put_device(&gameport->dev); in gameport_destroy_port()
606 static void gameport_reconnect_port(struct gameport *gameport) in gameport_reconnect_port() argument
609 if (!gameport->drv || !gameport->drv->reconnect || gameport->drv->reconnect(gameport)) { in gameport_reconnect_port()
610 gameport_disconnect_port(gameport); in gameport_reconnect_port()
611 gameport_find_driver(gameport); in gameport_reconnect_port()
615 gameport = gameport->child; in gameport_reconnect_port()
616 } while (gameport); in gameport_reconnect_port()
623 static void gameport_disconnect_port(struct gameport *gameport) in gameport_disconnect_port() argument
625 struct gameport *s, *parent; in gameport_disconnect_port()
627 if (gameport->child) { in gameport_disconnect_port()
633 for (s = gameport; s->child; s = s->child) in gameport_disconnect_port()
641 } while ((s = parent) != gameport); in gameport_disconnect_port()
647 device_release_driver(&gameport->dev); in gameport_disconnect_port()
654 void __gameport_register_port(struct gameport *gameport, struct module *owner) in __gameport_register_port() argument
656 gameport_init_port(gameport); in __gameport_register_port()
657 gameport_queue_event(gameport, owner, GAMEPORT_REGISTER_PORT); in __gameport_register_port()
664 void gameport_unregister_port(struct gameport *gameport) in gameport_unregister_port() argument
667 gameport_disconnect_port(gameport); in gameport_unregister_port()
668 gameport_destroy_port(gameport); in gameport_unregister_port()
693 struct gameport *gameport = to_gameport_port(dev); in gameport_driver_probe() local
696 drv->connect(gameport, drv); in gameport_driver_probe()
697 return gameport->drv ? 0 : -ENODEV; in gameport_driver_probe()
702 struct gameport *gameport = to_gameport_port(dev); in gameport_driver_remove() local
705 drv->disconnect(gameport); in gameport_driver_remove()
756 struct gameport *gameport; in gameport_unregister_driver() local
764 list_for_each_entry(gameport, &gameport_list, node) { in gameport_unregister_driver()
765 if (gameport->drv == drv) { in gameport_unregister_driver()
766 gameport_disconnect_port(gameport); in gameport_unregister_driver()
767 gameport_find_driver(gameport); in gameport_unregister_driver()
795 static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv) in gameport_set_drv() argument
797 mutex_lock(&gameport->drv_mutex); in gameport_set_drv()
798 gameport->drv = drv; in gameport_set_drv()
799 mutex_unlock(&gameport->drv_mutex); in gameport_set_drv()
802 int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode) in gameport_open() argument
804 if (gameport->open) { in gameport_open()
805 if (gameport->open(gameport, mode)) { in gameport_open()
813 gameport_set_drv(gameport, drv); in gameport_open()
818 void gameport_close(struct gameport *gameport) in gameport_close() argument
820 del_timer_sync(&gameport->poll_timer); in gameport_close()
821 gameport->poll_handler = NULL; in gameport_close()
822 gameport->poll_interval = 0; in gameport_close()
823 gameport_set_drv(gameport, NULL); in gameport_close()
824 if (gameport->close) in gameport_close()
825 gameport->close(gameport); in gameport_close()