/*
 * Generic 16550 kgdb support intended to be useful on a variety
 * of platforms.  To enable this support, it is necessary to set
 * the CONFIG_GEN550 option.  Any virtual mapping of the serial
 * port(s) to be used can be accomplished by setting
 * ppc_md.early_serial_map to a platform-specific mapping function.
 *
 * Adapted from ppc4xx_kgdb.c.
 *
 * Author: Matt Porter <mporter@kernel.crashing.org>
 *
 * 2002-2004 (c) MontaVista Software, Inc.  This file is licensed under
 * the terms of the GNU General Public License version 2.  This program
 * is licensed "as is" without any warranty of any kind, whether express
 * or implied.
 */

#include <linux/types.h>
#include <linux/kernel.h>

#include <asm/machdep.h>

extern unsigned long serial_init(int, void *);
extern unsigned long serial_getc(unsigned long);
extern unsigned long serial_putc(unsigned long, unsigned char);

#if defined(CONFIG_KGDB_TTYS0)
#define KGDB_PORT 0
#elif defined(CONFIG_KGDB_TTYS1)
#define KGDB_PORT 1
#elif defined(CONFIG_KGDB_TTYS2)
#define KGDB_PORT 2
#elif defined(CONFIG_KGDB_TTYS3)
#define KGDB_PORT 3
#else
#error "invalid kgdb_tty port"
#endif

static volatile unsigned int kgdb_debugport;

void putDebugChar(unsigned char c)
{
	if (kgdb_debugport == 0)
		kgdb_debugport = serial_init(KGDB_PORT, NULL);

	serial_putc(kgdb_debugport, c);
}

int getDebugChar(void)
{
	if (kgdb_debugport == 0)
		kgdb_debugport = serial_init(KGDB_PORT, NULL);

	return(serial_getc(kgdb_debugport));
}

void kgdb_interruptible(int enable)
{
	return;
}

void putDebugString(char* str)
{
	while (*str != '\0') {
		putDebugChar(*str);
		str++;
	}
	putDebugChar('\r');
	return;
}

/*
 * Note: gen550_init() must be called already on the port we are going
 * to use.
 */
void
gen550_kgdb_map_scc(void)
{
	printk(KERN_DEBUG "kgdb init\n");
	if (ppc_md.early_serial_map)
		ppc_md.early_serial_map();
	kgdb_debugport = serial_init(KGDB_PORT, NULL);
}
