LCOV - code coverage report
Current view: top level - drivers/ssb - main.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 26 610 4.3 %
Date: 2022-03-28 16:04:14 Functions: 3 45 6.7 %
Branches: 6 352 1.7 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Sonics Silicon Backplane
       3                 :            :  * Subsystem core
       4                 :            :  *
       5                 :            :  * Copyright 2005, Broadcom Corporation
       6                 :            :  * Copyright 2006, 2007, Michael Buesch <m@bues.ch>
       7                 :            :  *
       8                 :            :  * Licensed under the GNU/GPL. See COPYING for details.
       9                 :            :  */
      10                 :            : 
      11                 :            : #include "ssb_private.h"
      12                 :            : 
      13                 :            : #include <linux/delay.h>
      14                 :            : #include <linux/io.h>
      15                 :            : #include <linux/module.h>
      16                 :            : #include <linux/platform_device.h>
      17                 :            : #include <linux/ssb/ssb.h>
      18                 :            : #include <linux/ssb/ssb_regs.h>
      19                 :            : #include <linux/ssb/ssb_driver_gige.h>
      20                 :            : #include <linux/dma-mapping.h>
      21                 :            : #include <linux/pci.h>
      22                 :            : #include <linux/mmc/sdio_func.h>
      23                 :            : #include <linux/slab.h>
      24                 :            : 
      25                 :            : #include <pcmcia/cistpl.h>
      26                 :            : #include <pcmcia/ds.h>
      27                 :            : 
      28                 :            : #define DPRINT(fmt, ...) do { printk(KERN_INFO "[%s] "fmt"\n", \
      29                 :            :                 __FUNCTION__, ##__VA_ARGS__); } while (0)
      30                 :            : 
      31                 :            : MODULE_DESCRIPTION("Sonics Silicon Backplane driver");
      32                 :            : MODULE_LICENSE("GPL");
      33                 :            : 
      34                 :            : 
      35                 :            : /* Temporary list of yet-to-be-attached buses */
      36                 :            : static LIST_HEAD(attach_queue);
      37                 :            : /* List if running buses */
      38                 :            : static LIST_HEAD(buses);
      39                 :            : /* Software ID counter */
      40                 :            : static unsigned int next_busnumber;
      41                 :            : /* buses_mutes locks the two buslists and the next_busnumber.
      42                 :            :  * Don't lock this directly, but use ssb_buses_[un]lock() below. */
      43                 :            : static DEFINE_MUTEX(buses_mutex);
      44                 :            : 
      45                 :            : /* There are differences in the codeflow, if the bus is
      46                 :            :  * initialized from early boot, as various needed services
      47                 :            :  * are not available early. This is a mechanism to delay
      48                 :            :  * these initializations to after early boot has finished.
      49                 :            :  * It's also used to avoid mutex locking, as that's not
      50                 :            :  * available and needed early. */
      51                 :            : static bool ssb_is_early_boot = 1;
      52                 :            : 
      53                 :            : static void ssb_buses_lock(void);
      54                 :            : static void ssb_buses_unlock(void);
      55                 :            : 
      56                 :            : 
      57                 :            : #ifdef CONFIG_SSB_PCIHOST
      58                 :          0 : struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev)
      59                 :            : {
      60                 :          0 :         struct ssb_bus *bus;
      61                 :            : 
      62                 :          0 :         ssb_buses_lock();
      63         [ #  # ]:          0 :         list_for_each_entry(bus, &buses, list) {
      64         [ #  # ]:          0 :                 if (bus->bustype == SSB_BUSTYPE_PCI &&
      65         [ #  # ]:          0 :                     bus->host_pci == pdev)
      66                 :          0 :                         goto found;
      67                 :            :         }
      68                 :            :         bus = NULL;
      69                 :          0 : found:
      70                 :          0 :         ssb_buses_unlock();
      71                 :            : 
      72                 :          0 :         return bus;
      73                 :            : }
      74                 :            : #endif /* CONFIG_SSB_PCIHOST */
      75                 :            : 
      76                 :            : #ifdef CONFIG_SSB_PCMCIAHOST
      77                 :            : struct ssb_bus *ssb_pcmcia_dev_to_bus(struct pcmcia_device *pdev)
      78                 :            : {
      79                 :            :         struct ssb_bus *bus;
      80                 :            : 
      81                 :            :         ssb_buses_lock();
      82                 :            :         list_for_each_entry(bus, &buses, list) {
      83                 :            :                 if (bus->bustype == SSB_BUSTYPE_PCMCIA &&
      84                 :            :                     bus->host_pcmcia == pdev)
      85                 :            :                         goto found;
      86                 :            :         }
      87                 :            :         bus = NULL;
      88                 :            : found:
      89                 :            :         ssb_buses_unlock();
      90                 :            : 
      91                 :            :         return bus;
      92                 :            : }
      93                 :            : #endif /* CONFIG_SSB_PCMCIAHOST */
      94                 :            : 
      95                 :          0 : int ssb_for_each_bus_call(unsigned long data,
      96                 :            :                           int (*func)(struct ssb_bus *bus, unsigned long data))
      97                 :            : {
      98                 :          0 :         struct ssb_bus *bus;
      99                 :          0 :         int res;
     100                 :            : 
     101                 :          0 :         ssb_buses_lock();
     102         [ #  # ]:          0 :         list_for_each_entry(bus, &buses, list) {
     103                 :          0 :                 res = func(bus, data);
     104         [ #  # ]:          0 :                 if (res >= 0) {
     105                 :          0 :                         ssb_buses_unlock();
     106                 :          0 :                         return res;
     107                 :            :                 }
     108                 :            :         }
     109                 :          0 :         ssb_buses_unlock();
     110                 :            : 
     111                 :            :         return -ENODEV;
     112                 :            : }
     113                 :            : 
     114                 :          0 : static struct ssb_device *ssb_device_get(struct ssb_device *dev)
     115                 :            : {
     116                 :          0 :         if (dev)
     117                 :          0 :                 get_device(dev->dev);
     118                 :          0 :         return dev;
     119                 :            : }
     120                 :            : 
     121                 :          0 : static void ssb_device_put(struct ssb_device *dev)
     122                 :            : {
     123                 :          0 :         if (dev)
     124                 :          0 :                 put_device(dev->dev);
     125                 :            : }
     126                 :            : 
     127                 :          0 : static int ssb_device_resume(struct device *dev)
     128                 :            : {
     129         [ #  # ]:          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     130                 :          0 :         struct ssb_driver *ssb_drv;
     131                 :          0 :         int err = 0;
     132                 :            : 
     133         [ #  # ]:          0 :         if (dev->driver) {
     134                 :          0 :                 ssb_drv = drv_to_ssb_drv(dev->driver);
     135   [ #  #  #  # ]:          0 :                 if (ssb_drv && ssb_drv->resume)
     136                 :          0 :                         err = ssb_drv->resume(ssb_dev);
     137         [ #  # ]:          0 :                 if (err)
     138                 :          0 :                         goto out;
     139                 :            :         }
     140                 :          0 : out:
     141                 :          0 :         return err;
     142                 :            : }
     143                 :            : 
     144                 :          0 : static int ssb_device_suspend(struct device *dev, pm_message_t state)
     145                 :            : {
     146         [ #  # ]:          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     147                 :          0 :         struct ssb_driver *ssb_drv;
     148                 :          0 :         int err = 0;
     149                 :            : 
     150         [ #  # ]:          0 :         if (dev->driver) {
     151                 :          0 :                 ssb_drv = drv_to_ssb_drv(dev->driver);
     152   [ #  #  #  # ]:          0 :                 if (ssb_drv && ssb_drv->suspend)
     153                 :          0 :                         err = ssb_drv->suspend(ssb_dev, state);
     154         [ #  # ]:          0 :                 if (err)
     155                 :          0 :                         goto out;
     156                 :            :         }
     157                 :          0 : out:
     158                 :          0 :         return err;
     159                 :            : }
     160                 :            : 
     161                 :          0 : int ssb_bus_resume(struct ssb_bus *bus)
     162                 :            : {
     163                 :          0 :         int err;
     164                 :            : 
     165                 :            :         /* Reset HW state information in memory, so that HW is
     166                 :            :          * completely reinitialized. */
     167                 :          0 :         bus->mapped_device = NULL;
     168                 :            : #ifdef CONFIG_SSB_DRIVER_PCICORE
     169                 :          0 :         bus->pcicore.setup_done = 0;
     170                 :            : #endif
     171                 :            : 
     172                 :          0 :         err = ssb_bus_powerup(bus, 0);
     173         [ #  # ]:          0 :         if (err)
     174                 :            :                 return err;
     175                 :          0 :         err = ssb_pcmcia_hardware_setup(bus);
     176                 :          0 :         if (err) {
     177                 :            :                 ssb_bus_may_powerdown(bus);
     178                 :            :                 return err;
     179                 :            :         }
     180                 :          0 :         ssb_chipco_resume(&bus->chipco);
     181                 :          0 :         ssb_bus_may_powerdown(bus);
     182                 :            : 
     183                 :          0 :         return 0;
     184                 :            : }
     185                 :            : EXPORT_SYMBOL(ssb_bus_resume);
     186                 :            : 
     187                 :          0 : int ssb_bus_suspend(struct ssb_bus *bus)
     188                 :            : {
     189                 :          0 :         ssb_chipco_suspend(&bus->chipco);
     190                 :          0 :         ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
     191                 :            : 
     192                 :          0 :         return 0;
     193                 :            : }
     194                 :            : EXPORT_SYMBOL(ssb_bus_suspend);
     195                 :            : 
     196                 :            : #ifdef CONFIG_SSB_SPROM
     197                 :            : /** ssb_devices_freeze - Freeze all devices on the bus.
     198                 :            :  *
     199                 :            :  * After freezing no device driver will be handling a device
     200                 :            :  * on this bus anymore. ssb_devices_thaw() must be called after
     201                 :            :  * a successful freeze to reactivate the devices.
     202                 :            :  *
     203                 :            :  * @bus: The bus.
     204                 :            :  * @ctx: Context structure. Pass this to ssb_devices_thaw().
     205                 :            :  */
     206                 :          0 : int ssb_devices_freeze(struct ssb_bus *bus, struct ssb_freeze_context *ctx)
     207                 :            : {
     208                 :          0 :         struct ssb_device *sdev;
     209                 :          0 :         struct ssb_driver *sdrv;
     210                 :          0 :         unsigned int i;
     211                 :            : 
     212                 :          0 :         memset(ctx, 0, sizeof(*ctx));
     213                 :          0 :         ctx->bus = bus;
     214         [ #  # ]:          0 :         WARN_ON(bus->nr_devices > ARRAY_SIZE(ctx->device_frozen));
     215                 :            : 
     216         [ #  # ]:          0 :         for (i = 0; i < bus->nr_devices; i++) {
     217         [ #  # ]:          0 :                 sdev = ssb_device_get(&bus->devices[i]);
     218                 :            : 
     219   [ #  #  #  #  :          0 :                 if (!sdev->dev || !sdev->dev->driver ||
                   #  # ]
     220                 :            :                     !device_is_registered(sdev->dev)) {
     221         [ #  # ]:          0 :                         ssb_device_put(sdev);
     222                 :          0 :                         continue;
     223                 :            :                 }
     224                 :          0 :                 sdrv = drv_to_ssb_drv(sdev->dev->driver);
     225   [ #  #  #  # ]:          0 :                 if (WARN_ON(!sdrv->remove))
     226                 :          0 :                         continue;
     227                 :          0 :                 sdrv->remove(sdev);
     228                 :          0 :                 ctx->device_frozen[i] = 1;
     229                 :            :         }
     230                 :            : 
     231                 :          0 :         return 0;
     232                 :            : }
     233                 :            : 
     234                 :            : /** ssb_devices_thaw - Unfreeze all devices on the bus.
     235                 :            :  *
     236                 :            :  * This will re-attach the device drivers and re-init the devices.
     237                 :            :  *
     238                 :            :  * @ctx: The context structure from ssb_devices_freeze()
     239                 :            :  */
     240                 :          0 : int ssb_devices_thaw(struct ssb_freeze_context *ctx)
     241                 :            : {
     242                 :          0 :         struct ssb_bus *bus = ctx->bus;
     243                 :          0 :         struct ssb_device *sdev;
     244                 :          0 :         struct ssb_driver *sdrv;
     245                 :          0 :         unsigned int i;
     246                 :          0 :         int err, result = 0;
     247                 :            : 
     248         [ #  # ]:          0 :         for (i = 0; i < bus->nr_devices; i++) {
     249         [ #  # ]:          0 :                 if (!ctx->device_frozen[i])
     250                 :          0 :                         continue;
     251                 :          0 :                 sdev = &bus->devices[i];
     252                 :            : 
     253   [ #  #  #  #  :          0 :                 if (WARN_ON(!sdev->dev || !sdev->dev->driver))
             #  #  #  # ]
     254                 :          0 :                         continue;
     255                 :          0 :                 sdrv = drv_to_ssb_drv(sdev->dev->driver);
     256   [ #  #  #  #  :          0 :                 if (WARN_ON(!sdrv || !sdrv->probe))
             #  #  #  # ]
     257                 :          0 :                         continue;
     258                 :            : 
     259                 :          0 :                 err = sdrv->probe(sdev, &sdev->id);
     260         [ #  # ]:          0 :                 if (err) {
     261         [ #  # ]:          0 :                         dev_err(sdev->dev,
     262                 :            :                                 "Failed to thaw device %s\n",
     263                 :            :                                 dev_name(sdev->dev));
     264                 :          0 :                         result = err;
     265                 :            :                 }
     266         [ #  # ]:          0 :                 ssb_device_put(sdev);
     267                 :            :         }
     268                 :            : 
     269                 :          0 :         return result;
     270                 :            : }
     271                 :            : #endif /* CONFIG_SSB_SPROM */
     272                 :            : 
     273                 :          0 : static void ssb_device_shutdown(struct device *dev)
     274                 :            : {
     275         [ #  # ]:          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     276                 :          0 :         struct ssb_driver *ssb_drv;
     277                 :            : 
     278         [ #  # ]:          0 :         if (!dev->driver)
     279                 :            :                 return;
     280                 :          0 :         ssb_drv = drv_to_ssb_drv(dev->driver);
     281   [ #  #  #  # ]:          0 :         if (ssb_drv && ssb_drv->shutdown)
     282                 :          0 :                 ssb_drv->shutdown(ssb_dev);
     283                 :            : }
     284                 :            : 
     285                 :          0 : static int ssb_device_remove(struct device *dev)
     286                 :            : {
     287         [ #  # ]:          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     288                 :          0 :         struct ssb_driver *ssb_drv = drv_to_ssb_drv(dev->driver);
     289                 :            : 
     290   [ #  #  #  # ]:          0 :         if (ssb_drv && ssb_drv->remove)
     291                 :          0 :                 ssb_drv->remove(ssb_dev);
     292         [ #  # ]:          0 :         ssb_device_put(ssb_dev);
     293                 :            : 
     294                 :          0 :         return 0;
     295                 :            : }
     296                 :            : 
     297                 :          0 : static int ssb_device_probe(struct device *dev)
     298                 :            : {
     299         [ #  # ]:          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     300                 :          0 :         struct ssb_driver *ssb_drv = drv_to_ssb_drv(dev->driver);
     301                 :          0 :         int err = 0;
     302                 :            : 
     303         [ #  # ]:          0 :         ssb_device_get(ssb_dev);
     304   [ #  #  #  # ]:          0 :         if (ssb_drv && ssb_drv->probe)
     305                 :          0 :                 err = ssb_drv->probe(ssb_dev, &ssb_dev->id);
     306         [ #  # ]:          0 :         if (err)
     307         [ #  # ]:          0 :                 ssb_device_put(ssb_dev);
     308                 :            : 
     309                 :          0 :         return err;
     310                 :            : }
     311                 :            : 
     312                 :          0 : static int ssb_match_devid(const struct ssb_device_id *tabid,
     313                 :            :                            const struct ssb_device_id *devid)
     314                 :            : {
     315         [ #  # ]:          0 :         if ((tabid->vendor != devid->vendor) &&
     316                 :            :             tabid->vendor != SSB_ANY_VENDOR)
     317                 :            :                 return 0;
     318   [ #  #  #  # ]:          0 :         if ((tabid->coreid != devid->coreid) &&
     319                 :            :             tabid->coreid != SSB_ANY_ID)
     320                 :            :                 return 0;
     321   [ #  #  #  # ]:          0 :         if ((tabid->revision != devid->revision) &&
     322                 :            :             tabid->revision != SSB_ANY_REV)
     323                 :            :                 return 0;
     324                 :            :         return 1;
     325                 :            : }
     326                 :            : 
     327                 :          0 : static int ssb_bus_match(struct device *dev, struct device_driver *drv)
     328                 :            : {
     329                 :          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     330                 :          0 :         struct ssb_driver *ssb_drv = drv_to_ssb_drv(drv);
     331                 :          0 :         const struct ssb_device_id *id;
     332                 :            : 
     333                 :          0 :         for (id = ssb_drv->id_table;
     334   [ #  #  #  #  :          0 :              id->vendor || id->coreid || id->revision;
                   #  # ]
     335                 :          0 :              id++) {
     336         [ #  # ]:          0 :                 if (ssb_match_devid(id, &ssb_dev->id))
     337                 :            :                         return 1; /* found */
     338                 :            :         }
     339                 :            : 
     340                 :            :         return 0;
     341                 :            : }
     342                 :            : 
     343                 :          0 : static int ssb_device_uevent(struct device *dev, struct kobj_uevent_env *env)
     344                 :            : {
     345         [ #  # ]:          0 :         struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
     346                 :            : 
     347         [ #  # ]:          0 :         if (!dev)
     348                 :            :                 return -ENODEV;
     349                 :            : 
     350                 :          0 :         return add_uevent_var(env,
     351                 :            :                              "MODALIAS=ssb:v%04Xid%04Xrev%02X",
     352                 :          0 :                              ssb_dev->id.vendor, ssb_dev->id.coreid,
     353                 :          0 :                              ssb_dev->id.revision);
     354                 :            : }
     355                 :            : 
     356                 :            : #define ssb_config_attr(attrib, field, format_string) \
     357                 :            : static ssize_t \
     358                 :            : attrib##_show(struct device *dev, struct device_attribute *attr, char *buf) \
     359                 :            : { \
     360                 :            :         return sprintf(buf, format_string, dev_to_ssb_dev(dev)->field); \
     361                 :            : } \
     362                 :            : static DEVICE_ATTR_RO(attrib);
     363                 :            : 
     364                 :          0 : ssb_config_attr(core_num, core_index, "%u\n")
     365                 :          0 : ssb_config_attr(coreid, id.coreid, "0x%04x\n")
     366                 :          0 : ssb_config_attr(vendor, id.vendor, "0x%04x\n")
     367                 :          0 : ssb_config_attr(revision, id.revision, "%u\n")
     368                 :          0 : ssb_config_attr(irq, irq, "%u\n")
     369                 :            : static ssize_t
     370                 :          0 : name_show(struct device *dev, struct device_attribute *attr, char *buf)
     371                 :            : {
     372                 :          0 :         return sprintf(buf, "%s\n",
     373                 :          0 :                        ssb_core_name(dev_to_ssb_dev(dev)->id.coreid));
     374                 :            : }
     375                 :            : static DEVICE_ATTR_RO(name);
     376                 :            : 
     377                 :            : static struct attribute *ssb_device_attrs[] = {
     378                 :            :         &dev_attr_name.attr,
     379                 :            :         &dev_attr_core_num.attr,
     380                 :            :         &dev_attr_coreid.attr,
     381                 :            :         &dev_attr_vendor.attr,
     382                 :            :         &dev_attr_revision.attr,
     383                 :            :         &dev_attr_irq.attr,
     384                 :            :         NULL,
     385                 :            : };
     386                 :            : ATTRIBUTE_GROUPS(ssb_device);
     387                 :            : 
     388                 :            : static struct bus_type ssb_bustype = {
     389                 :            :         .name           = "ssb",
     390                 :            :         .match          = ssb_bus_match,
     391                 :            :         .probe          = ssb_device_probe,
     392                 :            :         .remove         = ssb_device_remove,
     393                 :            :         .shutdown       = ssb_device_shutdown,
     394                 :            :         .suspend        = ssb_device_suspend,
     395                 :            :         .resume         = ssb_device_resume,
     396                 :            :         .uevent         = ssb_device_uevent,
     397                 :            :         .dev_groups     = ssb_device_groups,
     398                 :            : };
     399                 :            : 
     400                 :         13 : static void ssb_buses_lock(void)
     401                 :            : {
     402                 :            :         /* See the comment at the ssb_is_early_boot definition */
     403   [ #  #  #  # ]:          0 :         if (!ssb_is_early_boot)
     404                 :         13 :                 mutex_lock(&buses_mutex);
     405                 :            : }
     406                 :            : 
     407                 :         13 : static void ssb_buses_unlock(void)
     408                 :            : {
     409                 :            :         /* See the comment at the ssb_is_early_boot definition */
     410   [ #  #  #  #  :          0 :         if (!ssb_is_early_boot)
                   #  # ]
     411                 :         13 :                 mutex_unlock(&buses_mutex);
     412                 :            : }
     413                 :            : 
     414                 :          0 : static void ssb_devices_unregister(struct ssb_bus *bus)
     415                 :            : {
     416                 :          0 :         struct ssb_device *sdev;
     417                 :          0 :         int i;
     418                 :            : 
     419   [ #  #  #  # ]:          0 :         for (i = bus->nr_devices - 1; i >= 0; i--) {
     420                 :          0 :                 sdev = &(bus->devices[i]);
     421   [ #  #  #  # ]:          0 :                 if (sdev->dev)
     422                 :          0 :                         device_unregister(sdev->dev);
     423                 :            :         }
     424                 :            : 
     425                 :            : #ifdef CONFIG_SSB_EMBEDDED
     426                 :            :         if (bus->bustype == SSB_BUSTYPE_SSB)
     427                 :            :                 platform_device_unregister(bus->watchdog);
     428                 :            : #endif
     429                 :            : }
     430                 :            : 
     431                 :          0 : void ssb_bus_unregister(struct ssb_bus *bus)
     432                 :            : {
     433                 :          0 :         int err;
     434                 :            : 
     435         [ #  # ]:          0 :         err = ssb_gpio_unregister(bus);
     436                 :          0 :         if (err == -EBUSY)
     437                 :            :                 pr_debug("Some GPIOs are still in use\n");
     438                 :          0 :         else if (err)
     439                 :            :                 pr_debug("Can not unregister GPIO driver: %i\n", err);
     440                 :            : 
     441         [ #  # ]:          0 :         ssb_buses_lock();
     442                 :          0 :         ssb_devices_unregister(bus);
     443         [ #  # ]:          0 :         list_del(&bus->list);
     444         [ #  # ]:          0 :         ssb_buses_unlock();
     445                 :            : 
     446                 :          0 :         ssb_pcmcia_exit(bus);
     447                 :          0 :         ssb_pci_exit(bus);
     448                 :          0 :         ssb_iounmap(bus);
     449                 :          0 : }
     450                 :            : EXPORT_SYMBOL(ssb_bus_unregister);
     451                 :            : 
     452                 :          0 : static void ssb_release_dev(struct device *dev)
     453                 :            : {
     454                 :          0 :         struct __ssb_dev_wrapper *devwrap;
     455                 :            : 
     456                 :          0 :         devwrap = container_of(dev, struct __ssb_dev_wrapper, dev);
     457                 :          0 :         kfree(devwrap);
     458                 :          0 : }
     459                 :            : 
     460                 :          0 : static int ssb_devices_register(struct ssb_bus *bus)
     461                 :            : {
     462                 :          0 :         struct ssb_device *sdev;
     463                 :          0 :         struct device *dev;
     464                 :          0 :         struct __ssb_dev_wrapper *devwrap;
     465                 :          0 :         int i, err = 0;
     466                 :          0 :         int dev_idx = 0;
     467                 :            : 
     468         [ #  # ]:          0 :         for (i = 0; i < bus->nr_devices; i++) {
     469                 :          0 :                 sdev = &(bus->devices[i]);
     470                 :            : 
     471                 :            :                 /* We don't register SSB-system devices to the kernel,
     472                 :            :                  * as the drivers for them are built into SSB. */
     473         [ #  # ]:          0 :                 switch (sdev->id.coreid) {
     474                 :          0 :                 case SSB_DEV_CHIPCOMMON:
     475                 :            :                 case SSB_DEV_PCI:
     476                 :            :                 case SSB_DEV_PCIE:
     477                 :            :                 case SSB_DEV_PCMCIA:
     478                 :            :                 case SSB_DEV_MIPS:
     479                 :            :                 case SSB_DEV_MIPS_3302:
     480                 :            :                 case SSB_DEV_EXTIF:
     481                 :          0 :                         continue;
     482                 :            :                 }
     483                 :            : 
     484                 :          0 :                 devwrap = kzalloc(sizeof(*devwrap), GFP_KERNEL);
     485         [ #  # ]:          0 :                 if (!devwrap) {
     486                 :          0 :                         err = -ENOMEM;
     487                 :          0 :                         goto error;
     488                 :            :                 }
     489                 :          0 :                 dev = &devwrap->dev;
     490                 :          0 :                 devwrap->sdev = sdev;
     491                 :            : 
     492                 :          0 :                 dev->release = ssb_release_dev;
     493                 :          0 :                 dev->bus = &ssb_bustype;
     494                 :          0 :                 dev_set_name(dev, "ssb%u:%d", bus->busnumber, dev_idx);
     495                 :            : 
     496      [ #  #  # ]:          0 :                 switch (bus->bustype) {
     497                 :          0 :                 case SSB_BUSTYPE_PCI:
     498                 :            : #ifdef CONFIG_SSB_PCIHOST
     499                 :          0 :                         sdev->irq = bus->host_pci->irq;
     500                 :          0 :                         dev->parent = &bus->host_pci->dev;
     501                 :          0 :                         sdev->dma_dev = dev->parent;
     502                 :            : #endif
     503                 :          0 :                         break;
     504                 :            :                 case SSB_BUSTYPE_PCMCIA:
     505                 :            : #ifdef CONFIG_SSB_PCMCIAHOST
     506                 :            :                         sdev->irq = bus->host_pcmcia->irq;
     507                 :            :                         dev->parent = &bus->host_pcmcia->dev;
     508                 :            : #endif
     509                 :            :                         break;
     510                 :            :                 case SSB_BUSTYPE_SDIO:
     511                 :            : #ifdef CONFIG_SSB_SDIOHOST
     512                 :            :                         dev->parent = &bus->host_sdio->dev;
     513                 :            : #endif
     514                 :            :                         break;
     515                 :          0 :                 case SSB_BUSTYPE_SSB:
     516                 :          0 :                         dev->dma_mask = &dev->coherent_dma_mask;
     517                 :          0 :                         sdev->dma_dev = dev;
     518                 :          0 :                         break;
     519                 :            :                 }
     520                 :            : 
     521                 :          0 :                 sdev->dev = dev;
     522                 :          0 :                 err = device_register(dev);
     523         [ #  # ]:          0 :                 if (err) {
     524         [ #  # ]:          0 :                         pr_err("Could not register %s\n", dev_name(dev));
     525                 :            :                         /* Set dev to NULL to not unregister
     526                 :            :                          * dev on error unwinding. */
     527                 :          0 :                         sdev->dev = NULL;
     528                 :          0 :                         put_device(dev);
     529                 :          0 :                         goto error;
     530                 :            :                 }
     531                 :          0 :                 dev_idx++;
     532                 :            :         }
     533                 :            : 
     534                 :            : #ifdef CONFIG_SSB_DRIVER_MIPS
     535                 :            :         if (bus->mipscore.pflash.present) {
     536                 :            :                 err = platform_device_register(&ssb_pflash_dev);
     537                 :            :                 if (err)
     538                 :            :                         pr_err("Error registering parallel flash\n");
     539                 :            :         }
     540                 :            : #endif
     541                 :            : 
     542                 :            : #ifdef CONFIG_SSB_SFLASH
     543                 :            :         if (bus->mipscore.sflash.present) {
     544                 :            :                 err = platform_device_register(&ssb_sflash_dev);
     545                 :            :                 if (err)
     546                 :            :                         pr_err("Error registering serial flash\n");
     547                 :            :         }
     548                 :            : #endif
     549                 :            : 
     550                 :            :         return 0;
     551                 :          0 : error:
     552                 :            :         /* Unwind the already registered devices. */
     553                 :          0 :         ssb_devices_unregister(bus);
     554                 :            :         return err;
     555                 :            : }
     556                 :            : 
     557                 :            : /* Needs ssb_buses_lock() */
     558                 :         13 : static int ssb_attach_queued_buses(void)
     559                 :            : {
     560                 :         13 :         struct ssb_bus *bus, *n;
     561                 :         13 :         int err = 0;
     562                 :         13 :         int drop_them_all = 0;
     563                 :            : 
     564         [ -  + ]:         13 :         list_for_each_entry_safe(bus, n, &attach_queue, list) {
     565         [ #  # ]:          0 :                 if (drop_them_all) {
     566                 :          0 :                         list_del(&bus->list);
     567                 :          0 :                         continue;
     568                 :            :                 }
     569                 :            :                 /* Can't init the PCIcore in ssb_bus_register(), as that
     570                 :            :                  * is too early in boot for embedded systems
     571                 :            :                  * (no udelay() available). So do it here in attach stage.
     572                 :            :                  */
     573                 :          0 :                 err = ssb_bus_powerup(bus, 0);
     574         [ #  # ]:          0 :                 if (err)
     575                 :          0 :                         goto error;
     576                 :          0 :                 ssb_pcicore_init(&bus->pcicore);
     577                 :          0 :                 if (bus->bustype == SSB_BUSTYPE_SSB)
     578                 :            :                         ssb_watchdog_register(bus);
     579                 :            : 
     580                 :          0 :                 err = ssb_gpio_init(bus);
     581                 :          0 :                 if (err == -ENOTSUPP)
     582                 :          0 :                         pr_debug("GPIO driver not activated\n");
     583                 :            :                 else if (err)
     584                 :            :                         pr_debug("Error registering GPIO driver: %i\n", err);
     585                 :            : 
     586                 :          0 :                 ssb_bus_may_powerdown(bus);
     587                 :            : 
     588                 :          0 :                 err = ssb_devices_register(bus);
     589                 :          0 : error:
     590         [ #  # ]:          0 :                 if (err) {
     591                 :          0 :                         drop_them_all = 1;
     592                 :          0 :                         list_del(&bus->list);
     593                 :          0 :                         continue;
     594                 :            :                 }
     595                 :          0 :                 list_move_tail(&bus->list, &buses);
     596                 :            :         }
     597                 :            : 
     598                 :         13 :         return err;
     599                 :            : }
     600                 :            : 
     601                 :          0 : static int ssb_fetch_invariants(struct ssb_bus *bus,
     602                 :            :                                 ssb_invariants_func_t get_invariants)
     603                 :            : {
     604                 :          0 :         struct ssb_init_invariants iv;
     605                 :          0 :         int err;
     606                 :            : 
     607                 :          0 :         memset(&iv, 0, sizeof(iv));
     608                 :          0 :         err = get_invariants(bus, &iv);
     609         [ #  # ]:          0 :         if (err)
     610                 :          0 :                 goto out;
     611                 :          0 :         memcpy(&bus->boardinfo, &iv.boardinfo, sizeof(iv.boardinfo));
     612                 :          0 :         memcpy(&bus->sprom, &iv.sprom, sizeof(iv.sprom));
     613                 :          0 :         bus->has_cardbus_slot = iv.has_cardbus_slot;
     614                 :          0 : out:
     615                 :          0 :         return err;
     616                 :            : }
     617                 :            : 
     618                 :            : static int __maybe_unused
     619                 :          0 : ssb_bus_register(struct ssb_bus *bus,
     620                 :            :                  ssb_invariants_func_t get_invariants,
     621                 :            :                  unsigned long baseaddr)
     622                 :            : {
     623                 :          0 :         int err;
     624                 :            : 
     625                 :          0 :         spin_lock_init(&bus->bar_lock);
     626                 :          0 :         INIT_LIST_HEAD(&bus->list);
     627                 :            : #ifdef CONFIG_SSB_EMBEDDED
     628                 :            :         spin_lock_init(&bus->gpio_lock);
     629                 :            : #endif
     630                 :            : 
     631                 :            :         /* Powerup the bus */
     632                 :          0 :         DPRINT("Powerup");
     633                 :          0 :         err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);
     634         [ #  # ]:          0 :         if (err)
     635                 :          0 :                 goto out;
     636                 :            : 
     637                 :            :         /* Init SDIO-host device (if any), before the scan */
     638                 :          0 :         DPRINT("Init sdio");
     639         [ #  # ]:          0 :         err = ssb_sdio_init(bus);
     640                 :          0 :         if (err)
     641                 :            :                 goto err_disable_xtal;
     642                 :            : 
     643         [ #  # ]:          0 :         ssb_buses_lock();
     644                 :          0 :         bus->busnumber = next_busnumber;
     645                 :            :         /* Scan for devices (cores) */
     646                 :          0 :         DPRINT("Scan bus");
     647                 :          0 :         err = ssb_bus_scan(bus, baseaddr);
     648         [ #  # ]:          0 :         if (err)
     649                 :          0 :                 goto err_sdio_exit;
     650                 :            : 
     651                 :            :         /* Init PCI-host device (if any) */
     652                 :          0 :         DPRINT("Init pci-host");
     653                 :          0 :         err = ssb_pci_init(bus);
     654         [ #  # ]:          0 :         if (err)
     655                 :          0 :                 goto err_unmap;
     656                 :            :         /* Init PCMCIA-host device (if any) */
     657                 :          0 :         DPRINT("Init pcmcia");
     658                 :          0 :         err = ssb_pcmcia_init(bus);
     659                 :          0 :         if (err)
     660                 :            :                 goto err_pci_exit;
     661                 :            : 
     662                 :            :         /* Initialize basic system devices (if available) */
     663                 :          0 :         DPRINT("Init bus power");
     664                 :          0 :         err = ssb_bus_powerup(bus, 0);
     665         [ #  # ]:          0 :         if (err)
     666                 :          0 :                 goto err_pcmcia_exit;
     667                 :          0 :         ssb_chipcommon_init(&bus->chipco);
     668                 :          0 :         ssb_extif_init(&bus->extif);
     669                 :          0 :         ssb_mipscore_init(&bus->mipscore);
     670                 :          0 :         DPRINT("fetch invaiants");
     671                 :          0 :         err = ssb_fetch_invariants(bus, get_invariants);
     672         [ #  # ]:          0 :         if (err) {
     673                 :          0 :                 ssb_bus_may_powerdown(bus);
     674                 :          0 :                 goto err_pcmcia_exit;
     675                 :            :         }
     676                 :          0 :         ssb_bus_may_powerdown(bus);
     677                 :            : 
     678                 :            :         /* Queue it for attach.
     679                 :            :          * See the comment at the ssb_is_early_boot definition. */
     680         [ #  # ]:          0 :         list_add_tail(&bus->list, &attach_queue);
     681         [ #  # ]:          0 :         if (!ssb_is_early_boot) {
     682                 :            :                 /* This is not early boot, so we must attach the bus now */
     683                 :          0 :                 DPRINT("attach queued busses");
     684                 :          0 :                 err = ssb_attach_queued_buses();
     685         [ #  # ]:          0 :                 if (err)
     686                 :          0 :                         goto err_dequeue;
     687                 :            :         }
     688                 :          0 :         next_busnumber++;
     689         [ #  # ]:          0 :         ssb_buses_unlock();
     690                 :            : 
     691                 :          0 :         DPRINT("end");
     692                 :            : out:
     693                 :            :         return err;
     694                 :            : 
     695                 :            : err_dequeue:
     696                 :          0 :         list_del(&bus->list);
     697                 :          0 : err_pcmcia_exit:
     698                 :          0 :         ssb_pcmcia_exit(bus);
     699                 :            : err_pci_exit:
     700                 :          0 :         ssb_pci_exit(bus);
     701                 :          0 : err_unmap:
     702                 :          0 :         ssb_iounmap(bus);
     703                 :          0 : err_sdio_exit:
     704         [ #  # ]:          0 :         ssb_sdio_exit(bus);
     705                 :            : err_disable_xtal:
     706         [ #  # ]:          0 :         ssb_buses_unlock();
     707                 :          0 :         ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
     708                 :          0 :         return err;
     709                 :            : }
     710                 :            : 
     711                 :            : #ifdef CONFIG_SSB_PCIHOST
     712                 :          0 : int ssb_bus_pcibus_register(struct ssb_bus *bus, struct pci_dev *host_pci)
     713                 :            : {
     714                 :          0 :         int err;
     715                 :            : 
     716                 :          0 :         bus->bustype = SSB_BUSTYPE_PCI;
     717                 :          0 :         bus->host_pci = host_pci;
     718                 :          0 :         bus->ops = &ssb_pci_ops;
     719                 :            : 
     720                 :          0 :         err = ssb_bus_register(bus, ssb_pci_get_invariants, 0);
     721         [ #  # ]:          0 :         if (!err) {
     722         [ #  # ]:          0 :                 dev_info(&host_pci->dev,
     723                 :            :                          "Sonics Silicon Backplane found on PCI device %s\n",
     724                 :            :                          dev_name(&host_pci->dev));
     725                 :            :         } else {
     726                 :          0 :                 dev_err(&host_pci->dev,
     727                 :            :                         "Failed to register PCI version of SSB with error %d\n",
     728                 :            :                         err);
     729                 :            :         }
     730                 :            : 
     731                 :          0 :         return err;
     732                 :            : }
     733                 :            : #endif /* CONFIG_SSB_PCIHOST */
     734                 :            : 
     735                 :            : #ifdef CONFIG_SSB_PCMCIAHOST
     736                 :            : int ssb_bus_pcmciabus_register(struct ssb_bus *bus,
     737                 :            :                                struct pcmcia_device *pcmcia_dev,
     738                 :            :                                unsigned long baseaddr)
     739                 :            : {
     740                 :            :         int err;
     741                 :            : 
     742                 :            :         bus->bustype = SSB_BUSTYPE_PCMCIA;
     743                 :            :         bus->host_pcmcia = pcmcia_dev;
     744                 :            :         bus->ops = &ssb_pcmcia_ops;
     745                 :            : 
     746                 :            :         err = ssb_bus_register(bus, ssb_pcmcia_get_invariants, baseaddr);
     747                 :            :         if (!err) {
     748                 :            :                 dev_info(&pcmcia_dev->dev,
     749                 :            :                          "Sonics Silicon Backplane found on PCMCIA device %s\n",
     750                 :            :                          pcmcia_dev->devname);
     751                 :            :         }
     752                 :            : 
     753                 :            :         return err;
     754                 :            : }
     755                 :            : #endif /* CONFIG_SSB_PCMCIAHOST */
     756                 :            : 
     757                 :            : #ifdef CONFIG_SSB_SDIOHOST
     758                 :            : int ssb_bus_sdiobus_register(struct ssb_bus *bus, struct sdio_func *func,
     759                 :            :                              unsigned int quirks)
     760                 :            : {
     761                 :            :         int err;
     762                 :            : 
     763                 :            :         bus->bustype = SSB_BUSTYPE_SDIO;
     764                 :            :         bus->host_sdio = func;
     765                 :            :         bus->ops = &ssb_sdio_ops;
     766                 :            :         bus->quirks = quirks;
     767                 :            : 
     768                 :            :         err = ssb_bus_register(bus, ssb_sdio_get_invariants, ~0);
     769                 :            :         if (!err) {
     770                 :            :                 dev_info(&func->dev,
     771                 :            :                          "Sonics Silicon Backplane found on SDIO device %s\n",
     772                 :            :                          sdio_func_id(func));
     773                 :            :         }
     774                 :            : 
     775                 :            :         return err;
     776                 :            : }
     777                 :            : EXPORT_SYMBOL(ssb_bus_sdiobus_register);
     778                 :            : #endif /* CONFIG_SSB_PCMCIAHOST */
     779                 :            : 
     780                 :            : #ifdef CONFIG_SSB_HOST_SOC
     781                 :            : int ssb_bus_host_soc_register(struct ssb_bus *bus, unsigned long baseaddr)
     782                 :            : {
     783                 :            :         int err;
     784                 :            : 
     785                 :            :         bus->bustype = SSB_BUSTYPE_SSB;
     786                 :            :         bus->ops = &ssb_host_soc_ops;
     787                 :            : 
     788                 :            :         err = ssb_bus_register(bus, ssb_host_soc_get_invariants, baseaddr);
     789                 :            :         if (!err) {
     790                 :            :                 pr_info("Sonics Silicon Backplane found at address 0x%08lX\n",
     791                 :            :                         baseaddr);
     792                 :            :         }
     793                 :            : 
     794                 :            :         return err;
     795                 :            : }
     796                 :            : #endif
     797                 :            : 
     798                 :         13 : int __ssb_driver_register(struct ssb_driver *drv, struct module *owner)
     799                 :            : {
     800                 :         13 :         drv->drv.name = drv->name;
     801                 :         13 :         drv->drv.bus = &ssb_bustype;
     802                 :         13 :         drv->drv.owner = owner;
     803                 :            : 
     804                 :         13 :         return driver_register(&drv->drv);
     805                 :            : }
     806                 :            : EXPORT_SYMBOL(__ssb_driver_register);
     807                 :            : 
     808                 :          0 : void ssb_driver_unregister(struct ssb_driver *drv)
     809                 :            : {
     810                 :          0 :         driver_unregister(&drv->drv);
     811                 :          0 : }
     812                 :            : EXPORT_SYMBOL(ssb_driver_unregister);
     813                 :            : 
     814                 :          0 : void ssb_set_devtypedata(struct ssb_device *dev, void *data)
     815                 :            : {
     816                 :          0 :         struct ssb_bus *bus = dev->bus;
     817                 :          0 :         struct ssb_device *ent;
     818                 :          0 :         int i;
     819                 :            : 
     820         [ #  # ]:          0 :         for (i = 0; i < bus->nr_devices; i++) {
     821                 :          0 :                 ent = &(bus->devices[i]);
     822         [ #  # ]:          0 :                 if (ent->id.vendor != dev->id.vendor)
     823                 :          0 :                         continue;
     824         [ #  # ]:          0 :                 if (ent->id.coreid != dev->id.coreid)
     825                 :          0 :                         continue;
     826                 :            : 
     827                 :          0 :                 ent->devtypedata = data;
     828                 :            :         }
     829                 :          0 : }
     830                 :            : EXPORT_SYMBOL(ssb_set_devtypedata);
     831                 :            : 
     832                 :          0 : static u32 clkfactor_f6_resolve(u32 v)
     833                 :            : {
     834                 :            :         /* map the magic values */
     835                 :          0 :         switch (v) {
     836                 :            :         case SSB_CHIPCO_CLK_F6_2:
     837                 :            :                 return 2;
     838                 :            :         case SSB_CHIPCO_CLK_F6_3:
     839                 :            :                 return 3;
     840                 :            :         case SSB_CHIPCO_CLK_F6_4:
     841                 :            :                 return 4;
     842                 :            :         case SSB_CHIPCO_CLK_F6_5:
     843                 :            :                 return 5;
     844                 :            :         case SSB_CHIPCO_CLK_F6_6:
     845                 :            :                 return 6;
     846                 :            :         case SSB_CHIPCO_CLK_F6_7:
     847                 :            :                 return 7;
     848                 :            :         }
     849                 :            :         return 0;
     850                 :            : }
     851                 :            : 
     852                 :            : /* Calculate the speed the backplane would run at a given set of clockcontrol values */
     853                 :          0 : u32 ssb_calc_clock_rate(u32 plltype, u32 n, u32 m)
     854                 :            : {
     855                 :          0 :         u32 n1, n2, clock, m1, m2, m3, mc;
     856                 :            : 
     857                 :          0 :         n1 = (n & SSB_CHIPCO_CLK_N1);
     858                 :          0 :         n2 = ((n & SSB_CHIPCO_CLK_N2) >> SSB_CHIPCO_CLK_N2_SHIFT);
     859                 :            : 
     860   [ #  #  #  #  :          0 :         switch (plltype) {
                      # ]
     861                 :          0 :         case SSB_PLLTYPE_6: /* 100/200 or 120/240 only */
     862         [ #  # ]:          0 :                 if (m & SSB_CHIPCO_CLK_T6_MMASK)
     863                 :          0 :                         return SSB_CHIPCO_CLK_T6_M1;
     864                 :            :                 return SSB_CHIPCO_CLK_T6_M0;
     865                 :            :         case SSB_PLLTYPE_1: /* 48Mhz base, 3 dividers */
     866                 :            :         case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
     867                 :            :         case SSB_PLLTYPE_4: /* 48Mhz, 4 dividers */
     868                 :            :         case SSB_PLLTYPE_7: /* 25Mhz, 4 dividers */
     869         [ #  # ]:          0 :                 n1 = clkfactor_f6_resolve(n1);
     870                 :          0 :                 n2 += SSB_CHIPCO_CLK_F5_BIAS;
     871                 :          0 :                 break;
     872                 :          0 :         case SSB_PLLTYPE_2: /* 48Mhz, 4 dividers */
     873                 :          0 :                 n1 += SSB_CHIPCO_CLK_T2_BIAS;
     874                 :          0 :                 n2 += SSB_CHIPCO_CLK_T2_BIAS;
     875         [ #  # ]:          0 :                 WARN_ON(!((n1 >= 2) && (n1 <= 7)));
     876         [ #  # ]:          0 :                 WARN_ON(!((n2 >= 5) && (n2 <= 23)));
     877                 :            :                 break;
     878                 :            :         case SSB_PLLTYPE_5: /* 25Mhz, 4 dividers */
     879                 :            :                 return 100000000;
     880                 :            :         default:
     881                 :          0 :                 WARN_ON(1);
     882                 :            :         }
     883                 :            : 
     884         [ #  # ]:          0 :         switch (plltype) {
     885                 :          0 :         case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
     886                 :            :         case SSB_PLLTYPE_7: /* 25Mhz, 4 dividers */
     887                 :          0 :                 clock = SSB_CHIPCO_CLK_BASE2 * n1 * n2;
     888                 :          0 :                 break;
     889                 :          0 :         default:
     890                 :          0 :                 clock = SSB_CHIPCO_CLK_BASE1 * n1 * n2;
     891                 :            :         }
     892         [ #  # ]:          0 :         if (!clock)
     893                 :            :                 return 0;
     894                 :            : 
     895                 :          0 :         m1 = (m & SSB_CHIPCO_CLK_M1);
     896                 :          0 :         m2 = ((m & SSB_CHIPCO_CLK_M2) >> SSB_CHIPCO_CLK_M2_SHIFT);
     897                 :          0 :         m3 = ((m & SSB_CHIPCO_CLK_M3) >> SSB_CHIPCO_CLK_M3_SHIFT);
     898                 :          0 :         mc = ((m & SSB_CHIPCO_CLK_MC) >> SSB_CHIPCO_CLK_MC_SHIFT);
     899                 :            : 
     900      [ #  #  # ]:          0 :         switch (plltype) {
     901                 :            :         case SSB_PLLTYPE_1: /* 48Mhz base, 3 dividers */
     902                 :            :         case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
     903                 :            :         case SSB_PLLTYPE_4: /* 48Mhz, 4 dividers */
     904                 :            :         case SSB_PLLTYPE_7: /* 25Mhz, 4 dividers */
     905         [ #  # ]:          0 :                 m1 = clkfactor_f6_resolve(m1);
     906                 :          0 :                 if ((plltype == SSB_PLLTYPE_1) ||
     907         [ #  # ]:          0 :                     (plltype == SSB_PLLTYPE_3))
     908                 :          0 :                         m2 += SSB_CHIPCO_CLK_F5_BIAS;
     909                 :            :                 else
     910         [ #  # ]:          0 :                         m2 = clkfactor_f6_resolve(m2);
     911         [ #  # ]:          0 :                 m3 = clkfactor_f6_resolve(m3);
     912                 :            : 
     913   [ #  #  #  #  :          0 :                 switch (mc) {
                   #  # ]
     914                 :          0 :                 case SSB_CHIPCO_CLK_MC_BYPASS:
     915                 :          0 :                         return clock;
     916                 :          0 :                 case SSB_CHIPCO_CLK_MC_M1:
     917                 :          0 :                         return (clock / m1);
     918                 :          0 :                 case SSB_CHIPCO_CLK_MC_M1M2:
     919                 :          0 :                         return (clock / (m1 * m2));
     920                 :          0 :                 case SSB_CHIPCO_CLK_MC_M1M2M3:
     921                 :          0 :                         return (clock / (m1 * m2 * m3));
     922                 :          0 :                 case SSB_CHIPCO_CLK_MC_M1M3:
     923                 :          0 :                         return (clock / (m1 * m3));
     924                 :            :                 }
     925                 :            :                 return 0;
     926                 :          0 :         case SSB_PLLTYPE_2:
     927                 :          0 :                 m1 += SSB_CHIPCO_CLK_T2_BIAS;
     928                 :          0 :                 m2 += SSB_CHIPCO_CLK_T2M2_BIAS;
     929                 :          0 :                 m3 += SSB_CHIPCO_CLK_T2_BIAS;
     930         [ #  # ]:          0 :                 WARN_ON(!((m1 >= 2) && (m1 <= 7)));
     931         [ #  # ]:          0 :                 WARN_ON(!((m2 >= 3) && (m2 <= 10)));
     932         [ #  # ]:          0 :                 WARN_ON(!((m3 >= 2) && (m3 <= 7)));
     933                 :            : 
     934         [ #  # ]:          0 :                 if (!(mc & SSB_CHIPCO_CLK_T2MC_M1BYP))
     935                 :          0 :                         clock /= m1;
     936         [ #  # ]:          0 :                 if (!(mc & SSB_CHIPCO_CLK_T2MC_M2BYP))
     937                 :          0 :                         clock /= m2;
     938         [ #  # ]:          0 :                 if (!(mc & SSB_CHIPCO_CLK_T2MC_M3BYP))
     939                 :          0 :                         clock /= m3;
     940                 :            :                 return clock;
     941                 :            :         default:
     942                 :          0 :                 WARN_ON(1);
     943                 :            :         }
     944                 :          0 :         return 0;
     945                 :            : }
     946                 :            : 
     947                 :            : /* Get the current speed the backplane is running at */
     948                 :          0 : u32 ssb_clockspeed(struct ssb_bus *bus)
     949                 :            : {
     950                 :          0 :         u32 rate;
     951                 :          0 :         u32 plltype;
     952                 :          0 :         u32 clkctl_n, clkctl_m;
     953                 :            : 
     954         [ #  # ]:          0 :         if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
     955                 :          0 :                 return ssb_pmu_get_controlclock(&bus->chipco);
     956                 :            : 
     957         [ #  # ]:          0 :         if (ssb_extif_available(&bus->extif))
     958                 :            :                 ssb_extif_get_clockcontrol(&bus->extif, &plltype,
     959                 :            :                                            &clkctl_n, &clkctl_m);
     960         [ #  # ]:          0 :         else if (bus->chipco.dev)
     961                 :          0 :                 ssb_chipco_get_clockcontrol(&bus->chipco, &plltype,
     962                 :            :                                             &clkctl_n, &clkctl_m);
     963                 :            :         else
     964                 :            :                 return 0;
     965                 :            : 
     966         [ #  # ]:          0 :         if (bus->chip_id == 0x5365) {
     967                 :            :                 rate = 100000000;
     968                 :            :         } else {
     969                 :          0 :                 rate = ssb_calc_clock_rate(plltype, clkctl_n, clkctl_m);
     970         [ #  # ]:          0 :                 if (plltype == SSB_PLLTYPE_3) /* 25Mhz, 2 dividers */
     971                 :          0 :                         rate /= 2;
     972                 :            :         }
     973                 :            : 
     974                 :            :         return rate;
     975                 :            : }
     976                 :            : EXPORT_SYMBOL(ssb_clockspeed);
     977                 :            : 
     978                 :          0 : static u32 ssb_tmslow_reject_bitmask(struct ssb_device *dev)
     979                 :            : {
     980                 :          0 :         u32 rev = ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_SSBREV;
     981                 :            : 
     982                 :            :         /* The REJECT bit seems to be different for Backplane rev 2.3 */
     983   [ #  #  #  # ]:          0 :         switch (rev) {
     984                 :            :         case SSB_IDLOW_SSBREV_22:
     985                 :            :         case SSB_IDLOW_SSBREV_24:
     986                 :            :         case SSB_IDLOW_SSBREV_26:
     987                 :            :                 return SSB_TMSLOW_REJECT;
     988                 :          0 :         case SSB_IDLOW_SSBREV_23:
     989                 :          0 :                 return SSB_TMSLOW_REJECT_23;
     990                 :            :         case SSB_IDLOW_SSBREV_25:     /* TODO - find the proper REJECT bit */
     991                 :            :         case SSB_IDLOW_SSBREV_27:     /* same here */
     992                 :            :                 return SSB_TMSLOW_REJECT;       /* this is a guess */
     993                 :            :         case SSB_IDLOW_SSBREV:
     994                 :            :                 break;
     995                 :            :         default:
     996                 :          0 :                 WARN(1, KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);
     997                 :            :         }
     998                 :            :         return (SSB_TMSLOW_REJECT | SSB_TMSLOW_REJECT_23);
     999                 :            : }
    1000                 :            : 
    1001                 :          0 : int ssb_device_is_enabled(struct ssb_device *dev)
    1002                 :            : {
    1003                 :          0 :         DPRINT("");
    1004                 :          0 :         u32 val;
    1005                 :          0 :         u32 reject;
    1006                 :            : 
    1007                 :          0 :         reject = ssb_tmslow_reject_bitmask(dev);
    1008                 :          0 :         val = ssb_read32(dev, SSB_TMSLOW);
    1009                 :          0 :         val &= SSB_TMSLOW_CLOCK | SSB_TMSLOW_RESET | reject;
    1010                 :            : 
    1011                 :          0 :         return (val == SSB_TMSLOW_CLOCK);
    1012                 :            : }
    1013                 :            : EXPORT_SYMBOL(ssb_device_is_enabled);
    1014                 :            : 
    1015                 :          0 : static void ssb_flush_tmslow(struct ssb_device *dev)
    1016                 :            : {
    1017                 :            :         /* Make _really_ sure the device has finished the TMSLOW
    1018                 :            :          * register write transaction, as we risk running into
    1019                 :            :          * a machine check exception otherwise.
    1020                 :            :          * Do this by reading the register back to commit the
    1021                 :            :          * PCI write and delay an additional usec for the device
    1022                 :            :          * to react to the change. */
    1023                 :          0 :         ssb_read32(dev, SSB_TMSLOW);
    1024                 :          0 :         udelay(1);
    1025                 :          0 : }
    1026                 :            : 
    1027                 :          0 : void ssb_device_enable(struct ssb_device *dev, u32 core_specific_flags)
    1028                 :            : {
    1029                 :          0 :         u32 val;
    1030                 :          0 :         DPRINT("");
    1031                 :          0 :         ssb_device_disable(dev, core_specific_flags);
    1032                 :          0 :         ssb_write32(dev, SSB_TMSLOW,
    1033                 :            :                     SSB_TMSLOW_RESET | SSB_TMSLOW_CLOCK |
    1034                 :            :                     SSB_TMSLOW_FGC | core_specific_flags);
    1035                 :          0 :         ssb_flush_tmslow(dev);
    1036                 :            : 
    1037                 :            :         /* Clear SERR if set. This is a hw bug workaround. */
    1038         [ #  # ]:          0 :         if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_SERR)
    1039                 :          0 :                 ssb_write32(dev, SSB_TMSHIGH, 0);
    1040                 :            : 
    1041                 :          0 :         val = ssb_read32(dev, SSB_IMSTATE);
    1042         [ #  # ]:          0 :         if (val & (SSB_IMSTATE_IBE | SSB_IMSTATE_TO)) {
    1043                 :          0 :                 val &= ~(SSB_IMSTATE_IBE | SSB_IMSTATE_TO);
    1044                 :          0 :                 ssb_write32(dev, SSB_IMSTATE, val);
    1045                 :            :         }
    1046                 :            : 
    1047                 :          0 :         ssb_write32(dev, SSB_TMSLOW,
    1048                 :            :                     SSB_TMSLOW_CLOCK | SSB_TMSLOW_FGC |
    1049                 :            :                     core_specific_flags);
    1050                 :          0 :         ssb_flush_tmslow(dev);
    1051                 :            : 
    1052                 :          0 :         ssb_write32(dev, SSB_TMSLOW, SSB_TMSLOW_CLOCK |
    1053                 :            :                     core_specific_flags);
    1054                 :          0 :         ssb_flush_tmslow(dev);
    1055                 :          0 :         DPRINT("end");
    1056                 :          0 : }
    1057                 :            : EXPORT_SYMBOL(ssb_device_enable);
    1058                 :            : 
    1059                 :            : /* Wait for bitmask in a register to get set or cleared.
    1060                 :            :  * timeout is in units of ten-microseconds */
    1061                 :          0 : static int ssb_wait_bits(struct ssb_device *dev, u16 reg, u32 bitmask,
    1062                 :            :                          int timeout, int set)
    1063                 :            : {
    1064                 :          0 :         int i;
    1065                 :          0 :         u32 val;
    1066                 :            : 
    1067         [ #  # ]:          0 :         for (i = 0; i < timeout; i++) {
    1068                 :          0 :                 val = ssb_read32(dev, reg);
    1069         [ #  # ]:          0 :                 if (set) {
    1070         [ #  # ]:          0 :                         if ((val & bitmask) == bitmask)
    1071                 :            :                                 return 0;
    1072                 :            :                 } else {
    1073         [ #  # ]:          0 :                         if (!(val & bitmask))
    1074                 :            :                                 return 0;
    1075                 :            :                 }
    1076                 :          0 :                 udelay(10);
    1077                 :            :         }
    1078         [ #  # ]:          0 :         dev_err(dev->dev,
    1079                 :            :                 "Timeout waiting for bitmask %08X on register %04X to %s\n",
    1080                 :            :                 bitmask, reg, set ? "set" : "clear");
    1081                 :            : 
    1082                 :          0 :         return -ETIMEDOUT;
    1083                 :            : }
    1084                 :            : 
    1085                 :          0 : void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
    1086                 :            : {
    1087                 :          0 :         u32 reject, val;
    1088                 :          0 :         DPRINT("");
    1089                 :            : 
    1090         [ #  # ]:          0 :         if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_RESET)
    1091                 :            :                 return;
    1092                 :            : 
    1093                 :          0 :         reject = ssb_tmslow_reject_bitmask(dev);
    1094                 :            : 
    1095         [ #  # ]:          0 :         if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_CLOCK) {
    1096                 :          0 :                 ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
    1097                 :          0 :                 ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
    1098                 :          0 :                 ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
    1099                 :            : 
    1100         [ #  # ]:          0 :                 if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
    1101                 :          0 :                         val = ssb_read32(dev, SSB_IMSTATE);
    1102                 :          0 :                         val |= SSB_IMSTATE_REJECT;
    1103                 :          0 :                         ssb_write32(dev, SSB_IMSTATE, val);
    1104                 :          0 :                         ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000,
    1105                 :            :                                       0);
    1106                 :            :                 }
    1107                 :            : 
    1108                 :          0 :                 ssb_write32(dev, SSB_TMSLOW,
    1109                 :            :                         SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
    1110                 :          0 :                         reject | SSB_TMSLOW_RESET |
    1111                 :            :                         core_specific_flags);
    1112                 :          0 :                 ssb_flush_tmslow(dev);
    1113                 :            : 
    1114         [ #  # ]:          0 :                 if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
    1115                 :          0 :                         val = ssb_read32(dev, SSB_IMSTATE);
    1116                 :          0 :                         val &= ~SSB_IMSTATE_REJECT;
    1117                 :          0 :                         ssb_write32(dev, SSB_IMSTATE, val);
    1118                 :            :                 }
    1119                 :            :         }
    1120                 :            : 
    1121                 :          0 :         ssb_write32(dev, SSB_TMSLOW,
    1122                 :          0 :                     reject | SSB_TMSLOW_RESET |
    1123                 :            :                     core_specific_flags);
    1124                 :          0 :         ssb_flush_tmslow(dev);
    1125                 :            : }
    1126                 :            : EXPORT_SYMBOL(ssb_device_disable);
    1127                 :            : 
    1128                 :            : /* Some chipsets need routing known for PCIe and 64-bit DMA */
    1129                 :          0 : static bool ssb_dma_translation_special_bit(struct ssb_device *dev)
    1130                 :            : {
    1131                 :          0 :         u16 chip_id = dev->bus->chip_id;
    1132                 :            : 
    1133                 :          0 :         if (dev->id.coreid == SSB_DEV_80211) {
    1134                 :          0 :                 return (chip_id == 0x4322 || chip_id == 43221 ||
    1135   [ #  #  #  # ]:          0 :                         chip_id == 43231 || chip_id == 43222);
    1136                 :            :         }
    1137                 :            : 
    1138                 :            :         return false;
    1139                 :            : }
    1140                 :            : 
    1141                 :          0 : u32 ssb_dma_translation(struct ssb_device *dev)
    1142                 :            : {
    1143      [ #  #  # ]:          0 :         switch (dev->bus->bustype) {
    1144                 :            :         case SSB_BUSTYPE_SSB:
    1145                 :            :                 return 0;
    1146                 :          0 :         case SSB_BUSTYPE_PCI:
    1147         [ #  # ]:          0 :                 if (pci_is_pcie(dev->bus->host_pci) &&
    1148         [ #  # ]:          0 :                     ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) {
    1149                 :            :                         return SSB_PCIE_DMA_H32;
    1150                 :            :                 } else {
    1151   [ #  #  #  # ]:          0 :                         if (ssb_dma_translation_special_bit(dev))
    1152                 :            :                                 return SSB_PCIE_DMA_H32;
    1153                 :            :                         else
    1154                 :          0 :                                 return SSB_PCI_DMA;
    1155                 :            :                 }
    1156                 :          0 :         default:
    1157                 :          0 :                 __ssb_dma_not_implemented(dev);
    1158                 :            :         }
    1159                 :          0 :         return 0;
    1160                 :            : }
    1161                 :            : EXPORT_SYMBOL(ssb_dma_translation);
    1162                 :            : 
    1163                 :          0 : int ssb_bus_may_powerdown(struct ssb_bus *bus)
    1164                 :            : {
    1165                 :          0 :         struct ssb_chipcommon *cc;
    1166                 :          0 :         int err = 0;
    1167                 :            : 
    1168                 :            :         /* On buses where more than one core may be working
    1169                 :            :          * at a time, we must not powerdown stuff if there are
    1170                 :            :          * still cores that may want to run. */
    1171         [ #  # ]:          0 :         if (bus->bustype == SSB_BUSTYPE_SSB)
    1172                 :          0 :                 goto out;
    1173                 :            : 
    1174                 :          0 :         cc = &bus->chipco;
    1175                 :            : 
    1176         [ #  # ]:          0 :         if (!cc->dev)
    1177                 :          0 :                 goto out;
    1178         [ #  # ]:          0 :         if (cc->dev->id.revision < 5)
    1179                 :          0 :                 goto out;
    1180                 :            : 
    1181                 :          0 :         ssb_chipco_set_clockmode(cc, SSB_CLKMODE_SLOW);
    1182                 :          0 :         err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
    1183         [ #  # ]:          0 :         if (err)
    1184                 :          0 :                 goto error;
    1185                 :          0 : out:
    1186                 :          0 :         bus->powered_up = 0;
    1187                 :          0 :         return err;
    1188                 :            : error:
    1189                 :          0 :         pr_err("Bus powerdown failed\n");
    1190                 :          0 :         goto out;
    1191                 :            : }
    1192                 :            : EXPORT_SYMBOL(ssb_bus_may_powerdown);
    1193                 :            : 
    1194                 :          0 : int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl)
    1195                 :            : {
    1196                 :          0 :         int err;
    1197                 :          0 :         enum ssb_clkmode mode;
    1198                 :            : 
    1199                 :          0 :         err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);
    1200         [ #  # ]:          0 :         if (err)
    1201                 :          0 :                 goto error;
    1202                 :            : 
    1203                 :          0 :         bus->powered_up = 1;
    1204                 :            : 
    1205         [ #  # ]:          0 :         mode = dynamic_pctl ? SSB_CLKMODE_DYNAMIC : SSB_CLKMODE_FAST;
    1206                 :          0 :         ssb_chipco_set_clockmode(&bus->chipco, mode);
    1207                 :            : 
    1208                 :          0 :         return 0;
    1209                 :            : error:
    1210                 :          0 :         pr_err("Bus powerup failed\n");
    1211                 :          0 :         return err;
    1212                 :            : }
    1213                 :            : EXPORT_SYMBOL(ssb_bus_powerup);
    1214                 :            : 
    1215                 :          0 : static void ssb_broadcast_value(struct ssb_device *dev,
    1216                 :            :                                 u32 address, u32 data)
    1217                 :            : {
    1218                 :            : #ifdef CONFIG_SSB_DRIVER_PCICORE
    1219                 :            :         /* This is used for both, PCI and ChipCommon core, so be careful. */
    1220                 :          0 :         BUILD_BUG_ON(SSB_PCICORE_BCAST_ADDR != SSB_CHIPCO_BCAST_ADDR);
    1221                 :          0 :         BUILD_BUG_ON(SSB_PCICORE_BCAST_DATA != SSB_CHIPCO_BCAST_DATA);
    1222                 :            : #endif
    1223                 :            : 
    1224                 :          0 :         ssb_write32(dev, SSB_CHIPCO_BCAST_ADDR, address);
    1225                 :          0 :         ssb_read32(dev, SSB_CHIPCO_BCAST_ADDR); /* flush */
    1226                 :          0 :         ssb_write32(dev, SSB_CHIPCO_BCAST_DATA, data);
    1227                 :          0 :         ssb_read32(dev, SSB_CHIPCO_BCAST_DATA); /* flush */
    1228                 :          0 : }
    1229                 :            : 
    1230                 :          0 : void ssb_commit_settings(struct ssb_bus *bus)
    1231                 :            : {
    1232                 :          0 :         struct ssb_device *dev;
    1233                 :            : 
    1234                 :            : #ifdef CONFIG_SSB_DRIVER_PCICORE
    1235         [ #  # ]:          0 :         dev = bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev;
    1236                 :            : #else
    1237                 :            :         dev = bus->chipco.dev;
    1238                 :            : #endif
    1239   [ #  #  #  # ]:          0 :         if (WARN_ON(!dev))
    1240                 :            :                 return;
    1241                 :            :         /* This forces an update of the cached registers. */
    1242                 :          0 :         ssb_broadcast_value(dev, 0xFD8, 0);
    1243                 :            : }
    1244                 :            : EXPORT_SYMBOL(ssb_commit_settings);
    1245                 :            : 
    1246                 :          0 : u32 ssb_admatch_base(u32 adm)
    1247                 :            : {
    1248                 :          0 :         u32 base = 0;
    1249                 :            : 
    1250   [ #  #  #  # ]:          0 :         switch (adm & SSB_ADM_TYPE) {
    1251                 :          0 :         case SSB_ADM_TYPE0:
    1252                 :          0 :                 base = (adm & SSB_ADM_BASE0);
    1253                 :          0 :                 break;
    1254                 :          0 :         case SSB_ADM_TYPE1:
    1255         [ #  # ]:          0 :                 WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
    1256                 :          0 :                 base = (adm & SSB_ADM_BASE1);
    1257                 :          0 :                 break;
    1258                 :          0 :         case SSB_ADM_TYPE2:
    1259         [ #  # ]:          0 :                 WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
    1260                 :          0 :                 base = (adm & SSB_ADM_BASE2);
    1261                 :          0 :                 break;
    1262                 :            :         default:
    1263                 :          0 :                 WARN_ON(1);
    1264                 :            :         }
    1265                 :            : 
    1266                 :          0 :         return base;
    1267                 :            : }
    1268                 :            : EXPORT_SYMBOL(ssb_admatch_base);
    1269                 :            : 
    1270                 :          0 : u32 ssb_admatch_size(u32 adm)
    1271                 :            : {
    1272                 :          0 :         u32 size = 0;
    1273                 :            : 
    1274   [ #  #  #  # ]:          0 :         switch (adm & SSB_ADM_TYPE) {
    1275                 :          0 :         case SSB_ADM_TYPE0:
    1276                 :          0 :                 size = ((adm & SSB_ADM_SZ0) >> SSB_ADM_SZ0_SHIFT);
    1277                 :          0 :                 break;
    1278                 :          0 :         case SSB_ADM_TYPE1:
    1279         [ #  # ]:          0 :                 WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
    1280                 :          0 :                 size = ((adm & SSB_ADM_SZ1) >> SSB_ADM_SZ1_SHIFT);
    1281                 :          0 :                 break;
    1282                 :          0 :         case SSB_ADM_TYPE2:
    1283         [ #  # ]:          0 :                 WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
    1284                 :          0 :                 size = ((adm & SSB_ADM_SZ2) >> SSB_ADM_SZ2_SHIFT);
    1285                 :          0 :                 break;
    1286                 :            :         default:
    1287                 :          0 :                 WARN_ON(1);
    1288                 :            :         }
    1289                 :          0 :         size = (1 << (size + 1));
    1290                 :            : 
    1291                 :          0 :         return size;
    1292                 :            : }
    1293                 :            : EXPORT_SYMBOL(ssb_admatch_size);
    1294                 :            : 
    1295                 :         13 : static int __init ssb_modinit(void)
    1296                 :            : {
    1297                 :         13 :         int err;
    1298                 :            : 
    1299                 :            :         /* See the comment at the ssb_is_early_boot definition */
    1300                 :         13 :         ssb_is_early_boot = 0;
    1301                 :         13 :         err = bus_register(&ssb_bustype);
    1302         [ +  - ]:         13 :         if (err)
    1303                 :            :                 return err;
    1304                 :            : 
    1305                 :            :         /* Maybe we already registered some buses at early boot.
    1306                 :            :          * Check for this and attach them
    1307                 :            :          */
    1308         [ +  - ]:         13 :         ssb_buses_lock();
    1309                 :         13 :         err = ssb_attach_queued_buses();
    1310         [ +  - ]:         13 :         ssb_buses_unlock();
    1311         [ -  + ]:         13 :         if (err) {
    1312                 :          0 :                 bus_unregister(&ssb_bustype);
    1313                 :          0 :                 goto out;
    1314                 :            :         }
    1315                 :            : 
    1316                 :         13 :         err = b43_pci_ssb_bridge_init();
    1317         [ -  + ]:         13 :         if (err) {
    1318                 :          0 :                 pr_err("Broadcom 43xx PCI-SSB-bridge initialization failed\n");
    1319                 :            :                 /* don't fail SSB init because of this */
    1320                 :          0 :                 err = 0;
    1321                 :            :         }
    1322                 :            :         err = ssb_host_pcmcia_init();
    1323                 :            :         if (err) {
    1324                 :            :                 pr_err("PCMCIA host initialization failed\n");
    1325                 :            :                 /* don't fail SSB init because of this */
    1326                 :            :                 err = 0;
    1327                 :            :         }
    1328                 :            :         err = ssb_gige_init();
    1329                 :            :         if (err) {
    1330                 :            :                 pr_err("SSB Broadcom Gigabit Ethernet driver initialization failed\n");
    1331                 :            :                 /* don't fail SSB init because of this */
    1332                 :            :                 err = 0;
    1333                 :            :         }
    1334                 :            : out:
    1335                 :            :         return err;
    1336                 :            : }
    1337                 :            : /* ssb must be initialized after PCI but before the ssb drivers.
    1338                 :            :  * That means we must use some initcall between subsys_initcall
    1339                 :            :  * and device_initcall. */
    1340                 :            : fs_initcall(ssb_modinit);
    1341                 :            : 
    1342                 :          0 : static void __exit ssb_modexit(void)
    1343                 :            : {
    1344                 :          0 :         ssb_gige_exit();
    1345                 :          0 :         ssb_host_pcmcia_exit();
    1346                 :          0 :         b43_pci_ssb_bridge_exit();
    1347                 :          0 :         bus_unregister(&ssb_bustype);
    1348                 :          0 : }
    1349                 :            : module_exit(ssb_modexit)

Generated by: LCOV version 1.14