1 /* $Id: b1pci.c,v 1.1.4.1.2.1 2001/12/21 15:00:17 kai Exp $
3 * Module for AVM B1 PCI-card.
5 * Copyright 1999 by Carsten Paeth <calle@calle.de>
7 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/skbuff.h>
16 #include <linux/delay.h>
18 #include <linux/interrupt.h>
19 #include <linux/ioport.h>
20 #include <linux/pci.h>
21 #include <linux/capi.h>
23 #include <linux/init.h>
24 #include <linux/isdn/capicmd.h>
25 #include <linux/isdn/capiutil.h>
26 #include <linux/isdn/capilli.h>
29 /* ------------------------------------------------------------- */
31 static struct pci_device_id b1pci_pci_tbl[] = {
32 { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_B1, PCI_ANY_ID, PCI_ANY_ID },
33 { } /* Terminating entry */
36 MODULE_DEVICE_TABLE(pci, b1pci_pci_tbl);
37 MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM B1 PCI card");
38 MODULE_AUTHOR("Carsten Paeth");
39 MODULE_LICENSE("GPL");
41 /* ------------------------------------------------------------- */
43 static char *b1pci_procinfo(struct capi_ctr *ctrl)
45 avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
49 sprintf(cinfo->infobuf, "%s %s 0x%x %d r%d",
50 cinfo->cardname[0] ? cinfo->cardname : "-",
51 cinfo->version[VER_DRIVER] ? cinfo->version[VER_DRIVER] : "-",
52 cinfo->card ? cinfo->card->port : 0x0,
53 cinfo->card ? cinfo->card->irq : 0,
54 cinfo->card ? cinfo->card->revision : 0
56 return cinfo->infobuf;
59 /* ------------------------------------------------------------- */
61 static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev)
67 card = b1_alloc_card(1);
69 printk(KERN_WARNING "b1pci: no memory.\n");
74 cinfo = card->ctrlinfo;
75 sprintf(card->name, "b1pci-%x", p->port);
78 card->cardtype = avm_b1pci;
80 if (!request_region(card->port, AVMB1_PORTLEN, card->name)) {
81 printk(KERN_WARNING "b1pci: ports 0x%03x-0x%03x in use.\n",
82 card->port, card->port + AVMB1_PORTLEN);
87 retval = b1_detect(card->port, card->cardtype);
89 printk(KERN_NOTICE "b1pci: NO card at 0x%x (%d)\n",
92 goto err_release_region;
97 retval = request_irq(card->irq, b1_interrupt, SA_SHIRQ, card->name, card);
99 printk(KERN_ERR "b1pci: unable to get IRQ %d.\n", card->irq);
101 goto err_release_region;
104 cinfo->capi_ctrl.driver_name = "b1pci";
105 cinfo->capi_ctrl.driverdata = cinfo;
106 cinfo->capi_ctrl.register_appl = b1_register_appl;
107 cinfo->capi_ctrl.release_appl = b1_release_appl;
108 cinfo->capi_ctrl.send_message = b1_send_message;
109 cinfo->capi_ctrl.load_firmware = b1_load_firmware;
110 cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
111 cinfo->capi_ctrl.procinfo = b1pci_procinfo;
112 cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
113 strcpy(cinfo->capi_ctrl.name, card->name);
114 cinfo->capi_ctrl.owner = THIS_MODULE;
116 retval = attach_capi_ctr(&cinfo->capi_ctrl);
118 printk(KERN_ERR "b1pci: attach controller failed.\n");
122 if (card->revision >= 4) {
123 printk(KERN_INFO "b1pci: AVM B1 PCI V4 at i/o %#x, irq %d, revision %d (no dma)\n",
124 card->port, card->irq, card->revision);
126 printk(KERN_INFO "b1pci: AVM B1 PCI at i/o %#x, irq %d, revision %d\n",
127 card->port, card->irq, card->revision);
130 pci_set_drvdata(pdev, card);
134 free_irq(card->irq, card);
136 release_region(card->port, AVMB1_PORTLEN);
143 static void b1pci_remove(struct pci_dev *pdev)
145 avmcard *card = pci_get_drvdata(pdev);
146 avmctrl_info *cinfo = card->ctrlinfo;
147 unsigned int port = card->port;
152 detach_capi_ctr(&cinfo->capi_ctrl);
153 free_irq(card->irq, card);
154 release_region(card->port, AVMB1_PORTLEN);
158 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
159 /* ------------------------------------------------------------- */
161 static char *b1pciv4_procinfo(struct capi_ctr *ctrl)
163 avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
167 sprintf(cinfo->infobuf, "%s %s 0x%x %d 0x%lx r%d",
168 cinfo->cardname[0] ? cinfo->cardname : "-",
169 cinfo->version[VER_DRIVER] ? cinfo->version[VER_DRIVER] : "-",
170 cinfo->card ? cinfo->card->port : 0x0,
171 cinfo->card ? cinfo->card->irq : 0,
172 cinfo->card ? cinfo->card->membase : 0,
173 cinfo->card ? cinfo->card->revision : 0
175 return cinfo->infobuf;
178 /* ------------------------------------------------------------- */
180 static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev)
186 card = b1_alloc_card(1);
188 printk(KERN_WARNING "b1pci: no memory.\n");
193 card->dma = avmcard_dma_alloc("b1pci", pdev, 2048+128, 2048+128);
195 printk(KERN_WARNING "b1pci: dma alloc.\n");
200 cinfo = card->ctrlinfo;
201 sprintf(card->name, "b1pciv4-%x", p->port);
202 card->port = p->port;
204 card->membase = p->membase;
205 card->cardtype = avm_b1pci;
207 if (!request_region(card->port, AVMB1_PORTLEN, card->name)) {
208 printk(KERN_WARNING "b1pci: ports 0x%03x-0x%03x in use.\n",
209 card->port, card->port + AVMB1_PORTLEN);
214 card->mbase = ioremap(card->membase, 64);
216 printk(KERN_NOTICE "b1pci: can't remap memory at 0x%lx\n",
219 goto err_release_region;
224 retval = b1pciv4_detect(card);
226 printk(KERN_NOTICE "b1pci: NO card at 0x%x (%d)\n",
232 b1_getrevision(card);
234 retval = request_irq(card->irq, b1dma_interrupt, SA_SHIRQ, card->name, card);
236 printk(KERN_ERR "b1pci: unable to get IRQ %d.\n",
242 cinfo->capi_ctrl.owner = THIS_MODULE;
243 cinfo->capi_ctrl.driver_name = "b1pciv4";
244 cinfo->capi_ctrl.driverdata = cinfo;
245 cinfo->capi_ctrl.register_appl = b1dma_register_appl;
246 cinfo->capi_ctrl.release_appl = b1dma_release_appl;
247 cinfo->capi_ctrl.send_message = b1dma_send_message;
248 cinfo->capi_ctrl.load_firmware = b1dma_load_firmware;
249 cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr;
250 cinfo->capi_ctrl.procinfo = b1pciv4_procinfo;
251 cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc;
252 strcpy(cinfo->capi_ctrl.name, card->name);
254 retval = attach_capi_ctr(&cinfo->capi_ctrl);
256 printk(KERN_ERR "b1pci: attach controller failed.\n");
259 card->cardnr = cinfo->capi_ctrl.cnr;
261 printk(KERN_INFO "b1pci: AVM B1 PCI V4 at i/o %#x, irq %d, mem %#lx, revision %d (dma)\n",
262 card->port, card->irq, card->membase, card->revision);
264 pci_set_drvdata(pdev, card);
268 free_irq(card->irq, card);
270 iounmap(card->mbase);
272 release_region(card->port, AVMB1_PORTLEN);
274 avmcard_dma_free(card->dma);
282 static void b1pciv4_remove(struct pci_dev *pdev)
284 avmcard *card = pci_get_drvdata(pdev);
285 avmctrl_info *cinfo = card->ctrlinfo;
289 detach_capi_ctr(&cinfo->capi_ctrl);
290 free_irq(card->irq, card);
291 iounmap(card->mbase);
292 release_region(card->port, AVMB1_PORTLEN);
293 avmcard_dma_free(card->dma);
297 #endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */
299 static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
300 const struct pci_device_id *ent)
302 struct capicardparams param;
305 if (pci_enable_device(pdev) < 0) {
306 printk(KERN_ERR "b1pci: failed to enable AVM-B1\n");
309 param.irq = pdev->irq;
311 if (pci_resource_start(pdev, 2)) { /* B1 PCI V4 */
312 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
313 pci_set_master(pdev);
315 param.membase = pci_resource_start(pdev, 0);
316 param.port = pci_resource_start(pdev, 2);
318 printk(KERN_INFO "b1pci: PCI BIOS reports AVM-B1 V4 at i/o %#x, irq %d, mem %#x\n",
319 param.port, param.irq, param.membase);
320 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
321 retval = b1pciv4_probe(¶m, pdev);
323 retval = b1pci_probe(¶m, pdev);
326 printk(KERN_ERR "b1pci: no AVM-B1 V4 at i/o %#x, irq %d, mem %#x detected\n",
327 param.port, param.irq, param.membase);
331 param.port = pci_resource_start(pdev, 1);
333 printk(KERN_INFO "b1pci: PCI BIOS reports AVM-B1 at i/o %#x, irq %d\n",
334 param.port, param.irq);
335 retval = b1pci_probe(¶m, pdev);
337 printk(KERN_ERR "b1pci: no AVM-B1 at i/o %#x, irq %d detected\n",
338 param.port, param.irq);
344 static void __devexit b1pci_pci_remove(struct pci_dev *pdev)
346 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
347 avmcard *card = pci_get_drvdata(pdev);
350 b1pciv4_remove(pdev);
358 static struct pci_driver b1pci_pci_driver = {
360 .id_table = b1pci_pci_tbl,
361 .probe = b1pci_pci_probe,
362 .remove = __devexit_p(b1pci_pci_remove),
365 static int __init b1pci_init(void)
367 return pci_module_init(&b1pci_pci_driver);
370 static void __exit b1pci_exit(void)
372 pci_unregister_driver(&b1pci_pci_driver);
375 module_init(b1pci_init);
376 module_exit(b1pci_exit);