diff --git a/arch/ppc64/kernel/hvconsole.c b/arch/ppc64/kernel/hvconsole.c
index c72fb8ffe974a3d42bd6865eeba8fcfacfda6f19..94fb06198ea2d3ca10a278ef6d9ad3f3bead5319 100644
--- a/arch/ppc64/kernel/hvconsole.c
+++ b/arch/ppc64/kernel/hvconsole.c
@@ -93,7 +93,7 @@ EXPORT_SYMBOL(hvc_put_chars);
  * We hope/assume that the first vty found corresponds to the first console
  * device.
  */
-int hvc_find_vtys(void)
+static int hvc_find_vtys(void)
 {
 	struct device_node *vty;
 	int num_found = 0;
@@ -119,3 +119,4 @@ int hvc_find_vtys(void)
 
 	return num_found;
 }
+console_initcall(hvc_find_vtys);
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c
index 7bc65a76dfc44d5c00883be4dcbda6324cf6959c..d59c642f9654c5a189ce62634f1368c859e2702c 100644
--- a/drivers/char/hvc_console.c
+++ b/drivers/char/hvc_console.c
@@ -219,10 +219,23 @@ struct console hvc_con_driver = {
 	.index		= -1,
 };
 
-/* Early console initialization.  Preceeds driver initialization. */
+/*
+ * Early console initialization.  Preceeds driver initialization.
+ *
+ * (1) we are first, and the user specified another driver
+ * -- index will remain -1
+ * (2) we are first and the user specified no driver
+ * -- index will be set to 0, then we will fail setup.
+ * (3)  we are first and the user specified our driver
+ * -- index will be set to user specified driver, and we will fail
+ * (4) we are after driver, and this initcall will register us
+ * -- if the user didn't specify a driver then the console will match
+ *
+ * Note that for cases 2 and 3, we will match later when the io driver
+ * calls hvc_instantiate() and call register again.
+ */
 static int __init hvc_console_init(void)
 {
-	hvc_find_vtys();
 	register_console(&hvc_con_driver);
 	return 0;
 }
@@ -257,6 +270,13 @@ int hvc_instantiate(uint32_t vtermno, int index)
 	if (last_hvc < index)
 		last_hvc = index;
 
+	/* if this index is what the user requested, then register
+	 * now (setup won't fail at this point).  It's ok to just
+	 * call register again if previously .setup failed.
+	 */
+	if (index == hvc_con_driver.index)
+		register_console(&hvc_con_driver);
+
 	return 0;
 }
 
diff --git a/include/asm-ppc64/hvconsole.h b/include/asm-ppc64/hvconsole.h
index d89d94c918158095e8e98bfb685ca0e995257072..91c2414ac00b69a4658416949c71deebc5e46326 100644
--- a/include/asm-ppc64/hvconsole.h
+++ b/include/asm-ppc64/hvconsole.h
@@ -32,9 +32,6 @@
 extern int hvc_get_chars(uint32_t vtermno, char *buf, int count);
 extern int hvc_put_chars(uint32_t vtermno, const char *buf, int count);
 
-/* Early discovery of console adapters. */
-extern int hvc_find_vtys(void);
-
-/* Implemented by a console driver */
+/* Register a vterm and a slot index for use as a console */
 extern int hvc_instantiate(uint32_t vtermno, int index);
 #endif /* _PPC64_HVCONSOLE_H */