29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 #include <linux/stddef.h>
32 #include <linux/module.h>
33 #include <linux/serio.h>
34 #include <linux/errno.h>
35 #include <linux/sched.h>
36 #include <linux/slab.h>
54 static void serio_add_port(
struct serio *
serio);
55 static int serio_reconnect_port(
struct serio *
serio);
56 static void serio_disconnect_port(
struct serio *
serio);
57 static void serio_reconnect_subtree(
struct serio *
serio);
58 static void serio_attach_driver(
struct serio_driver *drv);
65 retval = drv->
connect(serio, drv);
71 static int serio_reconnect_driver(
struct serio *serio)
76 if (serio->
drv && serio->
drv->reconnect)
77 retval = serio->
drv->reconnect(serio);
83 static void serio_disconnect_driver(
struct serio *serio)
87 serio->
drv->disconnect(serio);
91 static int serio_match_port(
const struct serio_device_id *ids,
struct serio *serio)
108 static int serio_bind_driver(
struct serio *serio,
struct serio_driver *drv)
112 if (serio_match_port(drv->
id_table, serio)) {
115 if (serio_connect_driver(serio, drv)) {
123 "device_bind_driver() failed for %s (%s) and %s, error: %d\n",
126 serio_disconnect_driver(serio);
134 static void serio_find_driver(
struct serio *serio)
141 "device_attach() failed for %s (%s), error: %d\n",
175 if (!list_empty(&serio_event_list)) {
178 list_del_init(&
event->node);
181 spin_unlock_irqrestore(&serio_event_lock, flags);
187 module_put(event->
owner);
191 static void serio_remove_duplicate_events(
void *
object,
200 if (
object == e->
object) {
209 list_del_init(&e->
node);
214 spin_unlock_irqrestore(&serio_event_lock, flags);
223 while ((event = serio_get_event())) {
225 switch (event->
type) {
228 serio_add_port(event->
object);
232 serio_reconnect_port(event->
object);
236 serio_disconnect_port(event->
object);
237 serio_find_driver(event->
object);
241 serio_reconnect_subtree(event->
object);
245 serio_attach_driver(event->
object);
249 serio_remove_duplicate_events(event->
object, event->
type);
250 serio_free_event(event);
256 static DECLARE_WORK(serio_event_work, serio_handle_event);
258 static int serio_queue_event(
void *
object,
struct module *
owner,
275 if (event->
object ==
object) {
276 if (event->
type == event_type)
284 pr_err(
"Not enough memory to queue event %d\n", event_type);
289 if (!try_module_get(owner)) {
290 pr_warning(
"Can't get module reference, dropping event %d\n",
299 event->owner =
owner;
302 queue_work(system_long_wq, &serio_event_work);
305 spin_unlock_irqrestore(&serio_event_lock, flags);
313 static void serio_remove_pending_events(
void *
object)
321 if (event->
object ==
object) {
322 list_del_init(&event->
node);
323 serio_free_event(event);
327 spin_unlock_irqrestore(&serio_event_lock, flags);
336 static struct serio *serio_get_pending_child(
struct serio *
parent)
346 serio =
event->object;
347 if (serio->
parent == parent) {
354 spin_unlock_irqrestore(&serio_event_lock, flags);
372 return sprintf(buf,
"serio:ty%02Xpr%02Xid%02Xex%02X\n",
373 serio->
id.type, serio->
id.proto, serio->
id.id, serio->
id.extra);
379 return sprintf(buf,
"%02x\n", serio->
id.type);
385 return sprintf(buf,
"%02x\n", serio->
id.proto);
391 return sprintf(buf,
"%02x\n", serio->
id.id);
397 return sprintf(buf,
"%02x\n", serio->
id.extra);
405 static struct attribute *serio_device_id_attrs[] = {
407 &dev_attr_proto.attr,
409 &dev_attr_extra.attr,
415 .attrs = serio_device_id_attrs,
419 &serio_id_attr_group,
433 if (!
strncmp(buf,
"none", count)) {
434 serio_disconnect_port(serio);
435 }
else if (!
strncmp(buf,
"reconnect", count)) {
436 serio_reconnect_subtree(serio);
437 }
else if (!
strncmp(buf,
"rescan", count)) {
438 serio_disconnect_port(serio);
439 serio_find_driver(serio);
442 serio_disconnect_port(serio);
451 return error ? error :
count;
466 if (!
strncmp(buf,
"manual", count)) {
468 }
else if (!
strncmp(buf,
"auto", count)) {
486 static void serio_release_port(
struct device *dev)
497 static void serio_init_port(
struct serio *serio)
503 INIT_LIST_HEAD(&serio->
node);
511 serio->
dev.bus = &serio_bus;
512 serio->
dev.release = serio_release_port;
513 serio->
dev.groups = serio_device_attr_groups;
526 static void serio_add_port(
struct serio *serio)
528 struct serio *parent = serio->
parent;
532 serio_pause_rx(parent);
534 serio_continue_rx(parent);
545 "device_add() failed for %s (%s), error: %d\n",
553 static void serio_destroy_port(
struct serio *serio)
557 while ((child = serio_get_pending_child(serio)) !=
NULL) {
558 serio_remove_pending_events(child);
566 serio_pause_rx(serio->
parent);
568 serio_continue_rx(serio->
parent);
572 if (device_is_registered(&serio->
dev))
575 list_del_init(&serio->
node);
576 serio_remove_pending_events(serio);
586 static int serio_reconnect_port(
struct serio *serio)
588 int error = serio_reconnect_driver(serio);
591 serio_disconnect_port(serio);
592 serio_find_driver(serio);
602 static void serio_reconnect_subtree(
struct serio *root)
604 struct serio *
s = root;
608 error = serio_reconnect_port(s);
627 struct serio *parent = s->
parent;
644 static void serio_disconnect_port(
struct serio *serio)
646 struct serio *s = serio;
652 while (!list_empty(&serio->
children)) {
664 struct serio *parent = s->
parent;
667 serio_destroy_port(s);
697 serio_init_port(serio);
708 serio_disconnect_port(serio);
709 serio_destroy_port(serio);
719 struct serio *
s, *
next;
723 serio_disconnect_port(s);
724 serio_destroy_port(s);
747 static ssize_t serio_driver_set_bind_mode(
struct device_driver *drv,
const char *buf,
size_t count)
753 if (!
strncmp(buf,
"manual", count)) {
755 }
else if (!
strncmp(buf,
"auto", count)) {
768 serio_driver_show_bind_mode, serio_driver_set_bind_mode),
772 static int serio_driver_probe(
struct device *dev)
777 return serio_connect_driver(serio, drv);
780 static int serio_driver_remove(
struct device *dev)
784 serio_disconnect_driver(serio);
788 static void serio_cleanup(
struct serio *serio)
791 if (serio->
drv && serio->
drv->cleanup)
792 serio->
drv->cleanup(serio);
796 static void serio_shutdown(
struct device *dev)
800 serio_cleanup(serio);
803 static void serio_attach_driver(
struct serio_driver *drv)
809 pr_warning(
"driver_attach() failed for %s with error %d\n",
818 drv->
driver.bus = &serio_bus;
820 drv->
driver.mod_name = mod_name;
830 pr_err(
"driver_register() failed for %s, error: %d\n",
859 serio_remove_pending_events(drv);
863 if (serio->
drv == drv) {
864 serio_disconnect_port(serio);
865 serio_find_driver(serio);
876 static void serio_set_drv(
struct serio *serio,
struct serio_driver *drv)
878 serio_pause_rx(serio);
880 serio_continue_rx(serio);
891 return serio_match_port(serio_drv->
id_table, serio);
894 #ifdef CONFIG_HOTPLUG
896 #define SERIO_ADD_UEVENT_VAR(fmt, val...) \
898 int err = add_uevent_var(env, fmt, val); \
912 SERIO_ADD_UEVENT_VAR(
"SERIO_TYPE=%02x", serio->
id.type);
913 SERIO_ADD_UEVENT_VAR(
"SERIO_PROTO=%02x", serio->
id.proto);
914 SERIO_ADD_UEVENT_VAR(
"SERIO_ID=%02x", serio->
id.id);
915 SERIO_ADD_UEVENT_VAR(
"SERIO_EXTRA=%02x", serio->
id.extra);
916 SERIO_ADD_UEVENT_VAR(
"MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X",
917 serio->
id.type, serio->
id.proto, serio->
id.id, serio->
id.extra);
921 #undef SERIO_ADD_UEVENT_VAR
933 static int serio_suspend(
struct device *dev)
937 serio_cleanup(serio);
942 static int serio_resume(
struct device *dev)
955 static const struct dev_pm_ops serio_pm_ops = {
957 .resume = serio_resume,
958 .poweroff = serio_suspend,
959 .restore = serio_resume,
966 serio_set_drv(serio, drv);
968 if (serio->
open && serio->
open(serio)) {
969 serio_set_drv(serio,
NULL);
982 serio_set_drv(serio,
NULL);
987 unsigned char data,
unsigned int dfl)
995 ret = serio->
drv->interrupt(serio, data, dfl);
996 }
else if (!dfl && device_is_registered(&serio->
dev)) {
1001 spin_unlock_irqrestore(&serio->
lock, flags);
1007 static struct bus_type serio_bus = {
1009 .dev_attrs = serio_device_attrs,
1010 .drv_attrs = serio_driver_attrs,
1011 .match = serio_bus_match,
1012 .uevent = serio_uevent,
1013 .probe = serio_driver_probe,
1014 .remove = serio_driver_remove,
1015 .shutdown = serio_shutdown,
1017 .pm = &serio_pm_ops,
1021 static int __init serio_init(
void)
1027 pr_err(
"Failed to register serio bus, error: %d\n", error);
1034 static void __exit serio_exit(
void)