2008-05-20 07:53:02 +08:00
|
|
|
/*
|
2005-04-17 06:20:36 +08: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 <linux/string.h>
|
|
|
|
|
|
|
|
extern void restore_current(void);
|
|
|
|
|
|
|
|
/* Non blocking put character to console device, returns -1 if
|
|
|
|
* unsuccessful.
|
|
|
|
*/
|
2010-12-01 06:33:29 +08:00
|
|
|
static int prom_nbputchar(const char *buf)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
int i = -1;
|
|
|
|
|
|
|
|
spin_lock_irqsave(&prom_lock, flags);
|
|
|
|
switch(prom_vers) {
|
|
|
|
case PROM_V0:
|
2010-12-04 01:56:45 +08:00
|
|
|
if ((*(romvec->pv_nbputchar))(*buf))
|
|
|
|
i = 1;
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
case PROM_V2:
|
|
|
|
case PROM_V3:
|
2010-12-01 06:33:29 +08:00
|
|
|
if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout,
|
|
|
|
buf, 0x1) == 1)
|
2010-12-04 01:56:45 +08:00
|
|
|
i = 1;
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2011-06-03 22:45:23 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
restore_current();
|
|
|
|
spin_unlock_irqrestore(&prom_lock, flags);
|
|
|
|
return i; /* Ugh, we could spin forever on unsupported proms ;( */
|
|
|
|
}
|
|
|
|
|
2010-12-01 12:15:58 +08:00
|
|
|
void prom_console_write_buf(const char *buf, int len)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2010-12-01 12:15:58 +08:00
|
|
|
while (len) {
|
|
|
|
int n = prom_nbputchar(buf);
|
2010-12-04 01:56:45 +08:00
|
|
|
if (n < 0)
|
2010-12-01 12:15:58 +08:00
|
|
|
continue;
|
|
|
|
len--;
|
|
|
|
buf++;
|
2010-12-01 06:33:29 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2010-12-01 12:15:58 +08:00
|
|
|
|