diff options
Diffstat (limited to 'arch/sparc/prom/printf.c')
| -rw-r--r-- | arch/sparc/prom/printf.c | 35 | 
1 files changed, 29 insertions, 6 deletions
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c index ca869266b9f..d9682f06b3b 100644 --- a/arch/sparc/prom/printf.c +++ b/arch/sparc/prom/printf.c @@ -15,22 +15,45 @@  #include <linux/kernel.h>  #include <linux/compiler.h> +#include <linux/spinlock.h>  #include <asm/openprom.h>  #include <asm/oplib.h> +#define CONSOLE_WRITE_BUF_SIZE	1024 +  static char ppbuf[1024]; +static char console_write_buf[CONSOLE_WRITE_BUF_SIZE]; +static DEFINE_RAW_SPINLOCK(console_write_lock);  void notrace prom_write(const char *buf, unsigned int n)  { -	char ch; +	unsigned int dest_len; +	unsigned long flags; +	char *dest; + +	dest = console_write_buf; +	raw_spin_lock_irqsave(&console_write_lock, flags); -	while (n != 0) { -		--n; -		if ((ch = *buf++) == '\n') -			prom_putchar('\r'); -		prom_putchar(ch); +	dest_len = 0; +	while (n-- != 0) { +		char ch = *buf++; +		if (ch == '\n') { +			*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; +		}  	} +	if (dest_len) +		prom_console_write_buf(console_write_buf, dest_len); + +	raw_spin_unlock_irqrestore(&console_write_lock, flags);  }  void notrace prom_printf(const char *fmt, ...)  | 
