• Home
  • Raw
  • Download

Lines Matching refs:serio

65 static void serio_add_port(struct serio *serio);
66 static int serio_reconnect_port(struct serio *serio);
67 static void serio_disconnect_port(struct serio *serio);
68 static void serio_reconnect_chain(struct serio *serio);
71 static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) in serio_connect_driver() argument
75 mutex_lock(&serio->drv_mutex); in serio_connect_driver()
76 retval = drv->connect(serio, drv); in serio_connect_driver()
77 mutex_unlock(&serio->drv_mutex); in serio_connect_driver()
82 static int serio_reconnect_driver(struct serio *serio) in serio_reconnect_driver() argument
86 mutex_lock(&serio->drv_mutex); in serio_reconnect_driver()
87 if (serio->drv && serio->drv->reconnect) in serio_reconnect_driver()
88 retval = serio->drv->reconnect(serio); in serio_reconnect_driver()
89 mutex_unlock(&serio->drv_mutex); in serio_reconnect_driver()
94 static void serio_disconnect_driver(struct serio *serio) in serio_disconnect_driver() argument
96 mutex_lock(&serio->drv_mutex); in serio_disconnect_driver()
97 if (serio->drv) in serio_disconnect_driver()
98 serio->drv->disconnect(serio); in serio_disconnect_driver()
99 mutex_unlock(&serio->drv_mutex); in serio_disconnect_driver()
102 static int serio_match_port(const struct serio_device_id *ids, struct serio *serio) in serio_match_port() argument
105 if ((ids->type == SERIO_ANY || ids->type == serio->id.type) && in serio_match_port()
106 (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) && in serio_match_port()
107 (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) && in serio_match_port()
108 (ids->id == SERIO_ANY || ids->id == serio->id.id)) in serio_match_port()
119 static int serio_bind_driver(struct serio *serio, struct serio_driver *drv) in serio_bind_driver() argument
123 if (serio_match_port(drv->id_table, serio)) { in serio_bind_driver()
125 serio->dev.driver = &drv->driver; in serio_bind_driver()
126 if (serio_connect_driver(serio, drv)) { in serio_bind_driver()
127 serio->dev.driver = NULL; in serio_bind_driver()
131 error = device_bind_driver(&serio->dev); in serio_bind_driver()
136 serio->phys, serio->name, in serio_bind_driver()
138 serio_disconnect_driver(serio); in serio_bind_driver()
139 serio->dev.driver = NULL; in serio_bind_driver()
146 static void serio_find_driver(struct serio *serio) in serio_find_driver() argument
150 error = device_attach(&serio->dev); in serio_find_driver()
154 serio->phys, serio->name, error); in serio_find_driver()
370 static struct serio *serio_get_pending_child(struct serio *parent) in serio_get_pending_child()
373 struct serio *serio, *child = NULL; in serio_get_pending_child() local
380 serio = event->object; in serio_get_pending_child()
381 if (serio->parent == parent) { in serio_get_pending_child()
382 child = serio; in serio_get_pending_child()
412 struct serio *serio = to_serio_port(dev); in serio_show_description() local
413 return sprintf(buf, "%s\n", serio->name); in serio_show_description()
418 struct serio *serio = to_serio_port(dev); in serio_show_modalias() local
421 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); in serio_show_modalias()
426 struct serio *serio = to_serio_port(dev); in serio_show_id_type() local
427 return sprintf(buf, "%02x\n", serio->id.type); in serio_show_id_type()
432 struct serio *serio = to_serio_port(dev); in serio_show_id_proto() local
433 return sprintf(buf, "%02x\n", serio->id.proto); in serio_show_id_proto()
438 struct serio *serio = to_serio_port(dev); in serio_show_id_id() local
439 return sprintf(buf, "%02x\n", serio->id.id); in serio_show_id_id()
444 struct serio *serio = to_serio_port(dev); in serio_show_id_extra() local
445 return sprintf(buf, "%02x\n", serio->id.extra); in serio_show_id_extra()
468 struct serio *serio = to_serio_port(dev); in serio_rebind_driver() local
477 serio_disconnect_port(serio); in serio_rebind_driver()
479 serio_reconnect_chain(serio); in serio_rebind_driver()
481 serio_disconnect_port(serio); in serio_rebind_driver()
482 serio_find_driver(serio); in serio_rebind_driver()
484 serio_disconnect_port(serio); in serio_rebind_driver()
485 error = serio_bind_driver(serio, to_serio_driver(drv)); in serio_rebind_driver()
498 struct serio *serio = to_serio_port(dev); in serio_show_bind_mode() local
499 return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto"); in serio_show_bind_mode()
504 struct serio *serio = to_serio_port(dev); in serio_set_bind_mode() local
509 serio->manual_bind = 1; in serio_set_bind_mode()
511 serio->manual_bind = 0; in serio_set_bind_mode()
530 struct serio *serio = to_serio_port(dev); in serio_release_port() local
532 kfree(serio); in serio_release_port()
539 static void serio_init_port(struct serio *serio) in serio_init_port() argument
545 INIT_LIST_HEAD(&serio->node); in serio_init_port()
546 spin_lock_init(&serio->lock); in serio_init_port()
547 mutex_init(&serio->drv_mutex); in serio_init_port()
548 device_initialize(&serio->dev); in serio_init_port()
549 dev_set_name(&serio->dev, "serio%ld", in serio_init_port()
551 serio->dev.bus = &serio_bus; in serio_init_port()
552 serio->dev.release = serio_release_port; in serio_init_port()
553 if (serio->parent) { in serio_init_port()
554 serio->dev.parent = &serio->parent->dev; in serio_init_port()
555 serio->depth = serio->parent->depth + 1; in serio_init_port()
557 serio->depth = 0; in serio_init_port()
558 lockdep_set_subclass(&serio->lock, serio->depth); in serio_init_port()
565 static void serio_add_port(struct serio *serio) in serio_add_port() argument
569 if (serio->parent) { in serio_add_port()
570 serio_pause_rx(serio->parent); in serio_add_port()
571 serio->parent->child = serio; in serio_add_port()
572 serio_continue_rx(serio->parent); in serio_add_port()
575 list_add_tail(&serio->node, &serio_list); in serio_add_port()
576 if (serio->start) in serio_add_port()
577 serio->start(serio); in serio_add_port()
578 error = device_add(&serio->dev); in serio_add_port()
582 serio->phys, serio->name, error); in serio_add_port()
584 serio->registered = 1; in serio_add_port()
585 error = sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group); in serio_add_port()
589 serio->phys, serio->name, error); in serio_add_port()
597 static void serio_destroy_port(struct serio *serio) in serio_destroy_port() argument
599 struct serio *child; in serio_destroy_port()
601 child = serio_get_pending_child(serio); in serio_destroy_port()
607 if (serio->stop) in serio_destroy_port()
608 serio->stop(serio); in serio_destroy_port()
610 if (serio->parent) { in serio_destroy_port()
611 serio_pause_rx(serio->parent); in serio_destroy_port()
612 serio->parent->child = NULL; in serio_destroy_port()
613 serio_continue_rx(serio->parent); in serio_destroy_port()
614 serio->parent = NULL; in serio_destroy_port()
617 if (serio->registered) { in serio_destroy_port()
618 sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group); in serio_destroy_port()
619 device_del(&serio->dev); in serio_destroy_port()
620 serio->registered = 0; in serio_destroy_port()
623 list_del_init(&serio->node); in serio_destroy_port()
624 serio_remove_pending_events(serio); in serio_destroy_port()
625 put_device(&serio->dev); in serio_destroy_port()
634 static int serio_reconnect_port(struct serio *serio) in serio_reconnect_port() argument
636 int error = serio_reconnect_driver(serio); in serio_reconnect_port()
639 serio_disconnect_port(serio); in serio_reconnect_port()
640 serio_find_driver(serio); in serio_reconnect_port()
649 static void serio_reconnect_chain(struct serio *serio) in serio_reconnect_chain() argument
652 if (serio_reconnect_port(serio)) { in serio_reconnect_chain()
656 serio = serio->child; in serio_reconnect_chain()
657 } while (serio); in serio_reconnect_chain()
664 static void serio_disconnect_port(struct serio *serio) in serio_disconnect_port() argument
666 struct serio *s, *parent; in serio_disconnect_port()
668 if (serio->child) { in serio_disconnect_port()
674 for (s = serio; s->child; s = s->child) in serio_disconnect_port()
682 } while ((s = parent) != serio); in serio_disconnect_port()
688 device_release_driver(&serio->dev); in serio_disconnect_port()
691 void serio_rescan(struct serio *serio) in serio_rescan() argument
693 serio_queue_event(serio, NULL, SERIO_RESCAN_PORT); in serio_rescan()
696 void serio_reconnect(struct serio *serio) in serio_reconnect() argument
698 serio_queue_event(serio, NULL, SERIO_RECONNECT_CHAIN); in serio_reconnect()
705 void __serio_register_port(struct serio *serio, struct module *owner) in __serio_register_port() argument
707 serio_init_port(serio); in __serio_register_port()
708 serio_queue_event(serio, owner, SERIO_REGISTER_PORT); in __serio_register_port()
714 void serio_unregister_port(struct serio *serio) in serio_unregister_port() argument
717 serio_disconnect_port(serio); in serio_unregister_port()
718 serio_destroy_port(serio); in serio_unregister_port()
725 void serio_unregister_child_port(struct serio *serio) in serio_unregister_child_port() argument
728 if (serio->child) { in serio_unregister_child_port()
729 serio_disconnect_port(serio->child); in serio_unregister_child_port()
730 serio_destroy_port(serio->child); in serio_unregister_child_port()
779 struct serio *serio = to_serio_port(dev); in serio_driver_probe() local
782 return serio_connect_driver(serio, drv); in serio_driver_probe()
787 struct serio *serio = to_serio_port(dev); in serio_driver_remove() local
789 serio_disconnect_driver(serio); in serio_driver_remove()
793 static void serio_cleanup(struct serio *serio) in serio_cleanup() argument
795 mutex_lock(&serio->drv_mutex); in serio_cleanup()
796 if (serio->drv && serio->drv->cleanup) in serio_cleanup()
797 serio->drv->cleanup(serio); in serio_cleanup()
798 mutex_unlock(&serio->drv_mutex); in serio_cleanup()
803 struct serio *serio = to_serio_port(dev); in serio_shutdown() local
805 serio_cleanup(serio); in serio_shutdown()
860 struct serio *serio; in serio_unregister_driver() local
868 list_for_each_entry(serio, &serio_list, node) { in serio_unregister_driver()
869 if (serio->drv == drv) { in serio_unregister_driver()
870 serio_disconnect_port(serio); in serio_unregister_driver()
871 serio_find_driver(serio); in serio_unregister_driver()
881 static void serio_set_drv(struct serio *serio, struct serio_driver *drv) in serio_set_drv() argument
883 serio_pause_rx(serio); in serio_set_drv()
884 serio->drv = drv; in serio_set_drv()
885 serio_continue_rx(serio); in serio_set_drv()
890 struct serio *serio = to_serio_port(dev); in serio_bus_match() local
893 if (serio->manual_bind || serio_drv->manual_bind) in serio_bus_match()
896 return serio_match_port(serio_drv->id_table, serio); in serio_bus_match()
910 struct serio *serio; in serio_uevent() local
915 serio = to_serio_port(dev); in serio_uevent()
917 SERIO_ADD_UEVENT_VAR("SERIO_TYPE=%02x", serio->id.type); in serio_uevent()
918 SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); in serio_uevent()
919 SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); in serio_uevent()
920 SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); in serio_uevent()
922 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); in serio_uevent()
967 int serio_open(struct serio *serio, struct serio_driver *drv) in serio_open() argument
969 serio_set_drv(serio, drv); in serio_open()
971 if (serio->open && serio->open(serio)) { in serio_open()
972 serio_set_drv(serio, NULL); in serio_open()
979 void serio_close(struct serio *serio) in serio_close() argument
981 if (serio->close) in serio_close()
982 serio->close(serio); in serio_close()
984 serio_set_drv(serio, NULL); in serio_close()
987 irqreturn_t serio_interrupt(struct serio *serio, in serio_interrupt() argument
993 spin_lock_irqsave(&serio->lock, flags); in serio_interrupt()
995 if (likely(serio->drv)) { in serio_interrupt()
996 ret = serio->drv->interrupt(serio, data, dfl); in serio_interrupt()
997 } else if (!dfl && serio->registered) { in serio_interrupt()
998 serio_rescan(serio); in serio_interrupt()
1002 spin_unlock_irqrestore(&serio->lock, flags); in serio_interrupt()