Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[pandora-kernel.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
26 static int mem[MAX_PCBIT_CARDS];
27 static int irq[MAX_PCBIT_CARDS];
28
29 module_param_array(mem, int, NULL, 0);
30 module_param_array(irq, int, NULL, 0);
31
32 static int num_boards;
33 struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
34
35 static int __init pcbit_init(void)
36 {
37         int board;
38
39         num_boards = 0;
40
41         printk(KERN_NOTICE 
42                "PCBIT-D device driver v 0.5-fjpc0 19991204 - "
43                "Copyright (C) 1996 Universidade de Lisboa\n");
44
45         if (mem[0] || irq[0]) 
46         {
47                 for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++)
48                 {
49                         if (!mem[board])
50                                 mem[board] = 0xD0000;
51                         if (!irq[board])
52                                 irq[board] = 5;
53                         
54                         if (pcbit_init_dev(board, mem[board], irq[board]) == 0)
55                                 num_boards++;
56                 
57                         else 
58                         {
59                                 printk(KERN_WARNING 
60                                        "pcbit_init failed for dev %d", 
61                                        board + 1);
62                                 return -EIO;
63                         }
64                 }
65         }
66
67         /* Hardcoded default settings detection */
68
69         if (!num_boards)
70         {
71                 printk(KERN_INFO 
72                        "Trying to detect board using default settings\n");
73                 if (pcbit_init_dev(0, 0xD0000, 5) == 0)
74                         num_boards++;
75                 else
76                         return -EIO;
77         }
78         return 0;
79 }
80
81 static void __exit pcbit_exit(void)
82 {
83 #ifdef MODULE
84         int board;
85
86         for (board = 0; board < num_boards; board++)
87                 pcbit_terminate(board);
88         printk(KERN_NOTICE 
89                "PCBIT-D module unloaded\n");
90 #endif
91 }
92
93 #ifndef MODULE
94 #define MAX_PARA        (MAX_PCBIT_CARDS * 2)
95 static int __init pcbit_setup(char *line)
96 {
97         int i, j, argc;
98         char *str;
99         int ints[MAX_PARA+1];
100
101         str = get_options(line, MAX_PARA, ints);
102         argc = ints[0];
103         i = 0;
104         j = 1;
105
106         while (argc && (i<MAX_PCBIT_CARDS)) {
107
108                 if (argc) {
109                         mem[i]  = ints[j];
110                         j++; argc--;
111                 }
112                 
113                 if (argc) {
114                         irq[i]  = ints[j];
115                         j++; argc--;
116                 }
117
118                 i++;
119         }
120         return(1);
121 }
122 __setup("pcbit=", pcbit_setup);
123 #endif
124
125 module_init(pcbit_init);
126 module_exit(pcbit_exit);
127