/*
 * arch/ppc/syslib/mv64x60_dbg.c
 *
 * 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/config.h>
#include <linux/irq.h>
#include <asm/delay.h>
#include <asm/mv64x60.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 */
