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

   This software file (the "File") is owned and distributed by Marvell
   International Ltd. and/or its affiliates ("Marvell") under the following
   alternative licensing terms.  Once you have made an election to distribute the
   File under one of the following license alternatives, please (i) delete this
   introductory statement regarding license alternatives, (ii) delete the two
   license alternatives that you have not elected to use and (iii) preserve the
   Marvell copyright notice above.

********************************************************************************
   Marvell Commercial License Option

   If you received this File from Marvell and you have entered into a commercial
   license agreement (a "Commercial License") with Marvell, the File is licensed
   to you under the terms of the applicable Commercial License.

********************************************************************************
   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.
********************************************************************************
   Marvell BSD License Option

   If you received this File from Marvell, you may opt to use, redistribute and/or
   modify this File under the following licensing terms.
   Redistribution and use in source and binary forms, with or without modification,
   are permitted provided that the following conditions are met:

*   Redistributions of source code must retain the above copyright notice,
	this list of conditions and the following disclaimer.

*   Redistributions in binary form must reproduce the above copyright
	notice, this list of conditions and the following disclaimer in the
	documentation and/or other materials provided with the distribution.

*   Neither the name of Marvell nor the names of its contributors may be
	used to endorse or promote products derived from this software without
	specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*******************************************************************************/
#include "mvCommon.h"
#include "boardEnv/mvBoardEnvLib.h"
#include "boardEnv/mvBoardEnvSpec.h"
#include "twsi/mvTwsi.h"
#include "pex/mvPexRegs.h"

/***************************************** Customer Boards *****************************************/
/*******************************************************************************
 * A39x Customer Board 0 - Based on RD
 *******************************************************************************/
#define A39X_CUSTOMER_BOARD_0_NAND_READ_PARAMS		0x000C0282
#define A39X_CUSTOMER_BOARD_0_NAND_WRITE_PARAMS		0x00010305
/*NAND care support for small page chips*/
#define A39X_CUSTOMER_BOARD_0_NAND_CONTROL		0x01c00543

#define A39X_CUSTOMER_BOARD_0_NOR_READ_PARAMS		0x403E07CF
#define A39X_CUSTOMER_BOARD_0_NOR_WRITE_PARAMS		0x000F0F0F
MV_BOARD_TWSI_INFO armada_39x_customer_0_BoardTwsiDev[] = {
	/* {{MV_BOARD_DEV_CLASS devClass, MV_U8 devClassId,  MV_U8 twsiDevAddr, MV_U8 twsiDevAddrType}} */
	{ BOARD_DEV_TWSI_SATR,	0,	0x50, ADDR7_BIT, MV_TRUE},  /* read only for HW configuration */
	{ BOARD_DEV_TWSI_SATR,	1,	0x4C, ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_IO_EXPANDER,	0,	0x20, ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_IO_EXPANDER,	1,	0x21, ADDR7_BIT, MV_FALSE},
};

MV_BOARD_MAC_INFO armada_39x_customer_0_BoardMacInfo[] = {
	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_8 boardEthSmiAddr, MV_8
	 * boardEthSmiAddr0, MV_PHY_PORT_TYPE portType, MV_BOOL boardMacEnabled;}} */
	{ BOARD_MAC_SPEED_AUTO, 0x0, 0x0, XSMI, MV_TRUE},
	{ BOARD_MAC_SPEED_AUTO, 0x5, 0x5, SMI, MV_TRUE},
	{ BOARD_MAC_SPEED_AUTO, 0x4, 0x4, SMI, MV_TRUE},
	{ BOARD_MAC_SPEED_AUTO, 0x0, 0x0, XSMI, MV_TRUE}
};

MV_BOARD_NET_COMPLEX_INFO armada_39x_customer_0_InfoBoardNetComplexInfo[] = {
	{
		.netComplexOpt = MV_NETCOMP_GE_MAC1_2_SGMII_L1 |
			MV_NETCOMP_GE_MAC2_2_SGMII_L3 |
			MV_NETCOMP_GE_MAC0_2_RXAUI,
	}
};

