2008-05-19 16:53:02 -07:00
/*
2005-04-16 15:20:36 -07:00
* devops . c : Device operations using the PROM .
*
* Copyright ( C ) 1995 David S . Miller ( davem @ caip . rutgers . edu )
*/
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/sched.h>
# include <asm/openprom.h>
# include <asm/oplib.h>
extern void restore_current ( void ) ;
/* Open the device described by the string 'dstr'. Returns the handle
* to that device used for subsequent operations on that device .
* Returns - 1 on failure .
*/
int
prom_devopen ( char * dstr )
{
int handle ;
unsigned long flags ;
spin_lock_irqsave ( & prom_lock , flags ) ;
switch ( prom_vers ) {
case PROM_V0 :
handle = ( * ( romvec - > pv_v0devops . v0_devopen ) ) ( dstr ) ;
if ( handle = = 0 ) handle = - 1 ;
break ;
case PROM_V2 :
case PROM_V3 :
handle = ( * ( romvec - > pv_v2devops . v2_dev_open ) ) ( dstr ) ;
break ;
default :
handle = - 1 ;
break ;
} ;
restore_current ( ) ;
spin_unlock_irqrestore ( & prom_lock , flags ) ;
return handle ;
}
/* Close the device described by device handle 'dhandle'. */
int
prom_devclose ( int dhandle )
{
unsigned long flags ;
spin_lock_irqsave ( & prom_lock , flags ) ;
switch ( prom_vers ) {
case PROM_V0 :
( * ( romvec - > pv_v0devops . v0_devclose ) ) ( dhandle ) ;
break ;
case PROM_V2 :
case PROM_V3 :
( * ( romvec - > pv_v2devops . v2_dev_close ) ) ( dhandle ) ;
break ;
default :
break ;
} ;
restore_current ( ) ;
spin_unlock_irqrestore ( & prom_lock , flags ) ;
return 0 ;
}
/* Seek to specified location described by 'seekhi' and 'seeklo'
* for device ' dhandle ' .
*/
void
prom_seek ( int dhandle , unsigned int seekhi , unsigned int seeklo )
{
unsigned long flags ;
spin_lock_irqsave ( & prom_lock , flags ) ;
switch ( prom_vers ) {
case PROM_V0 :
( * ( romvec - > pv_v0devops . v0_seekdev ) ) ( dhandle , seekhi , seeklo ) ;
break ;
case PROM_V2 :
case PROM_V3 :
( * ( romvec - > pv_v2devops . v2_dev_seek ) ) ( dhandle , seekhi , seeklo ) ;
break ;
default :
break ;
} ;
restore_current ( ) ;
spin_unlock_irqrestore ( & prom_lock , flags ) ;
return ;
}