2008-05-19 16:53:02 -07:00
/*
2005-04-16 15:20:36 -07:00
* console . c : Routines that deal with sending and receiving IO
* to / from the current console device using the PROM .
*
* Copyright ( C ) 1995 David S . Miller ( davem @ caip . rutgers . edu )
* Copyright ( C ) 1998 Pete Zaitcev < zaitcev @ yahoo . com >
*/
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/sched.h>
# include <asm/openprom.h>
# include <asm/oplib.h>
# include <asm/system.h>
# include <linux/string.h>
extern void restore_current ( void ) ;
/* Non blocking put character to console device, returns -1 if
* unsuccessful .
*/
2010-11-30 14:33:29 -08:00
static int prom_nbputchar ( const char * buf )
2005-04-16 15:20:36 -07:00
{
unsigned long flags ;
int i = - 1 ;
spin_lock_irqsave ( & prom_lock , flags ) ;
switch ( prom_vers ) {
case PROM_V0 :
2010-12-03 17:56:45 +00:00
if ( ( * ( romvec - > pv_nbputchar ) ) ( * buf ) )
i = 1 ;
2005-04-16 15:20:36 -07:00
break ;
case PROM_V2 :
case PROM_V3 :
2010-11-30 14:33:29 -08:00
if ( ( * ( romvec - > pv_v2devops ) . v2_dev_write ) ( * romvec - > pv_v2bootargs . fd_stdout ,
buf , 0x1 ) = = 1 )
2010-12-03 17:56:45 +00:00
i = 1 ;
2005-04-16 15:20:36 -07:00
break ;
default :
break ;
} ;
restore_current ( ) ;
spin_unlock_irqrestore ( & prom_lock , flags ) ;
return i ; /* Ugh, we could spin forever on unsupported proms ;( */
}
2010-11-30 20:15:58 -08:00
void prom_console_write_buf ( const char * buf , int len )
2005-04-16 15:20:36 -07:00
{
2010-11-30 20:15:58 -08:00
while ( len ) {
int n = prom_nbputchar ( buf ) ;
2010-12-03 17:56:45 +00:00
if ( n < 0 )
2010-11-30 20:15:58 -08:00
continue ;
len - - ;
buf + + ;
2010-11-30 14:33:29 -08:00
}
2005-04-16 15:20:36 -07:00
}
2010-11-30 20:15:58 -08:00