Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.33-rc2 157 lines 3.6 kB view raw
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 28#include <pcmcia/cs_types.h> 29#include <pcmcia/cs.h> 30#include <pcmcia/cistpl.h> 31#include <pcmcia/ciscode.h> 32#include <pcmcia/ds.h> 33#include <pcmcia/cisreg.h> 34 35 36static /*const */ struct pcmcia_device_id b43_pcmcia_tbl[] = { 37 PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448), 38 PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476), 39 PCMCIA_DEVICE_NULL, 40}; 41 42MODULE_DEVICE_TABLE(pcmcia, b43_pcmcia_tbl); 43 44#ifdef CONFIG_PM 45static int b43_pcmcia_suspend(struct pcmcia_device *dev) 46{ 47 struct ssb_bus *ssb = dev->priv; 48 49 return ssb_bus_suspend(ssb); 50} 51 52static int b43_pcmcia_resume(struct pcmcia_device *dev) 53{ 54 struct ssb_bus *ssb = dev->priv; 55 56 return ssb_bus_resume(ssb); 57} 58#else /* CONFIG_PM */ 59# define b43_pcmcia_suspend NULL 60# define b43_pcmcia_resume NULL 61#endif /* CONFIG_PM */ 62 63static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev) 64{ 65 struct ssb_bus *ssb; 66 win_req_t win; 67 memreq_t mem; 68 int err = -ENOMEM; 69 int res = 0; 70 71 ssb = kzalloc(sizeof(*ssb), GFP_KERNEL); 72 if (!ssb) 73 goto out_error; 74 75 err = -ENODEV; 76 77 dev->conf.Attributes = CONF_ENABLE_IRQ; 78 dev->conf.IntType = INT_MEMORY_AND_IO; 79 80 dev->io.BasePort2 = 0; 81 dev->io.NumPorts2 = 0; 82 dev->io.Attributes2 = 0; 83 84 win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM | 85 WIN_ENABLE | WIN_DATA_WIDTH_16 | 86 WIN_USE_WAIT; 87 win.Base = 0; 88 win.Size = SSB_CORE_SIZE; 89 win.AccessSpeed = 250; 90 res = pcmcia_request_window(dev, &win, &dev->win); 91 if (res != 0) 92 goto err_kfree_ssb; 93 94 mem.CardOffset = 0; 95 mem.Page = 0; 96 res = pcmcia_map_mem_page(dev, dev->win, &mem); 97 if (res != 0) 98 goto err_disable; 99 100 dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; 101 dev->irq.Handler = NULL; /* The handler is registered later. */ 102 res = pcmcia_request_irq(dev, &dev->irq); 103 if (res != 0) 104 goto err_disable; 105 106 res = pcmcia_request_configuration(dev, &dev->conf); 107 if (res != 0) 108 goto err_disable; 109 110 err = ssb_bus_pcmciabus_register(ssb, dev, win.Base); 111 if (err) 112 goto err_disable; 113 dev->priv = ssb; 114 115 return 0; 116 117err_disable: 118 pcmcia_disable_device(dev); 119err_kfree_ssb: 120 kfree(ssb); 121out_error: 122 printk(KERN_ERR "b43-pcmcia: Initialization failed (%d, %d)\n", 123 res, err); 124 return err; 125} 126 127static void __devexit b43_pcmcia_remove(struct pcmcia_device *dev) 128{ 129 struct ssb_bus *ssb = dev->priv; 130 131 ssb_bus_unregister(ssb); 132 pcmcia_disable_device(dev); 133 kfree(ssb); 134 dev->priv = NULL; 135} 136 137static struct pcmcia_driver b43_pcmcia_driver = { 138 .owner = THIS_MODULE, 139 .drv = { 140 .name = "b43-pcmcia", 141 }, 142 .id_table = b43_pcmcia_tbl, 143 .probe = b43_pcmcia_probe, 144 .remove = __devexit_p(b43_pcmcia_remove), 145 .suspend = b43_pcmcia_suspend, 146 .resume = b43_pcmcia_resume, 147}; 148 149int b43_pcmcia_init(void) 150{ 151 return pcmcia_register_driver(&b43_pcmcia_driver); 152} 153 154void b43_pcmcia_exit(void) 155{ 156 pcmcia_unregister_driver(&b43_pcmcia_driver); 157}