LCOV - code coverage report
Current view: top level - drivers/pcmcia - ds.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 6 686 0.9 %
Date: 2022-03-28 13:20:08 Functions: 1 48 2.1 %
Branches: 2 372 0.5 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * ds.c -- 16-bit PCMCIA core support
       4                 :            :  *
       5                 :            :  * The initial developer of the original code is David A. Hinds
       6                 :            :  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
       7                 :            :  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
       8                 :            :  *
       9                 :            :  * (C) 1999             David A. Hinds
      10                 :            :  * (C) 2003 - 2010      Dominik Brodowski
      11                 :            :  */
      12                 :            : 
      13                 :            : #include <linux/kernel.h>
      14                 :            : #include <linux/module.h>
      15                 :            : #include <linux/init.h>
      16                 :            : #include <linux/errno.h>
      17                 :            : #include <linux/list.h>
      18                 :            : #include <linux/delay.h>
      19                 :            : #include <linux/workqueue.h>
      20                 :            : #include <linux/crc32.h>
      21                 :            : #include <linux/firmware.h>
      22                 :            : #include <linux/kref.h>
      23                 :            : #include <linux/dma-mapping.h>
      24                 :            : #include <linux/slab.h>
      25                 :            : 
      26                 :            : #include <pcmcia/cistpl.h>
      27                 :            : #include <pcmcia/ds.h>
      28                 :            : #include <pcmcia/ss.h>
      29                 :            : 
      30                 :            : #include "cs_internal.h"
      31                 :            : 
      32                 :            : /*====================================================================*/
      33                 :            : 
      34                 :            : /* Module parameters */
      35                 :            : 
      36                 :            : MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
      37                 :            : MODULE_DESCRIPTION("PCMCIA Driver Services");
      38                 :            : MODULE_LICENSE("GPL");
      39                 :            : 
      40                 :            : 
      41                 :            : /*====================================================================*/
      42                 :            : 
      43                 :          0 : static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
      44                 :            : {
      45                 :          0 :         const struct pcmcia_device_id *did = p_drv->id_table;
      46                 :          0 :         unsigned int i;
      47                 :          0 :         u32 hash;
      48                 :            : 
      49   [ #  #  #  # ]:          0 :         if (!p_drv->probe || !p_drv->remove)
      50                 :          0 :                 printk(KERN_DEBUG "pcmcia: %s lacks a requisite callback "
      51                 :            :                        "function\n", p_drv->name);
      52                 :            : 
      53   [ #  #  #  # ]:          0 :         while (did && did->match_flags) {
      54         [ #  # ]:          0 :                 for (i = 0; i < 4; i++) {
      55         [ #  # ]:          0 :                         if (!did->prod_id[i])
      56                 :          0 :                                 continue;
      57                 :            : 
      58                 :          0 :                         hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i]));
      59         [ #  # ]:          0 :                         if (hash == did->prod_id_hash[i])
      60                 :          0 :                                 continue;
      61                 :            : 
      62                 :          0 :                         printk(KERN_DEBUG "pcmcia: %s: invalid hash for "
      63                 :            :                                "product string \"%s\": is 0x%x, should "
      64                 :            :                                "be 0x%x\n", p_drv->name, did->prod_id[i],
      65                 :            :                                did->prod_id_hash[i], hash);
      66                 :          0 :                         printk(KERN_DEBUG "pcmcia: see "
      67                 :            :                                 "Documentation/pcmcia/devicetable.rst for "
      68                 :            :                                 "details\n");
      69                 :            :                 }
      70                 :          0 :                 did++;
      71                 :            :         }
      72                 :            : 
      73                 :          0 :         return;
      74                 :            : }
      75                 :            : 
      76                 :            : 
      77                 :            : /*======================================================================*/
      78                 :            : 
      79                 :            : 
      80                 :            : struct pcmcia_dynid {
      81                 :            :         struct list_head                node;
      82                 :            :         struct pcmcia_device_id         id;
      83                 :            : };
      84                 :            : 
      85                 :            : /**
      86                 :            :  * pcmcia_store_new_id - add a new PCMCIA device ID to this driver and re-probe devices
      87                 :            :  * @driver: target device driver
      88                 :            :  * @buf: buffer for scanning device ID data
      89                 :            :  * @count: input size
      90                 :            :  *
      91                 :            :  * Adds a new dynamic PCMCIA device ID to this driver,
      92                 :            :  * and causes the driver to probe for all devices again.
      93                 :            :  */
      94                 :            : static ssize_t
      95                 :          0 : new_id_store(struct device_driver *driver, const char *buf, size_t count)
      96                 :            : {
      97                 :          0 :         struct pcmcia_dynid *dynid;
      98                 :          0 :         struct pcmcia_driver *pdrv = to_pcmcia_drv(driver);
      99                 :          0 :         __u16 match_flags, manf_id, card_id;
     100                 :          0 :         __u8 func_id, function, device_no;
     101                 :          0 :         __u32 prod_id_hash[4] = {0, 0, 0, 0};
     102                 :          0 :         int fields = 0;
     103                 :          0 :         int retval = 0;
     104                 :            : 
     105                 :          0 :         fields = sscanf(buf, "%hx %hx %hx %hhx %hhx %hhx %x %x %x %x",
     106                 :            :                         &match_flags, &manf_id, &card_id, &func_id, &function, &device_no,
     107                 :            :                         &prod_id_hash[0], &prod_id_hash[1], &prod_id_hash[2], &prod_id_hash[3]);
     108         [ #  # ]:          0 :         if (fields < 6)
     109                 :            :                 return -EINVAL;
     110                 :            : 
     111                 :          0 :         dynid = kzalloc(sizeof(struct pcmcia_dynid), GFP_KERNEL);
     112         [ #  # ]:          0 :         if (!dynid)
     113                 :            :                 return -ENOMEM;
     114                 :            : 
     115                 :          0 :         dynid->id.match_flags = match_flags;
     116                 :          0 :         dynid->id.manf_id = manf_id;
     117                 :          0 :         dynid->id.card_id = card_id;
     118                 :          0 :         dynid->id.func_id = func_id;
     119                 :          0 :         dynid->id.function = function;
     120                 :          0 :         dynid->id.device_no = device_no;
     121                 :          0 :         memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);
     122                 :            : 
     123                 :          0 :         mutex_lock(&pdrv->dynids.lock);
     124                 :          0 :         list_add_tail(&dynid->node, &pdrv->dynids.list);
     125                 :          0 :         mutex_unlock(&pdrv->dynids.lock);
     126                 :            : 
     127                 :          0 :         retval = driver_attach(&pdrv->drv);
     128                 :            : 
     129         [ #  # ]:          0 :         if (retval)
     130                 :          0 :                 return retval;
     131                 :          0 :         return count;
     132                 :            : }
     133                 :            : static DRIVER_ATTR_WO(new_id);
     134                 :            : 
     135                 :            : static void
     136                 :          0 : pcmcia_free_dynids(struct pcmcia_driver *drv)
     137                 :            : {
     138                 :          0 :         struct pcmcia_dynid *dynid, *n;
     139                 :            : 
     140                 :          0 :         mutex_lock(&drv->dynids.lock);
     141         [ #  # ]:          0 :         list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
     142                 :          0 :                 list_del(&dynid->node);
     143                 :          0 :                 kfree(dynid);
     144                 :            :         }
     145                 :          0 :         mutex_unlock(&drv->dynids.lock);
     146                 :          0 : }
     147                 :            : 
     148                 :            : static int
     149                 :          0 : pcmcia_create_newid_file(struct pcmcia_driver *drv)
     150                 :            : {
     151                 :          0 :         int error = 0;
     152                 :          0 :         if (drv->probe != NULL)
     153                 :          0 :                 error = driver_create_file(&drv->drv, &driver_attr_new_id);
     154                 :          0 :         return error;
     155                 :            : }
     156                 :            : 
     157                 :            : static void
     158                 :          0 : pcmcia_remove_newid_file(struct pcmcia_driver *drv)
     159                 :            : {
     160                 :          0 :         driver_remove_file(&drv->drv, &driver_attr_new_id);
     161                 :            : }
     162                 :            : 
     163                 :            : /**
     164                 :            :  * pcmcia_register_driver - register a PCMCIA driver with the bus core
     165                 :            :  * @driver: the &driver being registered
     166                 :            :  *
     167                 :            :  * Registers a PCMCIA driver with the PCMCIA bus core.
     168                 :            :  */
     169                 :          0 : int pcmcia_register_driver(struct pcmcia_driver *driver)
     170                 :            : {
     171                 :          0 :         int error;
     172                 :            : 
     173         [ #  # ]:          0 :         if (!driver)
     174                 :            :                 return -EINVAL;
     175                 :            : 
     176                 :          0 :         pcmcia_check_driver(driver);
     177                 :            : 
     178                 :            :         /* initialize common fields */
     179                 :          0 :         driver->drv.bus = &pcmcia_bus_type;
     180                 :          0 :         driver->drv.owner = driver->owner;
     181                 :          0 :         driver->drv.name = driver->name;
     182                 :          0 :         mutex_init(&driver->dynids.lock);
     183                 :          0 :         INIT_LIST_HEAD(&driver->dynids.list);
     184                 :            : 
     185                 :          0 :         pr_debug("registering driver %s\n", driver->name);
     186                 :            : 
     187                 :          0 :         error = driver_register(&driver->drv);
     188         [ #  # ]:          0 :         if (error < 0)
     189                 :            :                 return error;
     190                 :            : 
     191         [ #  # ]:          0 :         error = pcmcia_create_newid_file(driver);
     192         [ #  # ]:          0 :         if (error)
     193                 :          0 :                 driver_unregister(&driver->drv);
     194                 :            : 
     195                 :            :         return error;
     196                 :            : }
     197                 :            : EXPORT_SYMBOL(pcmcia_register_driver);
     198                 :            : 
     199                 :            : /**
     200                 :            :  * pcmcia_unregister_driver - unregister a PCMCIA driver with the bus core
     201                 :            :  * @driver: the &driver being unregistered
     202                 :            :  */
     203                 :          0 : void pcmcia_unregister_driver(struct pcmcia_driver *driver)
     204                 :            : {
     205                 :          0 :         pr_debug("unregistering driver %s\n", driver->name);
     206                 :          0 :         pcmcia_remove_newid_file(driver);
     207                 :          0 :         driver_unregister(&driver->drv);
     208                 :          0 :         pcmcia_free_dynids(driver);
     209                 :          0 : }
     210                 :            : EXPORT_SYMBOL(pcmcia_unregister_driver);
     211                 :            : 
     212                 :            : 
     213                 :            : /* pcmcia_device handling */
     214                 :            : 
     215                 :          0 : static struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
     216                 :            : {
     217                 :          0 :         struct device *tmp_dev;
     218                 :          0 :         tmp_dev = get_device(&p_dev->dev);
     219         [ #  # ]:          0 :         if (!tmp_dev)
     220                 :            :                 return NULL;
     221                 :          0 :         return to_pcmcia_dev(tmp_dev);
     222                 :            : }
     223                 :            : 
     224                 :          0 : static void pcmcia_put_dev(struct pcmcia_device *p_dev)
     225                 :            : {
     226                 :          0 :         if (p_dev)
     227                 :          0 :                 put_device(&p_dev->dev);
     228                 :            : }
     229                 :            : 
     230                 :          0 : static void pcmcia_release_function(struct kref *ref)
     231                 :            : {
     232                 :          0 :         struct config_t *c = container_of(ref, struct config_t, ref);
     233                 :          0 :         pr_debug("releasing config_t\n");
     234                 :          0 :         kfree(c);
     235                 :          0 : }
     236                 :            : 
     237                 :          0 : static void pcmcia_release_dev(struct device *dev)
     238                 :            : {
     239                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
     240                 :          0 :         int i;
     241                 :          0 :         dev_dbg(dev, "releasing device\n");
     242                 :          0 :         pcmcia_put_socket(p_dev->socket);
     243         [ #  # ]:          0 :         for (i = 0; i < 4; i++)
     244                 :          0 :                 kfree(p_dev->prod_id[i]);
     245                 :          0 :         kfree(p_dev->devname);
     246                 :          0 :         kref_put(&p_dev->function_config->ref, pcmcia_release_function);
     247                 :          0 :         kfree(p_dev);
     248                 :          0 : }
     249                 :            : 
     250                 :            : 
     251                 :          0 : static int pcmcia_device_probe(struct device *dev)
     252                 :            : {
     253                 :          0 :         struct pcmcia_device *p_dev;
     254                 :          0 :         struct pcmcia_driver *p_drv;
     255                 :          0 :         struct pcmcia_socket *s;
     256                 :          0 :         cistpl_config_t cis_config;
     257                 :          0 :         int ret = 0;
     258                 :            : 
     259                 :          0 :         dev = get_device(dev);
     260         [ #  # ]:          0 :         if (!dev)
     261                 :            :                 return -ENODEV;
     262                 :            : 
     263                 :          0 :         p_dev = to_pcmcia_dev(dev);
     264                 :          0 :         p_drv = to_pcmcia_drv(dev->driver);
     265                 :          0 :         s = p_dev->socket;
     266                 :            : 
     267                 :          0 :         dev_dbg(dev, "trying to bind to %s\n", p_drv->name);
     268                 :            : 
     269   [ #  #  #  #  :          0 :         if ((!p_drv->probe) || (!p_dev->function_config) ||
                   #  # ]
     270                 :          0 :             (!try_module_get(p_drv->owner))) {
     271                 :          0 :                 ret = -EINVAL;
     272                 :          0 :                 goto put_dev;
     273                 :            :         }
     274                 :            : 
     275                 :            :         /* set up some more device information */
     276                 :          0 :         ret = pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_CONFIG,
     277                 :            :                                 &cis_config);
     278         [ #  # ]:          0 :         if (!ret) {
     279                 :          0 :                 p_dev->config_base = cis_config.base;
     280                 :          0 :                 p_dev->config_regs = cis_config.rmask[0];
     281                 :          0 :                 dev_dbg(dev, "base %x, regs %x", p_dev->config_base,
     282                 :            :                         p_dev->config_regs);
     283                 :            :         } else {
     284                 :          0 :                 dev_info(dev,
     285                 :            :                          "pcmcia: could not parse base and rmask0 of CIS\n");
     286                 :          0 :                 p_dev->config_base = 0;
     287                 :          0 :                 p_dev->config_regs = 0;
     288                 :            :         }
     289                 :            : 
     290                 :          0 :         ret = p_drv->probe(p_dev);
     291         [ #  # ]:          0 :         if (ret) {
     292                 :          0 :                 dev_dbg(dev, "binding to %s failed with %d\n",
     293                 :            :                            p_drv->name, ret);
     294                 :          0 :                 goto put_module;
     295                 :            :         }
     296                 :          0 :         dev_dbg(dev, "%s bound: Vpp %d.%d, idx %x, IRQ %d", p_drv->name,
     297                 :            :                 p_dev->vpp/10, p_dev->vpp%10, p_dev->config_index, p_dev->irq);
     298                 :          0 :         dev_dbg(dev, "resources: ioport %pR %pR iomem %pR %pR %pR",
     299                 :            :                 p_dev->resource[0], p_dev->resource[1], p_dev->resource[2],
     300                 :            :                 p_dev->resource[3], p_dev->resource[4]);
     301                 :            : 
     302                 :          0 :         mutex_lock(&s->ops_mutex);
     303         [ #  # ]:          0 :         if ((s->pcmcia_pfc) &&
     304   [ #  #  #  # ]:          0 :             (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
     305                 :          0 :                 pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
     306                 :          0 :         mutex_unlock(&s->ops_mutex);
     307                 :            : 
     308                 :          0 : put_module:
     309         [ #  # ]:          0 :         if (ret)
     310                 :          0 :                 module_put(p_drv->owner);
     311                 :          0 : put_dev:
     312         [ #  # ]:          0 :         if (ret)
     313                 :          0 :                 put_device(dev);
     314                 :            :         return ret;
     315                 :            : }
     316                 :            : 
     317                 :            : 
     318                 :            : /*
     319                 :            :  * Removes a PCMCIA card from the device tree and socket list.
     320                 :            :  */
     321                 :          0 : static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *leftover)
     322                 :            : {
     323                 :          0 :         struct pcmcia_device    *p_dev;
     324                 :          0 :         struct pcmcia_device    *tmp;
     325                 :            : 
     326                 :          0 :         dev_dbg(leftover ? &leftover->dev : &s->dev,
     327                 :            :                    "pcmcia_card_remove(%d) %s\n", s->sock,
     328                 :            :                    leftover ? leftover->devname : "");
     329                 :            : 
     330                 :          0 :         mutex_lock(&s->ops_mutex);
     331         [ #  # ]:          0 :         if (!leftover)
     332                 :          0 :                 s->device_count = 0;
     333                 :            :         else
     334                 :          0 :                 s->device_count = 1;
     335                 :          0 :         mutex_unlock(&s->ops_mutex);
     336                 :            : 
     337                 :            :         /* unregister all pcmcia_devices registered with this socket, except leftover */
     338         [ #  # ]:          0 :         list_for_each_entry_safe(p_dev, tmp, &s->devices_list, socket_device_list) {
     339         [ #  # ]:          0 :                 if (p_dev == leftover)
     340                 :          0 :                         continue;
     341                 :            : 
     342                 :          0 :                 mutex_lock(&s->ops_mutex);
     343                 :          0 :                 list_del(&p_dev->socket_device_list);
     344                 :          0 :                 mutex_unlock(&s->ops_mutex);
     345                 :            : 
     346                 :          0 :                 dev_dbg(&p_dev->dev, "unregistering device\n");
     347                 :          0 :                 device_unregister(&p_dev->dev);
     348                 :            :         }
     349                 :            : 
     350                 :          0 :         return;
     351                 :            : }
     352                 :            : 
     353                 :          0 : static int pcmcia_device_remove(struct device *dev)
     354                 :            : {
     355                 :          0 :         struct pcmcia_device *p_dev;
     356                 :          0 :         struct pcmcia_driver *p_drv;
     357                 :          0 :         int i;
     358                 :            : 
     359                 :          0 :         p_dev = to_pcmcia_dev(dev);
     360                 :          0 :         p_drv = to_pcmcia_drv(dev->driver);
     361                 :            : 
     362                 :          0 :         dev_dbg(dev, "removing device\n");
     363                 :            : 
     364                 :            :         /* If we're removing the primary module driving a
     365                 :            :          * pseudo multi-function card, we need to unbind
     366                 :            :          * all devices
     367                 :            :          */
     368         [ #  # ]:          0 :         if ((p_dev->socket->pcmcia_pfc) &&
     369         [ #  # ]:          0 :             (p_dev->socket->device_count > 0) &&
     370         [ #  # ]:          0 :             (p_dev->device_no == 0))
     371                 :          0 :                 pcmcia_card_remove(p_dev->socket, p_dev);
     372                 :            : 
     373                 :            :         /* detach the "instance" */
     374         [ #  # ]:          0 :         if (!p_drv)
     375                 :            :                 return 0;
     376                 :            : 
     377         [ #  # ]:          0 :         if (p_drv->remove)
     378                 :          0 :                 p_drv->remove(p_dev);
     379                 :            : 
     380                 :            :         /* check for proper unloading */
     381         [ #  # ]:          0 :         if (p_dev->_irq || p_dev->_io || p_dev->_locked)
     382                 :          0 :                 dev_info(dev,
     383                 :            :                          "pcmcia: driver %s did not release config properly\n",
     384                 :            :                          p_drv->name);
     385                 :            : 
     386         [ #  # ]:          0 :         for (i = 0; i < MAX_WIN; i++)
     387         [ #  # ]:          0 :                 if (p_dev->_win & CLIENT_WIN_REQ(i))
     388                 :          0 :                         dev_info(dev,
     389                 :            :                                  "pcmcia: driver %s did not release window properly\n",
     390                 :            :                                  p_drv->name);
     391                 :            : 
     392                 :            :         /* references from pcmcia_probe_device */
     393         [ #  # ]:          0 :         pcmcia_put_dev(p_dev);
     394                 :          0 :         module_put(p_drv->owner);
     395                 :            : 
     396                 :          0 :         return 0;
     397                 :            : }
     398                 :            : 
     399                 :            : 
     400                 :            : /*
     401                 :            :  * pcmcia_device_query -- determine information about a pcmcia device
     402                 :            :  */
     403                 :          0 : static int pcmcia_device_query(struct pcmcia_device *p_dev)
     404                 :            : {
     405                 :          0 :         cistpl_manfid_t manf_id;
     406                 :          0 :         cistpl_funcid_t func_id;
     407                 :          0 :         cistpl_vers_1_t *vers1;
     408                 :          0 :         unsigned int i;
     409                 :            : 
     410                 :          0 :         vers1 = kmalloc(sizeof(*vers1), GFP_KERNEL);
     411         [ #  # ]:          0 :         if (!vers1)
     412                 :            :                 return -ENOMEM;
     413                 :            : 
     414         [ #  # ]:          0 :         if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL,
     415                 :            :                                CISTPL_MANFID, &manf_id)) {
     416                 :          0 :                 mutex_lock(&p_dev->socket->ops_mutex);
     417                 :          0 :                 p_dev->manf_id = manf_id.manf;
     418                 :          0 :                 p_dev->card_id = manf_id.card;
     419                 :          0 :                 p_dev->has_manf_id = 1;
     420                 :          0 :                 p_dev->has_card_id = 1;
     421                 :          0 :                 mutex_unlock(&p_dev->socket->ops_mutex);
     422                 :            :         }
     423                 :            : 
     424         [ #  # ]:          0 :         if (!pccard_read_tuple(p_dev->socket, p_dev->func,
     425                 :            :                                CISTPL_FUNCID, &func_id)) {
     426                 :          0 :                 mutex_lock(&p_dev->socket->ops_mutex);
     427                 :          0 :                 p_dev->func_id = func_id.func;
     428                 :          0 :                 p_dev->has_func_id = 1;
     429                 :          0 :                 mutex_unlock(&p_dev->socket->ops_mutex);
     430                 :            :         } else {
     431                 :            :                 /* rule of thumb: cards with no FUNCID, but with
     432                 :            :                  * common memory device geometry information, are
     433                 :            :                  * probably memory cards (from pcmcia-cs) */
     434                 :          0 :                 cistpl_device_geo_t *devgeo;
     435                 :            : 
     436                 :          0 :                 devgeo = kmalloc(sizeof(*devgeo), GFP_KERNEL);
     437         [ #  # ]:          0 :                 if (!devgeo) {
     438                 :          0 :                         kfree(vers1);
     439                 :          0 :                         return -ENOMEM;
     440                 :            :                 }
     441         [ #  # ]:          0 :                 if (!pccard_read_tuple(p_dev->socket, p_dev->func,
     442                 :            :                                       CISTPL_DEVICE_GEO, devgeo)) {
     443                 :          0 :                         dev_dbg(&p_dev->dev,
     444                 :            :                                    "mem device geometry probably means "
     445                 :            :                                    "FUNCID_MEMORY\n");
     446                 :          0 :                         mutex_lock(&p_dev->socket->ops_mutex);
     447                 :          0 :                         p_dev->func_id = CISTPL_FUNCID_MEMORY;
     448                 :          0 :                         p_dev->has_func_id = 1;
     449                 :          0 :                         mutex_unlock(&p_dev->socket->ops_mutex);
     450                 :            :                 }
     451                 :          0 :                 kfree(devgeo);
     452                 :            :         }
     453                 :            : 
     454         [ #  # ]:          0 :         if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, CISTPL_VERS_1,
     455                 :            :                                vers1)) {
     456                 :          0 :                 mutex_lock(&p_dev->socket->ops_mutex);
     457         [ #  # ]:          0 :                 for (i = 0; i < min_t(unsigned int, 4, vers1->ns); i++) {
     458                 :          0 :                         char *tmp;
     459                 :          0 :                         unsigned int length;
     460                 :          0 :                         char *new;
     461                 :            : 
     462                 :          0 :                         tmp = vers1->str + vers1->ofs[i];
     463                 :            : 
     464                 :          0 :                         length = strlen(tmp) + 1;
     465         [ #  # ]:          0 :                         if ((length < 2) || (length > 255))
     466                 :          0 :                                 continue;
     467                 :            : 
     468                 :          0 :                         new = kstrdup(tmp, GFP_KERNEL);
     469         [ #  # ]:          0 :                         if (!new)
     470                 :          0 :                                 continue;
     471                 :            : 
     472                 :          0 :                         tmp = p_dev->prod_id[i];
     473                 :          0 :                         p_dev->prod_id[i] = new;
     474                 :          0 :                         kfree(tmp);
     475                 :            :                 }
     476                 :          0 :                 mutex_unlock(&p_dev->socket->ops_mutex);
     477                 :            :         }
     478                 :            : 
     479                 :          0 :         kfree(vers1);
     480                 :          0 :         return 0;
     481                 :            : }
     482                 :            : 
     483                 :            : 
     484                 :          0 : static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
     485                 :            :                                                unsigned int function)
     486                 :            : {
     487                 :          0 :         struct pcmcia_device *p_dev, *tmp_dev;
     488                 :          0 :         int i;
     489                 :            : 
     490                 :          0 :         s = pcmcia_get_socket(s);
     491         [ #  # ]:          0 :         if (!s)
     492                 :            :                 return NULL;
     493                 :            : 
     494                 :          0 :         pr_debug("adding device to %d, function %d\n", s->sock, function);
     495                 :            : 
     496                 :          0 :         p_dev = kzalloc(sizeof(struct pcmcia_device), GFP_KERNEL);
     497         [ #  # ]:          0 :         if (!p_dev)
     498                 :          0 :                 goto err_put;
     499                 :            : 
     500                 :          0 :         mutex_lock(&s->ops_mutex);
     501                 :          0 :         p_dev->device_no = (s->device_count++);
     502                 :          0 :         mutex_unlock(&s->ops_mutex);
     503                 :            : 
     504                 :            :         /* max of 2 PFC devices */
     505   [ #  #  #  # ]:          0 :         if ((p_dev->device_no >= 2) && (function == 0))
     506                 :          0 :                 goto err_free;
     507                 :            : 
     508                 :            :         /* max of 4 devices overall */
     509         [ #  # ]:          0 :         if (p_dev->device_no >= 4)
     510                 :          0 :                 goto err_free;
     511                 :            : 
     512                 :          0 :         p_dev->socket = s;
     513                 :          0 :         p_dev->func   = function;
     514                 :            : 
     515                 :          0 :         p_dev->dev.bus = &pcmcia_bus_type;
     516                 :          0 :         p_dev->dev.parent = s->dev.parent;
     517                 :          0 :         p_dev->dev.release = pcmcia_release_dev;
     518                 :            :         /* by default don't allow DMA */
     519                 :          0 :         p_dev->dma_mask = DMA_MASK_NONE;
     520                 :          0 :         p_dev->dev.dma_mask = &p_dev->dma_mask;
     521                 :          0 :         dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no);
     522   [ #  #  #  # ]:          0 :         if (!dev_name(&p_dev->dev))
     523                 :          0 :                 goto err_free;
     524                 :          0 :         p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev));
     525         [ #  # ]:          0 :         if (!p_dev->devname)
     526                 :          0 :                 goto err_free;
     527                 :          0 :         dev_dbg(&p_dev->dev, "devname is %s\n", p_dev->devname);
     528                 :            : 
     529                 :          0 :         mutex_lock(&s->ops_mutex);
     530                 :            : 
     531                 :            :         /*
     532                 :            :          * p_dev->function_config must be the same for all card functions.
     533                 :            :          * Note that this is serialized by ops_mutex, so that only one
     534                 :            :          * such struct will be created.
     535                 :            :          */
     536         [ #  # ]:          0 :         list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
     537         [ #  # ]:          0 :                 if (p_dev->func == tmp_dev->func) {
     538                 :          0 :                         p_dev->function_config = tmp_dev->function_config;
     539                 :          0 :                         p_dev->irq = tmp_dev->irq;
     540                 :          0 :                         kref_get(&p_dev->function_config->ref);
     541                 :            :                 }
     542                 :            : 
     543                 :            :         /* Add to the list in pcmcia_bus_socket */
     544                 :          0 :         list_add(&p_dev->socket_device_list, &s->devices_list);
     545                 :            : 
     546         [ #  # ]:          0 :         if (pcmcia_setup_irq(p_dev))
     547                 :          0 :                 dev_warn(&p_dev->dev,
     548                 :            :                         "IRQ setup failed -- device might not work\n");
     549                 :            : 
     550         [ #  # ]:          0 :         if (!p_dev->function_config) {
     551                 :          0 :                 config_t *c;
     552                 :          0 :                 dev_dbg(&p_dev->dev, "creating config_t\n");
     553                 :          0 :                 c = kzalloc(sizeof(struct config_t), GFP_KERNEL);
     554         [ #  # ]:          0 :                 if (!c) {
     555                 :          0 :                         mutex_unlock(&s->ops_mutex);
     556                 :          0 :                         goto err_unreg;
     557                 :            :                 }
     558                 :          0 :                 p_dev->function_config = c;
     559                 :          0 :                 kref_init(&c->ref);
     560         [ #  # ]:          0 :                 for (i = 0; i < MAX_IO_WIN; i++) {
     561                 :          0 :                         c->io[i].name = p_dev->devname;
     562                 :          0 :                         c->io[i].flags = IORESOURCE_IO;
     563                 :            :                 }
     564         [ #  # ]:          0 :                 for (i = 0; i < MAX_WIN; i++) {
     565                 :          0 :                         c->mem[i].name = p_dev->devname;
     566                 :          0 :                         c->mem[i].flags = IORESOURCE_MEM;
     567                 :            :                 }
     568                 :            :         }
     569         [ #  # ]:          0 :         for (i = 0; i < MAX_IO_WIN; i++)
     570                 :          0 :                 p_dev->resource[i] = &p_dev->function_config->io[i];
     571         [ #  # ]:          0 :         for (; i < (MAX_IO_WIN + MAX_WIN); i++)
     572                 :          0 :                 p_dev->resource[i] = &p_dev->function_config->mem[i-MAX_IO_WIN];
     573                 :            : 
     574                 :          0 :         mutex_unlock(&s->ops_mutex);
     575                 :            : 
     576                 :          0 :         dev_notice(&p_dev->dev, "pcmcia: registering new device %s (IRQ: %d)\n",
     577                 :            :                    p_dev->devname, p_dev->irq);
     578                 :            : 
     579                 :          0 :         pcmcia_device_query(p_dev);
     580                 :            : 
     581         [ #  # ]:          0 :         if (device_register(&p_dev->dev))
     582                 :          0 :                 goto err_unreg;
     583                 :            : 
     584                 :            :         return p_dev;
     585                 :            : 
     586                 :          0 :  err_unreg:
     587                 :          0 :         mutex_lock(&s->ops_mutex);
     588                 :          0 :         list_del(&p_dev->socket_device_list);
     589                 :          0 :         mutex_unlock(&s->ops_mutex);
     590                 :            : 
     591                 :          0 :  err_free:
     592                 :          0 :         mutex_lock(&s->ops_mutex);
     593                 :          0 :         s->device_count--;
     594                 :          0 :         mutex_unlock(&s->ops_mutex);
     595                 :            : 
     596         [ #  # ]:          0 :         for (i = 0; i < 4; i++)
     597                 :          0 :                 kfree(p_dev->prod_id[i]);
     598                 :          0 :         kfree(p_dev->devname);
     599                 :          0 :         kfree(p_dev);
     600                 :          0 :  err_put:
     601                 :          0 :         pcmcia_put_socket(s);
     602                 :            : 
     603                 :          0 :         return NULL;
     604                 :            : }
     605                 :            : 
     606                 :            : 
     607                 :          0 : static int pcmcia_card_add(struct pcmcia_socket *s)
     608                 :            : {
     609                 :          0 :         cistpl_longlink_mfc_t mfc;
     610                 :          0 :         unsigned int no_funcs, i, no_chains;
     611                 :          0 :         int ret = -EAGAIN;
     612                 :            : 
     613                 :          0 :         mutex_lock(&s->ops_mutex);
     614         [ #  # ]:          0 :         if (!(s->resource_setup_done)) {
     615                 :          0 :                 dev_dbg(&s->dev,
     616                 :            :                            "no resources available, delaying card_add\n");
     617                 :          0 :                 mutex_unlock(&s->ops_mutex);
     618                 :          0 :                 return -EAGAIN; /* try again, but later... */
     619                 :            :         }
     620                 :            : 
     621         [ #  # ]:          0 :         if (pcmcia_validate_mem(s)) {
     622                 :          0 :                 dev_dbg(&s->dev, "validating mem resources failed, "
     623                 :            :                        "delaying card_add\n");
     624                 :          0 :                 mutex_unlock(&s->ops_mutex);
     625                 :          0 :                 return -EAGAIN; /* try again, but later... */
     626                 :            :         }
     627                 :          0 :         mutex_unlock(&s->ops_mutex);
     628                 :            : 
     629                 :          0 :         ret = pccard_validate_cis(s, &no_chains);
     630   [ #  #  #  # ]:          0 :         if (ret || !no_chains) {
     631                 :            : #if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
     632                 :            :                 /* Set up as an anonymous card. If we don't have anonymous
     633                 :            :                    memory support then just error the card as there is no
     634                 :            :                    point trying to second guess.
     635                 :            : 
     636                 :            :                    Note: some cards have just a device entry, it may be
     637                 :            :                    worth extending support to cover these in future */
     638                 :            :                 if (ret == -EIO) {
     639                 :            :                         dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n");
     640                 :            :                         pcmcia_replace_cis(s, "\xFF", 1);
     641                 :            :                         no_chains = 1;
     642                 :            :                         ret = 0;
     643                 :            :                 } else
     644                 :            : #endif
     645                 :            :                 {
     646                 :            :                         dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
     647                 :            :                         return -ENODEV;
     648                 :            :                 }
     649                 :            :         }
     650                 :            : 
     651         [ #  # ]:          0 :         if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
     652                 :          0 :                 no_funcs = mfc.nfn;
     653                 :            :         else
     654                 :            :                 no_funcs = 1;
     655                 :          0 :         s->functions = no_funcs;
     656                 :            : 
     657         [ #  # ]:          0 :         for (i = 0; i < no_funcs; i++)
     658                 :          0 :                 pcmcia_device_add(s, i);
     659                 :            : 
     660                 :            :         return ret;
     661                 :            : }
     662                 :            : 
     663                 :            : 
     664                 :          0 : static int pcmcia_requery_callback(struct device *dev, void *_data)
     665                 :            : {
     666                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
     667         [ #  # ]:          0 :         if (!p_dev->dev.driver) {
     668                 :          0 :                 dev_dbg(dev, "update device information\n");
     669                 :          0 :                 pcmcia_device_query(p_dev);
     670                 :            :         }
     671                 :            : 
     672                 :          0 :         return 0;
     673                 :            : }
     674                 :            : 
     675                 :            : 
     676                 :          0 : static void pcmcia_requery(struct pcmcia_socket *s)
     677                 :            : {
     678                 :          0 :         int has_pfc;
     679                 :            : 
     680         [ #  # ]:          0 :         if (!(s->state & SOCKET_PRESENT))
     681                 :            :                 return;
     682                 :            : 
     683         [ #  # ]:          0 :         if (s->functions == 0) {
     684                 :          0 :                 pcmcia_card_add(s);
     685                 :          0 :                 return;
     686                 :            :         }
     687                 :            : 
     688                 :            :         /* some device information might have changed because of a CIS
     689                 :            :          * update or because we can finally read it correctly... so
     690                 :            :          * determine it again, overwriting old values if necessary. */
     691                 :          0 :         bus_for_each_dev(&pcmcia_bus_type, NULL, NULL, pcmcia_requery_callback);
     692                 :            : 
     693                 :            :         /* if the CIS changed, we need to check whether the number of
     694                 :            :          * functions changed. */
     695         [ #  # ]:          0 :         if (s->fake_cis) {
     696                 :          0 :                 int old_funcs, new_funcs;
     697                 :          0 :                 cistpl_longlink_mfc_t mfc;
     698                 :            : 
     699                 :            :                 /* does this cis override add or remove functions? */
     700                 :          0 :                 old_funcs = s->functions;
     701                 :            : 
     702         [ #  # ]:          0 :                 if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC,
     703                 :            :                                         &mfc))
     704                 :          0 :                         new_funcs = mfc.nfn;
     705                 :            :                 else
     706                 :            :                         new_funcs = 1;
     707         [ #  # ]:          0 :                 if (old_funcs != new_funcs) {
     708                 :            :                         /* we need to re-start */
     709                 :          0 :                         pcmcia_card_remove(s, NULL);
     710                 :          0 :                         s->functions = 0;
     711                 :          0 :                         pcmcia_card_add(s);
     712                 :            :                 }
     713                 :            :         }
     714                 :            : 
     715                 :            :         /* If the PCMCIA device consists of two pseudo devices,
     716                 :            :          * call pcmcia_device_add() -- which will fail if both
     717                 :            :          * devices are already registered. */
     718                 :          0 :         mutex_lock(&s->ops_mutex);
     719                 :          0 :         has_pfc = s->pcmcia_pfc;
     720                 :          0 :         mutex_unlock(&s->ops_mutex);
     721         [ #  # ]:          0 :         if (has_pfc)
     722                 :          0 :                 pcmcia_device_add(s, 0);
     723                 :            : 
     724                 :            :         /* we re-scan all devices, not just the ones connected to this
     725                 :            :          * socket. This does not matter, though. */
     726         [ #  # ]:          0 :         if (bus_rescan_devices(&pcmcia_bus_type))
     727                 :          0 :                 dev_warn(&s->dev, "rescanning the bus failed\n");
     728                 :            : }
     729                 :            : 
     730                 :            : 
     731                 :            : #ifdef CONFIG_PCMCIA_LOAD_CIS
     732                 :            : 
     733                 :            : /**
     734                 :            :  * pcmcia_load_firmware - load CIS from userspace if device-provided is broken
     735                 :            :  * @dev: the pcmcia device which needs a CIS override
     736                 :            :  * @filename: requested filename in /lib/firmware/
     737                 :            :  *
     738                 :            :  * This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
     739                 :            :  * the one provided by the card is broken. The firmware files reside in
     740                 :            :  * /lib/firmware/ in userspace.
     741                 :            :  */
     742                 :          0 : static int pcmcia_load_firmware(struct pcmcia_device *dev, char *filename)
     743                 :            : {
     744                 :          0 :         struct pcmcia_socket *s = dev->socket;
     745                 :          0 :         const struct firmware *fw;
     746                 :          0 :         int ret = -ENOMEM;
     747                 :          0 :         cistpl_longlink_mfc_t mfc;
     748                 :          0 :         int old_funcs, new_funcs = 1;
     749                 :            : 
     750         [ #  # ]:          0 :         if (!filename)
     751                 :            :                 return -EINVAL;
     752                 :            : 
     753                 :          0 :         dev_dbg(&dev->dev, "trying to load CIS file %s\n", filename);
     754                 :            : 
     755         [ #  # ]:          0 :         if (request_firmware(&fw, filename, &dev->dev) == 0) {
     756         [ #  # ]:          0 :                 if (fw->size >= CISTPL_MAX_CIS_SIZE) {
     757                 :          0 :                         ret = -EINVAL;
     758                 :          0 :                         dev_err(&dev->dev, "pcmcia: CIS override is too big\n");
     759                 :          0 :                         goto release;
     760                 :            :                 }
     761                 :            : 
     762         [ #  # ]:          0 :                 if (!pcmcia_replace_cis(s, fw->data, fw->size))
     763                 :          0 :                         ret = 0;
     764                 :            :                 else {
     765                 :          0 :                         dev_err(&dev->dev, "pcmcia: CIS override failed\n");
     766                 :          0 :                         goto release;
     767                 :            :                 }
     768                 :            : 
     769                 :            :                 /* we need to re-start if the number of functions changed */
     770                 :          0 :                 old_funcs = s->functions;
     771         [ #  # ]:          0 :                 if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC,
     772                 :            :                                         &mfc))
     773                 :          0 :                         new_funcs = mfc.nfn;
     774                 :            : 
     775         [ #  # ]:          0 :                 if (old_funcs != new_funcs)
     776                 :          0 :                         ret = -EBUSY;
     777                 :            : 
     778                 :            :                 /* update information */
     779                 :          0 :                 pcmcia_device_query(dev);
     780                 :            : 
     781                 :            :                 /* requery (as number of functions might have changed) */
     782                 :          0 :                 pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
     783                 :            :         }
     784                 :          0 :  release:
     785                 :          0 :         release_firmware(fw);
     786                 :            : 
     787                 :          0 :         return ret;
     788                 :            : }
     789                 :            : 
     790                 :            : #else /* !CONFIG_PCMCIA_LOAD_CIS */
     791                 :            : 
     792                 :            : static inline int pcmcia_load_firmware(struct pcmcia_device *dev,
     793                 :            :                                        char *filename)
     794                 :            : {
     795                 :            :         return -ENODEV;
     796                 :            : }
     797                 :            : 
     798                 :            : #endif
     799                 :            : 
     800                 :            : 
     801                 :          0 : static inline int pcmcia_devmatch(struct pcmcia_device *dev,
     802                 :            :                                   const struct pcmcia_device_id *did)
     803                 :            : {
     804         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
     805   [ #  #  #  # ]:          0 :                 if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
     806                 :            :                         return 0;
     807                 :            :         }
     808                 :            : 
     809         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
     810   [ #  #  #  # ]:          0 :                 if ((!dev->has_card_id) || (dev->card_id != did->card_id))
     811                 :            :                         return 0;
     812                 :            :         }
     813                 :            : 
     814         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
     815         [ #  # ]:          0 :                 if (dev->func != did->function)
     816                 :            :                         return 0;
     817                 :            :         }
     818                 :            : 
     819         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
     820         [ #  # ]:          0 :                 if (!dev->prod_id[0])
     821                 :            :                         return 0;
     822         [ #  # ]:          0 :                 if (strcmp(did->prod_id[0], dev->prod_id[0]))
     823                 :            :                         return 0;
     824                 :            :         }
     825                 :            : 
     826         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
     827         [ #  # ]:          0 :                 if (!dev->prod_id[1])
     828                 :            :                         return 0;
     829         [ #  # ]:          0 :                 if (strcmp(did->prod_id[1], dev->prod_id[1]))
     830                 :            :                         return 0;
     831                 :            :         }
     832                 :            : 
     833         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
     834         [ #  # ]:          0 :                 if (!dev->prod_id[2])
     835                 :            :                         return 0;
     836         [ #  # ]:          0 :                 if (strcmp(did->prod_id[2], dev->prod_id[2]))
     837                 :            :                         return 0;
     838                 :            :         }
     839                 :            : 
     840         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
     841         [ #  # ]:          0 :                 if (!dev->prod_id[3])
     842                 :            :                         return 0;
     843         [ #  # ]:          0 :                 if (strcmp(did->prod_id[3], dev->prod_id[3]))
     844                 :            :                         return 0;
     845                 :            :         }
     846                 :            : 
     847         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
     848                 :          0 :                 dev_dbg(&dev->dev, "this is a pseudo-multi-function device\n");
     849                 :          0 :                 mutex_lock(&dev->socket->ops_mutex);
     850                 :          0 :                 dev->socket->pcmcia_pfc = 1;
     851                 :          0 :                 mutex_unlock(&dev->socket->ops_mutex);
     852         [ #  # ]:          0 :                 if (dev->device_no != did->device_no)
     853                 :            :                         return 0;
     854                 :            :         }
     855                 :            : 
     856         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
     857                 :          0 :                 int ret;
     858                 :            : 
     859   [ #  #  #  # ]:          0 :                 if ((!dev->has_func_id) || (dev->func_id != did->func_id))
     860                 :            :                         return 0;
     861                 :            : 
     862                 :            :                 /* if this is a pseudo-multi-function device,
     863                 :            :                  * we need explicit matches */
     864         [ #  # ]:          0 :                 if (dev->socket->pcmcia_pfc)
     865                 :            :                         return 0;
     866         [ #  # ]:          0 :                 if (dev->device_no)
     867                 :            :                         return 0;
     868                 :            : 
     869                 :            :                 /* also, FUNC_ID matching needs to be activated by userspace
     870                 :            :                  * after it has re-checked that there is no possible module
     871                 :            :                  * with a prod_id/manf_id/card_id match.
     872                 :            :                  */
     873                 :          0 :                 mutex_lock(&dev->socket->ops_mutex);
     874                 :          0 :                 ret = dev->allow_func_id_match;
     875                 :          0 :                 mutex_unlock(&dev->socket->ops_mutex);
     876                 :            : 
     877         [ #  # ]:          0 :                 if (!ret) {
     878                 :            :                         dev_dbg(&dev->dev,
     879                 :            :                                 "skipping FUNC_ID match until userspace ACK\n");
     880                 :            :                         return 0;
     881                 :            :                 }
     882                 :            :         }
     883                 :            : 
     884         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
     885                 :          0 :                 dev_dbg(&dev->dev, "device needs a fake CIS\n");
     886         [ #  # ]:          0 :                 if (!dev->socket->fake_cis)
     887         [ #  # ]:          0 :                         if (pcmcia_load_firmware(dev, did->cisfile))
     888                 :            :                                 return 0;
     889                 :            :         }
     890                 :            : 
     891         [ #  # ]:          0 :         if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
     892                 :            :                 int i;
     893         [ #  # ]:          0 :                 for (i = 0; i < 4; i++)
     894         [ #  # ]:          0 :                         if (dev->prod_id[i])
     895                 :            :                                 return 0;
     896         [ #  # ]:          0 :                 if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
     897                 :          0 :                         return 0;
     898                 :            :         }
     899                 :            : 
     900                 :            :         return 1;
     901                 :            : }
     902                 :            : 
     903                 :            : 
     904                 :          0 : static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
     905                 :            : {
     906                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
     907                 :          0 :         struct pcmcia_driver *p_drv = to_pcmcia_drv(drv);
     908                 :          0 :         const struct pcmcia_device_id *did = p_drv->id_table;
     909                 :          0 :         struct pcmcia_dynid *dynid;
     910                 :            : 
     911                 :            :         /* match dynamic devices first */
     912                 :          0 :         mutex_lock(&p_drv->dynids.lock);
     913         [ #  # ]:          0 :         list_for_each_entry(dynid, &p_drv->dynids.list, node) {
     914                 :          0 :                 dev_dbg(dev, "trying to match to %s\n", drv->name);
     915         [ #  # ]:          0 :                 if (pcmcia_devmatch(p_dev, &dynid->id)) {
     916                 :          0 :                         dev_dbg(dev, "matched to %s\n", drv->name);
     917                 :          0 :                         mutex_unlock(&p_drv->dynids.lock);
     918                 :          0 :                         return 1;
     919                 :            :                 }
     920                 :            :         }
     921                 :          0 :         mutex_unlock(&p_drv->dynids.lock);
     922                 :            : 
     923   [ #  #  #  # ]:          0 :         while (did && did->match_flags) {
     924                 :          0 :                 dev_dbg(dev, "trying to match to %s\n", drv->name);
     925         [ #  # ]:          0 :                 if (pcmcia_devmatch(p_dev, did)) {
     926                 :            :                         dev_dbg(dev, "matched to %s\n", drv->name);
     927                 :            :                         return 1;
     928                 :            :                 }
     929                 :          0 :                 did++;
     930                 :            :         }
     931                 :            : 
     932                 :            :         return 0;
     933                 :            : }
     934                 :            : 
     935                 :          0 : static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
     936                 :            : {
     937                 :          0 :         struct pcmcia_device *p_dev;
     938                 :          0 :         int i;
     939                 :          0 :         u32 hash[4] = { 0, 0, 0, 0};
     940                 :            : 
     941         [ #  # ]:          0 :         if (!dev)
     942                 :            :                 return -ENODEV;
     943                 :            : 
     944                 :            :         p_dev = to_pcmcia_dev(dev);
     945                 :            : 
     946                 :            :         /* calculate hashes */
     947         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
     948         [ #  # ]:          0 :                 if (!p_dev->prod_id[i])
     949                 :          0 :                         continue;
     950                 :          0 :                 hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
     951                 :            :         }
     952                 :            : 
     953         [ #  # ]:          0 :         if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock))
     954                 :            :                 return -ENOMEM;
     955                 :            : 
     956         [ #  # ]:          0 :         if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no))
     957                 :            :                 return -ENOMEM;
     958                 :            : 
     959         [ #  # ]:          0 :         if (add_uevent_var(env, "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
     960                 :            :                            "pa%08Xpb%08Xpc%08Xpd%08X",
     961         [ #  # ]:          0 :                            p_dev->has_manf_id ? p_dev->manf_id : 0,
     962         [ #  # ]:          0 :                            p_dev->has_card_id ? p_dev->card_id : 0,
     963                 :          0 :                            p_dev->has_func_id ? p_dev->func_id : 0,
     964                 :          0 :                            p_dev->func,
     965         [ #  # ]:          0 :                            p_dev->device_no,
     966                 :            :                            hash[0],
     967                 :            :                            hash[1],
     968                 :            :                            hash[2],
     969                 :            :                            hash[3]))
     970                 :          0 :                 return -ENOMEM;
     971                 :            : 
     972                 :            :         return 0;
     973                 :            : }
     974                 :            : 
     975                 :            : /************************ runtime PM support ***************************/
     976                 :            : 
     977                 :            : static int pcmcia_dev_suspend(struct device *dev);
     978                 :            : static int pcmcia_dev_resume(struct device *dev);
     979                 :            : 
     980                 :          0 : static int runtime_suspend(struct device *dev)
     981                 :            : {
     982                 :          0 :         int rc;
     983                 :            : 
     984                 :          0 :         device_lock(dev);
     985                 :          0 :         rc = pcmcia_dev_suspend(dev);
     986                 :          0 :         device_unlock(dev);
     987                 :          0 :         return rc;
     988                 :            : }
     989                 :            : 
     990                 :          0 : static int runtime_resume(struct device *dev)
     991                 :            : {
     992                 :          0 :         int rc;
     993                 :            : 
     994                 :          0 :         device_lock(dev);
     995                 :          0 :         rc = pcmcia_dev_resume(dev);
     996                 :          0 :         device_unlock(dev);
     997                 :          0 :         return rc;
     998                 :            : }
     999                 :            : 
    1000                 :            : /************************ per-device sysfs output ***************************/
    1001                 :            : 
    1002                 :            : #define pcmcia_device_attr(field, test, format)                         \
    1003                 :            : static ssize_t field##_show (struct device *dev, struct device_attribute *attr, char *buf)              \
    1004                 :            : {                                                                       \
    1005                 :            :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);               \
    1006                 :            :         return p_dev->test ? sprintf(buf, format, p_dev->field) : -ENODEV; \
    1007                 :            : }                                                                       \
    1008                 :            : static DEVICE_ATTR_RO(field);
    1009                 :            : 
    1010                 :            : #define pcmcia_device_stringattr(name, field)                                   \
    1011                 :            : static ssize_t name##_show (struct device *dev, struct device_attribute *attr, char *buf)               \
    1012                 :            : {                                                                       \
    1013                 :            :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);               \
    1014                 :            :         return p_dev->field ? sprintf(buf, "%s\n", p_dev->field) : -ENODEV; \
    1015                 :            : }                                                                       \
    1016                 :            : static DEVICE_ATTR_RO(name);
    1017                 :            : 
    1018         [ #  # ]:          0 : pcmcia_device_attr(func_id, has_func_id, "0x%02x\n");
    1019         [ #  # ]:          0 : pcmcia_device_attr(manf_id, has_manf_id, "0x%04x\n");
    1020         [ #  # ]:          0 : pcmcia_device_attr(card_id, has_card_id, "0x%04x\n");
    1021         [ #  # ]:          0 : pcmcia_device_stringattr(prod_id1, prod_id[0]);
    1022         [ #  # ]:          0 : pcmcia_device_stringattr(prod_id2, prod_id[1]);
    1023         [ #  # ]:          0 : pcmcia_device_stringattr(prod_id3, prod_id[2]);
    1024         [ #  # ]:          0 : pcmcia_device_stringattr(prod_id4, prod_id[3]);
    1025                 :            : 
    1026                 :          0 : static ssize_t function_show(struct device *dev, struct device_attribute *attr,
    1027                 :            :                              char *buf)
    1028                 :            : {
    1029                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1030         [ #  # ]:          0 :         return p_dev->socket ? sprintf(buf, "0x%02x\n", p_dev->func) : -ENODEV;
    1031                 :            : }
    1032                 :            : static DEVICE_ATTR_RO(function);
    1033                 :            : 
    1034                 :          0 : static ssize_t resources_show(struct device *dev,
    1035                 :            :                               struct device_attribute *attr, char *buf)
    1036                 :            : {
    1037                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1038                 :          0 :         char *str = buf;
    1039                 :          0 :         int i;
    1040                 :            : 
    1041         [ #  # ]:          0 :         for (i = 0; i < PCMCIA_NUM_RESOURCES; i++)
    1042                 :          0 :                 str += sprintf(str, "%pr\n", p_dev->resource[i]);
    1043                 :            : 
    1044                 :          0 :         return str - buf;
    1045                 :            : }
    1046                 :            : static DEVICE_ATTR_RO(resources);
    1047                 :            : 
    1048                 :          0 : static ssize_t pm_state_show(struct device *dev, struct device_attribute *attr, char *buf)
    1049                 :            : {
    1050                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1051                 :            : 
    1052         [ #  # ]:          0 :         if (p_dev->suspended)
    1053                 :          0 :                 return sprintf(buf, "off\n");
    1054                 :            :         else
    1055                 :          0 :                 return sprintf(buf, "on\n");
    1056                 :            : }
    1057                 :            : 
    1058                 :          0 : static ssize_t pm_state_store(struct device *dev, struct device_attribute *attr,
    1059                 :            :                               const char *buf, size_t count)
    1060                 :            : {
    1061                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1062                 :          0 :         int ret = 0;
    1063                 :            : 
    1064         [ #  # ]:          0 :         if (!count)
    1065                 :            :                 return -EINVAL;
    1066                 :            : 
    1067   [ #  #  #  # ]:          0 :         if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
    1068                 :          0 :                 ret = runtime_suspend(dev);
    1069   [ #  #  #  # ]:          0 :         else if (p_dev->suspended && !strncmp(buf, "on", 2))
    1070                 :          0 :                 ret = runtime_resume(dev);
    1071                 :            : 
    1072         [ #  # ]:          0 :         return ret ? ret : count;
    1073                 :            : }
    1074                 :            : static DEVICE_ATTR_RW(pm_state);
    1075                 :            : 
    1076                 :          0 : static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
    1077                 :            : {
    1078                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1079                 :          0 :         int i;
    1080                 :          0 :         u32 hash[4] = { 0, 0, 0, 0};
    1081                 :            : 
    1082                 :            :         /* calculate hashes */
    1083         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
    1084         [ #  # ]:          0 :                 if (!p_dev->prod_id[i])
    1085                 :          0 :                         continue;
    1086                 :          0 :                 hash[i] = crc32(0, p_dev->prod_id[i],
    1087                 :            :                                 strlen(p_dev->prod_id[i]));
    1088                 :            :         }
    1089                 :          0 :         return sprintf(buf, "pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
    1090                 :            :                                 "pa%08Xpb%08Xpc%08Xpd%08X\n",
    1091         [ #  # ]:          0 :                                 p_dev->has_manf_id ? p_dev->manf_id : 0,
    1092         [ #  # ]:          0 :                                 p_dev->has_card_id ? p_dev->card_id : 0,
    1093                 :          0 :                                 p_dev->has_func_id ? p_dev->func_id : 0,
    1094         [ #  # ]:          0 :                                 p_dev->func, p_dev->device_no,
    1095                 :            :                                 hash[0], hash[1], hash[2], hash[3]);
    1096                 :            : }
    1097                 :            : static DEVICE_ATTR_RO(modalias);
    1098                 :            : 
    1099                 :          0 : static ssize_t allow_func_id_match_store(struct device *dev,
    1100                 :            :                 struct device_attribute *attr, const char *buf, size_t count)
    1101                 :            : {
    1102                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1103                 :            : 
    1104         [ #  # ]:          0 :         if (!count)
    1105                 :            :                 return -EINVAL;
    1106                 :            : 
    1107                 :          0 :         mutex_lock(&p_dev->socket->ops_mutex);
    1108                 :          0 :         p_dev->allow_func_id_match = 1;
    1109                 :          0 :         mutex_unlock(&p_dev->socket->ops_mutex);
    1110                 :          0 :         pcmcia_parse_uevents(p_dev->socket, PCMCIA_UEVENT_REQUERY);
    1111                 :            : 
    1112                 :          0 :         return count;
    1113                 :            : }
    1114                 :            : static DEVICE_ATTR_WO(allow_func_id_match);
    1115                 :            : 
    1116                 :            : static struct attribute *pcmcia_dev_attrs[] = {
    1117                 :            :         &dev_attr_resources.attr,
    1118                 :            :         &dev_attr_pm_state.attr,
    1119                 :            :         &dev_attr_function.attr,
    1120                 :            :         &dev_attr_func_id.attr,
    1121                 :            :         &dev_attr_manf_id.attr,
    1122                 :            :         &dev_attr_card_id.attr,
    1123                 :            :         &dev_attr_prod_id1.attr,
    1124                 :            :         &dev_attr_prod_id2.attr,
    1125                 :            :         &dev_attr_prod_id3.attr,
    1126                 :            :         &dev_attr_prod_id4.attr,
    1127                 :            :         &dev_attr_modalias.attr,
    1128                 :            :         &dev_attr_allow_func_id_match.attr,
    1129                 :            :         NULL,
    1130                 :            : };
    1131                 :            : ATTRIBUTE_GROUPS(pcmcia_dev);
    1132                 :            : 
    1133                 :            : /* PM support, also needed for reset */
    1134                 :            : 
    1135                 :          0 : static int pcmcia_dev_suspend(struct device *dev)
    1136                 :            : {
    1137                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1138                 :          0 :         struct pcmcia_driver *p_drv = NULL;
    1139                 :          0 :         int ret = 0;
    1140                 :            : 
    1141                 :          0 :         mutex_lock(&p_dev->socket->ops_mutex);
    1142         [ #  # ]:          0 :         if (p_dev->suspended) {
    1143                 :          0 :                 mutex_unlock(&p_dev->socket->ops_mutex);
    1144                 :          0 :                 return 0;
    1145                 :            :         }
    1146                 :          0 :         p_dev->suspended = 1;
    1147                 :          0 :         mutex_unlock(&p_dev->socket->ops_mutex);
    1148                 :            : 
    1149                 :          0 :         dev_dbg(dev, "suspending\n");
    1150                 :            : 
    1151         [ #  # ]:          0 :         if (dev->driver)
    1152                 :          0 :                 p_drv = to_pcmcia_drv(dev->driver);
    1153                 :            : 
    1154         [ #  # ]:          0 :         if (!p_drv)
    1155                 :          0 :                 goto out;
    1156                 :            : 
    1157         [ #  # ]:          0 :         if (p_drv->suspend) {
    1158                 :          0 :                 ret = p_drv->suspend(p_dev);
    1159         [ #  # ]:          0 :                 if (ret) {
    1160                 :          0 :                         dev_err(dev,
    1161                 :            :                                 "pcmcia: device %s (driver %s) did not want to go to sleep (%d)\n",
    1162                 :            :                                 p_dev->devname, p_drv->name, ret);
    1163                 :          0 :                         mutex_lock(&p_dev->socket->ops_mutex);
    1164                 :          0 :                         p_dev->suspended = 0;
    1165                 :          0 :                         mutex_unlock(&p_dev->socket->ops_mutex);
    1166                 :          0 :                         goto out;
    1167                 :            :                 }
    1168                 :            :         }
    1169                 :            : 
    1170         [ #  # ]:          0 :         if (p_dev->device_no == p_dev->func) {
    1171                 :          0 :                 dev_dbg(dev, "releasing configuration\n");
    1172                 :          0 :                 pcmcia_release_configuration(p_dev);
    1173                 :            :         }
    1174                 :            : 
    1175                 :          0 :  out:
    1176                 :            :         return ret;
    1177                 :            : }
    1178                 :            : 
    1179                 :            : 
    1180                 :          0 : static int pcmcia_dev_resume(struct device *dev)
    1181                 :            : {
    1182                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1183                 :          0 :         struct pcmcia_driver *p_drv = NULL;
    1184                 :          0 :         int ret = 0;
    1185                 :            : 
    1186                 :          0 :         mutex_lock(&p_dev->socket->ops_mutex);
    1187         [ #  # ]:          0 :         if (!p_dev->suspended) {
    1188                 :          0 :                 mutex_unlock(&p_dev->socket->ops_mutex);
    1189                 :          0 :                 return 0;
    1190                 :            :         }
    1191                 :          0 :         p_dev->suspended = 0;
    1192                 :          0 :         mutex_unlock(&p_dev->socket->ops_mutex);
    1193                 :            : 
    1194                 :          0 :         dev_dbg(dev, "resuming\n");
    1195                 :            : 
    1196         [ #  # ]:          0 :         if (dev->driver)
    1197                 :          0 :                 p_drv = to_pcmcia_drv(dev->driver);
    1198                 :            : 
    1199         [ #  # ]:          0 :         if (!p_drv)
    1200                 :          0 :                 goto out;
    1201                 :            : 
    1202         [ #  # ]:          0 :         if (p_dev->device_no == p_dev->func) {
    1203                 :          0 :                 dev_dbg(dev, "requesting configuration\n");
    1204                 :          0 :                 ret = pcmcia_enable_device(p_dev);
    1205         [ #  # ]:          0 :                 if (ret)
    1206                 :          0 :                         goto out;
    1207                 :            :         }
    1208                 :            : 
    1209         [ #  # ]:          0 :         if (p_drv->resume)
    1210                 :          0 :                 ret = p_drv->resume(p_dev);
    1211                 :            : 
    1212                 :          0 :  out:
    1213                 :            :         return ret;
    1214                 :            : }
    1215                 :            : 
    1216                 :            : 
    1217                 :          0 : static int pcmcia_bus_suspend_callback(struct device *dev, void *_data)
    1218                 :            : {
    1219                 :          0 :         struct pcmcia_socket *skt = _data;
    1220                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1221                 :            : 
    1222   [ #  #  #  # ]:          0 :         if (p_dev->socket != skt || p_dev->suspended)
    1223                 :            :                 return 0;
    1224                 :            : 
    1225                 :          0 :         return runtime_suspend(dev);
    1226                 :            : }
    1227                 :            : 
    1228                 :          0 : static int pcmcia_bus_resume_callback(struct device *dev, void *_data)
    1229                 :            : {
    1230                 :          0 :         struct pcmcia_socket *skt = _data;
    1231                 :          0 :         struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
    1232                 :            : 
    1233   [ #  #  #  # ]:          0 :         if (p_dev->socket != skt || !p_dev->suspended)
    1234                 :            :                 return 0;
    1235                 :            : 
    1236                 :          0 :         runtime_resume(dev);
    1237                 :            : 
    1238                 :          0 :         return 0;
    1239                 :            : }
    1240                 :            : 
    1241                 :          0 : static int pcmcia_bus_resume(struct pcmcia_socket *skt)
    1242                 :            : {
    1243                 :          0 :         dev_dbg(&skt->dev, "resuming socket %d\n", skt->sock);
    1244                 :          0 :         bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
    1245                 :          0 :         return 0;
    1246                 :            : }
    1247                 :            : 
    1248                 :          0 : static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
    1249                 :            : {
    1250                 :          0 :         dev_dbg(&skt->dev, "suspending socket %d\n", skt->sock);
    1251         [ #  # ]:          0 :         if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
    1252                 :            :                              pcmcia_bus_suspend_callback)) {
    1253                 :          0 :                 pcmcia_bus_resume(skt);
    1254                 :          0 :                 return -EIO;
    1255                 :            :         }
    1256                 :            :         return 0;
    1257                 :            : }
    1258                 :            : 
    1259                 :          0 : static int pcmcia_bus_remove(struct pcmcia_socket *skt)
    1260                 :            : {
    1261                 :          0 :         atomic_set(&skt->present, 0);
    1262                 :          0 :         pcmcia_card_remove(skt, NULL);
    1263                 :            : 
    1264                 :          0 :         mutex_lock(&skt->ops_mutex);
    1265                 :          0 :         destroy_cis_cache(skt);
    1266                 :          0 :         pcmcia_cleanup_irq(skt);
    1267                 :          0 :         mutex_unlock(&skt->ops_mutex);
    1268                 :            : 
    1269                 :          0 :         return 0;
    1270                 :            : }
    1271                 :            : 
    1272                 :          0 : static int pcmcia_bus_add(struct pcmcia_socket *skt)
    1273                 :            : {
    1274                 :          0 :         atomic_set(&skt->present, 1);
    1275                 :            : 
    1276                 :          0 :         mutex_lock(&skt->ops_mutex);
    1277                 :          0 :         skt->pcmcia_pfc = 0;
    1278                 :          0 :         destroy_cis_cache(skt); /* to be on the safe side... */
    1279                 :          0 :         mutex_unlock(&skt->ops_mutex);
    1280                 :            : 
    1281                 :          0 :         pcmcia_card_add(skt);
    1282                 :            : 
    1283                 :          0 :         return 0;
    1284                 :            : }
    1285                 :            : 
    1286                 :          0 : static int pcmcia_bus_early_resume(struct pcmcia_socket *skt)
    1287                 :            : {
    1288         [ #  # ]:          0 :         if (!verify_cis_cache(skt))
    1289                 :            :                 return 0;
    1290                 :            : 
    1291                 :          0 :         dev_dbg(&skt->dev, "cis mismatch - different card\n");
    1292                 :            : 
    1293                 :            :         /* first, remove the card */
    1294                 :          0 :         pcmcia_bus_remove(skt);
    1295                 :            : 
    1296                 :          0 :         mutex_lock(&skt->ops_mutex);
    1297                 :          0 :         destroy_cis_cache(skt);
    1298                 :          0 :         kfree(skt->fake_cis);
    1299                 :          0 :         skt->fake_cis = NULL;
    1300                 :          0 :         skt->functions = 0;
    1301                 :          0 :         mutex_unlock(&skt->ops_mutex);
    1302                 :            : 
    1303                 :            :         /* now, add the new card */
    1304                 :          0 :         pcmcia_bus_add(skt);
    1305                 :          0 :         return 0;
    1306                 :            : }
    1307                 :            : 
    1308                 :            : 
    1309                 :            : /*
    1310                 :            :  * NOTE: This is racy. There's no guarantee the card will still be
    1311                 :            :  * physically present, even if the call to this function returns
    1312                 :            :  * non-NULL. Furthermore, the device driver most likely is unbound
    1313                 :            :  * almost immediately, so the timeframe where pcmcia_dev_present
    1314                 :            :  * returns NULL is probably really really small.
    1315                 :            :  */
    1316                 :          0 : struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *_p_dev)
    1317                 :            : {
    1318                 :          0 :         struct pcmcia_device *p_dev;
    1319                 :          0 :         struct pcmcia_device *ret = NULL;
    1320                 :            : 
    1321                 :          0 :         p_dev = pcmcia_get_dev(_p_dev);
    1322         [ #  # ]:          0 :         if (!p_dev)
    1323                 :            :                 return NULL;
    1324                 :            : 
    1325         [ #  # ]:          0 :         if (atomic_read(&p_dev->socket->present) != 0)
    1326                 :          0 :                 ret = p_dev;
    1327                 :            : 
    1328                 :          0 :         pcmcia_put_dev(p_dev);
    1329                 :          0 :         return ret;
    1330                 :            : }
    1331                 :            : EXPORT_SYMBOL(pcmcia_dev_present);
    1332                 :            : 
    1333                 :            : 
    1334                 :            : static struct pcmcia_callback pcmcia_bus_callback = {
    1335                 :            :         .owner = THIS_MODULE,
    1336                 :            :         .add = pcmcia_bus_add,
    1337                 :            :         .remove = pcmcia_bus_remove,
    1338                 :            :         .requery = pcmcia_requery,
    1339                 :            :         .validate = pccard_validate_cis,
    1340                 :            :         .suspend = pcmcia_bus_suspend,
    1341                 :            :         .early_resume = pcmcia_bus_early_resume,
    1342                 :            :         .resume = pcmcia_bus_resume,
    1343                 :            : };
    1344                 :            : 
    1345                 :          0 : static int pcmcia_bus_add_socket(struct device *dev,
    1346                 :            :                                            struct class_interface *class_intf)
    1347                 :            : {
    1348                 :          0 :         struct pcmcia_socket *socket = dev_get_drvdata(dev);
    1349                 :          0 :         int ret;
    1350                 :            : 
    1351                 :          0 :         socket = pcmcia_get_socket(socket);
    1352         [ #  # ]:          0 :         if (!socket) {
    1353                 :          0 :                 dev_err(dev, "PCMCIA obtaining reference to socket failed\n");
    1354                 :          0 :                 return -ENODEV;
    1355                 :            :         }
    1356                 :            : 
    1357                 :          0 :         ret = sysfs_create_bin_file(&dev->kobj, &pccard_cis_attr);
    1358         [ #  # ]:          0 :         if (ret) {
    1359                 :          0 :                 dev_err(dev, "PCMCIA registration failed\n");
    1360                 :          0 :                 pcmcia_put_socket(socket);
    1361                 :          0 :                 return ret;
    1362                 :            :         }
    1363                 :            : 
    1364                 :          0 :         INIT_LIST_HEAD(&socket->devices_list);
    1365                 :          0 :         socket->pcmcia_pfc = 0;
    1366                 :          0 :         socket->device_count = 0;
    1367                 :          0 :         atomic_set(&socket->present, 0);
    1368                 :            : 
    1369                 :          0 :         ret = pccard_register_pcmcia(socket, &pcmcia_bus_callback);
    1370         [ #  # ]:          0 :         if (ret) {
    1371                 :          0 :                 dev_err(dev, "PCMCIA registration failed\n");
    1372                 :          0 :                 pcmcia_put_socket(socket);
    1373                 :          0 :                 return ret;
    1374                 :            :         }
    1375                 :            : 
    1376                 :            :         return 0;
    1377                 :            : }
    1378                 :            : 
    1379                 :          0 : static void pcmcia_bus_remove_socket(struct device *dev,
    1380                 :            :                                      struct class_interface *class_intf)
    1381                 :            : {
    1382         [ #  # ]:          0 :         struct pcmcia_socket *socket = dev_get_drvdata(dev);
    1383                 :            : 
    1384         [ #  # ]:          0 :         if (!socket)
    1385                 :            :                 return;
    1386                 :            : 
    1387                 :          0 :         pccard_register_pcmcia(socket, NULL);
    1388                 :            : 
    1389                 :            :         /* unregister any unbound devices */
    1390                 :          0 :         mutex_lock(&socket->skt_mutex);
    1391                 :          0 :         pcmcia_card_remove(socket, NULL);
    1392                 :          0 :         release_cis_mem(socket);
    1393                 :          0 :         mutex_unlock(&socket->skt_mutex);
    1394                 :            : 
    1395                 :          0 :         sysfs_remove_bin_file(&dev->kobj, &pccard_cis_attr);
    1396                 :            : 
    1397                 :          0 :         pcmcia_put_socket(socket);
    1398                 :            : 
    1399                 :          0 :         return;
    1400                 :            : }
    1401                 :            : 
    1402                 :            : 
    1403                 :            : /* the pcmcia_bus_interface is used to handle pcmcia socket devices */
    1404                 :            : static struct class_interface pcmcia_bus_interface __refdata = {
    1405                 :            :         .class = &pcmcia_socket_class,
    1406                 :            :         .add_dev = &pcmcia_bus_add_socket,
    1407                 :            :         .remove_dev = &pcmcia_bus_remove_socket,
    1408                 :            : };
    1409                 :            : 
    1410                 :            : static const struct dev_pm_ops pcmcia_bus_pm_ops = {
    1411                 :            :         SET_SYSTEM_SLEEP_PM_OPS(pcmcia_dev_suspend, pcmcia_dev_resume)
    1412                 :            : };
    1413                 :            : 
    1414                 :            : struct bus_type pcmcia_bus_type = {
    1415                 :            :         .name = "pcmcia",
    1416                 :            :         .uevent = pcmcia_bus_uevent,
    1417                 :            :         .match = pcmcia_bus_match,
    1418                 :            :         .dev_groups = pcmcia_dev_groups,
    1419                 :            :         .probe = pcmcia_device_probe,
    1420                 :            :         .remove = pcmcia_device_remove,
    1421                 :            :         .pm = &pcmcia_bus_pm_ops,
    1422                 :            : };
    1423                 :            : 
    1424                 :            : 
    1425                 :         30 : static int __init init_pcmcia_bus(void)
    1426                 :            : {
    1427                 :         30 :         int ret;
    1428                 :            : 
    1429                 :         30 :         ret = bus_register(&pcmcia_bus_type);
    1430         [ -  + ]:         30 :         if (ret < 0) {
    1431                 :          0 :                 printk(KERN_WARNING "pcmcia: bus_register error: %d\n", ret);
    1432                 :          0 :                 return ret;
    1433                 :            :         }
    1434                 :         30 :         ret = class_interface_register(&pcmcia_bus_interface);
    1435         [ -  + ]:         30 :         if (ret < 0) {
    1436                 :          0 :                 printk(KERN_WARNING
    1437                 :            :                         "pcmcia: class_interface_register error: %d\n", ret);
    1438                 :          0 :                 bus_unregister(&pcmcia_bus_type);
    1439                 :          0 :                 return ret;
    1440                 :            :         }
    1441                 :            : 
    1442                 :            :         return 0;
    1443                 :            : }
    1444                 :            : fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
    1445                 :            :                                * pcmcia_socket_class is already registered */
    1446                 :            : 
    1447                 :            : 
    1448                 :          0 : static void __exit exit_pcmcia_bus(void)
    1449                 :            : {
    1450                 :          0 :         class_interface_unregister(&pcmcia_bus_interface);
    1451                 :            : 
    1452                 :          0 :         bus_unregister(&pcmcia_bus_type);
    1453                 :          0 : }
    1454                 :            : module_exit(exit_pcmcia_bus);
    1455                 :            : 
    1456                 :            : 
    1457                 :            : MODULE_ALIAS("ds");

Generated by: LCOV version 1.14