Lines Matching refs:serio

48 static void serio_add_port(struct serio *serio);
49 static int serio_reconnect_port(struct serio *serio);
50 static void serio_disconnect_port(struct serio *serio);
51 static void serio_reconnect_subtree(struct serio *serio);
54 static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) in serio_connect_driver() argument
58 mutex_lock(&serio->drv_mutex); in serio_connect_driver()
59 retval = drv->connect(serio, drv); in serio_connect_driver()
60 mutex_unlock(&serio->drv_mutex); in serio_connect_driver()
65 static int serio_reconnect_driver(struct serio *serio) in serio_reconnect_driver() argument
69 mutex_lock(&serio->drv_mutex); in serio_reconnect_driver()
70 if (serio->drv && serio->drv->reconnect) in serio_reconnect_driver()
71 retval = serio->drv->reconnect(serio); in serio_reconnect_driver()
72 mutex_unlock(&serio->drv_mutex); in serio_reconnect_driver()
77 static void serio_disconnect_driver(struct serio *serio) in serio_disconnect_driver() argument
79 mutex_lock(&serio->drv_mutex); in serio_disconnect_driver()
80 if (serio->drv) in serio_disconnect_driver()
81 serio->drv->disconnect(serio); in serio_disconnect_driver()
82 mutex_unlock(&serio->drv_mutex); in serio_disconnect_driver()
85 static int serio_match_port(const struct serio_device_id *ids, struct serio *serio) in serio_match_port() argument
88 if ((ids->type == SERIO_ANY || ids->type == serio->id.type) && in serio_match_port()
89 (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) && in serio_match_port()
90 (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) && in serio_match_port()
91 (ids->id == SERIO_ANY || ids->id == serio->id.id)) in serio_match_port()
102 static int serio_bind_driver(struct serio *serio, struct serio_driver *drv) in serio_bind_driver() argument
106 if (serio_match_port(drv->id_table, serio)) { in serio_bind_driver()
108 serio->dev.driver = &drv->driver; in serio_bind_driver()
109 if (serio_connect_driver(serio, drv)) { in serio_bind_driver()
110 serio->dev.driver = NULL; in serio_bind_driver()
114 error = device_bind_driver(&serio->dev); in serio_bind_driver()
116 dev_warn(&serio->dev, in serio_bind_driver()
118 serio->phys, serio->name, in serio_bind_driver()
120 serio_disconnect_driver(serio); in serio_bind_driver()
121 serio->dev.driver = NULL; in serio_bind_driver()
128 static void serio_find_driver(struct serio *serio) in serio_find_driver() argument
132 error = device_attach(&serio->dev); in serio_find_driver()
134 dev_warn(&serio->dev, in serio_find_driver()
136 serio->phys, serio->name, error); in serio_find_driver()
330 static struct serio *serio_get_pending_child(struct serio *parent) in serio_get_pending_child()
333 struct serio *serio, *child = NULL; in serio_get_pending_child() local
340 serio = event->object; in serio_get_pending_child()
341 if (serio->parent == parent) { in serio_get_pending_child()
342 child = serio; in serio_get_pending_child()
358 struct serio *serio = to_serio_port(dev); in serio_show_description() local
359 return sprintf(buf, "%s\n", serio->name); in serio_show_description()
364 struct serio *serio = to_serio_port(dev); in modalias_show() local
367 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); in modalias_show()
372 struct serio *serio = to_serio_port(dev); in type_show() local
373 return sprintf(buf, "%02x\n", serio->id.type); in type_show()
378 struct serio *serio = to_serio_port(dev); in proto_show() local
379 return sprintf(buf, "%02x\n", serio->id.proto); in proto_show()
384 struct serio *serio = to_serio_port(dev); in id_show() local
385 return sprintf(buf, "%02x\n", serio->id.id); in id_show()
390 struct serio *serio = to_serio_port(dev); in extra_show() local
391 return sprintf(buf, "%02x\n", serio->id.extra); in extra_show()
396 struct serio *serio = to_serio_port(dev); in drvctl_store() local
405 serio_disconnect_port(serio); in drvctl_store()
407 serio_reconnect_subtree(serio); in drvctl_store()
409 serio_disconnect_port(serio); in drvctl_store()
410 serio_find_driver(serio); in drvctl_store()
411 serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT); in drvctl_store()
413 serio_disconnect_port(serio); in drvctl_store()
414 error = serio_bind_driver(serio, to_serio_driver(drv)); in drvctl_store()
415 serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT); in drvctl_store()
427 struct serio *serio = to_serio_port(dev); in serio_show_bind_mode() local
428 return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto"); in serio_show_bind_mode()
433 struct serio *serio = to_serio_port(dev); in serio_set_bind_mode() local
438 serio->manual_bind = true; in serio_set_bind_mode()
440 serio->manual_bind = false; in serio_set_bind_mode()
450 struct serio *serio = to_serio_port(dev); in firmware_id_show() local
452 return sprintf(buf, "%s\n", serio->firmware_id); in firmware_id_show()
500 struct serio *serio = to_serio_port(dev); in serio_release_port() local
502 kfree(serio); in serio_release_port()
509 static void serio_init_port(struct serio *serio) in serio_init_port() argument
515 INIT_LIST_HEAD(&serio->node); in serio_init_port()
516 INIT_LIST_HEAD(&serio->child_node); in serio_init_port()
517 INIT_LIST_HEAD(&serio->children); in serio_init_port()
518 spin_lock_init(&serio->lock); in serio_init_port()
519 mutex_init(&serio->drv_mutex); in serio_init_port()
520 device_initialize(&serio->dev); in serio_init_port()
521 dev_set_name(&serio->dev, "serio%lu", in serio_init_port()
523 serio->dev.bus = &serio_bus; in serio_init_port()
524 serio->dev.release = serio_release_port; in serio_init_port()
525 serio->dev.groups = serio_device_attr_groups; in serio_init_port()
526 if (serio->parent) { in serio_init_port()
527 serio->dev.parent = &serio->parent->dev; in serio_init_port()
528 serio->depth = serio->parent->depth + 1; in serio_init_port()
530 serio->depth = 0; in serio_init_port()
531 lockdep_set_subclass(&serio->lock, serio->depth); in serio_init_port()
538 static void serio_add_port(struct serio *serio) in serio_add_port() argument
540 struct serio *parent = serio->parent; in serio_add_port()
545 list_add_tail(&serio->child_node, &parent->children); in serio_add_port()
549 list_add_tail(&serio->node, &serio_list); in serio_add_port()
551 if (serio->start) in serio_add_port()
552 serio->start(serio); in serio_add_port()
554 error = device_add(&serio->dev); in serio_add_port()
556 dev_err(&serio->dev, in serio_add_port()
558 serio->phys, serio->name, error); in serio_add_port()
565 static void serio_destroy_port(struct serio *serio) in serio_destroy_port() argument
567 struct serio *child; in serio_destroy_port()
569 while ((child = serio_get_pending_child(serio)) != NULL) { in serio_destroy_port()
574 if (serio->stop) in serio_destroy_port()
575 serio->stop(serio); in serio_destroy_port()
577 if (serio->parent) { in serio_destroy_port()
578 serio_pause_rx(serio->parent); in serio_destroy_port()
579 list_del_init(&serio->child_node); in serio_destroy_port()
580 serio_continue_rx(serio->parent); in serio_destroy_port()
581 serio->parent = NULL; in serio_destroy_port()
584 if (device_is_registered(&serio->dev)) in serio_destroy_port()
585 device_del(&serio->dev); in serio_destroy_port()
587 list_del_init(&serio->node); in serio_destroy_port()
588 serio_remove_pending_events(serio); in serio_destroy_port()
589 put_device(&serio->dev); in serio_destroy_port()
598 static int serio_reconnect_port(struct serio *serio) in serio_reconnect_port() argument
600 int error = serio_reconnect_driver(serio); in serio_reconnect_port()
603 serio_disconnect_port(serio); in serio_reconnect_port()
604 serio_find_driver(serio); in serio_reconnect_port()
614 static void serio_reconnect_subtree(struct serio *root) in serio_reconnect_subtree()
616 struct serio *s = root; in serio_reconnect_subtree()
628 struct serio, child_node); in serio_reconnect_subtree()
639 struct serio *parent = s->parent; in serio_reconnect_subtree()
643 struct serio, child_node); in serio_reconnect_subtree()
656 static void serio_disconnect_port(struct serio *serio) in serio_disconnect_port() argument
658 struct serio *s = serio; in serio_disconnect_port()
664 while (!list_empty(&serio->children)) { in serio_disconnect_port()
669 struct serio, child_node); in serio_disconnect_port()
675 if (s != serio) { in serio_disconnect_port()
676 struct serio *parent = s->parent; 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()
697 void serio_reconnect(struct serio *serio) in serio_reconnect() argument
699 serio_queue_event(serio, NULL, SERIO_RECONNECT_SUBTREE); in serio_reconnect()
707 void __serio_register_port(struct serio *serio, struct module *owner) in __serio_register_port() argument
709 serio_init_port(serio); in __serio_register_port()
710 serio_queue_event(serio, owner, SERIO_REGISTER_PORT); in __serio_register_port()
717 void serio_unregister_port(struct serio *serio) in serio_unregister_port() argument
720 serio_disconnect_port(serio); in serio_unregister_port()
721 serio_destroy_port(serio); in serio_unregister_port()
729 void serio_unregister_child_port(struct serio *serio) in serio_unregister_child_port() argument
731 struct serio *s, *next; in serio_unregister_child_port()
734 list_for_each_entry_safe(s, next, &serio->children, child_node) { in serio_unregister_child_port()
787 struct serio *serio = to_serio_port(dev); in serio_driver_probe() local
790 return serio_connect_driver(serio, drv); in serio_driver_probe()
795 struct serio *serio = to_serio_port(dev); in serio_driver_remove() local
797 serio_disconnect_driver(serio); in serio_driver_remove()
801 static void serio_cleanup(struct serio *serio) in serio_cleanup() argument
803 mutex_lock(&serio->drv_mutex); in serio_cleanup()
804 if (serio->drv && serio->drv->cleanup) in serio_cleanup()
805 serio->drv->cleanup(serio); in serio_cleanup()
806 mutex_unlock(&serio->drv_mutex); in serio_cleanup()
811 struct serio *serio = to_serio_port(dev); in serio_shutdown() local
813 serio_cleanup(serio); in serio_shutdown()
867 struct serio *serio; in serio_unregister_driver() local
875 list_for_each_entry(serio, &serio_list, node) { in serio_unregister_driver()
876 if (serio->drv == drv) { in serio_unregister_driver()
877 serio_disconnect_port(serio); in serio_unregister_driver()
878 serio_find_driver(serio); in serio_unregister_driver()
889 static void serio_set_drv(struct serio *serio, struct serio_driver *drv) in serio_set_drv() argument
891 serio_pause_rx(serio); in serio_set_drv()
892 serio->drv = drv; in serio_set_drv()
893 serio_continue_rx(serio); in serio_set_drv()
898 struct serio *serio = to_serio_port(dev); in serio_bus_match() local
901 if (serio->manual_bind || serio_drv->manual_bind) in serio_bus_match()
904 return serio_match_port(serio_drv->id_table, serio); in serio_bus_match()
916 struct serio *serio; in serio_uevent() local
921 serio = to_serio_port(dev); in serio_uevent()
923 SERIO_ADD_UEVENT_VAR("SERIO_TYPE=%02x", serio->id.type); in serio_uevent()
924 SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); in serio_uevent()
925 SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); in serio_uevent()
926 SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); in serio_uevent()
929 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); in serio_uevent()
931 if (serio->firmware_id[0]) in serio_uevent()
933 serio->firmware_id); in serio_uevent()
942 struct serio *serio = to_serio_port(dev); in serio_suspend() local
944 serio_cleanup(serio); in serio_suspend()
951 struct serio *serio = to_serio_port(dev); in serio_resume() local
954 mutex_lock(&serio->drv_mutex); in serio_resume()
955 if (serio->drv && serio->drv->fast_reconnect) { in serio_resume()
956 error = serio->drv->fast_reconnect(serio); in serio_resume()
961 mutex_unlock(&serio->drv_mutex); in serio_resume()
968 serio_queue_event(serio, NULL, SERIO_RECONNECT_PORT); in serio_resume()
983 int serio_open(struct serio *serio, struct serio_driver *drv) in serio_open() argument
985 serio_set_drv(serio, drv); in serio_open()
987 if (serio->open && serio->open(serio)) { in serio_open()
988 serio_set_drv(serio, NULL); in serio_open()
996 void serio_close(struct serio *serio) in serio_close() argument
998 if (serio->close) in serio_close()
999 serio->close(serio); in serio_close()
1001 serio_set_drv(serio, NULL); in serio_close()
1005 irqreturn_t serio_interrupt(struct serio *serio, in serio_interrupt() argument
1011 spin_lock_irqsave(&serio->lock, flags); in serio_interrupt()
1013 if (likely(serio->drv)) { in serio_interrupt()
1014 ret = serio->drv->interrupt(serio, data, dfl); in serio_interrupt()
1015 } else if (!dfl && device_is_registered(&serio->dev)) { in serio_interrupt()
1016 serio_rescan(serio); in serio_interrupt()
1020 spin_unlock_irqrestore(&serio->lock, flags); in serio_interrupt()