From: Anton Blanchard <anton@samba.org>

Lets make a decent attempt to find out where your console is.  The new
preferred_console stuff is pretty nice.



---

 arch/ppc64/kernel/setup.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+)

diff -puN arch/ppc64/kernel/setup.c~ppc64-use-preferred-console arch/ppc64/kernel/setup.c
--- 25/arch/ppc64/kernel/setup.c~ppc64-use-preferred-console	2004-01-22 19:09:04.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/setup.c	2004-01-22 19:09:04.000000000 -0800
@@ -430,6 +430,56 @@ void parse_cmd_line(unsigned long r3, un
 	}
 }
 
+static int __init set_preferred_console(void)
+{
+	struct device_node *prom_stdout;
+	char *name;
+
+	/* The user has requested a console so this is already set up. */
+	if (strstr(cmd_line, "console="))
+		return -EBUSY;
+
+	prom_stdout = find_path_device(of_stdout_device);
+	if (!prom_stdout)
+		return -ENODEV;
+
+	name = (char *)get_property(prom_stdout, "name", NULL);
+	if (!name)
+		return -ENODEV;
+
+	if (strcmp(name, "serial") == 0) {
+		int i;
+		u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i);
+		if (i > 8) {
+			int offset;
+			switch (reg[1]) {
+				case 0x3f8:
+					offset = 0;
+					break;
+				case 0x2f8:
+					offset = 1;
+					break;
+				case 0x898:
+					offset = 2;
+					break;
+				case 0x890:
+					offset = 3;
+					break;
+				default:
+					/* We dont recognise the serial port */
+					return -ENODEV;
+			}
+
+			return add_preferred_console("ttyS", offset, NULL);
+		}
+	} else if (strcmp(name, "vty") == 0) {
+		/* pSeries LPAR virtual console */
+		return add_preferred_console("hvc", 0, NULL);
+	}
+
+	return -ENODEV;
+}
+console_initcall(set_preferred_console);
 
 #ifdef CONFIG_PPC_PSERIES
 int parse_bootinfo(void)

_