/*
 * (C) Copyright 2006
 * Mindspeed Technologies, Inc. <www.mindspeed.com>
 *
 * 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 <asm/mach-types.h>
#include <asm/arch/bsp.h>
#include <asm/hardware.h>
#include <spi.h>

DECLARE_GLOBAL_DATA_PTR;

#if (CONFIG_COMMANDS & CFG_CMD_SPI) || defined(CONFIG_SPI)
extern void spi_hw_init(void);
#endif

/* Initialize SDRAM, ARM and bus CLOCK and instruction cache */
void bsp_init(void)
{
	struct cs_cfg cfg = {
		.memtype = CS_MEMTYPE_SDRAM,
		.baseaddr = PHYS_SDRAM,
		.size = PHYS_SDRAM_SIZE,

		.tras = 0x6,
		.trc = 0x9,
		.trcd = 0x3,
		.trp = 0x3,
		.cl = 0x3,

		.memchip_dtype = 0x1,
		.twr = 0x2,
		.buswidth = 0x1,
		.tmrd = 0x2,
		.trrd = 0x2,

		.refcnt = 0x0408,
		.pwroncnt = 0x0042,
	};

	SoC_pll_cfg(CLK_MODE_SYNC, 2 * CFG_HZ_CLOCK, 0);
	SoC_cs_cfg(EXP_CSSD0, CS_ENABLE, &cfg);

	icache_enable();
}

static void exp_csp0_init (void)
{
	struct cs_cfg cfg = {
		.memtype = CS_MEMTYPE_SRAM,
		.buswidth = CS_BUSWIDTH_8BIT,
		.level = CS_ACTIVE_LOW,
		.cmdwidth = 0x9,
		.addrsetup = 0x5,
		.dqm_mode = CS_DQMMODE_NORMAL,
	};

	SoC_cs_cfg(EXP_CSP0, CS_ENABLE, &cfg);
}


static void nand_hw_init(void)
{
	SoC_gpio_cfg(CFG_NAND_BR_GPIO, GPIO_TYPE_INPUT);
	SoC_gpio_cfg(CFG_NAND_CE_GPIO, GPIO_TYPE_OUTPUT);
	SoC_gpio_cfg(CFG_NAND_CLE_GPIO, GPIO_TYPE_OUTPUT);
	SoC_gpio_cfg(CFG_NAND_ALE_GPIO, GPIO_TYPE_OUTPUT);
}

static void nor_hw_init(void)
{
	struct cs_cfg cfg = {
		.memtype = CS_MEMTYPE_SRAM,

		.baseaddr = PHYS_FLASH2,
		.size = 8 * 1024 * 1024,

		.buswidth = CS_BUSWIDTH_16BIT,
		.level = CS_ACTIVE_LOW,
		.cmdwidth = 0x9,
		.addrsetup = 0x7,
		.dqm_mode = CS_DQMMODE_NORMAL,
	};

	SoC_cs_cfg(EXP_CSSD1, CS_ENABLE, &cfg);

	SoC_ioctrl_cfg(IOCTRL_EXPA21_A22, 1);
}

static void eeprom_hw_init(void)
{
#if 0
	struct cs_cfg cfg = {
		.memtype = CS_MEMTYPE_SRAM,
		.bus_width = CS_BUSWIDTH_8BIT,
		.level = CS_ACTIVE_LOW,
		.cmd_width = 0x5,
		.addr_setup = 0x4,
		.dqm_mode = CS_DQMMODE_NORMAL,
	};

	SoC_cs_cfg(EXP_CSBOOT, CS_ENABLE, &cfg);
#endif
}

extern spi_chipsel_type spi_chipsel[];

static void ethswitch_init(void)
{
	uchar dout[3];
	int rc;

	*(volatile u8 *)CPLD_RESET_CTRL &= ~ESWITCH_OUT_OF_RESET;	/* reset ESwitch */
	*(volatile u8 *)CPLD_INTMASK |= ESWITCH_IRQMASK;
	*(volatile u8 *)CPLD_RESET_CTRL |= ESWITCH_OUT_OF_RESET;	/* Take ESwitch out of reset */

	spi_hw_init();

	/* initialize the SPI write buffer */
	dout[0] = 0x02;				/* Eswitch write command */
	dout[1] = 1;				/* address */
	dout[2] = 1;				/* value */
	
	rc = spi_xfer(spi_chipsel[2], 24, dout, NULL);
	if (rc)
		printf(" ethswitch_init: can't initialize the SPI bus \n", rc);
}


int board_init(void)
{
	/* arch number of Mindspeed Comcerto */
	gd->bd->bi_arch_number = MACH_TYPE_M825XX;

	/* adress of boot parameters */
	gd->bd->bi_boot_params = LINUX_BOOTPARAM_ADDR;

	/* CPLD, FPGA and NAND chip select */
	exp_csp0_init();

	nand_hw_init();
	nor_hw_init();
	eeprom_hw_init();
	ethswitch_init();

	return 0;
}

int dram_init(void)
{
	gd->bd->bi_dram[0].start = PHYS_SDRAM;
	gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;

	return 0;
}

extern void partition_flash(void);

int misc_init_r(void)
{
	return 0;
}

#ifdef BOARD_LATE_INIT
int board_late_init(void)
{
	printf("Reserve MSP memory\n");
	gd->bd->bi_dram[0].start += MSP_BOTTOM_MEMORY_RESERVED_SIZE;
	gd->bd->bi_dram[0].size -= MSP_BOTTOM_MEMORY_RESERVED_SIZE + MSP_TOP_MEMORY_RESERVED_SIZE;
	return 0;
}
#endif
