diff options
Diffstat (limited to 'drivers/isdn/pcbit/module.c')
-rw-r--r-- | drivers/isdn/pcbit/module.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/drivers/isdn/pcbit/module.c b/drivers/isdn/pcbit/module.c new file mode 100644 index 000000000000..282073a35d6a --- /dev/null +++ b/drivers/isdn/pcbit/module.c | |||
@@ -0,0 +1,130 @@ | |||
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 | extern void pcbit_terminate(int board); | ||
36 | extern int pcbit_init_dev(int board, int mem_base, int irq); | ||
37 | |||
38 | static int __init pcbit_init(void) | ||
39 | { | ||
40 | int board; | ||
41 | |||
42 | num_boards = 0; | ||
43 | |||
44 | printk(KERN_NOTICE | ||
45 | "PCBIT-D device driver v 0.5-fjpc0 19991204 - " | ||
46 | "Copyright (C) 1996 Universidade de Lisboa\n"); | ||
47 | |||
48 | if (mem[0] || irq[0]) | ||
49 | { | ||
50 | for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++) | ||
51 | { | ||
52 | if (!mem[board]) | ||
53 | mem[board] = 0xD0000; | ||
54 | if (!irq[board]) | ||
55 | irq[board] = 5; | ||
56 | |||
57 | if (pcbit_init_dev(board, mem[board], irq[board]) == 0) | ||
58 | num_boards++; | ||
59 | |||
60 | else | ||
61 | { | ||
62 | printk(KERN_WARNING | ||
63 | "pcbit_init failed for dev %d", | ||
64 | board + 1); | ||
65 | return -EIO; | ||
66 | } | ||
67 | } | ||
68 | } | ||
69 | |||
70 | /* Hardcoded default settings detection */ | ||
71 | |||
72 | if (!num_boards) | ||
73 | { | ||
74 | printk(KERN_INFO | ||
75 | "Trying to detect board using default settings\n"); | ||
76 | if (pcbit_init_dev(0, 0xD0000, 5) == 0) | ||
77 | num_boards++; | ||
78 | else | ||
79 | return -EIO; | ||
80 | } | ||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | static void __exit pcbit_exit(void) | ||
85 | { | ||
86 | #ifdef MODULE | ||
87 | int board; | ||
88 | |||
89 | for (board = 0; board < num_boards; board++) | ||
90 | pcbit_terminate(board); | ||
91 | printk(KERN_NOTICE | ||
92 | "PCBIT-D module unloaded\n"); | ||
93 | #endif | ||
94 | } | ||
95 | |||
96 | #ifndef MODULE | ||
97 | #define MAX_PARA (MAX_PCBIT_CARDS * 2) | ||
98 | static int __init pcbit_setup(char *line) | ||
99 | { | ||
100 | int i, j, argc; | ||
101 | char *str; | ||
102 | int ints[MAX_PARA+1]; | ||
103 | |||
104 | str = get_options(line, MAX_PARA, ints); | ||
105 | argc = ints[0]; | ||
106 | i = 0; | ||
107 | j = 1; | ||
108 | |||
109 | while (argc && (i<MAX_PCBIT_CARDS)) { | ||
110 | |||
111 | if (argc) { | ||
112 | mem[i] = ints[j]; | ||
113 | j++; argc--; | ||
114 | } | ||
115 | |||
116 | if (argc) { | ||
117 | irq[i] = ints[j]; | ||
118 | j++; argc--; | ||
119 | } | ||
120 | |||
121 | i++; | ||
122 | } | ||
123 | return(1); | ||
124 | } | ||
125 | __setup("pcbit=", pcbit_setup); | ||
126 | #endif | ||
127 | |||
128 | module_init(pcbit_init); | ||
129 | module_exit(pcbit_exit); | ||
130 | |||