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