/*
 * (C) Copyright 2013 Quantenna Communications Inc.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <common.h>
#include <config.h>
#include <command.h>
#include <linux/ctype.h>
#include <linux/types.h>
#include <asm/types.h>
#include <asm/cache.h>
#include <net.h>
#include <timestamp.h>
#include <asm/io.h>

#include "ruby.h"
#include "board_cfg.h"
#include <shared_defs_common.h>
#include "ruby_board_cfg.h"
#include "ruby_board_db.h"
#include "ruby_version.h"
#include "ruby_mini_common.h"

gd_t *gd;
gd_t *global_data;

int console_assign(int file, char *devname)
{
	return 0;
}

int console_init_f(void)
{
	gd->have_console = 0;
	return 0;
}

int getc(void)
{
	return 0;
}

void putc(char c)
{
	serial_putc(c);
}

void puts(const char *s)
{
	serial_puts(s);
}

void printf(const char *fmt, ...)
{
	va_list args;
	uint __attribute__((unused)) i;
	char printbuffer[256];

	va_start (args, fmt);

	/*
	 * For this to work, printbuffer must be larger than
	 * anything we ever want to print.
	 */
	i = vsprintf (printbuffer, fmt, args);
	va_end (args);

	/* Print the string */
	puts (printbuffer);
}

void vprintf(const char *fmt, va_list args)
{
	uint __attribute__((unused)) i;
	char printbuffer[256];

	/*
	 * For this to work, printbuffer must be larger than
	 * anything we ever want to print.
	 */
	i = vsprintf (printbuffer, fmt, args);

	/* Print the string */
	puts (printbuffer);
}

int ctrlc(void)
{
	return 0;
}

int had_ctrlc(void)
{
	return 0;
}

void print_size (phys_size_t s, const char * c) {}

unsigned long load_addr = RUBY_SRAM_BEGIN;

#if !defined(TOPAZ_EP_MINI_UBOOT) && !defined(TOPAZ_TINY_UBOOT)
/*
 * tftp environment variables (ipaddr, serverip, bootfile) are set dynamically
 * before attempting tftp. They are cleared before attempting bootp. Bootp will
 * not work if ipaddr is set, as the udp receive routines reject packets whose
 * destination address does not match ipaddr
 */
uchar __env[CONFIG_ENV_SIZE] = {
	"ethaddr="	MKSTR(CONFIG_ETHADDR)	"\0"
	"ipaddr="	MKSTR(CONFIG_IPADDR)	"\0"
	"serverip="	MKSTR(CONFIG_SERVERIP)	"\0"
	"bootfile="	MKSTR(CONFIG_BOOTFILE)	"\0"
#if TOPAZ_QFDR_VLAN > 1
	"vlan="		MKSTR(TOPAZ_QFDR_VLAN)	"\0"
#endif
	"\0"
};

static const board_cfg_t mini_board_conf = {
	.bc_emac0       = EMAC0_CONFIG,
	.bc_emac1       = EMAC1_CONFIG,
	.bc_phy0_addr   = EMAC0_PHY_ADDR,
	.bc_phy1_addr   = EMAC1_PHY_ADDR,
	.bc_rgmii_timing = EMAC_RGMII_TIMING,
};

uchar env_get_char (int index)
{
	return __env[index];
}

uchar *env_get_addr (int index)
{
	return &__env[index];
}

void *env_get_file_body(int fileoffset)
{
	return NULL; // there are no config files in minimal environment.
}


void env_crc_update(void) {}
#endif /* TOPAZ_EP_MINI_UBOOT */

void show_boot_progress(int status)
{
}

int cpu_init(void)
{
	/*
	 * disable interrupts. Smaller version with no
	 * return code compared to u-boot full
	 */
	unsigned int status;
	status = read_new_aux_reg(ARC_REG_STATUS32);
	status &= STATUS_DISABLE_INTERRUPTS;
	__asm__ __volatile__ ( "flag %0" : : "r"(status) );

	return 0;
}

static void board_global_data_init(void)
{
	DECLARE_GLOBAL_DATA_PTR;
	gd->cpu_clk = RUBY_FIXED_CPU_CLK;
	gd->bus_clk = RUBY_FIXED_DEV_CLK;
	gd->baudrate = RUBY_SERIAL_BAUD;
	gd->bd->bi_boot_params = 0x0;
}

int board_init(void)
{
	/*
	 * Enable i-cache/d-cache immediately upon jump from start.S
	 */
	#ifndef TOPAZ_ICACHE_WORKAROUND
	icache_enable();
	#endif

	dcache_enable();
	board_global_data_init();
	board_serial_init();
	board_timer_init();
#if defined(TOPAZ_EP_MINI_UBOOT) || defined(TOPAZ_TINY_UBOOT)
	extern void board_spi_flash_init(void);
	board_spi_flash_init();
#endif

#if TOPAZ_QFDR_VLAN > 1
	printf("qfdr manage vlan %u\n",TOPAZ_QFDR_VLAN);
#endif
	return 0;
}

#if !defined(TOPAZ_EP_MINI_UBOOT)
int env_init(void)
{
#if !defined(TOPAZ_TINY_UBOOT)
	gd->env_addr  = (ulong)&__env[0];
	gd->env_valid = 1;
#endif
	return 0;
}
#endif

typedef int (init_fnc_t) (void);
static init_fnc_t *init_sequence[] = {
	cpu_init,		/* cpu specific initialisations*/
	board_init,
	serial_init,            /* serial communications setup */
	env_init,		/* intialise environment */
	console_init_f,         /* stage 1 init of console */
	NULL,
};

void ruby_mini_init(void)
{
	static gd_t gd_data;
	static bd_t bd_data;
	init_fnc_t **init_fnc_ptr;

	gd = global_data = &gd_data;
	gd->bd = &bd_data;
	gd->bd->bi_board_id = 0;

	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
		if ((*init_fnc_ptr)() != 0) {
			hang();
		}
	}
}

void __attribute__ ((noreturn)) hang(void)
{
	board_reset("hang called\n");
}

void cmd_usage(cmd_tbl_t *cmdtp)
{
}

#if !defined(TOPAZ_EP_MINI_UBOOT) && !defined(TOPAZ_TINY_UBOOT)
int board_config(int board_id, int parameter)
{
	int* ptr = (int *)&mini_board_conf;
	return ptr[parameter];
}
#endif

