PageRenderTime 26ms CodeModel.GetById 13ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/isdn/pcbit/module.c

http://github.com/mirrors/linux
C | 125 lines | 91 code | 23 blank | 11 comment | 17 complexity | 5834162823baaba55825ca321ea85e7f MD5 | raw file
  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);