LCOV - code coverage report
Current view: top level - drivers/input/serio - serio.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 356 0.0 %
Date: 2014-02-18 Functions: 0 53 0.0 %
Branches: 0 178 0.0 %

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

Generated by: LCOV version 1.9