File: /usr/src/linux/drivers/isdn/pcbit/module.c

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