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 00000000000..282073a35d6 --- /dev/null +++ b/drivers/isdn/pcbit/module.c @@ -0,0 +1,130 @@ +/* + * PCBIT-D module support + * + * Copyright (C) 1996 Universidade de Lisboa + * + * Written by Pedro Roque Marques (roque@di.fc.ul.pt) + * + * This software may be used and distributed according to the terms of + * the GNU General Public License, incorporated herein by reference. + */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/sched.h> +#include <linux/string.h> +#include <linux/kernel.h> +#include <linux/skbuff.h> + +#include <linux/isdnif.h> +#include "pcbit.h" + +MODULE_DESCRIPTION("ISDN4Linux: Driver for PCBIT-T card"); +MODULE_AUTHOR("Pedro Roque Marques"); +MODULE_LICENSE("GPL"); + +static int mem[MAX_PCBIT_CARDS]; +static int irq[MAX_PCBIT_CARDS]; + +module_param_array(mem, int, NULL, 0); +module_param_array(irq, int, NULL, 0); + +static int num_boards; +struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS]; + +extern void pcbit_terminate(int board); +extern int pcbit_init_dev(int board, int mem_base, int irq); + +static int __init pcbit_init(void) +{ + int board; + + num_boards = 0; + + printk(KERN_NOTICE + "PCBIT-D device driver v 0.5-fjpc0 19991204 - " + "Copyright (C) 1996 Universidade de Lisboa\n"); + + if (mem[0] || irq[0]) + { + for (board=0; board < MAX_PCBIT_CARDS && mem[board] && irq[board]; board++) + { + if (!mem[board]) + mem[board] = 0xD0000; + if (!irq[board]) + irq[board] = 5; + + if (pcbit_init_dev(board, mem[board], irq[board]) == 0) + num_boards++; + + else + { + printk(KERN_WARNING + "pcbit_init failed for dev %d", + board + 1); + return -EIO; + } + } + } + + /* Hardcoded default settings detection */ + + if (!num_boards) + { + printk(KERN_INFO + "Trying to detect board using default settings\n"); + if (pcbit_init_dev(0, 0xD0000, 5) == 0) + num_boards++; + else + return -EIO; + } + return 0; +} + +static void __exit pcbit_exit(void) +{ +#ifdef MODULE + int board; + + for (board = 0; board < num_boards; board++) + pcbit_terminate(board); + printk(KERN_NOTICE + "PCBIT-D module unloaded\n"); +#endif +} + +#ifndef MODULE +#define MAX_PARA (MAX_PCBIT_CARDS * 2) +static int __init pcbit_setup(char *line) +{ + int i, j, argc; + char *str; + int ints[MAX_PARA+1]; + + str = get_options(line, MAX_PARA, ints); + argc = ints[0]; + i = 0; + j = 1; + + while (argc && (i<MAX_PCBIT_CARDS)) { + + if (argc) { + mem[i] = ints[j]; + j++; argc--; + } + + if (argc) { + irq[i] = ints[j]; + j++; argc--; + } + + i++; + } + return(1); +} +__setup("pcbit=", pcbit_setup); +#endif + +module_init(pcbit_init); +module_exit(pcbit_exit); + |