
/*
 * Copyright Codito Technologies (www.codito.com)
 *
 * cpu/arc/serial.c
 *
 *  Copyright (C)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Authors : Sandeep Patil (sandeep.patil@codito.com)
 *           Pradeep Sawlani (pradeep.sawlani@codito.com)
 */

#include <common.h>
#include <asm/serial.h>

volatile arc_uart *uart = (arc_uart *) UART_BASEADDR;

/*
 * Sets baudarate
 */
void serial_setbrg (void)
{
	DECLARE_GLOBAL_DATA_PTR;

	int arc_console_baud = gd->cpu_clk/(gd->baudrate*4) - 1;
	uart->baudl = arc_console_baud & 0xff;
	uart->baudh = (arc_console_baud & 0xff00) >> 8;
}

/*
 * Intialise the serial port with given baudrate
 */
int serial_init (void)
{
	serial_setbrg ();
	return 0;
}

/*
 * Output a single byte to the serial port.
 */
void serial_putc (const char c)
{
	if (c == '\n')
		serial_putc('\r');
	/* Wait till dataTx register is empty */
	while (!(uart->status & UART_TXEMPTY));
	uart->data = c;
}

/*
 * Read a single byte from the serial port. Returns 1 on success, 0
 * otherwise 0.
 */
int serial_tstc (void)
{
	return !(uart->status & UART_RXEMPTY);
}

/*
 * Read a single byte from the serial port.
 */
int serial_getc (void)
{
	unsigned char ch;

	/* Wait till character is placed in fifo */
	while (uart->status & UART_RXEMPTY);

	/* Also check for overflow errors */
	if (uart->status & UART_OVERFLOW_ERR)
		return 0;

	ch = uart->data & 0x00ff;
	return ((int)ch);
}

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

