2005-04-16 15:20:36 -07:00
/*
* PCBIT - D module support
*
* Copyright ( C ) 1996 Universidade de Lisboa
2012-02-19 19:52:38 -08:00
*
2005-04-16 15:20:36 -07:00
* Written by Pedro Roque Marques ( roque @ di . fc . ul . pt )
*
2012-02-19 19:52:38 -08:00
* This software may be used and distributed according to the terms of
2005-04-16 15:20:36 -07:00
* 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 ;
2012-02-19 19:52:38 -08:00
struct pcbit_dev * dev_pcbit [ MAX_PCBIT_CARDS ] ;
2005-04-16 15:20:36 -07:00
static int __init pcbit_init ( void )
{
int board ;
num_boards = 0 ;
2012-02-19 19:52:38 -08:00
printk ( KERN_NOTICE
2005-04-16 15:20:36 -07:00
" PCBIT-D device driver v 0.5-fjpc0 19991204 - "
" Copyright (C) 1996 Universidade de Lisboa \n " ) ;
2012-02-19 19:52:38 -08:00
if ( mem [ 0 ] | | irq [ 0 ] )
2005-04-16 15:20:36 -07:00
{
2012-02-19 19:52:38 -08:00
for ( board = 0 ; board < MAX_PCBIT_CARDS & & mem [ board ] & & irq [ board ] ; board + + )
2005-04-16 15:20:36 -07:00
{
if ( ! mem [ board ] )
mem [ board ] = 0xD0000 ;
if ( ! irq [ board ] )
irq [ board ] = 5 ;
2012-02-19 19:52:38 -08:00
2005-04-16 15:20:36 -07:00
if ( pcbit_init_dev ( board , mem [ board ] , irq [ board ] ) = = 0 )
num_boards + + ;
2012-02-19 19:52:38 -08:00
else
2005-04-16 15:20:36 -07:00
{
2012-02-19 19:52:38 -08:00
printk ( KERN_WARNING
" pcbit_init failed for dev %d " ,
2005-04-16 15:20:36 -07:00
board + 1 ) ;
return - EIO ;
}
}
}
/* Hardcoded default settings detection */
if ( ! num_boards )
{
2012-02-19 19:52:38 -08:00
printk ( KERN_INFO
2005-04-16 15:20:36 -07:00
" 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 ) ;
2012-02-19 19:52:38 -08:00
printk ( KERN_NOTICE
2005-04-16 15:20:36 -07:00
" 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 ;
2012-02-19 19:52:38 -08:00
int ints [ MAX_PARA + 1 ] ;
2005-04-16 15:20:36 -07:00
str = get_options ( line , MAX_PARA , ints ) ;
argc = ints [ 0 ] ;
i = 0 ;
j = 1 ;
2012-02-19 19:52:38 -08:00
while ( argc & & ( i < MAX_PCBIT_CARDS ) ) {
2005-04-16 15:20:36 -07:00
if ( argc ) {
mem [ i ] = ints [ j ] ;
j + + ; argc - - ;
}
2012-02-19 19:52:38 -08:00
2005-04-16 15:20:36 -07:00
if ( argc ) {
irq [ i ] = ints [ j ] ;
j + + ; argc - - ;
}
i + + ;
}
2012-02-19 19:52:38 -08:00
return ( 1 ) ;
2005-04-16 15:20:36 -07:00
}
__setup ( " pcbit= " , pcbit_setup ) ;
# endif
module_init ( pcbit_init ) ;
module_exit ( pcbit_exit ) ;