17913ad1aSFinn Thain /*
27913ad1aSFinn Thain * This file is subject to the terms and conditions of the GNU General Public
37913ad1aSFinn Thain * License. See the file "COPYING" in the main directory of this archive
47913ad1aSFinn Thain * for more details.
57913ad1aSFinn Thain *
67913ad1aSFinn Thain * Copyright (c) 2014 Finn Thain
77913ad1aSFinn Thain */
87913ad1aSFinn Thain
97913ad1aSFinn Thain #include <linux/kernel.h>
107913ad1aSFinn Thain #include <linux/console.h>
117913ad1aSFinn Thain #include <linux/init.h>
127913ad1aSFinn Thain #include <linux/string.h>
137913ad1aSFinn Thain #include <asm/setup.h>
147913ad1aSFinn Thain
156395a5f9SGeert Uytterhoeven
16*d4e05e95SDaniel Palmer #include "../mvme147/mvme147.h"
176395a5f9SGeert Uytterhoeven #include "../mvme16x/mvme16x.h"
18c46f46d0SFinn Thain
197913ad1aSFinn Thain asmlinkage void __init debug_cons_nputs(const char *s, unsigned n);
207913ad1aSFinn Thain
debug_cons_write(struct console * c,const char * s,unsigned n)21c46f46d0SFinn Thain static void __ref debug_cons_write(struct console *c,
227913ad1aSFinn Thain const char *s, unsigned n)
237913ad1aSFinn Thain {
24a3595962SGreg Ungerer #if !(defined(CONFIG_SUN3) || defined(CONFIG_M68000) || \
25a3595962SGreg Ungerer defined(CONFIG_COLDFIRE))
26*d4e05e95SDaniel Palmer if (MACH_IS_MVME147)
27*d4e05e95SDaniel Palmer mvme147_scc_write(c, s, n);
28*d4e05e95SDaniel Palmer else if (MACH_IS_MVME16x)
29c46f46d0SFinn Thain mvme16x_cons_write(c, s, n);
30c46f46d0SFinn Thain else
317913ad1aSFinn Thain debug_cons_nputs(s, n);
32c46f46d0SFinn Thain #endif
337913ad1aSFinn Thain }
347913ad1aSFinn Thain
357913ad1aSFinn Thain static struct console early_console_instance = {
367913ad1aSFinn Thain .name = "debug",
377913ad1aSFinn Thain .write = debug_cons_write,
387913ad1aSFinn Thain .flags = CON_PRINTBUFFER | CON_BOOT,
397913ad1aSFinn Thain .index = -1
407913ad1aSFinn Thain };
417913ad1aSFinn Thain
setup_early_printk(char * buf)427913ad1aSFinn Thain static int __init setup_early_printk(char *buf)
437913ad1aSFinn Thain {
447913ad1aSFinn Thain if (early_console || buf)
457913ad1aSFinn Thain return 0;
467913ad1aSFinn Thain
477913ad1aSFinn Thain early_console = &early_console_instance;
487913ad1aSFinn Thain register_console(early_console);
497913ad1aSFinn Thain
507913ad1aSFinn Thain return 0;
517913ad1aSFinn Thain }
527913ad1aSFinn Thain early_param("earlyprintk", setup_early_printk);
537913ad1aSFinn Thain
547913ad1aSFinn Thain /*
557913ad1aSFinn Thain * debug_cons_nputs() defined in arch/m68k/kernel/head.S cannot be called
567913ad1aSFinn Thain * after init sections are discarded (for platforms that use it).
577913ad1aSFinn Thain */
58a3595962SGreg Ungerer #if !(defined(CONFIG_SUN3) || defined(CONFIG_M68000) || \
59a3595962SGreg Ungerer defined(CONFIG_COLDFIRE))
607913ad1aSFinn Thain
unregister_early_console(void)617913ad1aSFinn Thain static int __init unregister_early_console(void)
627913ad1aSFinn Thain {
63c46f46d0SFinn Thain if (!early_console || MACH_IS_MVME16x)
647913ad1aSFinn Thain return 0;
657913ad1aSFinn Thain
667913ad1aSFinn Thain return unregister_console(early_console);
677913ad1aSFinn Thain }
687913ad1aSFinn Thain late_initcall(unregister_early_console);
697913ad1aSFinn Thain
707913ad1aSFinn Thain #endif
71