/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.

*******************************************************************************/

/*
 * serial.c - serial support.
 */

#include <common.h>
#include <command.h>
#include "mvCommon.h"
#include "uart/mvUart.h"
#include "cpu/mvCpu.h"
#include <serial.h>
#include "boardEnv/mvBoardEnvLib.h"

extern unsigned int whoAmI(void);

extern void print_mvBanner(void);

/* mvUartPortGet:
 * This routine can be overriden at board environment code.
 * required in case that UART port number is not aligned with CPU number. (e.g : CPU0 uses UART1)
 */
__weak MV_U32 mvUartPortGet(void)
{
#ifdef CONFIG_AMP_SUPPORT
	return whoAmI();
#else
	return CONFIG_SYS_DUART_CHAN;
#endif
}

int mv_serial_init (void)
{
	DECLARE_GLOBAL_DATA_PTR;

	int clock_divisor = (CONFIG_SYS_TCLK / 16)/gd->baudrate;

	/* muti-core support, initiate each Uart to each cpu */
	mvUartInit(whoAmI(), clock_divisor, mvUartBase(mvUartPortGet()));

	console_init_f();

#if !defined(DB_78X60_PCAC) && !defined(DB_78X60_PCAC_REV2)
	/* print banner */
	print_mvBanner();
#endif

	return (0);
}

void mv_serial_putc(const char c)
{
	if (c == '\n')

	mvUartPutc(mvUartPortGet(), '\r');
	mvUartPutc(mvUartPortGet(), c);
}

int mv_serial_getc(void)
{
	return mvUartGetc(mvUartPortGet());
}

int mv_serial_tstc(void)
{
	return mvUartTstc(mvUartPortGet());
}

void mv_serial_setbrg (void)
{
	DECLARE_GLOBAL_DATA_PTR;
	int clock_divisor = (CONFIG_SYS_TCLK / 16)/gd->baudrate;

	/* muti-core support, initiate each Uart to each cpu */
	mvUartInit(whoAmI(), clock_divisor, mvUartBase(mvUartPortGet()));
}

void mv_serial_puts (const char *s)
{
	while (*s) {
		serial_putc (*s++);
	}
}

#if defined(CONFIG_CMD_KGDB)
void kgdb_serial_init(void){}

void putDebugChar (int c)
{
	serial_putc (c);
}

void putDebugStr (const char *str)
{
	serial_puts (str);
}

int getDebugChar (void)
{
	return serial_getc();
}

void kgdb_interruptible (int yes)
{
	return;
}
#endif	/* CFG_CMD_KGDB	*/

static struct serial_device mv_serial_drv = {
	.name	= "mv_serial",
	.start	= mv_serial_init,
	.stop	= NULL,
	.setbrg	= mv_serial_setbrg,
	.putc	= mv_serial_putc,
	.puts	= default_serial_puts,
	.getc	= mv_serial_getc,
	.tstc	= mv_serial_tstc,
};

void mv_serial_initialize(void)
{
	serial_register(&mv_serial_drv);
}

__weak struct serial_device *default_serial_console(void)
{
	return &mv_serial_drv;
}
