2005-04-16 15:20:36 -07:00
/*
* printf . c : Internal prom library printf facility .
*
* Copyright ( C ) 1995 David S . Miller ( davem @ caip . rutgers . edu )
* Copyright ( C ) 1997 Jakub Jelinek ( jj @ sunsite . mff . cuni . cz )
* Copyright ( c ) 2002 Pete Zaitcev ( zaitcev @ yahoo . com )
*
* We used to warn all over the code : DO NOT USE prom_printf ( ) ,
* and yet people do . Anton ' s banking code was outputting banks
* with prom_printf for most of the 2.4 lifetime . Since an effective
* stick is not available , we deployed a carrot : an early printk
* through PROM by means of - p boot option . This ought to fix it .
* USE printk ; if you need , deploy - p .
*/
# include <linux/kernel.h>
2009-09-04 03:38:54 -07:00
# include <linux/compiler.h>
2010-11-30 20:15:58 -08:00
# include <linux/spinlock.h>
2005-04-16 15:20:36 -07:00
# include <asm/openprom.h>
# include <asm/oplib.h>
2010-11-30 20:15:58 -08:00
# define CONSOLE_WRITE_BUF_SIZE 1024
2005-04-16 15:20:36 -07:00
static char ppbuf [ 1024 ] ;
2010-11-30 20:15:58 -08:00
static char console_write_buf [ CONSOLE_WRITE_BUF_SIZE ] ;
static DEFINE_RAW_SPINLOCK ( console_write_lock ) ;
2005-04-16 15:20:36 -07:00
2009-09-04 03:38:54 -07:00
void notrace prom_write ( const char * buf , unsigned int n )
2005-04-16 15:20:36 -07:00
{
2010-11-30 20:15:58 -08:00
unsigned int dest_len ;
unsigned long flags ;
char * dest ;
dest = console_write_buf ;
raw_spin_lock_irqsave ( & console_write_lock , flags ) ;
dest_len = 0 ;
2010-11-30 14:33:29 -08:00
while ( n - - ! = 0 ) {
2010-11-30 20:15:58 -08:00
char ch = * buf + + ;
2010-11-30 14:33:29 -08:00
if ( ch = = ' \n ' ) {
2010-11-30 20:15:58 -08:00
* dest + + = ' \r ' ;
dest_len + + ;
}
* dest + + = ch ;
dest_len + + ;
if ( dest_len > = CONSOLE_WRITE_BUF_SIZE - 1 ) {
prom_console_write_buf ( console_write_buf , dest_len ) ;
dest = console_write_buf ;
dest_len = 0 ;
2010-11-30 14:33:29 -08:00
}
2005-04-16 15:20:36 -07:00
}
2010-11-30 20:15:58 -08:00
if ( dest_len )
prom_console_write_buf ( console_write_buf , dest_len ) ;
raw_spin_unlock_irqrestore ( & console_write_lock , flags ) ;
2005-04-16 15:20:36 -07:00
}
2009-09-04 03:38:54 -07:00
void notrace prom_printf ( const char * fmt , . . . )
2005-04-16 15:20:36 -07:00
{
va_list args ;
int i ;
va_start ( args , fmt ) ;
i = vscnprintf ( ppbuf , sizeof ( ppbuf ) , fmt , args ) ;
va_end ( args ) ;
prom_write ( ppbuf , i ) ;
}