Lines Matching +full:drv +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 1999-2004 Vojtech Pavlik
37 static void serio_attach_driver(struct serio_driver *drv);
39 static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) in serio_connect_driver() argument
41 guard(mutex)(&serio->drv_mutex); in serio_connect_driver()
43 return drv->connect(serio, drv); in serio_connect_driver()
48 guard(mutex)(&serio->drv_mutex); in serio_reconnect_driver()
50 if (serio->drv && serio->drv->reconnect) in serio_reconnect_driver()
51 return serio->drv->reconnect(serio); in serio_reconnect_driver()
53 return -1; in serio_reconnect_driver()
58 guard(mutex)(&serio->drv_mutex); in serio_disconnect_driver()
60 if (serio->drv) in serio_disconnect_driver()
61 serio->drv->disconnect(serio); in serio_disconnect_driver()
66 while (ids->type || ids->proto) { in serio_match_port()
67 if ((ids->type == SERIO_ANY || ids->type == serio->id.type) && in serio_match_port()
68 (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) && in serio_match_port()
69 (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) && in serio_match_port()
70 (ids->id == SERIO_ANY || ids->id == serio->id.id)) in serio_match_port()
78 * Basic serio -> driver core mappings
81 static int serio_bind_driver(struct serio *serio, struct serio_driver *drv) in serio_bind_driver() argument
85 if (serio_match_port(drv->id_table, serio)) { in serio_bind_driver()
87 serio->dev.driver = &drv->driver; in serio_bind_driver()
88 if (serio_connect_driver(serio, drv)) { in serio_bind_driver()
89 serio->dev.driver = NULL; in serio_bind_driver()
90 return -ENODEV; in serio_bind_driver()
93 error = device_bind_driver(&serio->dev); in serio_bind_driver()
95 dev_warn(&serio->dev, in serio_bind_driver()
97 serio->phys, serio->name, in serio_bind_driver()
98 drv->description, error); in serio_bind_driver()
100 serio->dev.driver = NULL; in serio_bind_driver()
111 error = device_attach(&serio->dev); in serio_find_driver()
112 if (error < 0 && error != -EPROBE_DEFER) in serio_find_driver()
113 dev_warn(&serio->dev, in serio_find_driver()
115 serio->phys, serio->name, error); in serio_find_driver()
150 list_del_init(&event->node); in serio_get_event()
158 module_put(event->owner); in serio_free_event()
170 if (object == e->object) { in serio_remove_duplicate_events()
173 * look further - we only suppress duplicate events in serio_remove_duplicate_events()
174 * that were sent back-to-back. in serio_remove_duplicate_events()
176 if (type != e->type) in serio_remove_duplicate_events()
179 list_del_init(&e->node); in serio_remove_duplicate_events()
193 switch (event->type) { in serio_handle_event()
196 serio_add_port(event->object); in serio_handle_event()
200 serio_reconnect_port(event->object); in serio_handle_event()
204 serio_disconnect_port(event->object); in serio_handle_event()
205 serio_find_driver(event->object); in serio_handle_event()
209 serio_reconnect_subtree(event->object); in serio_handle_event()
213 serio_attach_driver(event->object); in serio_handle_event()
217 serio_remove_duplicate_events(event->object, event->type); in serio_handle_event()
239 if (event->object == object) { in serio_queue_event()
240 if (event->type == event_type) in serio_queue_event()
249 return -ENOMEM; in serio_queue_event()
256 return -EINVAL; in serio_queue_event()
259 event->type = event_type; in serio_queue_event()
260 event->object = object; in serio_queue_event()
261 event->owner = owner; in serio_queue_event()
263 list_add_tail(&event->node, &serio_event_list); in serio_queue_event()
280 if (event->object == object) { in serio_remove_pending_events()
281 list_del_init(&event->node); in serio_remove_pending_events()
301 if (event->type == SERIO_REGISTER_PORT) { in serio_get_pending_child()
302 serio = event->object; in serio_get_pending_child()
303 if (serio->parent == parent) in serio_get_pending_child()
318 return sprintf(buf, "%s\n", serio->name); in serio_show_description()
326 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); in modalias_show()
332 return sprintf(buf, "%02x\n", serio->id.type); in type_show()
338 return sprintf(buf, "%02x\n", serio->id.proto); in proto_show()
344 return sprintf(buf, "%02x\n", serio->id.id); in id_show()
350 return sprintf(buf, "%02x\n", serio->id.extra); in extra_show()
356 struct device_driver *drv; in drvctl_store() local
359 scoped_cond_guard(mutex_intr, return -EINTR, &serio_mutex) { in drvctl_store()
368 } else if ((drv = driver_find(buf, &serio_bus)) != NULL) { in drvctl_store()
370 error = serio_bind_driver(serio, to_serio_driver(drv)); in drvctl_store()
375 return -EINVAL; in drvctl_store()
385 return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto"); in serio_show_bind_mode()
395 serio->manual_bind = true; in serio_set_bind_mode()
397 serio->manual_bind = false; in serio_set_bind_mode()
399 retval = -EINVAL; in serio_set_bind_mode()
409 return sprintf(buf, "%s\n", serio->firmware_id); in firmware_id_show()
414 static DEVICE_ATTR_RO(id);
426 .name = "id",
468 static atomic_t serio_no = ATOMIC_INIT(-1); in serio_init_port()
472 INIT_LIST_HEAD(&serio->node); in serio_init_port()
473 INIT_LIST_HEAD(&serio->child_node); in serio_init_port()
474 INIT_LIST_HEAD(&serio->children); in serio_init_port()
475 spin_lock_init(&serio->lock); in serio_init_port()
476 mutex_init(&serio->drv_mutex); in serio_init_port()
477 device_initialize(&serio->dev); in serio_init_port()
478 dev_set_name(&serio->dev, "serio%lu", in serio_init_port()
480 serio->dev.bus = &serio_bus; in serio_init_port()
481 serio->dev.release = serio_release_port; in serio_init_port()
482 serio->dev.groups = serio_device_attr_groups; in serio_init_port()
483 if (serio->parent) { in serio_init_port()
484 serio->dev.parent = &serio->parent->dev; in serio_init_port()
485 serio->depth = serio->parent->depth + 1; in serio_init_port()
487 serio->depth = 0; in serio_init_port()
488 lockdep_set_subclass(&serio->lock, serio->depth); in serio_init_port()
497 struct serio *parent = serio->parent; in serio_add_port()
503 list_add_tail(&serio->child_node, &parent->children); in serio_add_port()
506 list_add_tail(&serio->node, &serio_list); in serio_add_port()
508 if (serio->start) in serio_add_port()
509 serio->start(serio); in serio_add_port()
511 error = device_add(&serio->dev); in serio_add_port()
513 dev_err(&serio->dev, in serio_add_port()
515 serio->phys, serio->name, error); in serio_add_port()
528 put_device(&child->dev); in serio_destroy_port()
531 if (serio->stop) in serio_destroy_port()
532 serio->stop(serio); in serio_destroy_port()
534 if (serio->parent) { in serio_destroy_port()
535 guard(serio_pause_rx)(serio->parent); in serio_destroy_port()
537 list_del_init(&serio->child_node); in serio_destroy_port()
538 serio->parent = NULL; in serio_destroy_port()
541 if (device_is_registered(&serio->dev)) in serio_destroy_port()
542 device_del(&serio->dev); in serio_destroy_port()
544 list_del_init(&serio->node); in serio_destroy_port()
546 put_device(&serio->dev); in serio_destroy_port()
550 * Reconnect serio port (re-initialize attached device).
568 * Reconnect serio port and all its children (re-initialize attached
583 if (!list_empty(&s->children)) { in serio_reconnect_subtree()
584 s = list_first_entry(&s->children, in serio_reconnect_subtree()
596 struct serio *parent = s->parent; in serio_reconnect_subtree()
598 if (!list_is_last(&s->child_node, &parent->children)) { in serio_reconnect_subtree()
599 s = list_entry(s->child_node.next, in serio_reconnect_subtree()
619 * first; we travel the tree in depth-first order. in serio_disconnect_port()
621 while (!list_empty(&serio->children)) { in serio_disconnect_port()
624 while (!list_empty(&s->children)) in serio_disconnect_port()
625 s = list_first_entry(&s->children, in serio_disconnect_port()
633 struct serio *parent = s->parent; in serio_disconnect_port()
635 device_release_driver(&s->dev); in serio_disconnect_port()
645 device_release_driver(&serio->dev); in serio_disconnect_port()
692 list_for_each_entry_safe(s, next, &serio->children, child_node) { in serio_unregister_child_port()
704 static ssize_t description_show(struct device_driver *drv, char *buf) in description_show() argument
706 struct serio_driver *driver = to_serio_driver(drv); in description_show()
707 return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)"); in description_show()
711 static ssize_t bind_mode_show(struct device_driver *drv, char *buf) in bind_mode_show() argument
713 struct serio_driver *serio_drv = to_serio_driver(drv); in bind_mode_show()
714 return sprintf(buf, "%s\n", serio_drv->manual_bind ? "manual" : "auto"); in bind_mode_show()
717 static ssize_t bind_mode_store(struct device_driver *drv, const char *buf, size_t count) in bind_mode_store() argument
719 struct serio_driver *serio_drv = to_serio_driver(drv); in bind_mode_store()
724 serio_drv->manual_bind = true; in bind_mode_store()
726 serio_drv->manual_bind = false; in bind_mode_store()
728 retval = -EINVAL; in bind_mode_store()
745 struct serio_driver *drv = to_serio_driver(dev->driver); in serio_driver_probe() local
747 return serio_connect_driver(serio, drv); in serio_driver_probe()
759 guard(mutex)(&serio->drv_mutex); in serio_cleanup()
761 if (serio->drv && serio->drv->cleanup) in serio_cleanup()
762 serio->drv->cleanup(serio); in serio_cleanup()
772 static void serio_attach_driver(struct serio_driver *drv) in serio_attach_driver() argument
776 error = driver_attach(&drv->driver); in serio_attach_driver()
779 drv->driver.name, error); in serio_attach_driver()
782 int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name) in __serio_register_driver() argument
784 bool manual_bind = drv->manual_bind; in __serio_register_driver()
787 drv->driver.bus = &serio_bus; in __serio_register_driver()
788 drv->driver.owner = owner; in __serio_register_driver()
789 drv->driver.mod_name = mod_name; in __serio_register_driver()
795 drv->manual_bind = true; in __serio_register_driver()
797 error = driver_register(&drv->driver); in __serio_register_driver()
800 drv->driver.name, error); in __serio_register_driver()
809 drv->manual_bind = false; in __serio_register_driver()
810 error = serio_queue_event(drv, NULL, SERIO_ATTACH_DRIVER); in __serio_register_driver()
812 driver_unregister(&drv->driver); in __serio_register_driver()
821 void serio_unregister_driver(struct serio_driver *drv) in serio_unregister_driver() argument
827 drv->manual_bind = true; /* so serio_find_driver ignores it */ in serio_unregister_driver()
828 serio_remove_pending_events(drv); in serio_unregister_driver()
832 if (serio->drv == drv) { in serio_unregister_driver()
840 driver_unregister(&drv->driver); in serio_unregister_driver()
844 static void serio_set_drv(struct serio *serio, struct serio_driver *drv) in serio_set_drv() argument
848 serio->drv = drv; in serio_set_drv()
851 static int serio_bus_match(struct device *dev, const struct device_driver *drv) in serio_bus_match() argument
854 const struct serio_driver *serio_drv = to_serio_driver(drv); in serio_bus_match()
856 if (serio->manual_bind || serio_drv->manual_bind) in serio_bus_match()
859 return serio_match_port(serio_drv->id_table, serio); in serio_bus_match()
874 return -ENODEV; in serio_uevent()
878 SERIO_ADD_UEVENT_VAR("SERIO_TYPE=%02x", serio->id.type); in serio_uevent()
879 SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); in serio_uevent()
880 SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); in serio_uevent()
881 SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); in serio_uevent()
884 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); in serio_uevent()
886 if (serio->firmware_id[0]) in serio_uevent()
888 serio->firmware_id); in serio_uevent()
907 int error = -ENOENT; in serio_resume()
909 scoped_guard(mutex, &serio->drv_mutex) { in serio_resume()
910 if (serio->drv && serio->drv->fast_reconnect) { in serio_resume()
911 error = serio->drv->fast_reconnect(serio); in serio_resume()
912 if (error && error != -ENOENT) in serio_resume()
937 /* called from serio_driver->connect/disconnect methods under serio_mutex */
938 int serio_open(struct serio *serio, struct serio_driver *drv) in serio_open() argument
940 serio_set_drv(serio, drv); in serio_open()
942 if (serio->open && serio->open(serio)) { in serio_open()
944 return -1; in serio_open()
950 /* called from serio_driver->connect/disconnect methods under serio_mutex */
953 if (serio->close) in serio_close()
954 serio->close(serio); in serio_close()
963 guard(spinlock_irqsave)(&serio->lock); in serio_interrupt()
965 if (likely(serio->drv)) in serio_interrupt()
966 return serio->drv->interrupt(serio, data, dfl); in serio_interrupt()
968 if (!dfl && device_is_registered(&serio->dev)) { in serio_interrupt()