summaryrefslogtreecommitdiff
path: root/arch/sparc/prom/printf.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2010-12-19 18:35:08 +0300
committerIngo Molnar <mingo@elte.hu>2010-12-19 18:35:14 +0300
commitca680888d5d0d03862ec311a83c6a1c7a1e00a01 (patch)
treebc2a1777f1d715f947fa77940ebce5c43029b37b /arch/sparc/prom/printf.c
parent40dc11ffb35e8c4e8fa71092048e0f8de9db758c (diff)
parentb0c3844d8af6b9f3f18f31e1b0502fbefa2166be (diff)
downloadlinux-ca680888d5d0d03862ec311a83c6a1c7a1e00a01.tar.xz
Merge commit 'v2.6.37-rc6' into sched/core
Merge reason: Update to the latest -rc. Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/sparc/prom/printf.c')
-rw-r--r--arch/sparc/prom/printf.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c
index ca869266b9f3..d9682f06b3b0 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, ...)