xref: /openbmc/linux/arch/m68k/kernel/early_printk.c (revision ecc23d0a422a3118fcf6e4f0a46e17a6c2047b02)
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