linux/drivers/net/wireless/b43/pcmcia.c
<<
>>
Prefs
   1/*
   2
   3  Broadcom B43 wireless driver
   4
   5  Copyright (c) 2007 Michael Buesch <mb@bu3sch.de>
   6
   7  This program is free software; you can redistribute it and/or modify
   8  it under the terms of the GNU General Public License as published by
   9  the Free Software Foundation; either version 2 of the License, or
  10  (at your option) any later version.
  11
  12  This program is distributed in the hope that it will be useful,
  13  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15  GNU General Public License for more details.
  16
  17  You should have received a copy of the GNU General Public License
  18  along with this program; see the file COPYING.  If not, write to
  19  the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
  20  Boston, MA 02110-1301, USA.
  21
  22*/
  23
  24#include "pcmcia.h"
  25
  26#include <linux/ssb/ssb.h>
  27#include <linux/slab.h>
  28
  29#include <pcmcia/cs_types.h>
  30#include <pcmcia/cs.h>
  31#include <pcmcia/cistpl.h>
  32#include <pcmcia/ciscode.h>
  33#include <pcmcia/ds.h>
  34#include <pcmcia/cisreg.h>
  35
  36
  37static /*const */ struct pcmcia_device_id b43_pcmcia_tbl[] = {
  38        PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448),
  39        PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476),
  40        PCMCIA_DEVICE_NULL,
  41};
  42
  43MODULE_DEVICE_TABLE(pcmcia, b43_pcmcia_tbl);
  44
  45#ifdef CONFIG_PM
  46static int b43_pcmcia_suspend(struct pcmcia_device *dev)
  47{
  48        struct ssb_bus *ssb = dev->priv;
  49
  50        return ssb_bus_suspend(ssb);
  51}
  52
  53static int b43_pcmcia_resume(struct pcmcia_device *dev)
  54{
  55        struct ssb_bus *ssb = dev->priv;
  56
  57        return ssb_bus_resume(ssb);
  58}
  59#else /* CONFIG_PM */
  60# define b43_pcmcia_suspend             NULL
  61# define b43_pcmcia_resume              NULL
  62#endif /* CONFIG_PM */
  63
  64static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
  65{
  66        struct ssb_bus *ssb;
  67        win_req_t win;
  68        memreq_t mem;
  69        int err = -ENOMEM;
  70        int res = 0;
  71
  72        ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
  73        if (!ssb)
  74                goto out_error;
  75
  76        err = -ENODEV;
  77
  78        dev->conf.Attributes = CONF_ENABLE_IRQ;
  79        dev->conf.IntType = INT_MEMORY_AND_IO;
  80
  81        dev->io.BasePort2 = 0;
  82        dev->io.NumPorts2 = 0;
  83        dev->io.Attributes2 = 0;
  84
  85        win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM |
  86                         WIN_ENABLE | WIN_DATA_WIDTH_16 |
  87                         WIN_USE_WAIT;
  88        win.Base = 0;
  89        win.Size = SSB_CORE_SIZE;
  90        win.AccessSpeed = 250;
  91        res = pcmcia_request_window(dev, &win, &dev->win);
  92        if (res != 0)
  93                goto err_kfree_ssb;
  94
  95        mem.CardOffset = 0;
  96        mem.Page = 0;
  97        res = pcmcia_map_mem_page(dev, dev->win, &mem);
  98        if (res != 0)
  99                goto err_disable;
 100
 101        if (!dev->irq)
 102                goto err_disable;
 103
 104        res = pcmcia_request_configuration(dev, &dev->conf);
 105        if (res != 0)
 106                goto err_disable;
 107
 108        err = ssb_bus_pcmciabus_register(ssb, dev, win.Base);
 109        if (err)
 110                goto err_disable;
 111        dev->priv = ssb;
 112
 113        return 0;
 114
 115err_disable:
 116        pcmcia_disable_device(dev);
 117err_kfree_ssb:
 118        kfree(ssb);
 119out_error:
 120        printk(KERN_ERR "b43-pcmcia: Initialization failed (%d, %d)\n",
 121               res, err);
 122        return err;
 123}
 124
 125static void __devexit b43_pcmcia_remove(struct pcmcia_device *dev)
 126{
 127        struct ssb_bus *ssb = dev->priv;
 128
 129        ssb_bus_unregister(ssb);
 130        pcmcia_disable_device(dev);
 131        kfree(ssb);
 132        dev->priv = NULL;
 133}
 134
 135static struct pcmcia_driver b43_pcmcia_driver = {
 136        .owner          = THIS_MODULE,
 137        .drv            = {
 138                                .name = "b43-pcmcia",
 139                        },
 140        .id_table       = b43_pcmcia_tbl,
 141        .probe          = b43_pcmcia_probe,
 142        .remove         = __devexit_p(b43_pcmcia_remove),
 143        .suspend        = b43_pcmcia_suspend,
 144        .resume         = b43_pcmcia_resume,
 145};
 146
 147int b43_pcmcia_init(void)
 148{
 149        return pcmcia_register_driver(&b43_pcmcia_driver);
 150}
 151
 152void b43_pcmcia_exit(void)
 153{
 154        pcmcia_unregister_driver(&b43_pcmcia_driver);
 155}
 156
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.