LCOV - code coverage report
Current view: top level - drivers/input/serio - serio.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 158 448 35.3 %
Date: 2022-03-28 15:32:58 Functions: 18 53 34.0 %
Branches: 43 192 22.4 %

           Branch data     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                 :         84 : static int serio_connect_driver(struct serio *serio, struct serio_driver *drv)
      43                 :            : {
      44                 :         84 :         int retval;
      45                 :            : 
      46                 :         84 :         mutex_lock(&serio->drv_mutex);
      47                 :         84 :         retval = drv->connect(serio, drv);
      48                 :         84 :         mutex_unlock(&serio->drv_mutex);
      49                 :            : 
      50                 :         84 :         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                 :        112 : static int serio_match_port(const struct serio_device_id *ids, struct serio *serio)
      74                 :            : {
      75   [ +  +  -  + ]:        196 :         while (ids->type || ids->proto) {
      76   [ +  -  +  + ]:        168 :                 if ((ids->type == SERIO_ANY || ids->type == serio->id.type) &&
      77   [ -  +  -  - ]:         84 :                     (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) &&
      78   [ -  +  -  - ]:         84 :                     (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) &&
      79   [ -  +  -  - ]:         84 :                     (ids->id == SERIO_ANY || ids->id == serio->id.id))
      80                 :            :                         return 1;
      81                 :         84 :                 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                 :          0 :         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                 :          0 :         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                 :        224 : static struct serio_event *serio_get_event(void)
     151                 :            : {
     152                 :        224 :         struct serio_event *event = NULL;
     153                 :        224 :         unsigned long flags;
     154                 :            : 
     155                 :        224 :         spin_lock_irqsave(&serio_event_lock, flags);
     156                 :            : 
     157         [ +  + ]:        224 :         if (!list_empty(&serio_event_list)) {
     158                 :        112 :                 event = list_first_entry(&serio_event_list,
     159                 :            :                                          struct serio_event, node);
     160                 :        112 :                 list_del_init(&event->node);
     161                 :            :         }
     162                 :            : 
     163                 :        224 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     164                 :        224 :         return event;
     165                 :            : }
     166                 :            : 
     167                 :        112 : static void serio_free_event(struct serio_event *event)
     168                 :            : {
     169                 :        112 :         module_put(event->owner);
     170                 :        112 :         kfree(event);
     171                 :        112 : }
     172                 :            : 
     173                 :        112 : static void serio_remove_duplicate_events(void *object,
     174                 :            :                                           enum serio_event_type type)
     175                 :            : {
     176                 :        112 :         struct serio_event *e, *next;
     177                 :        112 :         unsigned long flags;
     178                 :            : 
     179                 :        112 :         spin_lock_irqsave(&serio_event_lock, flags);
     180                 :            : 
     181         [ -  + ]:        112 :         list_for_each_entry_safe(e, next, &serio_event_list, node) {
     182         [ #  # ]:          0 :                 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                 :          0 :                         serio_free_event(e);
     193                 :            :                 }
     194                 :            :         }
     195                 :            : 
     196                 :        112 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     197                 :        112 : }
     198                 :            : 
     199                 :        112 : static void serio_handle_event(struct work_struct *work)
     200                 :            : {
     201                 :        112 :         struct serio_event *event;
     202                 :            : 
     203                 :        112 :         mutex_lock(&serio_mutex);
     204                 :            : 
     205         [ +  + ]:        224 :         while ((event = serio_get_event())) {
     206                 :            : 
     207   [ +  -  -  -  :        112 :                 switch (event->type) {
                   +  - ]
     208                 :            : 
     209                 :         56 :                 case SERIO_REGISTER_PORT:
     210                 :         56 :                         serio_add_port(event->object);
     211                 :         56 :                         break;
     212                 :            : 
     213                 :          0 :                 case SERIO_RECONNECT_PORT:
     214                 :          0 :                         serio_reconnect_port(event->object);
     215                 :          0 :                         break;
     216                 :            : 
     217                 :          0 :                 case SERIO_RESCAN_PORT:
     218                 :          0 :                         serio_disconnect_port(event->object);
     219                 :          0 :                         serio_find_driver(event->object);
     220                 :          0 :                         break;
     221                 :            : 
     222                 :          0 :                 case SERIO_RECONNECT_SUBTREE:
     223                 :          0 :                         serio_reconnect_subtree(event->object);
     224                 :          0 :                         break;
     225                 :            : 
     226                 :         56 :                 case SERIO_ATTACH_DRIVER:
     227                 :         56 :                         serio_attach_driver(event->object);
     228                 :         56 :                         break;
     229                 :            :                 }
     230                 :            : 
     231                 :        112 :                 serio_remove_duplicate_events(event->object, event->type);
     232                 :        112 :                 serio_free_event(event);
     233                 :            :         }
     234                 :            : 
     235                 :        112 :         mutex_unlock(&serio_mutex);
     236                 :        112 : }
     237                 :            : 
     238                 :            : static DECLARE_WORK(serio_event_work, serio_handle_event);
     239                 :            : 
     240                 :        112 : static int serio_queue_event(void *object, struct module *owner,
     241                 :            :                              enum serio_event_type event_type)
     242                 :            : {
     243                 :        112 :         unsigned long flags;
     244                 :        112 :         struct serio_event *event;
     245                 :        112 :         int retval = 0;
     246                 :            : 
     247                 :        112 :         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         [ -  + ]:        112 :         list_for_each_entry_reverse(event, &serio_event_list, node) {
     257         [ #  # ]:          0 :                 if (event->object == object) {
     258         [ #  # ]:          0 :                         if (event->type == event_type)
     259                 :          0 :                                 goto out;
     260                 :            :                         break;
     261                 :            :                 }
     262                 :            :         }
     263                 :            : 
     264                 :        112 :         event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC);
     265         [ -  + ]:        112 :         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         [ -  + ]:        112 :         if (!try_module_get(owner)) {
     272                 :          0 :                 pr_warn("Can't get module reference, dropping event %d\n",
     273                 :            :                         event_type);
     274                 :          0 :                 kfree(event);
     275                 :          0 :                 retval = -EINVAL;
     276                 :          0 :                 goto out;
     277                 :            :         }
     278                 :            : 
     279                 :        112 :         event->type = event_type;
     280                 :        112 :         event->object = object;
     281                 :        112 :         event->owner = owner;
     282                 :            : 
     283                 :        112 :         list_add_tail(&event->node, &serio_event_list);
     284                 :        112 :         queue_work(system_long_wq, &serio_event_work);
     285                 :            : 
     286                 :        112 : out:
     287                 :        112 :         spin_unlock_irqrestore(&serio_event_lock, flags);
     288                 :        112 :         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                 :          0 :         struct serio_event *event, *next;
     298                 :          0 :         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                 :          0 :                         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                 :          0 :         struct serio_event *event;
     321                 :          0 :         struct serio *serio, *child = NULL;
     322                 :          0 :         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                 :          0 :         struct device_driver *drv;
     386                 :          0 :         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                 :          0 :         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                 :         56 : static void serio_init_port(struct serio *serio)
     498                 :            : {
     499                 :         56 :         static atomic_t serio_no = ATOMIC_INIT(-1);
     500                 :            : 
     501                 :         56 :         __module_get(THIS_MODULE);
     502                 :            : 
     503                 :         56 :         INIT_LIST_HEAD(&serio->node);
     504                 :         56 :         INIT_LIST_HEAD(&serio->child_node);
     505                 :         56 :         INIT_LIST_HEAD(&serio->children);
     506                 :         56 :         spin_lock_init(&serio->lock);
     507                 :         56 :         mutex_init(&serio->drv_mutex);
     508                 :         56 :         device_initialize(&serio->dev);
     509                 :         56 :         dev_set_name(&serio->dev, "serio%lu",
     510                 :            :                      (unsigned long)atomic_inc_return(&serio_no));
     511                 :         56 :         serio->dev.bus = &serio_bus;
     512                 :         56 :         serio->dev.release = serio_release_port;
     513                 :         56 :         serio->dev.groups = serio_device_attr_groups;
     514         [ -  + ]:         56 :         if (serio->parent) {
     515                 :          0 :                 serio->dev.parent = &serio->parent->dev;
     516                 :          0 :                 serio->depth = serio->parent->depth + 1;
     517                 :            :         } else
     518                 :         56 :                 serio->depth = 0;
     519                 :         56 :         lockdep_set_subclass(&serio->lock, serio->depth);
     520                 :         56 : }
     521                 :            : 
     522                 :            : /*
     523                 :            :  * Complete serio port registration.
     524                 :            :  * Driver core will attempt to find appropriate driver for the port.
     525                 :            :  */
     526                 :         56 : static void serio_add_port(struct serio *serio)
     527                 :            : {
     528                 :         56 :         struct serio *parent = serio->parent;
     529                 :         56 :         int error;
     530                 :            : 
     531         [ -  + ]:         56 :         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         [ +  - ]:         56 :         list_add_tail(&serio->node, &serio_list);
     538                 :            : 
     539         [ +  - ]:         56 :         if (serio->start)
     540                 :         56 :                 serio->start(serio);
     541                 :            : 
     542                 :         56 :         error = device_add(&serio->dev);
     543         [ -  + ]:         56 :         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                 :         56 : }
     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                 :          0 :         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                 :          0 :         int error;
     606                 :            : 
     607                 :          0 :         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                 :         56 : void __serio_register_port(struct serio *serio, struct module *owner)
     696                 :            : {
     697                 :         56 :         serio_init_port(serio);
     698                 :         56 :         serio_queue_event(serio, owner, SERIO_REGISTER_PORT);
     699                 :         56 : }
     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                 :          0 :         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                 :          0 :         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                 :         84 : static int serio_driver_probe(struct device *dev)
     774                 :            : {
     775                 :         84 :         struct serio *serio = to_serio_port(dev);
     776                 :         84 :         struct serio_driver *drv = to_serio_driver(dev->driver);
     777                 :            : 
     778                 :         84 :         return serio_connect_driver(serio, drv);
     779                 :            : }
     780                 :            : 
     781                 :          0 : static int 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 :         return 0;
     787                 :            : }
     788                 :            : 
     789                 :          0 : static void serio_cleanup(struct serio *serio)
     790                 :            : {
     791                 :          0 :         mutex_lock(&serio->drv_mutex);
     792   [ #  #  #  # ]:          0 :         if (serio->drv && serio->drv->cleanup)
     793                 :          0 :                 serio->drv->cleanup(serio);
     794                 :          0 :         mutex_unlock(&serio->drv_mutex);
     795                 :          0 : }
     796                 :            : 
     797                 :          0 : static void serio_shutdown(struct device *dev)
     798                 :            : {
     799                 :          0 :         struct serio *serio = to_serio_port(dev);
     800                 :            : 
     801                 :          0 :         serio_cleanup(serio);
     802                 :          0 : }
     803                 :            : 
     804                 :         56 : static void serio_attach_driver(struct serio_driver *drv)
     805                 :            : {
     806                 :         56 :         int error;
     807                 :            : 
     808                 :         56 :         error = driver_attach(&drv->driver);
     809         [ -  + ]:         56 :         if (error)
     810                 :          0 :                 pr_warn("driver_attach() failed for %s with error %d\n",
     811                 :            :                         drv->driver.name, error);
     812                 :         56 : }
     813                 :            : 
     814                 :         56 : int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name)
     815                 :            : {
     816                 :         56 :         bool manual_bind = drv->manual_bind;
     817                 :         56 :         int error;
     818                 :            : 
     819                 :         56 :         drv->driver.bus = &serio_bus;
     820                 :         56 :         drv->driver.owner = owner;
     821                 :         56 :         drv->driver.mod_name = mod_name;
     822                 :            : 
     823                 :            :         /*
     824                 :            :          * Temporarily disable automatic binding because probing
     825                 :            :          * takes long time and we are better off doing it in kseriod
     826                 :            :          */
     827                 :         56 :         drv->manual_bind = true;
     828                 :            : 
     829                 :         56 :         error = driver_register(&drv->driver);
     830         [ -  + ]:         56 :         if (error) {
     831                 :          0 :                 pr_err("driver_register() failed for %s, error: %d\n",
     832                 :            :                         drv->driver.name, error);
     833                 :          0 :                 return error;
     834                 :            :         }
     835                 :            : 
     836                 :            :         /*
     837                 :            :          * Restore original bind mode and let kseriod bind the
     838                 :            :          * driver to free ports
     839                 :            :          */
     840         [ +  - ]:         56 :         if (!manual_bind) {
     841                 :         56 :                 drv->manual_bind = false;
     842                 :         56 :                 error = serio_queue_event(drv, NULL, SERIO_ATTACH_DRIVER);
     843         [ -  + ]:         56 :                 if (error) {
     844                 :          0 :                         driver_unregister(&drv->driver);
     845                 :          0 :                         return error;
     846                 :            :                 }
     847                 :            :         }
     848                 :            : 
     849                 :            :         return 0;
     850                 :            : }
     851                 :            : EXPORT_SYMBOL(__serio_register_driver);
     852                 :            : 
     853                 :          0 : void serio_unregister_driver(struct serio_driver *drv)
     854                 :            : {
     855                 :          0 :         struct serio *serio;
     856                 :            : 
     857                 :          0 :         mutex_lock(&serio_mutex);
     858                 :            : 
     859                 :          0 :         drv->manual_bind = true;     /* so serio_find_driver ignores it */
     860                 :          0 :         serio_remove_pending_events(drv);
     861                 :            : 
     862                 :          0 : start_over:
     863         [ #  # ]:          0 :         list_for_each_entry(serio, &serio_list, node) {
     864         [ #  # ]:          0 :                 if (serio->drv == drv) {
     865                 :          0 :                         serio_disconnect_port(serio);
     866                 :          0 :                         serio_find_driver(serio);
     867                 :            :                         /* we could've deleted some ports, restart */
     868                 :          0 :                         goto start_over;
     869                 :            :                 }
     870                 :            :         }
     871                 :            : 
     872                 :          0 :         driver_unregister(&drv->driver);
     873                 :          0 :         mutex_unlock(&serio_mutex);
     874                 :          0 : }
     875                 :            : EXPORT_SYMBOL(serio_unregister_driver);
     876                 :            : 
     877                 :        112 : static void serio_set_drv(struct serio *serio, struct serio_driver *drv)
     878                 :            : {
     879                 :        112 :         serio_pause_rx(serio);
     880                 :        112 :         serio->drv = drv;
     881                 :        112 :         serio_continue_rx(serio);
     882                 :            : }
     883                 :            : 
     884                 :        224 : static int serio_bus_match(struct device *dev, struct device_driver *drv)
     885                 :            : {
     886                 :        224 :         struct serio *serio = to_serio_port(dev);
     887                 :        224 :         struct serio_driver *serio_drv = to_serio_driver(drv);
     888                 :            : 
     889   [ +  -  +  + ]:        224 :         if (serio->manual_bind || serio_drv->manual_bind)
     890                 :            :                 return 0;
     891                 :            : 
     892                 :        112 :         return serio_match_port(serio_drv->id_table, serio);
     893                 :            : }
     894                 :            : 
     895                 :            : #define SERIO_ADD_UEVENT_VAR(fmt, val...)                               \
     896                 :            :         do {                                                            \
     897                 :            :                 int err = add_uevent_var(env, fmt, val);                \
     898                 :            :                 if (err)                                                \
     899                 :            :                         return err;                                     \
     900                 :            :         } while (0)
     901                 :            : 
     902                 :        336 : static int serio_uevent(struct device *dev, struct kobj_uevent_env *env)
     903                 :            : {
     904                 :        336 :         struct serio *serio;
     905                 :            : 
     906         [ +  - ]:        336 :         if (!dev)
     907                 :            :                 return -ENODEV;
     908                 :            : 
     909                 :        336 :         serio = to_serio_port(dev);
     910                 :            : 
     911         [ +  - ]:        336 :         SERIO_ADD_UEVENT_VAR("SERIO_TYPE=%02x", serio->id.type);
     912         [ +  - ]:        336 :         SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto);
     913         [ +  - ]:        336 :         SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id);
     914         [ +  - ]:        336 :         SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra);
     915                 :            : 
     916         [ +  - ]:        336 :         SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X",
     917                 :            :                                 serio->id.type, serio->id.proto, serio->id.id, serio->id.extra);
     918                 :            : 
     919         [ +  - ]:        336 :         if (serio->firmware_id[0])
     920         [ -  + ]:        336 :                 SERIO_ADD_UEVENT_VAR("SERIO_FIRMWARE_ID=%s",
     921                 :            :                                      serio->firmware_id);
     922                 :            : 
     923                 :            :         return 0;
     924                 :            : }
     925                 :            : #undef SERIO_ADD_UEVENT_VAR
     926                 :            : 
     927                 :            : #ifdef CONFIG_PM
     928                 :          0 : static int serio_suspend(struct device *dev)
     929                 :            : {
     930                 :          0 :         struct serio *serio = to_serio_port(dev);
     931                 :            : 
     932                 :          0 :         serio_cleanup(serio);
     933                 :            : 
     934                 :          0 :         return 0;
     935                 :            : }
     936                 :            : 
     937                 :          0 : static int serio_resume(struct device *dev)
     938                 :            : {
     939                 :          0 :         struct serio *serio = to_serio_port(dev);
     940                 :          0 :         int error = -ENOENT;
     941                 :            : 
     942                 :          0 :         mutex_lock(&serio->drv_mutex);
     943   [ #  #  #  # ]:          0 :         if (serio->drv && serio->drv->fast_reconnect) {
     944                 :          0 :                 error = serio->drv->fast_reconnect(serio);
     945         [ #  # ]:          0 :                 if (error && error != -ENOENT)
     946                 :          0 :                         dev_warn(dev, "fast reconnect failed with error %d\n",
     947                 :            :                                  error);
     948                 :            :         }
     949                 :          0 :         mutex_unlock(&serio->drv_mutex);
     950                 :            : 
     951         [ #  # ]:          0 :         if (error) {
     952                 :            :                 /*
     953                 :            :                  * Driver reconnect can take a while, so better let
     954                 :            :                  * kseriod deal with it.
     955                 :            :                  */
     956                 :          0 :                 serio_queue_event(serio, NULL, SERIO_RECONNECT_PORT);
     957                 :            :         }
     958                 :            : 
     959                 :          0 :         return 0;
     960                 :            : }
     961                 :            : 
     962                 :            : static const struct dev_pm_ops serio_pm_ops = {
     963                 :            :         .suspend        = serio_suspend,
     964                 :            :         .resume         = serio_resume,
     965                 :            :         .poweroff       = serio_suspend,
     966                 :            :         .restore        = serio_resume,
     967                 :            : };
     968                 :            : #endif /* CONFIG_PM */
     969                 :            : 
     970                 :            : /* called from serio_driver->connect/disconnect methods under serio_mutex */
     971                 :         84 : int serio_open(struct serio *serio, struct serio_driver *drv)
     972                 :            : {
     973                 :         84 :         serio_set_drv(serio, drv);
     974                 :            : 
     975   [ -  +  -  - ]:         84 :         if (serio->open && serio->open(serio)) {
     976                 :          0 :                 serio_set_drv(serio, NULL);
     977                 :          0 :                 return -1;
     978                 :            :         }
     979                 :            :         return 0;
     980                 :            : }
     981                 :            : EXPORT_SYMBOL(serio_open);
     982                 :            : 
     983                 :            : /* called from serio_driver->connect/disconnect methods under serio_mutex */
     984                 :         28 : void serio_close(struct serio *serio)
     985                 :            : {
     986         [ +  - ]:         28 :         if (serio->close)
     987                 :         28 :                 serio->close(serio);
     988                 :            : 
     989                 :         28 :         serio_set_drv(serio, NULL);
     990                 :         28 : }
     991                 :            : EXPORT_SYMBOL(serio_close);
     992                 :            : 
     993                 :       3724 : irqreturn_t serio_interrupt(struct serio *serio,
     994                 :            :                 unsigned char data, unsigned int dfl)
     995                 :            : {
     996                 :       3724 :         unsigned long flags;
     997                 :       3724 :         irqreturn_t ret = IRQ_NONE;
     998                 :            : 
     999                 :       3724 :         spin_lock_irqsave(&serio->lock, flags);
    1000                 :            : 
    1001         [ +  - ]:       3724 :         if (likely(serio->drv)) {
    1002                 :       3724 :                 ret = serio->drv->interrupt(serio, data, dfl);
    1003   [ #  #  #  # ]:          0 :         } else if (!dfl && device_is_registered(&serio->dev)) {
    1004                 :          0 :                 serio_rescan(serio);
    1005                 :          0 :                 ret = IRQ_HANDLED;
    1006                 :            :         }
    1007                 :            : 
    1008                 :       3724 :         spin_unlock_irqrestore(&serio->lock, flags);
    1009                 :            : 
    1010                 :       3724 :         return ret;
    1011                 :            : }
    1012                 :            : EXPORT_SYMBOL(serio_interrupt);
    1013                 :            : 
    1014                 :            : struct bus_type serio_bus = {
    1015                 :            :         .name           = "serio",
    1016                 :            :         .drv_groups     = serio_driver_groups,
    1017                 :            :         .match          = serio_bus_match,
    1018                 :            :         .uevent         = serio_uevent,
    1019                 :            :         .probe          = serio_driver_probe,
    1020                 :            :         .remove         = serio_driver_remove,
    1021                 :            :         .shutdown       = serio_shutdown,
    1022                 :            : #ifdef CONFIG_PM
    1023                 :            :         .pm             = &serio_pm_ops,
    1024                 :            : #endif
    1025                 :            : };
    1026                 :            : EXPORT_SYMBOL(serio_bus);
    1027                 :            : 
    1028                 :         28 : static int __init serio_init(void)
    1029                 :            : {
    1030                 :         28 :         int error;
    1031                 :            : 
    1032                 :         28 :         error = bus_register(&serio_bus);
    1033         [ -  + ]:         28 :         if (error) {
    1034                 :          0 :                 pr_err("Failed to register serio bus, error: %d\n", error);
    1035                 :          0 :                 return error;
    1036                 :            :         }
    1037                 :            : 
    1038                 :            :         return 0;
    1039                 :            : }
    1040                 :            : 
    1041                 :          0 : static void __exit serio_exit(void)
    1042                 :            : {
    1043                 :          0 :         bus_unregister(&serio_bus);
    1044                 :            : 
    1045                 :            :         /*
    1046                 :            :          * There should not be any outstanding events but work may
    1047                 :            :          * still be scheduled so simply cancel it.
    1048                 :            :          */
    1049                 :          0 :         cancel_work_sync(&serio_event_work);
    1050                 :          0 : }
    1051                 :            : 
    1052                 :            : subsys_initcall(serio_init);
    1053                 :            : module_exit(serio_exit);

Generated by: LCOV version 1.14