ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / isdn / pcbit / module.c
1 /*
2  * PCBIT-D module support
3  *
4  * Copyright (C) 1996 Universidade de Lisboa
5  * 
6  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
7  *
8  * This software may be used and distributed according to the terms of 
9  * the GNU General Public License, incorporated herein by reference.
10  */
11
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/sched.h>
15 #include <linux/string.h>
16 #include <linux/kernel.h>
17 #include <linux/skbuff.h>
18
19 #include <linux/isdnif.h>
20 #include "pcbit.h"
21
22 MODULE_DESCRIPTION("ISDN4Linux: Driver for PCBIT-T card");
23 MODULE_AUTHOR("Pedro Roque Marques");
24 MODULE_LICENSE("GPL");
25 MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_PCBIT_CARDS) "i");
26 MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_PCBIT_CARDS) "i");
27
28 static int mem[MAX_PCBIT_CARDS] = {0, };
29 static int irq[MAX_PCBIT_CARDS] = {0, };
30
31 static int num_boards;
32 struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS] = {0, };
33
34 extern void pcbit_terminate(int board);
35 extern int pcbit_init_dev(int board, int mem_base, int irq);
36
37 static int __init pcbit_init(void)
38 {
39         int board;
40
41         num_boards = 0;
42
43         printk(KERN_NOTICE 
44                "PCBIT-D device driver v 0.5-fjpc0 19991204 - "
45                "Copyright (C) 1996 Universidade de Lisboa\n");
46
47         if (mem[0] || irq[0]) 
48         {
49                 for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++)
50                 {
51                         if (!mem[board])
52                                 mem[board] = 0xD0000;
53                         if (!irq[board])
54                                 irq[board] = 5;
55                         
56                         if (pcbit_init_dev(board, mem[board], irq[board]) == 0)
57                                 num_boards++;
58                 
59                         else 
60                         {
61                                 printk(KERN_WARNING 
62                                        "pcbit_init failed for dev %d", 
63                                        board + 1);
64                                 return -EIO;
65                         }
66                 }
67         }
68
69         /* Hardcoded default settings detection */
70
71         if (!num_boards)
72         {
73                 printk(KERN_INFO 
74                        "Trying to detect board using default settings\n");
75                 if (pcbit_init_dev(0, 0xD0000, 5) == 0)
76                         num_boards++;
77                 else
78                         return -EIO;
79         }
80         return 0;
81 }
82
83 static void __exit pcbit_exit(void)
84 {
85 #ifdef MODULE
86         int board;
87
88         for (board = 0; board < num_boards; board++)
89                 pcbit_terminate(board);
90         printk(KERN_NOTICE 
91                "PCBIT-D module unloaded\n");
92 #endif
93 }
94
95 #ifndef MODULE
96 #define MAX_PARA        (MAX_PCBIT_CARDS * 2)
97 static int __init pcbit_setup(char *line)
98 {
99         int i, j, argc;
100         char *str;
101         int ints[MAX_PARA+1];
102
103         str = get_options(line, MAX_PARA, ints);
104         argc = ints[0];
105         i = 0;
106         j = 1;
107
108         while (argc && (i<MAX_PCBIT_CARDS)) {
109
110                 if (argc) {
111                         mem[i]  = ints[j];
112                         j++; argc--;
113                 }
114                 
115                 if (argc) {
116                         irq[i]  = ints[j];
117                         j++; argc--;
118                 }
119
120                 i++;
121         }
122         return(1);
123 }
124 __setup("pcbit=", pcbit_setup);
125 #endif
126
127 module_init(pcbit_init);
128 module_exit(pcbit_exit);
129