1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (c) 2014 Finn Thain 7 */ 8 9 #include <linux/kernel.h> 10 #include <linux/console.h> 11 #include <linux/init.h> 12 #include <linux/string.h> 13 #include <asm/setup.h> 14 15 asmlinkage void __init debug_cons_nputs(const char *s, unsigned n); 16 17 static void debug_cons_write(struct console *c, 18 const char *s, unsigned n) 19 { 20 debug_cons_nputs(s, n); 21 } 22 23 static struct console early_console_instance = { 24 .name = "debug", 25 .write = debug_cons_write, 26 .flags = CON_PRINTBUFFER | CON_BOOT, 27 .index = -1 28 }; 29 30 static int __init setup_early_printk(char *buf) 31 { 32 /* MVME16x registers an early console after interrupt setup. */ 33 if (MACH_IS_MVME16x) 34 return 0; 35 36 if (early_console || buf) 37 return 0; 38 39 early_console = &early_console_instance; 40 register_console(early_console); 41 42 return 0; 43 } 44 early_param("earlyprintk", setup_early_printk); 45 46 /* 47 * debug_cons_nputs() defined in arch/m68k/kernel/head.S cannot be called 48 * after init sections are discarded (for platforms that use it). 49 */ 50 #if !(defined(CONFIG_SUN3) || defined(CONFIG_M68360) || \ 51 defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)) 52 53 static int __init unregister_early_console(void) 54 { 55 if (!early_console) 56 return 0; 57 58 return unregister_console(early_console); 59 } 60 late_initcall(unregister_early_console); 61 62 #endif 63