Lines Matching refs:gameport
3 * Generic gameport layer
16 #include <linux/gameport.h>
27 MODULE_DESCRIPTION("Generic gameport layer");
35 * gameport_mutex protects entire gameport subsystem and is taken
36 * every time gameport port or driver registrered or unregistered.
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);
75 * gameport_measure_speed() measures the gameport i/o speed.
78 static int gameport_measure_speed(struct gameport *gameport)
84 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW))
93 gameport_read(gameport);
103 gameport_close(gameport);
110 static int old_gameport_measure_speed(struct gameport *gameport)
117 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW))
125 for (t = 0; t < 50; t++) gameport_read(gameport);
133 gameport_close(gameport);
141 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW))
149 for (t = 0; t < 50; t++) gameport_read(gameport);
156 gameport_close(gameport);
164 if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW))
168 j = jiffies; while (j == jiffies) { t++; gameport_read(gameport); }
170 gameport_close(gameport);
176 void gameport_start_polling(struct gameport *gameport)
178 spin_lock(&gameport->timer_lock);
180 if (!gameport->poll_cnt++) {
181 BUG_ON(!gameport->poll_handler);
182 BUG_ON(!gameport->poll_interval);
183 mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval));
186 spin_unlock(&gameport->timer_lock);
190 void gameport_stop_polling(struct gameport *gameport)
192 spin_lock(&gameport->timer_lock);
194 if (!--gameport->poll_cnt)
195 del_timer(&gameport->poll_timer);
197 spin_unlock(&gameport->timer_lock);
203 struct gameport *gameport = from_timer(gameport, t, poll_timer);
205 gameport->poll_handler(gameport);
206 if (gameport->poll_cnt)
207 mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval));
211 * Basic gameport -> driver core mappings
214 static int gameport_bind_driver(struct gameport *gameport, struct gameport_driver *drv)
218 gameport->dev.driver = &drv->driver;
219 if (drv->connect(gameport, drv)) {
220 gameport->dev.driver = NULL;
224 error = device_bind_driver(&gameport->dev);
226 dev_warn(&gameport->dev,
228 gameport->phys, gameport->name,
230 drv->disconnect(gameport);
231 gameport->dev.driver = NULL;
238 static void gameport_find_driver(struct gameport *gameport)
242 error = device_attach(&gameport->dev);
244 dev_warn(&gameport->dev,
246 gameport->phys, gameport->name, error);
362 * Scan event list for the other events for the same gameport port,
405 * be it a gameport port or a driver.
425 * Destroy child gameport port (if any) that has not been fully registered yet.
432 static struct gameport *gameport_get_pending_child(struct gameport *parent)
435 struct gameport *gameport, *child = NULL;
442 gameport = event->object;
443 if (gameport->parent == parent) {
444 child = gameport;
460 struct gameport *gameport = to_gameport_port(dev);
462 return sprintf(buf, "%s\n", gameport->name);
468 struct gameport *gameport = to_gameport_port(dev);
477 gameport_disconnect_port(gameport);
479 gameport_reconnect_port(gameport);
481 gameport_disconnect_port(gameport);
482 gameport_find_driver(gameport);
484 gameport_disconnect_port(gameport);
485 error = gameport_bind_driver(gameport, to_gameport_driver(drv));
505 struct gameport *gameport = to_gameport_port(dev);
507 kfree(gameport);
511 void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)
516 vsnprintf(gameport->phys, sizeof(gameport->phys), fmt, args);
522 * Prepare gameport port for registration.
524 static void gameport_init_port(struct gameport *gameport)
530 mutex_init(&gameport->drv_mutex);
531 device_initialize(&gameport->dev);
532 dev_set_name(&gameport->dev, "gameport%lu",
534 gameport->dev.bus = &gameport_bus;
535 gameport->dev.release = gameport_release_port;
536 if (gameport->parent)
537 gameport->dev.parent = &gameport->parent->dev;
539 INIT_LIST_HEAD(&gameport->node);
540 spin_lock_init(&gameport->timer_lock);
541 timer_setup(&gameport->poll_timer, gameport_run_poll_handler, 0);
545 * Complete gameport port registration.
548 static void gameport_add_port(struct gameport *gameport)
552 if (gameport->parent)
553 gameport->parent->child = gameport;
555 gameport->speed = use_ktime ?
556 gameport_measure_speed(gameport) :
557 old_gameport_measure_speed(gameport);
559 list_add_tail(&gameport->node, &gameport_list);
561 if (gameport->io)
562 dev_info(&gameport->dev, "%s is %s, io %#x, speed %dkHz\n",
563 gameport->name, gameport->phys, gameport->io, gameport->speed);
565 dev_info(&gameport->dev, "%s is %s, speed %dkHz\n",
566 gameport->name, gameport->phys, gameport->speed);
568 error = device_add(&gameport->dev);
570 dev_err(&gameport->dev,
572 gameport->phys, gameport->name, error);
579 static void gameport_destroy_port(struct gameport *gameport)
581 struct gameport *child;
583 child = gameport_get_pending_child(gameport);
589 if (gameport->parent) {
590 gameport->parent->child = NULL;
591 gameport->parent = NULL;
594 if (device_is_registered(&gameport->dev))
595 device_del(&gameport->dev);
597 list_del_init(&gameport->node);
599 gameport_remove_pending_events(gameport);
600 put_device(&gameport->dev);
604 * Reconnect gameport port and all its children (re-initialize attached devices)
606 static void gameport_reconnect_port(struct gameport *gameport)
609 if (!gameport->drv || !gameport->drv->reconnect || gameport->drv->reconnect(gameport)) {
610 gameport_disconnect_port(gameport);
611 gameport_find_driver(gameport);
615 gameport = gameport->child;
616 } while (gameport);
623 static void gameport_disconnect_port(struct gameport *gameport)
625 struct gameport *s, *parent;
627 if (gameport->child) {
633 for (s = gameport; s->child; s = s->child)
641 } while ((s = parent) != gameport);
647 device_release_driver(&gameport->dev);
654 void __gameport_register_port(struct gameport *gameport, struct module *owner)
656 gameport_init_port(gameport);
657 gameport_queue_event(gameport, owner, GAMEPORT_REGISTER_PORT);
662 * Synchronously unregisters gameport port.
664 void gameport_unregister_port(struct gameport *gameport)
667 gameport_disconnect_port(gameport);
668 gameport_destroy_port(gameport);
693 struct gameport *gameport = to_gameport_port(dev);
696 drv->connect(gameport, drv);
697 return gameport->drv ? 0 : -ENODEV;
702 struct gameport *gameport = to_gameport_port(dev);
705 drv->disconnect(gameport);
757 struct gameport *gameport;
765 list_for_each_entry(gameport, &gameport_list, node) {
766 if (gameport->drv == drv) {
767 gameport_disconnect_port(gameport);
768 gameport_find_driver(gameport);
788 .name = "gameport",
796 static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv)
798 mutex_lock(&gameport->drv_mutex);
799 gameport->drv = drv;
800 mutex_unlock(&gameport->drv_mutex);
803 int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode)
805 if (gameport->open) {
806 if (gameport->open(gameport, mode)) {
814 gameport_set_drv(gameport, drv);
819 void gameport_close(struct gameport *gameport)
821 del_timer_sync(&gameport->poll_timer);
822 gameport->poll_handler = NULL;
823 gameport->poll_interval = 0;
824 gameport_set_drv(gameport, NULL);
825 if (gameport->close)
826 gameport->close(gameport);
836 pr_err("failed to register gameport bus, error: %d\n", error);