/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (c) 2014 Finn Thain
 */

#include <linux/kernel.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/string.h>
#include <asm/setup.h>

extern void mvme16x_cons_write(struct console *co,
			       const char *str, unsigned count);

asmlinkage void __init debug_cons_nputs(const char *s, unsigned n);

static void __ref debug_cons_write(struct console *c,
				   const char *s, unsigned n)
{
#if !(defined(CONFIG_SUN3)   || defined(CONFIG_M68360) || \
      defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE))
	if (MACH_IS_MVME16x)
		mvme16x_cons_write(c, s, n);
	else
		debug_cons_nputs(s, n);
#endif
}

static struct console early_console_instance = {
	.name  = "debug",
	.write = debug_cons_write,
	.flags = CON_PRINTBUFFER | CON_BOOT,
	.index = -1
};

static int __init setup_early_printk(char *buf)
{
	if (early_console || buf)
		return 0;

	early_console = &early_console_instance;
	register_console(early_console);

	return 0;
}
early_param("earlyprintk", setup_early_printk);

/*
 * debug_cons_nputs() defined in arch/m68k/kernel/head.S cannot be called
 * after init sections are discarded (for platforms that use it).
 */
#if !(defined(CONFIG_SUN3)   || defined(CONFIG_M68360) || \
      defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE))

static int __init unregister_early_console(void)
{
	if (!early_console || MACH_IS_MVME16x)
		return 0;

	return unregister_console(early_console);
}
late_initcall(unregister_early_console);

#endif
