Efika boards have to be booted with console=ttyPSC0 unless there is a
graphics card plugged in. Detect if the firmware stdout is the serial
connector.

Signed-off-by: Olaf Hering <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/52xx/efika.c |   50 ++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

--- a/arch/powerpc/platforms/52xx/efika.c
+++ b/arch/powerpc/platforms/52xx/efika.c
@@ -13,6 +13,7 @@
 #include <linux/utsrelease.h>
 #include <linux/pci.h>
 #include <linux/of.h>
+#include <linux/console.h>
 #include <asm/prom.h>
 #include <asm/time.h>
 #include <asm/machdep.h>
@@ -208,12 +209,61 @@ static int __init efika_probe(void)
        return 1;
 }
 
+/*
+ * Per default, input/output-device points to keyboard/screen
+ * If no card is installed, the built-in serial port is used as a fallback.
+ * But unfortunately, the firmware does not connect /chosen/{stdin,stdout}
+ * the the built-in serial node. Instead, a /failsafe node is created.
+ * More advanced hardware configurations cant be detected,
+ * boot with console=xyz123 to point the kernel to the correct device
+ */
+static void __init efika_init_early(void)
+{
+#ifdef CONFIG_SERIAL_MPC52xx
+       struct device_node *stdout_node;
+       const char *property;
+
+       if (strstr(cmd_line, "console="))
+               return;
+       /* find the boot console from /chosen/stdout */
+       if (!of_chosen)
+               return;
+       property = of_get_property(of_chosen, "linux,stdout-path", NULL);
+       if (!property)
+               return;
+       stdout_node = of_find_node_by_path(property);
+       if (!stdout_node)
+               return;
+       property = of_get_property(stdout_node, "device_type", NULL);
+       if (property && strcmp(property, "serial") == 0) {
+               /*
+                * The 9pin connector is either /failsafe or /builtin/serial.
+                * The optional graphics card has also type 'serial' in VGA 
mode.
+                */
+               property = of_get_property(stdout_node, "name", NULL);
+               if (property) {
+                       if (strcmp(property, "failsafe") == 0)
+                               add_preferred_console("ttyPSC", 0, NULL);
+                       else {
+                               if (strcmp(property, "serial") == 0) {
+                                       property = of_get_property(stdout_node, 
"model", NULL);
+                                       if (property && strcmp(property, 
"mpc5200-serial") == 0)
+                                               add_preferred_console("ttyPSC", 
0, NULL);
+                               }
+                       }
+               }
+       }
+       of_node_put(stdout_node);
+#endif
+}
+
 define_machine(efika)
 {
        .name                   = EFIKA_PLATFORM_NAME,
        .probe                  = efika_probe,
        .setup_arch             = efika_setup_arch,
        .init                   = mpc52xx_declare_of_platform_devices,
+       .init_early             = efika_init_early,
        .show_cpuinfo           = efika_show_cpuinfo,
        .init_IRQ               = mpc52xx_init_irq,
        .get_irq                = mpc52xx_get_irq,
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to