MV_DEV_CS_INFO armada_39x_customer_0_BoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
	{ DEVICE_CS0,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
	{ DEVICE_CS1,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
	{ DEVICE_CS2,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
	{ DEVICE_CS3,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
	{ DEV_BOOCS,	N_A, BOARD_DEV_NOR_FLASH,	16,	16,	0,	MV_FALSE },	/* NOR DEV */
	{ SPI0_CS0,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
	{ SPI0_CS1,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
	{ SPI0_CS2,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
	{ SPI0_CS3,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
	{ SPI1_CS0,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_TRUE },	/* SPI1 DEV */
	{ SPI1_CS1,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE },	/* SPI1 DEV */
	{ SPI1_CS2,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE },	/* SPI1 DEV */
	{ SPI1_CS3,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE }	/* SPI1 DEV */
};

MV_BOARD_USB_INFO armada_39x_customer_0_BoardUsbInfo[] = {
/* {MV_UNIT_ID usbType, MV_U8 usbPortNum, MV_BOOL isActive} */
	{ USB3_UNIT_ID, 0, MV_FALSE},
	{ USB3_UNIT_ID, 1, MV_TRUE},
	{ USB_UNIT_ID,  0, MV_FALSE},
};


MV_BOARD_MPP_INFO armada_39x_customer_0_BoardMppConfigValue[] = {
	{ {
		A39X_CUSTOMER_BOARD_0_MPP0_7,
		A39X_CUSTOMER_BOARD_0_MPP8_15,
		A39X_CUSTOMER_BOARD_0_MPP16_23,
		A39X_CUSTOMER_BOARD_0_MPP24_31,
		A39X_CUSTOMER_BOARD_0_MPP32_39,
		A39X_CUSTOMER_BOARD_0_MPP40_47,
		A39X_CUSTOMER_BOARD_0_MPP48_55,
		A39X_CUSTOMER_BOARD_0_MPP56_63,
	} }
};

/* gpp_callback is a generic place holder routine for special GPIO pull-up/sown sequence
 * this routine is called as the final step of mvBoardEnvInit flow
 * for example see implementation for SolidRun's clearFog board: A38x_CLEARFOG_BOARD_gpp_callback*/
void A39x_CUSTOMER_BOARD_0_gpp_callback(MV_BOARD_INFO *board) {

	/* implement special GPIO/MPP post configuration here */
}

MV_BOARD_INFO armada_39x_customer_board_0_info = {
	.boardName			= "A39x-Customer-Board-0",
	.numBoardNetComplexValue	= ARRSZ(armada_39x_customer_0_InfoBoardNetComplexInfo),
	.pBoardNetComplexInfo		= armada_39x_customer_0_InfoBoardNetComplexInfo,
	.pBoardMppConfigValue		= armada_39x_customer_0_BoardMppConfigValue,
	.intsGppMaskLow			= 0,
	.intsGppMaskMid			= 0,
	.intsGppMaskHigh		= 0,
	.numBoardDeviceIf		= ARRSZ(armada_39x_customer_0_BoardDeCsInfo),
	.pDevCsInfo			= armada_39x_customer_0_BoardDeCsInfo,
	.numBoardTwsiDev		= ARRSZ(armada_39x_customer_0_BoardTwsiDev),
	.pBoardTwsiDev			= armada_39x_customer_0_BoardTwsiDev,
	.numBoardMacInfo		= ARRSZ(armada_39x_customer_0_BoardMacInfo),
	.pBoardMacInfo			= armada_39x_customer_0_BoardMacInfo,
	.numBoardGppInfo		= 0,
	.pBoardGppInfo			= 0,
	.activeLedsNumber		= 0,
	.pLedGppPin			= NULL,
	.ledsPolarity			= 0,

	/* PMU Power */
	.pmuPwrUpPolarity		= 0,
	.pmuPwrUpDelay			= 80000,

	/* GPP values */
	.gppOutEnValLow			= A39X_CUSTOMER_BOARD_0_GPP_OUT_ENA_LOW,
	.gppOutEnValMid			= A39X_CUSTOMER_BOARD_0_GPP_OUT_ENA_MID,
	.gppOutValLow			= A39X_CUSTOMER_BOARD_0_GPP_OUT_VAL_LOW,
	.gppOutValMid			= A39X_CUSTOMER_BOARD_0_GPP_OUT_VAL_MID,
	.gppPolarityValLow		= A39X_CUSTOMER_BOARD_0_GPP_POL_LOW,
	.gppPolarityValMid		= A39X_CUSTOMER_BOARD_0_GPP_POL_MID,
	.gppPostConfigCallBack		= A39x_CUSTOMER_BOARD_0_gpp_callback,

	.pBoardUsbInfo		= armada_39x_customer_0_BoardUsbInfo,
	.numBoardUsbInfo	= ARRSZ(armada_39x_customer_0_BoardUsbInfo),
	/* TDM */
	.numBoardTdmInfo		= {},
	.pBoardTdmInt2CsInfo		= {},
	.boardTdmInfoIndex		= -1,

	.pBoardSpecInit			= NULL,

	/* NAND init params */
	.nandFlashReadParams		= A39X_CUSTOMER_BOARD_0_NAND_READ_PARAMS,
	.nandFlashWriteParams		= A39X_CUSTOMER_BOARD_0_NAND_WRITE_PARAMS,
	.nandFlashControl		= A39X_CUSTOMER_BOARD_0_NAND_CONTROL,
	.nandIfMode				= NAND_IF_NFC,
	/* NOR init params */
	.norFlashReadParams		= A39X_CUSTOMER_BOARD_0_NOR_READ_PARAMS,
	.norFlashWriteParams		= A39X_CUSTOMER_BOARD_0_NOR_WRITE_PARAMS,
	/* Enable modules auto-detection. */
	.configAutoDetect		= MV_FALSE,
	.numIoExp			= 0,
	.pIoExp				= NULL,
	.boardOptionsModule		= MV_MODULE_NO_MODULE,
	.pSwitchInfo			= NULL,
	.switchInfoNum			= 0
};

/*
 * All supported 390 boards
 */
MV_BOARD_INFO *customerBoardInfoTbl[] = {
	&armada_39x_customer_board_0_info,
	&armada_39x_customer_board_0_info
};


/***************************************** Marvell Boards *****************************************/

/*******************************************************************************
 * 39x DB-88F6660 board */
/*******************************************************************************/
#define DB_88F69XX_BOARD_NAND_READ_PARAMS	0x000C0282
#define DB_88F69XX_BOARD_NAND_WRITE_PARAMS	0x00010305
/*NAND care support for small page chips*/
#define DB_88F69XX_BOARD_NAND_CONTROL		0x01c00543

#define DB_88F69XX_BOARD_NOR_READ_PARAMS	0x403E07CF
#define DB_88F69XX_BOARD_NOR_WRITE_PARAMS	0x000F0F0F

MV_BOARD_MPP_INFO db88f69xxInfoBoardMppConfigValue[] = {
	{ {
		  DB_88F69XX_MPP0_7,
		  DB_88F69XX_MPP8_15,
		  DB_88F69XX_MPP16_23,
		  DB_88F69XX_MPP24_31,
		  DB_88F69XX_MPP32_39,
		  DB_88F69XX_MPP40_47,
		  DB_88F69XX_MPP48_55,
		  DB_88F69XX_MPP56_63
	 } }
};

MV_BOARD_TWSI_INFO db88f69xxInfoBoardTwsiDev[] = {
	/* {{devClass,		devClassId, twsiDevAddr, twsiDevAddrType, moreThen256}} */
	{ BOARD_DEV_TWSI_SATR,		0,	0x50,	   ADDR7_BIT, MV_TRUE},  /* read only for HW configuration */
	{ BOARD_DEV_TWSI_SATR,		1,	0x4c,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_DEV_TWSI_SATR,		2,	0x4d,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_DEV_TWSI_SATR,		3,	0x4e,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_DEV_TWSI_SATR,		4,	0x21,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_MODULE_DETECT,	0,	0x20,	   ADDR7_BIT, MV_FALSE},   /* modules */
	{ BOARD_TWSI_MODULE_DETECT,	1,	0x23,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_MODULE_DETECT,	2,	0x24,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_MODULE_DETECT,	3,	0x25,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_MODULE_DETECT,	4,	0x26,	   ADDR7_BIT, MV_FALSE},
	{ BOARD_TWSI_MODULE_DETECT,	5,	0x27,	   ADDR7_BIT, MV_FALSE},
};

MV_BOARD_MAC_INFO db88f69xxInfoBoardMacInfo[] = {
	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_8 boardEthSmiAddr, MV_8
	 * boardEthSmiAddr0, MV_PHY_PORT_TYPE portType, MV_BOOL boardMacEnabled;}} */
	{ BOARD_MAC_SPEED_AUTO, 0x0, 0x0, XSMI, MV_TRUE},
	{ BOARD_MAC_SPEED_AUTO, 0x5, 0x5, SMI, MV_TRUE},
	{ BOARD_MAC_SPEED_AUTO, 0x4, 0x4, SMI, MV_TRUE},
	{ BOARD_MAC_SPEED_AUTO, 0x0, 0x0, XSMI, MV_TRUE}
};

MV_BOARD_NET_COMPLEX_INFO db88f69xxInfoBoarNetComplexInfo[] = {
	{
		.netComplexOpt = MV_NETCOMP_GE_MAC1_2_SGMII_L1 |
			MV_NETCOMP_GE_MAC2_2_SGMII_L3 |
			MV_NETCOMP_GE_MAC0_2_RXAUI,
	}
};

MV_BOARD_USB_INFO db88f69xxInfoBoardUsbInfo[] = {
/* {MV_UNIT_ID usbType, MV_U8 usbPortNum, MV_BOOL isActive} */
	{ USB3_UNIT_ID, 0, MV_FALSE},
	{ USB3_UNIT_ID, 1, MV_TRUE},
	{ USB_UNIT_ID,  0, MV_FALSE},
};

MV_DEV_CS_INFO db88f69xxInfoBoardDeCsInfo[] = {
	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
	{ DEVICE_CS0,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
	{ DEV_BOOCS,	N_A, BOARD_DEV_NOR_FLASH,	16,	16,	0,	MV_FALSE },	/* NOR DEV */
	{ SPI1_CS0,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_TRUE },	/* SPI1 DEV */
	{ SPI1_CS1,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE }	/* SPI1 DEV */
};

MV_BOARD_TDM_INFO db88f69xxTdm880[] = { {0} };

MV_BOARD_TDM_SPI_INFO db88f69xxTdmSpiInfo[] = { {1} };

MV_BOARD_INFO db88f69xx_board_info = {
	.boardName		= "DB-88F6920-BP",
	.numBoardNetComplexValue = ARRSZ(db88f69xxInfoBoarNetComplexInfo),
	.pBoardNetComplexInfo	= db88f69xxInfoBoarNetComplexInfo,
	.pBoardMppConfigValue	= db88f69xxInfoBoardMppConfigValue,
	.intsGppMaskLow		= 0,
	.intsGppMaskMid		= 0,
	.intsGppMaskHigh	= 0,
	.numBoardDeviceIf	= ARRSZ(db88f69xxInfoBoardDeCsInfo),
	.pDevCsInfo		= db88f69xxInfoBoardDeCsInfo,
	.numBoardTwsiDev	= ARRSZ(db88f69xxInfoBoardTwsiDev),
	.pBoardTwsiDev		= db88f69xxInfoBoardTwsiDev,
	.numBoardMacInfo	= ARRSZ(db88f69xxInfoBoardMacInfo),
	.pBoardMacInfo		= db88f69xxInfoBoardMacInfo,
	.numBoardGppInfo	= 0,
	.pBoardGppInfo		= 0,
	.activeLedsNumber	= 0,
	.pLedGppPin		= NULL,
	.ledsPolarity		= 0,

	/* PMU Power */
	.pmuPwrUpPolarity	= 0,
	.pmuPwrUpDelay		= 80000,

	/* GPP values */
	.gppOutEnValLow		= DB_88F69XX_GPP_OUT_ENA_LOW,
	.gppOutEnValMid		= DB_88F69XX_GPP_OUT_ENA_MID,
	.gppOutValLow		= DB_88F69XX_GPP_OUT_VAL_LOW,
	.gppOutValMid		= DB_88F69XX_GPP_OUT_VAL_MID,
	.gppPolarityValLow	= DB_88F69XX_GPP_POL_LOW,
	.gppPolarityValMid	= DB_88F69XX_GPP_POL_MID,

	.pBoardUsbInfo		= db88f69xxInfoBoardUsbInfo,
	.numBoardUsbInfo	= ARRSZ(db88f69xxInfoBoardUsbInfo),

	/* TDM */
	.numBoardTdmInfo		= {1},
	.pBoardTdmInt2CsInfo		= {db88f69xxTdm880},
	.boardTdmInfoIndex		= 0,

	.pBoardSpecInit			= NULL,

	/* NAND init params */
	.nandFlashReadParams		= DB_88F69XX_BOARD_NAND_READ_PARAMS,
	.nandFlashWriteParams		= DB_88F69XX_BOARD_NAND_WRITE_PARAMS,
	.nandFlashControl		= DB_88F69XX_BOARD_NAND_CONTROL,
	.nandIfMode				= NAND_IF_NFC,

	.pBoardTdmSpiInfo		= db88f69xxTdmSpiInfo,

	/* NOR init params */
	.norFlashReadParams		= DB_88F69XX_BOARD_NOR_READ_PARAMS,
	.norFlashWriteParams		= DB_88F69XX_BOARD_NOR_WRITE_PARAMS,

	/* Enable modules auto-detection. */
	.configAutoDetect		= MV_TRUE,
	.numIoExp			= 0,
	.pIoExp				= NULL,
	.boardOptionsModule		= MV_MODULE_NO_MODULE,
	/* Audio */
	.isAudioConnected		= MV_FALSE,
	.isTdmConnected			= MV_FALSE,
	.pSwitchInfo			= NULL,
	.switchInfoNum			= 0
};

MV_BOARD_INFO *marvellBoardInfoTbl[] = {
	&db88f69xx_board_info,
	&db88f69xx_board_info,
};
