| /* | |
| * 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/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]; | |
| 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); | |