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/string.h> 15#include <linux/kernel.h> 16#include <linux/skbuff.h> 17 18#include <linux/isdnif.h> 19#include "pcbit.h" 20 21MODULE_DESCRIPTION("ISDN4Linux: Driver for PCBIT-T card"); 22MODULE_AUTHOR("Pedro Roque Marques"); 23MODULE_LICENSE("GPL"); 24 25static int mem[MAX_PCBIT_CARDS]; 26static int irq[MAX_PCBIT_CARDS]; 27 28module_param_array(mem, int, NULL, 0); 29module_param_array(irq, int, NULL, 0); 30 31static int num_boards; 32struct pcbit_dev *dev_pcbit[MAX_PCBIT_CARDS]; 33 34static 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 80static void __exit pcbit_exit(void) 81{ 82#ifdef MODULE 83 int board; 84 85 for (board = 0; board < num_boards; board++) 86 pcbit_terminate(board); 87 printk(KERN_NOTICE 88 "PCBIT-D module unloaded\n"); 89#endif 90} 91 92#ifndef MODULE 93#define MAX_PARA (MAX_PCBIT_CARDS * 2) 94static int __init pcbit_setup(char *line) 95{ 96 int i, j, argc; 97 char *str; 98 int ints[MAX_PARA + 1]; 99 100 str = get_options(line, MAX_PARA, ints); 101 argc = ints[0]; 102 i = 0; 103 j = 1; 104 105 while (argc && (i < MAX_PCBIT_CARDS)) { 106 107 if (argc) { 108 mem[i] = ints[j]; 109 j++; argc--; 110 } 111 112 if (argc) { 113 irq[i] = ints[j]; 114 j++; argc--; 115 } 116 117 i++; 118 } 119 return (1); 120} 121__setup("pcbit=", pcbit_setup); 122#endif 123 124module_init(pcbit_init); 125module_exit(pcbit_exit); 126