/*
 * KGDB and progress routines for the Marvell/Galileo MV64x60 (Discovery).
 *
 * Author: Mark A. Greer <mgreer@mvista.com>
 *
 * 2003 (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.
 */

/*
 *****************************************************************************
 *
 *	Low-level MPSC/UART I/O routines
 *
 *****************************************************************************
 */


#include <linux/irq.h>
#include <asm/delay.h>
#include <asm/mv64x60.h>
#include <asm/machdep.h>


#if defined(CONFIG_SERIAL_TEXT_DEBUG)

#define	MPSC_CHR_1	0x000c
#define	MPSC_CHR_2	0x0010

static struct mv64x60_handle	mv64x60_dbg_bh;

void
mv64x60_progress_init(u32 base)
{
	mv64x60_dbg_bh.v_base = base;
	return;
}

static void
mv64x60_polled_putc(int chan, char c)
{
	u32	offset;

	if (chan == 0)
		offset = 0x8000;
	else
		offset = 0x9000;

	mv64x60_write(&mv64x60_dbg_bh, offset + MPSC_CHR_1, (u32)c);
	mv64x60_write(&mv64x60_dbg_bh, offset + MPSC_CHR_2, 0x200);
	udelay(2000);
}

void
mv64x60_mpsc_progress(char *s, unsigned short hex)
{
	volatile char	c;

	mv64x60_polled_putc(0, '\r');

	while ((c = *s++) != 0)
		mv64x60_polled_putc(0, c);

	mv64x60_polled_putc(0, '\n');
	mv64x60_polled_putc(0, '\r');

	return;
}
#endif	/* CONFIG_SERIAL_TEXT_DEBUG */


#if defined(CONFIG_KGDB)

#if defined(CONFIG_KGDB_TTYS0)
#define KGDB_PORT 0
#elif defined(CONFIG_KGDB_TTYS1)
#define KGDB_PORT 1
#else
#error "Invalid kgdb_tty port"
#endif

void
putDebugChar(unsigned char c)
{
	mv64x60_polled_putc(KGDB_PORT, (char)c);
}

int
getDebugChar(void)
{
	unsigned char	c;

	while (!mv64x60_polled_getc(KGDB_PORT, &c));
	return (int)c;
}

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

void
kgdb_interruptible(int enable)
{
}

void
kgdb_map_scc(void)
{
	if (ppc_md.early_serial_map)
		ppc_md.early_serial_map();
}
#endif	/* CONFIG_KGDB */
