LCOV - code coverage report
Current view: top level - drivers/input/serio - serio.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 59 401 14.7 %
Date: 2022-12-09 01:23:36 Functions: 7 53 13.2 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /*
       3             :  *  The Serio abstraction module
       4             :  *
       5             :  *  Copyright (c) 1999-2004 Vojtech Pavlik
       6             :  *  Copyright (c) 2004 Dmitry Torokhov
       7             :  *  Copyright (c) 2003 Daniele Bellucci
       8             :  */
       9             : 
      10             : /*
      11             :  */
      12             : 
      13             : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      14             : 
      15             : #include <linux/stddef.h>
      16             : #include <linux/module.h>
      17             : #include <linux/serio.h>
      18             : #include <linux/errno.h>
      19             : #include <linux/sched.h>
      20             : #include <linux/slab.h>
      21             : #include <linux/workqueue.h>
      22             : #include <linux/mutex.h>
      23             : 
      24             : MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
      25             : MODULE_DESCRIPTION("Serio abstraction core");
      26             : MODULE_LICENSE("GPL");
      27             : 
      28             : /*
      29             :  * serio_mutex protects entire serio subsystem and is taken every time
      30             :  * serio port or driver registered or unregistered.
      31             :  */
      32             : static DEFINE_MUTEX(serio_mutex);
      33             : 
      34             : static LIST_HEAD(serio_list);
      35             : 
      36             : static void serio_add_port(struct serio *serio);
      37             : static int serio_reconnect_port(struct serio *serio);
      38             : static void serio_disconnect_port(struct serio *serio);
      39             : static void serio_reconnect_subtree(struct serio *serio);
      40             : static void serio_attach_driver(struct serio_driver *drv);
      41             : 
      42           0 : static int serio_connect_driver(struct serio *serio, struct serio_driver *drv)
      43             : {
      44             :         int retval;
      45             : 
      46           0 :         mutex_lock(&serio->drv_mutex);
      47           0 :         retval = drv->connect(serio, drv);
      48           0 :         mutex_unlock(&serio->drv_mutex);
      49             : 
      50           0 :         return retval;
      51             : }
      52             : 
      53           0 : static int serio_reconnect_driver(struct serio *serio)
      54             : {
      55           0 :         int retval = -1;
      56             : 
      57           0 :         mutex_lock(&serio->drv_mutex);
      58           0 :         if (serio->drv && serio->drv->reconnect)
      59           0 :                 retval = serio->drv->reconnect(serio);
      60           0 :         mutex_unlock(&serio->drv_mutex);
      61             : 
      62           0 :         return retval;
      63             : }
      64             : 
      65           0 : static void serio_disconnect_driver(struct serio *serio)
      66             : {
      67           0 :         mutex_lock(&serio->drv_mutex);
      68           0 :         if (serio->drv)
      69           0 :                 serio->drv->disconnect(serio);
      70           0 :         mutex_unlock(&serio->drv_mutex);
      71           0 : }
      72             : 
      73           0 : static int serio_match_port(const struct serio_device_id *ids, struct serio *serio)
      74             : {
      75           0 :         while (ids->type || ids->proto) {
      76           0 :                 if ((ids->type == SERIO_ANY || ids->type == serio->id.type) &&
      77           0 :                     (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) &&
      78           0 :                     (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) &&
      79           0 :                     (ids->id == SERIO_ANY || ids->id == serio->id.id))
      80             :                         return 1;
      81           0 :                 ids++;
      82             :         }
      83             :         return 0;
      84             : }
      85             : 
      86             : /*
      87             :  * Basic serio -> driver core mappings
      88             :  */
      89             : 
      90           0 : static int serio_bind_driver(struct serio *serio, struct serio_driver *drv)
      91             : {
      92             :         int error;
      93             : 
      94           0 :         if (serio_match_port(drv->id_table, serio)) {
      95             : 
      96           0 :                 serio->dev.driver = &drv->driver;
      97           0 :                 if (serio_connect_driver(serio, drv)) {
      98           0 :                         serio->dev.driver = NULL;
      99           0 :                         return -ENODEV;
     100             :                 }
     101             : 
     102           0 :                 error = device_bind_driver(&serio->dev);
     103           0 :                 if (error) {
     104           0 :                         dev_warn(&serio->dev,
     105             :                                  "device_bind_driver() failed for %s (%s) and %s, error: %d\n",
     106             :                                  serio->phys, serio->name,
     107             :                                  drv->description, error);
     108           0 :                         serio_disconnect_driver(serio);
     109           0 :                         serio->dev.driver = NULL;
     110           0 :                         return error;
     111             :                 }
     112             :         }
     113             :         return 0;
     114             : }
     115             : 
     116           0 : static void serio_find_driver(struct serio *serio)
     117             : {
     118             :         int error;
     119             : 
     120           0 :         error = device_attach(&serio->dev);
     121           0 :         if (error < 0 && error != -EPROBE_DEFER)
     122           0 :                 dev_warn(&serio->dev,
     123             :                          "device_attach() failed for %s (%s), error: %d\n",
     124             :                          serio->phys, serio->name, error);
     125           0 : }
     126             : 
     127             : 
     128             : /*
     129             :  * Serio event processing.
     130             :  */
     131             : 
     132             : enum serio_event_type {
     133             :         SERIO_RESCAN_PORT,
     134             :         SERIO_RECONNECT_PORT,
     135             :         SERIO_RECONNECT_SUBTREE,
     136             :         SERIO_REGISTER_PORT,
     137             :         SERIO_ATTACH_DRIVER,
     138             : };
     139             : 
     140             : struct serio_event {
     141             :         enum serio_event_type type;
     142             :         void *object;
     143             :         struct module *owner;
     144             :         struct list_head node;
     145             : };
     146             : 
     147             : static DEFINE_SPINLOCK(serio_event_lock);       /* protects serio_event_list */
     148             : static LIST_HEAD(serio_event_list);
     149             : 
     150           3 : static struct serio_event *serio_get_event(void)
     151             : {
     152           3 :         struct serio_event *event = NULL;
     153             :         unsigned long flags;
     154             : 
     155           3 :         spin_lock_irqsave(&serio_event_lock, flags);
     156             : 
     157           3 :         if (!list_empty(&serio_event_list)) {
     158           2 :                 event = list_first_entry(&serio_event_list,
     159             :                                          struct serio_event, node);
     160           2 :                 list_del_init(&event->node);
     161             :         }
     162             : 
     163           3 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     164           3 :         return event;
     165             : }
     166             : 
     167             : static void serio_free_event(struct serio_event *event)
     168             : {
     169           2 :         module_put(event->owner);
     170           2 :         kfree(event);
     171             : }
     172             : 
     173           2 : static void serio_remove_duplicate_events(void *object,
     174             :                                           enum serio_event_type type)
     175             : {
     176             :         struct serio_event *e, *next;
     177             :         unsigned long flags;
     178             : 
     179           2 :         spin_lock_irqsave(&serio_event_lock, flags);
     180             : 
     181           3 :         list_for_each_entry_safe(e, next, &serio_event_list, node) {
     182           1 :                 if (object == e->object) {
     183             :                         /*
     184             :                          * If this event is of different type we should not
     185             :                          * look further - we only suppress duplicate events
     186             :                          * that were sent back-to-back.
     187             :                          */
     188           0 :                         if (type != e->type)
     189             :                                 break;
     190             : 
     191           0 :                         list_del_init(&e->node);
     192             :                         serio_free_event(e);
     193             :                 }
     194             :         }
     195             : 
     196           2 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     197           2 : }
     198             : 
     199           1 : static void serio_handle_event(struct work_struct *work)
     200             : {
     201             :         struct serio_event *event;
     202             : 
     203           1 :         mutex_lock(&serio_mutex);
     204             : 
     205           4 :         while ((event = serio_get_event())) {
     206             : 
     207           2 :                 switch (event->type) {
     208             : 
     209             :                 case SERIO_REGISTER_PORT:
     210           0 :                         serio_add_port(event->object);
     211           0 :                         break;
     212             : 
     213             :                 case SERIO_RECONNECT_PORT:
     214           0 :                         serio_reconnect_port(event->object);
     215           0 :                         break;
     216             : 
     217             :                 case SERIO_RESCAN_PORT:
     218           0 :                         serio_disconnect_port(event->object);
     219           0 :                         serio_find_driver(event->object);
     220           0 :                         break;
     221             : 
     222             :                 case SERIO_RECONNECT_SUBTREE:
     223           0 :                         serio_reconnect_subtree(event->object);
     224           0 :                         break;
     225             : 
     226             :                 case SERIO_ATTACH_DRIVER:
     227           2 :                         serio_attach_driver(event->object);
     228           2 :                         break;
     229             :                 }
     230             : 
     231           2 :                 serio_remove_duplicate_events(event->object, event->type);
     232             :                 serio_free_event(event);
     233             :         }
     234             : 
     235           1 :         mutex_unlock(&serio_mutex);
     236           1 : }
     237             : 
     238             : static DECLARE_WORK(serio_event_work, serio_handle_event);
     239             : 
     240           2 : static int serio_queue_event(void *object, struct module *owner,
     241             :                              enum serio_event_type event_type)
     242             : {
     243             :         unsigned long flags;
     244             :         struct serio_event *event;
     245           2 :         int retval = 0;
     246             : 
     247           2 :         spin_lock_irqsave(&serio_event_lock, flags);
     248             : 
     249             :         /*
     250             :          * Scan event list for the other events for the same serio port,
     251             :          * starting with the most recent one. If event is the same we
     252             :          * do not need add new one. If event is of different type we
     253             :          * need to add this event and should not look further because
     254             :          * we need to preseve sequence of distinct events.
     255             :          */
     256           3 :         list_for_each_entry_reverse(event, &serio_event_list, node) {
     257           1 :                 if (event->object == object) {
     258           0 :                         if (event->type == event_type)
     259             :                                 goto out;
     260             :                         break;
     261             :                 }
     262             :         }
     263             : 
     264           2 :         event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC);
     265           2 :         if (!event) {
     266           0 :                 pr_err("Not enough memory to queue event %d\n", event_type);
     267           0 :                 retval = -ENOMEM;
     268           0 :                 goto out;
     269             :         }
     270             : 
     271           2 :         if (!try_module_get(owner)) {
     272             :                 pr_warn("Can't get module reference, dropping event %d\n",
     273             :                         event_type);
     274             :                 kfree(event);
     275             :                 retval = -EINVAL;
     276             :                 goto out;
     277             :         }
     278             : 
     279           2 :         event->type = event_type;
     280           2 :         event->object = object;
     281           2 :         event->owner = owner;
     282             : 
     283           4 :         list_add_tail(&event->node, &serio_event_list);
     284           2 :         queue_work(system_long_wq, &serio_event_work);
     285             : 
     286             : out:
     287           2 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     288           2 :         return retval;
     289             : }
     290             : 
     291             : /*
     292             :  * Remove all events that have been submitted for a given
     293             :  * object, be it serio port or driver.
     294             :  */
     295           0 : static void serio_remove_pending_events(void *object)
     296             : {
     297             :         struct serio_event *event, *next;
     298             :         unsigned long flags;
     299             : 
     300           0 :         spin_lock_irqsave(&serio_event_lock, flags);
     301             : 
     302           0 :         list_for_each_entry_safe(event, next, &serio_event_list, node) {
     303           0 :                 if (event->object == object) {
     304           0 :                         list_del_init(&event->node);
     305             :                         serio_free_event(event);
     306             :                 }
     307             :         }
     308             : 
     309           0 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     310           0 : }
     311             : 
     312             : /*
     313             :  * Locate child serio port (if any) that has not been fully registered yet.
     314             :  *
     315             :  * Children are registered by driver's connect() handler so there can't be a
     316             :  * grandchild pending registration together with a child.
     317             :  */
     318           0 : static struct serio *serio_get_pending_child(struct serio *parent)
     319             : {
     320             :         struct serio_event *event;
     321           0 :         struct serio *serio, *child = NULL;
     322             :         unsigned long flags;
     323             : 
     324           0 :         spin_lock_irqsave(&serio_event_lock, flags);
     325             : 
     326           0 :         list_for_each_entry(event, &serio_event_list, node) {
     327           0 :                 if (event->type == SERIO_REGISTER_PORT) {
     328           0 :                         serio = event->object;
     329           0 :                         if (serio->parent == parent) {
     330             :                                 child = serio;
     331             :                                 break;
     332             :                         }
     333             :                 }
     334             :         }
     335             : 
     336           0 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     337           0 :         return child;
     338             : }
     339             : 
     340             : /*
     341             :  * Serio port operations
     342             :  */
     343             : 
     344           0 : static ssize_t serio_show_description(struct device *dev, struct device_attribute *attr, char *buf)
     345             : {
     346           0 :         struct serio *serio = to_serio_port(dev);
     347           0 :         return sprintf(buf, "%s\n", serio->name);
     348             : }
     349             : 
     350           0 : static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
     351             : {
     352           0 :         struct serio *serio = to_serio_port(dev);
     353             : 
     354           0 :         return sprintf(buf, "serio:ty%02Xpr%02Xid%02Xex%02X\n",
     355           0 :                         serio->id.type, serio->id.proto, serio->id.id, serio->id.extra);
     356             : }
     357             : 
     358           0 : static ssize_t type_show(struct device *dev, struct device_attribute *attr, char *buf)
     359             : {
     360           0 :         struct serio *serio = to_serio_port(dev);
     361           0 :         return sprintf(buf, "%02x\n", serio->id.type);
     362             : }
     363             : 
     364           0 : static ssize_t proto_show(struct device *dev, struct device_attribute *attr, char *buf)
     365             : {
     366           0 :         struct serio *serio = to_serio_port(dev);
     367           0 :         return sprintf(buf, "%02x\n", serio->id.proto);
     368             : }
     369             : 
     370           0 : static ssize_t id_show(struct device *dev, struct device_attribute *attr, char *buf)
     371             : {
     372           0 :         struct serio *serio = to_serio_port(dev);
     373           0 :         return sprintf(buf, "%02x\n", serio->id.id);
     374             : }
     375             : 
     376           0 : static ssize_t extra_show(struct device *dev, struct device_attribute *attr, char *buf)
     377             : {
     378           0 :         struct serio *serio = to_serio_port(dev);
     379           0 :         return sprintf(buf, "%02x\n", serio->id.extra);
     380             : }
     381             : 
     382           0 : static ssize_t drvctl_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
     383             : {
     384           0 :         struct serio *serio = to_serio_port(dev);
     385             :         struct device_driver *drv;
     386             :         int error;
     387             : 
     388           0 :         error = mutex_lock_interruptible(&serio_mutex);
     389           0 :         if (error)
     390           0 :                 return error;
     391             : 
     392           0 :         if (!strncmp(buf, "none", count)) {
     393           0 :                 serio_disconnect_port(serio);
     394           0 :         } else if (!strncmp(buf, "reconnect", count)) {
     395           0 :                 serio_reconnect_subtree(serio);
     396           0 :         } else if (!strncmp(buf, "rescan", count)) {
     397           0 :                 serio_disconnect_port(serio);
     398           0 :                 serio_find_driver(serio);
     399           0 :                 serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT);
     400           0 :         } else if ((drv = driver_find(buf, &serio_bus)) != NULL) {
     401           0 :                 serio_disconnect_port(serio);
     402           0 :                 error = serio_bind_driver(serio, to_serio_driver(drv));
     403           0 :                 serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT);
     404             :         } else {
     405             :                 error = -EINVAL;
     406             :         }
     407             : 
     408           0 :         mutex_unlock(&serio_mutex);
     409             : 
     410           0 :         return error ? error : count;
     411             : }
     412             : 
     413           0 : static ssize_t serio_show_bind_mode(struct device *dev, struct device_attribute *attr, char *buf)
     414             : {
     415           0 :         struct serio *serio = to_serio_port(dev);
     416           0 :         return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto");
     417             : }
     418             : 
     419           0 : static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
     420             : {
     421           0 :         struct serio *serio = to_serio_port(dev);
     422             :         int retval;
     423             : 
     424           0 :         retval = count;
     425           0 :         if (!strncmp(buf, "manual", count)) {
     426           0 :                 serio->manual_bind = true;
     427           0 :         } else if (!strncmp(buf, "auto", count)) {
     428           0 :                 serio->manual_bind = false;
     429             :         } else {
     430             :                 retval = -EINVAL;
     431             :         }
     432             : 
     433           0 :         return retval;
     434             : }
     435             : 
     436           0 : static ssize_t firmware_id_show(struct device *dev, struct device_attribute *attr, char *buf)
     437             : {
     438           0 :         struct serio *serio = to_serio_port(dev);
     439             : 
     440           0 :         return sprintf(buf, "%s\n", serio->firmware_id);
     441             : }
     442             : 
     443             : static DEVICE_ATTR_RO(type);
     444             : static DEVICE_ATTR_RO(proto);
     445             : static DEVICE_ATTR_RO(id);
     446             : static DEVICE_ATTR_RO(extra);
     447             : 
     448             : static struct attribute *serio_device_id_attrs[] = {
     449             :         &dev_attr_type.attr,
     450             :         &dev_attr_proto.attr,
     451             :         &dev_attr_id.attr,
     452             :         &dev_attr_extra.attr,
     453             :         NULL
     454             : };
     455             : 
     456             : static const struct attribute_group serio_id_attr_group = {
     457             :         .name   = "id",
     458             :         .attrs  = serio_device_id_attrs,
     459             : };
     460             : 
     461             : static DEVICE_ATTR_RO(modalias);
     462             : static DEVICE_ATTR_WO(drvctl);
     463             : static DEVICE_ATTR(description, S_IRUGO, serio_show_description, NULL);
     464             : static DEVICE_ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode);
     465             : static DEVICE_ATTR_RO(firmware_id);
     466             : 
     467             : static struct attribute *serio_device_attrs[] = {
     468             :         &dev_attr_modalias.attr,
     469             :         &dev_attr_description.attr,
     470             :         &dev_attr_drvctl.attr,
     471             :         &dev_attr_bind_mode.attr,
     472             :         &dev_attr_firmware_id.attr,
     473             :         NULL
     474             : };
     475             : 
     476             : static const struct attribute_group serio_device_attr_group = {
     477             :         .attrs  = serio_device_attrs,
     478             : };
     479             : 
     480             : static const struct attribute_group *serio_device_attr_groups[] = {
     481             :         &serio_id_attr_group,
     482             :         &serio_device_attr_group,
     483             :         NULL
     484             : };
     485             : 
     486           0 : static void serio_release_port(struct device *dev)
     487             : {
     488           0 :         struct serio *serio = to_serio_port(dev);
     489             : 
     490           0 :         kfree(serio);
     491           0 :         module_put(THIS_MODULE);
     492           0 : }
     493             : 
     494             : /*
     495             :  * Prepare serio port for registration.
     496             :  */
     497           0 : static void serio_init_port(struct serio *serio)
     498             : {
     499             :         static atomic_t serio_no = ATOMIC_INIT(-1);
     500             : 
     501           0 :         __module_get(THIS_MODULE);
     502             : 
     503           0 :         INIT_LIST_HEAD(&serio->node);
     504           0 :         INIT_LIST_HEAD(&serio->child_node);
     505           0 :         INIT_LIST_HEAD(&serio->children);
     506           0 :         spin_lock_init(&serio->lock);
     507           0 :         mutex_init(&serio->drv_mutex);
     508           0 :         device_initialize(&serio->dev);
     509           0 :         dev_set_name(&serio->dev, "serio%lu",
     510           0 :                      (unsigned long)atomic_inc_return(&serio_no));
     511           0 :         serio->dev.bus = &serio_bus;
     512           0 :         serio->dev.release = serio_release_port;
     513           0 :         serio->dev.groups = serio_device_attr_groups;
     514           0 :         if (serio->parent) {
     515           0 :                 serio->dev.parent = &serio->parent->dev;
     516           0 :                 serio->depth = serio->parent->depth + 1;
     517             :         } else
     518           0 :                 serio->depth = 0;
     519             :         lockdep_set_subclass(&serio->lock, serio->depth);
     520           0 : }
     521             : 
     522             : /*
     523             :  * Complete serio port registration.
     524             :  * Driver core will attempt to find appropriate driver for the port.
     525             :  */
     526           0 : static void serio_add_port(struct serio *serio)
     527             : {
     528           0 :         struct serio *parent = serio->parent;
     529             :         int error;
     530             : 
     531           0 :         if (parent) {
     532           0 :                 serio_pause_rx(parent);
     533           0 :                 list_add_tail(&serio->child_node, &parent->children);
     534           0 :                 serio_continue_rx(parent);
     535             :         }
     536             : 
     537           0 :         list_add_tail(&serio->node, &serio_list);
     538             : 
     539           0 :         if (serio->start)
     540           0 :                 serio->start(serio);
     541             : 
     542           0 :         error = device_add(&serio->dev);
     543           0 :         if (error)
     544           0 :                 dev_err(&serio->dev,
     545             :                         "device_add() failed for %s (%s), error: %d\n",
     546             :                         serio->phys, serio->name, error);
     547           0 : }
     548             : 
     549             : /*
     550             :  * serio_destroy_port() completes unregistration process and removes
     551             :  * port from the system
     552             :  */
     553           0 : static void serio_destroy_port(struct serio *serio)
     554             : {
     555             :         struct serio *child;
     556             : 
     557           0 :         while ((child = serio_get_pending_child(serio)) != NULL) {
     558           0 :                 serio_remove_pending_events(child);
     559           0 :                 put_device(&child->dev);
     560             :         }
     561             : 
     562           0 :         if (serio->stop)
     563           0 :                 serio->stop(serio);
     564             : 
     565           0 :         if (serio->parent) {
     566           0 :                 serio_pause_rx(serio->parent);
     567           0 :                 list_del_init(&serio->child_node);
     568           0 :                 serio_continue_rx(serio->parent);
     569           0 :                 serio->parent = NULL;
     570             :         }
     571             : 
     572           0 :         if (device_is_registered(&serio->dev))
     573           0 :                 device_del(&serio->dev);
     574             : 
     575           0 :         list_del_init(&serio->node);
     576           0 :         serio_remove_pending_events(serio);
     577           0 :         put_device(&serio->dev);
     578           0 : }
     579             : 
     580             : /*
     581             :  * Reconnect serio port (re-initialize attached device).
     582             :  * If reconnect fails (old device is no longer attached or
     583             :  * there was no device to begin with) we do full rescan in
     584             :  * hope of finding a driver for the port.
     585             :  */
     586           0 : static int serio_reconnect_port(struct serio *serio)
     587             : {
     588           0 :         int error = serio_reconnect_driver(serio);
     589             : 
     590           0 :         if (error) {
     591           0 :                 serio_disconnect_port(serio);
     592           0 :                 serio_find_driver(serio);
     593             :         }
     594             : 
     595           0 :         return error;
     596             : }
     597             : 
     598             : /*
     599             :  * Reconnect serio port and all its children (re-initialize attached
     600             :  * devices).
     601             :  */
     602           0 : static void serio_reconnect_subtree(struct serio *root)
     603             : {
     604           0 :         struct serio *s = root;
     605             :         int error;
     606             : 
     607             :         do {
     608           0 :                 error = serio_reconnect_port(s);
     609           0 :                 if (!error) {
     610             :                         /*
     611             :                          * Reconnect was successful, move on to do the
     612             :                          * first child.
     613             :                          */
     614           0 :                         if (!list_empty(&s->children)) {
     615           0 :                                 s = list_first_entry(&s->children,
     616             :                                                      struct serio, child_node);
     617           0 :                                 continue;
     618             :                         }
     619             :                 }
     620             : 
     621             :                 /*
     622             :                  * Either it was a leaf node or reconnect failed and it
     623             :                  * became a leaf node. Continue reconnecting starting with
     624             :                  * the next sibling of the parent node.
     625             :                  */
     626           0 :                 while (s != root) {
     627           0 :                         struct serio *parent = s->parent;
     628             : 
     629           0 :                         if (!list_is_last(&s->child_node, &parent->children)) {
     630           0 :                                 s = list_entry(s->child_node.next,
     631             :                                                struct serio, child_node);
     632           0 :                                 break;
     633             :                         }
     634             : 
     635             :                         s = parent;
     636             :                 }
     637           0 :         } while (s != root);
     638           0 : }
     639             : 
     640             : /*
     641             :  * serio_disconnect_port() unbinds a port from its driver. As a side effect
     642             :  * all children ports are unbound and destroyed.
     643             :  */
     644           0 : static void serio_disconnect_port(struct serio *serio)
     645             : {
     646           0 :         struct serio *s = serio;
     647             : 
     648             :         /*
     649             :          * Children ports should be disconnected and destroyed
     650             :          * first; we travel the tree in depth-first order.
     651             :          */
     652           0 :         while (!list_empty(&serio->children)) {
     653             : 
     654             :                 /* Locate a leaf */
     655           0 :                 while (!list_empty(&s->children))
     656           0 :                         s = list_first_entry(&s->children,
     657             :                                              struct serio, child_node);
     658             : 
     659             :                 /*
     660             :                  * Prune this leaf node unless it is the one we
     661             :                  * started with.
     662             :                  */
     663           0 :                 if (s != serio) {
     664           0 :                         struct serio *parent = s->parent;
     665             : 
     666           0 :                         device_release_driver(&s->dev);
     667           0 :                         serio_destroy_port(s);
     668             : 
     669           0 :                         s = parent;
     670             :                 }
     671             :         }
     672             : 
     673             :         /*
     674             :          * OK, no children left, now disconnect this port.
     675             :          */
     676           0 :         device_release_driver(&serio->dev);
     677           0 : }
     678             : 
     679           0 : void serio_rescan(struct serio *serio)
     680             : {
     681           0 :         serio_queue_event(serio, NULL, SERIO_RESCAN_PORT);
     682           0 : }
     683             : EXPORT_SYMBOL(serio_rescan);
     684             : 
     685           0 : void serio_reconnect(struct serio *serio)
     686             : {
     687           0 :         serio_queue_event(serio, NULL, SERIO_RECONNECT_SUBTREE);
     688           0 : }
     689             : EXPORT_SYMBOL(serio_reconnect);
     690             : 
     691             : /*
     692             :  * Submits register request to kseriod for subsequent execution.
     693             :  * Note that port registration is always asynchronous.
     694             :  */
     695           0 : void __serio_register_port(struct serio *serio, struct module *owner)
     696             : {
     697           0 :         serio_init_port(serio);
     698           0 :         serio_queue_event(serio, owner, SERIO_REGISTER_PORT);
     699           0 : }
     700             : EXPORT_SYMBOL(__serio_register_port);
     701             : 
     702             : /*
     703             :  * Synchronously unregisters serio port.
     704             :  */
     705           0 : void serio_unregister_port(struct serio *serio)
     706             : {
     707           0 :         mutex_lock(&serio_mutex);
     708           0 :         serio_disconnect_port(serio);
     709           0 :         serio_destroy_port(serio);
     710           0 :         mutex_unlock(&serio_mutex);
     711           0 : }
     712             : EXPORT_SYMBOL(serio_unregister_port);
     713             : 
     714             : /*
     715             :  * Safely unregisters children ports if they are present.
     716             :  */
     717           0 : void serio_unregister_child_port(struct serio *serio)
     718             : {
     719             :         struct serio *s, *next;
     720             : 
     721           0 :         mutex_lock(&serio_mutex);
     722           0 :         list_for_each_entry_safe(s, next, &serio->children, child_node) {
     723           0 :                 serio_disconnect_port(s);
     724           0 :                 serio_destroy_port(s);
     725             :         }
     726           0 :         mutex_unlock(&serio_mutex);
     727           0 : }
     728             : EXPORT_SYMBOL(serio_unregister_child_port);
     729             : 
     730             : 
     731             : /*
     732             :  * Serio driver operations
     733             :  */
     734             : 
     735           0 : static ssize_t description_show(struct device_driver *drv, char *buf)
     736             : {
     737           0 :         struct serio_driver *driver = to_serio_driver(drv);
     738           0 :         return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)");
     739             : }
     740             : static DRIVER_ATTR_RO(description);
     741             : 
     742           0 : static ssize_t bind_mode_show(struct device_driver *drv, char *buf)
     743             : {
     744           0 :         struct serio_driver *serio_drv = to_serio_driver(drv);
     745           0 :         return sprintf(buf, "%s\n", serio_drv->manual_bind ? "manual" : "auto");
     746             : }
     747             : 
     748           0 : static ssize_t bind_mode_store(struct device_driver *drv, const char *buf, size_t count)
     749             : {
     750           0 :         struct serio_driver *serio_drv = to_serio_driver(drv);
     751             :         int retval;
     752             : 
     753           0 :         retval = count;
     754           0 :         if (!strncmp(buf, "manual", count)) {
     755           0 :                 serio_drv->manual_bind = true;
     756           0 :         } else if (!strncmp(buf, "auto", count)) {
     757           0 :                 serio_drv->manual_bind = false;
     758             :         } else {
     759             :                 retval = -EINVAL;
     760             :         }
     761             : 
     762           0 :         return retval;
     763             : }
     764             : static DRIVER_ATTR_RW(bind_mode);
     765             : 
     766             : static struct attribute *serio_driver_attrs[] = {
     767             :         &driver_attr_description.attr,
     768             :         &driver_attr_bind_mode.attr,
     769             :         NULL,
     770             : };
     771             : ATTRIBUTE_GROUPS(serio_driver);
     772             : 
     773           0 : static int serio_driver_probe(struct device *dev)
     774             : {
     775           0 :         struct serio *serio = to_serio_port(dev);
     776           0 :         struct serio_driver *drv = to_serio_driver(dev->driver);
     777             : 
     778           0 :         return serio_connect_driver(serio, drv);
     779             : }
     780             : 
     781           0 : static void serio_driver_remove(struct device *dev)
     782             : {
     783           0 :         struct serio *serio = to_serio_port(dev);
     784             : 
     785           0 :         serio_disconnect_driver(serio);
     786           0 : }
     787             : 
     788           0 : static void serio_cleanup(struct serio *serio)
     789             : {
     790           0 :         mutex_lock(&serio->drv_mutex);
     791           0 :         if (serio->drv && serio->drv->cleanup)
     792           0 :                 serio->drv->cleanup(serio);
     793           0 :         mutex_unlock(&serio->drv_mutex);
     794           0 : }
     795             : 
     796           0 : static void serio_shutdown(struct device *dev)
     797             : {
     798           0 :         struct serio *serio = to_serio_port(dev);
     799             : 
     800           0 :         serio_cleanup(serio);
     801           0 : }
     802             : 
     803           2 : static void serio_attach_driver(struct serio_driver *drv)
     804             : {
     805             :         int error;
     806             : 
     807           2 :         error = driver_attach(&drv->driver);
     808           2 :         if (error)
     809           0 :                 pr_warn("driver_attach() failed for %s with error %d\n",
     810             :                         drv->driver.name, error);
     811           2 : }
     812             : 
     813           2 : int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name)
     814             : {
     815           2 :         bool manual_bind = drv->manual_bind;
     816             :         int error;
     817             : 
     818           2 :         drv->driver.bus = &serio_bus;
     819           2 :         drv->driver.owner = owner;
     820           2 :         drv->driver.mod_name = mod_name;
     821             : 
     822             :         /*
     823             :          * Temporarily disable automatic binding because probing
     824             :          * takes long time and we are better off doing it in kseriod
     825             :          */
     826           2 :         drv->manual_bind = true;
     827             : 
     828           2 :         error = driver_register(&drv->driver);
     829           2 :         if (error) {
     830           0 :                 pr_err("driver_register() failed for %s, error: %d\n",
     831             :                         drv->driver.name, error);
     832           0 :                 return error;
     833             :         }
     834             : 
     835             :         /*
     836             :          * Restore original bind mode and let kseriod bind the
     837             :          * driver to free ports
     838             :          */
     839           2 :         if (!manual_bind) {
     840           2 :                 drv->manual_bind = false;
     841           2 :                 error = serio_queue_event(drv, NULL, SERIO_ATTACH_DRIVER);
     842           2 :                 if (error) {
     843           0 :                         driver_unregister(&drv->driver);
     844           0 :                         return error;
     845             :                 }
     846             :         }
     847             : 
     848             :         return 0;
     849             : }
     850             : EXPORT_SYMBOL(__serio_register_driver);
     851             : 
     852           0 : void serio_unregister_driver(struct serio_driver *drv)
     853             : {
     854             :         struct serio *serio;
     855             : 
     856           0 :         mutex_lock(&serio_mutex);
     857             : 
     858           0 :         drv->manual_bind = true;     /* so serio_find_driver ignores it */
     859           0 :         serio_remove_pending_events(drv);
     860             : 
     861             : start_over:
     862           0 :         list_for_each_entry(serio, &serio_list, node) {
     863           0 :                 if (serio->drv == drv) {
     864           0 :                         serio_disconnect_port(serio);
     865           0 :                         serio_find_driver(serio);
     866             :                         /* we could've deleted some ports, restart */
     867           0 :                         goto start_over;
     868             :                 }
     869             :         }
     870             : 
     871           0 :         driver_unregister(&drv->driver);
     872           0 :         mutex_unlock(&serio_mutex);
     873           0 : }
     874             : EXPORT_SYMBOL(serio_unregister_driver);
     875             : 
     876             : static void serio_set_drv(struct serio *serio, struct serio_driver *drv)
     877             : {
     878           0 :         serio_pause_rx(serio);
     879           0 :         serio->drv = drv;
     880           0 :         serio_continue_rx(serio);
     881             : }
     882             : 
     883           0 : static int serio_bus_match(struct device *dev, struct device_driver *drv)
     884             : {
     885           0 :         struct serio *serio = to_serio_port(dev);
     886           0 :         struct serio_driver *serio_drv = to_serio_driver(drv);
     887             : 
     888           0 :         if (serio->manual_bind || serio_drv->manual_bind)
     889             :                 return 0;
     890             : 
     891           0 :         return serio_match_port(serio_drv->id_table, serio);
     892             : }
     893             : 
     894             : #define SERIO_ADD_UEVENT_VAR(fmt, val...)                               \
     895             :         do {                                                            \
     896             :                 int err = add_uevent_var(env, fmt, val);                \
     897             :                 if (err)                                                \
     898             :                         return err;                                     \
     899             :         } while (0)
     900             : 
     901           0 : static int serio_uevent(struct device *dev, struct kobj_uevent_env *env)
     902             : {
     903             :         struct serio *serio;
     904             : 
     905           0 :         if (!dev)
     906             :                 return -ENODEV;
     907             : 
     908           0 :         serio = to_serio_port(dev);
     909             : 
     910           0 :         SERIO_ADD_UEVENT_VAR("SERIO_TYPE=%02x", serio->id.type);
     911           0 :         SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto);
     912           0 :         SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id);
     913           0 :         SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra);
     914             : 
     915           0 :         SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X",
     916             :                                 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra);
     917             : 
     918           0 :         if (serio->firmware_id[0])
     919           0 :                 SERIO_ADD_UEVENT_VAR("SERIO_FIRMWARE_ID=%s",
     920             :                                      serio->firmware_id);
     921             : 
     922             :         return 0;
     923             : }
     924             : #undef SERIO_ADD_UEVENT_VAR
     925             : 
     926             : #ifdef CONFIG_PM
     927           0 : static int serio_suspend(struct device *dev)
     928             : {
     929           0 :         struct serio *serio = to_serio_port(dev);
     930             : 
     931           0 :         serio_cleanup(serio);
     932             : 
     933           0 :         return 0;
     934             : }
     935             : 
     936           0 : static int serio_resume(struct device *dev)
     937             : {
     938           0 :         struct serio *serio = to_serio_port(dev);
     939           0 :         int error = -ENOENT;
     940             : 
     941           0 :         mutex_lock(&serio->drv_mutex);
     942           0 :         if (serio->drv && serio->drv->fast_reconnect) {
     943           0 :                 error = serio->drv->fast_reconnect(serio);
     944           0 :                 if (error && error != -ENOENT)
     945           0 :                         dev_warn(dev, "fast reconnect failed with error %d\n",
     946             :                                  error);
     947             :         }
     948           0 :         mutex_unlock(&serio->drv_mutex);
     949             : 
     950           0 :         if (error) {
     951             :                 /*
     952             :                  * Driver reconnect can take a while, so better let
     953             :                  * kseriod deal with it.
     954             :                  */
     955           0 :                 serio_queue_event(serio, NULL, SERIO_RECONNECT_PORT);
     956             :         }
     957             : 
     958           0 :         return 0;
     959             : }
     960             : 
     961             : static const struct dev_pm_ops serio_pm_ops = {
     962             :         .suspend        = serio_suspend,
     963             :         .resume         = serio_resume,
     964             :         .poweroff       = serio_suspend,
     965             :         .restore        = serio_resume,
     966             : };
     967             : #endif /* CONFIG_PM */
     968             : 
     969             : /* called from serio_driver->connect/disconnect methods under serio_mutex */
     970           0 : int serio_open(struct serio *serio, struct serio_driver *drv)
     971             : {
     972           0 :         serio_set_drv(serio, drv);
     973             : 
     974           0 :         if (serio->open && serio->open(serio)) {
     975           0 :                 serio_set_drv(serio, NULL);
     976           0 :                 return -1;
     977             :         }
     978             :         return 0;
     979             : }
     980             : EXPORT_SYMBOL(serio_open);
     981             : 
     982             : /* called from serio_driver->connect/disconnect methods under serio_mutex */
     983           0 : void serio_close(struct serio *serio)
     984             : {
     985           0 :         if (serio->close)
     986           0 :                 serio->close(serio);
     987             : 
     988           0 :         serio_set_drv(serio, NULL);
     989           0 : }
     990             : EXPORT_SYMBOL(serio_close);
     991             : 
     992           0 : irqreturn_t serio_interrupt(struct serio *serio,
     993             :                 unsigned char data, unsigned int dfl)
     994             : {
     995             :         unsigned long flags;
     996           0 :         irqreturn_t ret = IRQ_NONE;
     997             : 
     998           0 :         spin_lock_irqsave(&serio->lock, flags);
     999             : 
    1000           0 :         if (likely(serio->drv)) {
    1001           0 :                 ret = serio->drv->interrupt(serio, data, dfl);
    1002           0 :         } else if (!dfl && device_is_registered(&serio->dev)) {
    1003           0 :                 serio_rescan(serio);
    1004           0 :                 ret = IRQ_HANDLED;
    1005             :         }
    1006             : 
    1007           0 :         spin_unlock_irqrestore(&serio->lock, flags);
    1008             : 
    1009           0 :         return ret;
    1010             : }
    1011             : EXPORT_SYMBOL(serio_interrupt);
    1012             : 
    1013             : struct bus_type serio_bus = {
    1014             :         .name           = "serio",
    1015             :         .drv_groups     = serio_driver_groups,
    1016             :         .match          = serio_bus_match,
    1017             :         .uevent         = serio_uevent,
    1018             :         .probe          = serio_driver_probe,
    1019             :         .remove         = serio_driver_remove,
    1020             :         .shutdown       = serio_shutdown,
    1021             : #ifdef CONFIG_PM
    1022             :         .pm             = &serio_pm_ops,
    1023             : #endif
    1024             : };
    1025             : EXPORT_SYMBOL(serio_bus);
    1026             : 
    1027           1 : static int __init serio_init(void)
    1028             : {
    1029             :         int error;
    1030             : 
    1031           1 :         error = bus_register(&serio_bus);
    1032           1 :         if (error) {
    1033           0 :                 pr_err("Failed to register serio bus, error: %d\n", error);
    1034           0 :                 return error;
    1035             :         }
    1036             : 
    1037             :         return 0;
    1038             : }
    1039             : 
    1040           0 : static void __exit serio_exit(void)
    1041             : {
    1042           0 :         bus_unregister(&serio_bus);
    1043             : 
    1044             :         /*
    1045             :          * There should not be any outstanding events but work may
    1046             :          * still be scheduled so simply cancel it.
    1047             :          */
    1048           0 :         cancel_work_sync(&serio_event_work);
    1049           0 : }
    1050             : 
    1051             : subsys_initcall(serio_init);
    1052             : module_exit(serio_exit);

Generated by: LCOV version 1.14