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