depends on IBM_OCP || XILINX_OCP
        default y
 
+choice
+       prompt "Early debugging (dangerous)"
+       bool
+       optional
+       help
+         Enable early debugging. Careful, if you enable debugging for the
+         wrong type of machine your kernel _will not boot_.
+
+config PPC_EARLY_DEBUG_LPAR
+       bool "LPAR HV Console"
+       depends on PPC_PSERIES
+       help
+         Select this to enable early debugging for a machine with a HVC
+         console on vterm 0.
+
+config PPC_EARLY_DEBUG_G5
+       bool "Apple G5"
+       depends on PPC_PMAC64
+       help
+         Select this to enable early debugging for Apple G5 machines.
+
+config PPC_EARLY_DEBUG_RTAS
+       bool "RTAS Panel"
+       depends on PPC_RTAS
+       help
+         Select this to enable early debugging via the RTAS panel.
+
+config PPC_EARLY_DEBUG_MAPLE
+       bool "Maple real mode"
+       depends on PPC_MAPLE
+       help
+         Select this to enable early debugging for Maple.
+
+config PPC_EARLY_DEBUG_ISERIES
+       bool "iSeries HV Console"
+       depends on PPC_ISERIES
+       help
+         Select this to enable early debugging for legacy iSeries. You need
+         to hit "Ctrl-x Ctrl-x" to see the messages on the console.
+
+endchoice
+
 endmenu
 
 #include <asm/delay.h>
 #include <asm/uaccess.h>
 #include <asm/lmb.h>
+#include <asm/udbg.h>
 
 struct rtas_t rtas = {
        .lock = SPIN_LOCK_UNLOCKED
  * are designed only for very early low-level debugging, which
  * is why the token is hard-coded to 10.
  */
-void call_rtas_display_status(unsigned char c)
+static void call_rtas_display_status(char c)
 {
        struct rtas_args *args = &rtas.args;
        unsigned long s;
        args->nargs = 1;
        args->nret  = 1;
        args->rets  = (rtas_arg_t *)&(args->args[1]);
-       args->args[0] = (int)c;
+       args->args[0] = (unsigned char)c;
 
        enter_rtas(__pa(args));
 
        spin_unlock_irqrestore(&rtas.lock, s);
 }
 
-void call_rtas_display_status_delay(unsigned char c)
+static void call_rtas_display_status_delay(char c)
 {
        static int pending_newline = 0;  /* did last write end with unprinted newline? */
        static int width = 16;
        }
 }
 
+void __init udbg_init_rtas(void)
+{
+       udbg_putc = call_rtas_display_status_delay;
+}
+
 void rtas_progress(char *s, unsigned short hex)
 {
        struct device_node *root;
 
 #define DBG(fmt...)
 #endif
 
-/*
- * Here are some early debugging facilities. You can enable one
- * but your kernel will not boot on anything else if you do so
- */
-
-/* For use on LPAR machines that support an HVC console on vterm 0 */
-extern void udbg_init_debug_lpar(void);
-
-/* This one is for use on Apple G5 machines */
-extern void udbg_init_pmac_realmode(void);
-
-/* That's RTAS panel debug */
-extern void call_rtas_display_status_delay(unsigned char c);
-
-/* Here's maple real mode debug */
-extern void udbg_init_maple_realmode(void);
-
-/* For iSeries - hit Ctrl-x Ctrl-x to see the output */
-extern void udbg_init_iseries(void);
-
-#define EARLY_DEBUG_INIT() do {} while(0)
-
-#if 0
-#define EARLY_DEBUG_INIT() udbg_init_debug_lpar()
-#define EARLY_DEBUG_INIT() udbg_init_iseries()
-#define EARLY_DEBUG_INIT() udbg_init_maple_realmode()
-#define EARLY_DEBUG_INIT() udbg_init_pmac_realmode()
-#define EARLY_DEBUG_INIT()                                             \
-       do { udbg_putc = call_rtas_display_status_delay; } while(0)
-#endif
-
 int have_of = 1;
 int boot_cpuid = 0;
 int boot_cpuid_phys = 0;
        struct paca_struct *lpaca = get_paca();
        static struct machdep_calls **mach;
 
-       /*
-        * Enable early debugging if any specified (see top of
-        * this file)
-        */
-       EARLY_DEBUG_INIT();
+       /* Enable early debugging if any specified (see udbg.h) */
+       udbg_early_init();
 
        DBG(" -> early_setup()\n");
 
 
 #include <linux/sched.h>
 #include <linux/console.h>
 #include <asm/processor.h>
+#include <asm/udbg.h>
 
 void (*udbg_putc)(char c);
 int (*udbg_getc)(void);
 int (*udbg_getc_poll)(void);
 
+/*
+ * Early debugging facilities. You can enable _one_ of these via .config,
+ * if you do so your kernel _will not boot_ on anything else. Be careful.
+ */
+void __init udbg_early_init(void)
+{
+#if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
+       /* For LPAR machines that have an HVC console on vterm 0 */
+       udbg_init_debug_lpar();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
+       /* For use on Apple G5 machines */
+       udbg_init_pmac_realmode();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS)
+       /* RTAS panel debug */
+       udbg_init_rtas();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE)
+       /* Maple real mode debug */
+       udbg_init_maple_realmode();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES)
+       /* For iSeries - hit Ctrl-x Ctrl-x to see the output */
+       udbg_init_iseries();
+#endif
+}
+
 /* udbg library, used by xmon et al */
 void udbg_puts(const char *s)
 {
 
        }
 }
 
-void udbg_init_maple_realmode(void)
+void __init udbg_init_maple_realmode(void)
 {
        udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
 
 
                udbg_real_scc_putc('\r');
 }
 
-void udbg_init_pmac_realmode(void)
+void __init udbg_init_pmac_realmode(void)
 {
        sccc = (volatile u8 __iomem *)0x80013020ul;
        sccd = (volatile u8 __iomem *)0x80013030ul;
 
 extern void enter_rtas(unsigned long);
 extern int rtas_token(const char *service);
 extern int rtas_call(int token, int, int, int *, ...);
-extern void call_rtas_display_status(unsigned char);
 extern void rtas_restart(char *cmd);
 extern void rtas_power_off(void);
 extern void rtas_halt(void);
 
 /*
- * c 2001 PPC 64 Team, IBM Corp
+ * (c) 2001, 2006 IBM Corporation.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 extern int udbg_adb_init(int force_btext);
 extern void udbg_adb_init_early(void);
 
+extern void __init udbg_early_init(void);
+extern void __init udbg_init_debug_lpar(void);
+extern void __init udbg_init_pmac_realmode(void);
+extern void __init udbg_init_maple_realmode(void);
+extern void __init udbg_init_iseries(void);
+extern void __init udbg_init_rtas(void);
+
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_UDBG_H */