gflt400: Add boardID and GPIOs

See go/gflt400-gpio-config

Change-Id: I4d2e56a98e4c440936efa5b5bc4780a839cc4e86
diff --git a/Makefile b/Makefile
index 2adc076..305bb9e 100644
--- a/Makefile
+++ b/Makefile
@@ -2693,6 +2693,7 @@
 rd88f6530mdu_config \
 db88f6601bp_config \
 rd88f6601mc_config \
+gflt400_config \
 gflt200_config \
 gflt110_config \
 kw2_test:
@@ -2727,7 +2728,8 @@
 	elif [ "$(findstring gflt200,$(RULE))" ] ; then \
 		echo "#define MV88F6601" > $(obj)include/config.h ;	\
 		echo "  * Configured for MV88F6601"; \
-	elif [ "$(findstring gflt110,$(RULE))" ] ; then \
+	elif [ "$(findstring gflt110,$(RULE))" ] || \
+		[ "$(findstring gflt400,$(RULE))" ]; then \
 		echo "#define MV88F6601" > $(obj)include/config.h ;	\
 		echo "  * Configured for MV88F6601"; \
 	else \
@@ -2811,6 +2813,12 @@
 		echo "#define MV_BOOTROM" >> $(obj)include/config.h ;	\
 		echo "MV_DDR_FREQ=256mb_400mhz_gflt110" >> $(obj)include/config.mk ;\
 		echo "  * Configured for GFLT110"; \
+	elif [ "$(findstring gflt400_config,$(RULE))" ] ; then\
+		echo "#define GFLT400" >> $(obj)include/config.h ;	\
+		echo "#define MV_BOOTSIZE_512K" >> $(obj)include/config.h ; \
+		echo "#define MV_BOOTROM" >> $(obj)include/config.h ;	\
+		echo "MV_DDR_FREQ=256mb_400mhz_gflt110" >> $(obj)include/config.mk ;\
+		echo "  * Configured for GFLT400"; \
 	else \
 		echo "  * Error no board was configured"; \
 	fi;
@@ -2963,7 +2971,8 @@
 
 	@if [ "$(findstring gflt200_config,$(RULE))" ] ; then \
 		echo "#include <configs/gflt200.h>" >> $(obj)include/config.h ; \
-	elif [ "$(findstring gflt110_config,$(RULE))" ] ; then \
+	elif [ "$(findstring gflt110_config,$(RULE))" ] || \
+		[ "$(findstring gflt400_config,$(RULE))" ]; then \
 		echo "#include <configs/gflt110.h>" >> $(obj)include/config.h ; \
 	else \
 		echo "#include <configs/mv_kw2.h>" >> $(obj)include/config.h ; \
diff --git a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.c b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.c
index 91471eb..48f19b4 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.c
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.c
@@ -159,24 +159,24 @@
 	MV_REG_WRITE(GPP_DATA_OUT_REG(0), BOARD_INFO(boardId)->gppOutValLow);
 	MV_REG_WRITE(GPP_DATA_OUT_REG(1), BOARD_INFO(boardId)->gppOutValMid);
 	if ((boardId != DB_88F6601_BP_ID) && (boardId != RD_88F6601_MC_ID)
-		&& (boardId != GFLT300_ID) && (boardId != GFLT200_ID)
-		&& (boardId != GFLT110_ID))
+		&& (boardId != GFLT400_ID) && (boardId != GFLT300_ID)
+		&& (boardId != GFLT200_ID) && (boardId != GFLT110_ID))
 		MV_REG_WRITE(GPP_DATA_OUT_REG(2), BOARD_INFO(boardId)->gppOutValHigh);
 
 	/* set GPP polarity */
 	mvGppPolaritySet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValLow);
 	mvGppPolaritySet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValMid);
 	if ((boardId != DB_88F6601_BP_ID) && (boardId != RD_88F6601_MC_ID)
-		&& (boardId != GFLT300_ID) && (boardId != GFLT200_ID)
-		&& (boardId != GFLT110_ID))
+		&& (boardId != GFLT400_ID) && (boardId != GFLT300_ID)
+		&& (boardId != GFLT200_ID) && (boardId != GFLT110_ID))
 		mvGppPolaritySet(2, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValHigh);
 
 	/* Set GPP Out Enable */
 	mvGppTypeSet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValLow);
 	mvGppTypeSet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValMid);
 	if ((boardId != DB_88F6601_BP_ID) && (boardId != RD_88F6601_MC_ID)
-		&& (boardId != GFLT300_ID) && (boardId != GFLT200_ID)
-		&& (boardId != GFLT110_ID))
+		&& (boardId != GFLT400_ID) && (boardId != GFLT300_ID)
+		&& (boardId != GFLT200_ID) && (boardId != GFLT110_ID))
 		mvGppTypeSet(2, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValHigh);
 
 	/* Nand CE */
@@ -361,8 +361,8 @@
 	}
 
 	if ((RD_88F6601_MC_ID == mvBoardIdGet()) ||
-		(GFLT300_ID == mvBoardIdGet()) || (GFLT200_ID == mvBoardIdGet()) ||
-		(GFLT110_ID == mvBoardIdGet()))
+		(GFLT400_ID == mvBoardIdGet()) || (GFLT300_ID == mvBoardIdGet()) ||
+		(GFLT200_ID == mvBoardIdGet()) || (GFLT110_ID == mvBoardIdGet()))
 		return MV_FALSE;
 
 	if ((ethPortNum > 0) || (ethCompOpt & ESC_OPT_SGMII_2_SW_P1))
@@ -661,8 +661,8 @@
 		return MV_ERROR;
 	}
 	if ((RD_88F6601_MC_ID == boardId) || (DB_88F6601_BP_ID == boardId)
-		|| (GFLT300_ID == boardId) || (GFLT200_ID == boardId)
-		|| (GFLT110_ID == boardId))
+		|| (GFLT400_ID == boardId) || (GFLT300_ID == boardId)
+		|| (GFLT200_ID == boardId) || (GFLT110_ID == boardId))
 	{
 		return 0;
 	}
@@ -1264,8 +1264,8 @@
 
 	tmpTClkRate = MV_REG_READ(MPP_SAMPLE_AT_RESET(0));
 	if ((RD_88F6601_MC_ID == boardId) || (DB_88F6601_BP_ID == boardId)
-		|| (GFLT300_ID == boardId) || (GFLT200_ID == boardId)
-		|| (GFLT110_ID == boardId)) {
+		|| (GFLT400_ID == boardId) || (GFLT300_ID == boardId)
+		|| (GFLT200_ID == boardId) || (GFLT110_ID == boardId)) {
 		tmpTClkRate &= MSAR_TCLCK_6601_MASK;
 		if (tmpTClkRate )
 			return MV_BOARD_TCLK_200MHZ;
@@ -1321,8 +1321,8 @@
 	clockSatr = MSAR_CPU_DDR_L2_CLCK_EXTRACT(sar0);
 	i = 0;
 	if ((RD_88F6601_MC_ID == boardId) || (DB_88F6601_BP_ID == boardId)
-		|| (GFLT300_ID == boardId)  || (GFLT200_ID == boardId)
-		|| (GFLT110_ID == boardId)) {
+		|| (GFLT400_ID == boardId) || (GFLT300_ID == boardId)
+		|| (GFLT200_ID == boardId) || (GFLT110_ID == boardId)) {
 		while (cpuDdrTbl6601[i].satrValue != -1) {
 			if (cpuDdrTbl6601[i].satrValue == clockSatr) {
 				res = i;
@@ -2369,8 +2369,8 @@
 		return MV_FALSE;
 	}
 	if ((RD_88F6601_MC_ID == mvBoardIdGet())
-		|| (GFLT300_ID == mvBoardIdGet()) || (GFLT200_ID == mvBoardIdGet())
-		|| (GFLT110_ID == mvBoardIdGet())) {
+		|| (GFLT400_ID == mvBoardIdGet()) || (GFLT300_ID == mvBoardIdGet())
+		|| (GFLT200_ID == mvBoardIdGet()) || (GFLT110_ID == mvBoardIdGet())) {
 		if (ethPortNum == 0)
 			return MV_TRUE;
 		return MV_FALSE;
@@ -2775,6 +2775,8 @@
 		tmpBoardId = DB_CUSTOMER_ID;
 #elif defined(GFLT200)
 		tmpBoardId = GFLT200_ID;
+#elif defined(GFLT400)
+		tmpBoardId = GFLT400_ID;
 #elif defined(GFLT110)
 		if (MV_REG_READ(MV_GPP_REGS_OFFSET_0 + 0x10 ) & BIT15)
 			tmpBoardId = GFLT110_ID;
diff --git a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.c b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
index ace6787..902a50e 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
@@ -1696,6 +1696,147 @@
 	.moduleAutoDetect = MV_FALSE
 };
 
+/***************************************************************************
+** GFLT400 - Copied from GFLT300
+****************************************************************************/
+
+MV_BOARD_TWSI_INFO gflt400InfoBoardTwsiDev[] = {
+	/* {{MV_BOARD_DEV_CLASS devClass, MV_U8 twsiDevAddr, MV_U8 twsiDevAddrType}} */
+};
+
+MV_BOARD_MAC_INFO gflt400InfoBoardMacInfo[] = {
+	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_U8 boardEthSmiAddr}} */
+	{BOARD_MAC_SPEED_AUTO, 0x0},
+	{BOARD_MAC_SPEED_AUTO, 0x1},
+	{N_A,N_A}
+};
+
+MV_BOARD_MPP_TYPE_INFO gflt400InfoBoardMppTypeInfo[] = {
+	{
+		.boardMppTdm = MV_BOARD_AUTO,
+		.ethSataComplexOpt = ESC_OPT_GEPHY_MAC0,
+		.ethPortsMode = 0x0
+	}
+};
+
+MV_BOARD_GPP_INFO gflt400InfoBoardGppInfo[] = {
+	/* {{MV_BOARD_GPP_CLASS devClass, MV_U8 gppPinNum}} */
+	{BOARD_GPP_LED,  9, .activeLow = 1, .name = "pon-blue"},
+	{BOARD_GPP_LED, 10, .activeLow = 1, .name = "pon-red"},
+};
+
+
+MV_DEV_CS_INFO gflt400InfoBoardDeCsInfo[] = {
+	/*{deviceCS, params, devType, devWidth} */
+#ifdef MV_SPI
+	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8},		/* SPI DEV */
+#endif
+#if !defined(MV_SPI)
+	{N_A, N_A, N_A, N_A}			/* No device */
+#endif
+};
+
+MV_BOARD_MPP_INFO gflt400InfoBoardMppConfigValue[] = {
+	{{
+	  GFLT400_MPP0_7,
+	  GFLT400_MPP8_15,
+	  GFLT400_MPP16_23,
+	  GFLT400_MPP24_31,
+	  GFLT400_MPP32_37
+	  }
+	 }
+};
+
+
+static MV_VOID gflt400BoardEgigaPhyInit(MV_BOARD_INFO *pBoardInfo)
+{
+	MV_U16 value = 0;
+	/* pass led control to internal phy */
+	MV_REG_WRITE(LED_MATRIX_CTRL_REG(0), 0x82);
+
+	/* link = mpp 14 = c2 = phy led[2] */
+	/* data = mpp 26 = c1 = phy led[1] */
+	mvEthPhyRegWrite(0, 22, 3);
+	mvEthPhyRegRead(0, 16, &value);
+	value = (value & ~0xff) | 0x37;
+	mvEthPhyRegWrite(0, 16, value);
+	mvEthPhyRegWrite(0, 22, 0);
+}
+
+
+static MV_VOID gflt400BoardPreBootOs(MV_BOARD_INFO *pBoardInfo)
+{
+	gfltConfigWatchDog();
+}
+
+MV_BOARD_INFO gflt400Info = {
+	.boardName = "GFLT400",
+	.pBoardEgigaPhyInit = gflt400BoardEgigaPhyInit,
+	.pBoardPreBootOs = gflt400BoardPreBootOs,
+	.numBoardMppTypeValue = MV_ARRAY_SIZE(gflt400InfoBoardMppTypeInfo),
+	.pBoardMppTypeValue = gflt400InfoBoardMppTypeInfo,
+	.numBoardMppConfigValue = MV_ARRAY_SIZE(gflt400InfoBoardMppConfigValue),
+	.pBoardMppConfigValue = gflt400InfoBoardMppConfigValue,
+	.intsGppMaskLow = 0,
+	.intsGppMaskMid = 0,
+	.intsGppMaskHigh = 0,
+	.numBoardDeviceIf = MV_ARRAY_SIZE(gflt400InfoBoardDeCsInfo),
+	.pDevCsInfo = gflt400InfoBoardDeCsInfo,
+	.numBoardTwsiDev = MV_ARRAY_SIZE(gflt400InfoBoardTwsiDev),
+	.pBoardTwsiDev = gflt400InfoBoardTwsiDev,
+	.numBoardMacInfo = MV_ARRAY_SIZE(gflt400InfoBoardMacInfo),
+	.pBoardMacInfo = gflt400InfoBoardMacInfo,
+	.numBoardGppInfo = MV_ARRAY_SIZE(gflt400InfoBoardGppInfo),
+	.pBoardGppInfo = gflt400InfoBoardGppInfo,
+	.activeLedsNumber = 0,
+	.pLedGppPin = NULL,
+	.ledsPolarity = 0,
+
+	/* GPP values */
+	.gppOutEnValLow = GFLT400_GPP_OUT_ENA_LOW,
+	.gppOutEnValMid = GFLT400_GPP_OUT_ENA_MID,
+	.gppOutEnValHigh = 0,
+	.gppOutValLow = GFLT400_GPP_OUT_VAL_LOW,
+	.gppOutValMid = GFLT400_GPP_OUT_VAL_MID,
+	.gppOutValHigh = 0,
+	.gppPolarityValLow = GFLT400_GPP_POL_LOW,
+	.gppPolarityValMid = GFLT400_GPP_POL_MID,
+	.gppPolarityValHigh = 0,
+
+	/* External Switch Configuration */
+	.pSwitchInfo = NULL,
+	.switchInfoNum = 0,
+
+	/* PON configuration. */
+	.ponConfigValue = BOARD_GPON_CONFIG,
+
+	/* TDM configuration */
+	/* We hold a different configuration array for each possible slic that
+	 ** can be connected to board.
+	 ** When modules are scanned, then we select the index of the relevant
+	 ** slic's information array.
+	 ** For RD and Customers boards we only need to initialize a single
+	 ** entry of the arrays below, and set the boardTdmInfoIndex to 0.
+	 */
+	.numBoardTdmInfo = {0},
+	.pBoardTdmInt2CsInfo = {NULL},
+	.boardTdmInfoIndex = -1,
+
+	.pBoardSpecInit = NULL,			/* gflt400BoardSpecInit, */
+
+	.deepIdlePwrUpDelay = 2400,	/* 12uS */
+
+	/* NAND init params */
+	.nandFlashParamsValid = MV_FALSE,
+	.nandFlashReadParams = 0,
+	.nandFlashWriteParams = 0,
+	.nandFlashControl = 0,
+	.pBoardTdmSpiInfo = NULL,
+
+	/* Enable modules auto-detection. */
+	.moduleAutoDetect = MV_FALSE
+};
+
 MV_BOARD_INFO *boardInfoTbl[] = {
 	&db88f6535Info,
 	&rd88f6510Info,
@@ -1708,4 +1849,5 @@
 	&gflt110Info,
 	NULL,  /* unsupported RD_88F6601_MC2L_ID */
 	&gflt300Info,
+	&gflt400Info,
 };
diff --git a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.h b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
index ed329a6..a1af2a5 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
@@ -112,7 +112,8 @@
 #define GFLT110_ID			DB_CUSTOMER_ID + 1
 #define RD_88F6601_MC2L_ID		DB_CUSTOMER_ID + 2   /* for an upstream kernel */
 #define GFLT300_ID			DB_CUSTOMER_ID + 3
-#define MV_MAX_BOARD_ID			(DB_CUSTOMER_ID + 4)
+#define GFLT400_ID			DB_CUSTOMER_ID + 4
+#define MV_MAX_BOARD_ID			(DB_CUSTOMER_ID + 5)
 
 /***************************************************************************
 ** RD-88F6510-SFU
@@ -640,4 +641,49 @@
 #define GFLT300_GPP_POL_LOW	(BIT17)
 #define GFLT300_GPP_POL_MID	0x0
 
+/***************************************************************************
+** GFLT400 - Copied from GFLT300
+****************************************************************************/
+/* GPIO settings for GFLT400: http://go/gflt400-gpio-config */
+
+/* GPPs
+ 0  GHN_RESET_N_L
+ 1  SPI_MOSI
+ 2  SPI_CLK
+ 3  SPI_CS_L
+ 4  SPI_MISO
+ 7  UART0_TX
+ 8  UART0_RX
+ 9  LED_BLUE_L
+ 10 LED_RED_L
+ 13 BOARD_VER[0]
+ 14 GE_LINK_RED
+ 15 BOARD_VER[1]
+ 17 SW_RESET
+ 18 BOARD_VER[2]
+ 20 DYING_GASP_INT_R2
+ 26 GE_DATA_LED
+ 28 SPI_WP_L(out)
+ 33 DYING_GASP_INT_R
+*/
+
+#define GFLT400_MPP0_7		0x20022220
+#define GFLT400_MPP8_15		0x05000002
+#define GFLT400_MPP16_23	0x00000000
+#define GFLT400_MPP24_31	0x00000500
+#define GFLT400_MPP32_37	0x00000000
+
+/* Default all ones-inputs, invert for outputs */
+#define GFLT400_GPP_OUT_ENA_LOW	 (~(BIT9 | BIT10))
+#define GFLT400_GPP_OUT_ENA_MID	 0x0
+
+/* BIT09 turns the LED blue.
+ * BIT10 turns the LED red. */
+#define GFLT400_GPP_OUT_VAL_LOW	(BIT9)
+#define GFLT400_GPP_OUT_VAL_MID	(0)
+
+/* GFLT400 has the reset button signal inverted */
+#define GFLT400_GPP_POL_LOW	(BIT17)
+#define GFLT400_GPP_POL_MID	0x0
+
 #endif /* __INCmvBoardEnvSpech */
diff --git a/board/mv_feroceon/mv_kw2/kw2_family/cpu/mvCpu.c b/board/mv_feroceon/mv_kw2/kw2_family/cpu/mvCpu.c
index 5dc1829..69e6693 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/cpu/mvCpu.c
+++ b/board/mv_feroceon/mv_kw2/kw2_family/cpu/mvCpu.c
@@ -112,7 +112,8 @@
 	/* Search for a matching entry */
 	i = 0;
 	if ((RD_88F6601_MC_ID == boardId) || (DB_88F6601_BP_ID == boardId) ||
-		(GFLT300_ID == boardId) || (GFLT200_ID == boardId) || (GFLT110_ID == boardId)){
+		(GFLT400_ID == boardId) || (GFLT300_ID == boardId) ||
+		(GFLT200_ID == boardId) || (GFLT110_ID == boardId)) {
 		while (cpuDdrTbl6601[i].satrValue != -1) {
 			if (cpuDdrTbl6601[i].satrValue == clockSatr) {
 				res = i;
@@ -160,8 +161,10 @@
 	if (idx == 0xFFFFFFFF)
 		return 0;
 	else {
-		if ((RD_88F6601_MC_ID == boardId) || (DB_88F6601_BP_ID == boardId)
-			|| (GFLT300_ID == boardId) || (GFLT200_ID == boardId) || (GFLT110_ID == boardId))
+		if ((RD_88F6601_MC_ID == boardId) ||
+			(DB_88F6601_BP_ID == boardId) ||
+			(GFLT400_ID == boardId) || (GFLT300_ID == boardId) ||
+			(GFLT200_ID == boardId) || (GFLT110_ID == boardId))
 			return cpuDdrTbl6601[idx].cpuClk;
 		else
 			return cpuDdrL2Tbl[idx].cpuClk;
@@ -194,8 +197,10 @@
 	if (idx == 0xFFFFFFFF)
 		return 0;
 	else {
-		if ((RD_88F6601_MC_ID == boardId) || (DB_88F6601_BP_ID == boardId)
-			|| (GFLT300_ID == boardId) || (GFLT200_ID == boardId) || (GFLT110_ID == boardId))
+		if ((RD_88F6601_MC_ID == boardId) ||
+			(DB_88F6601_BP_ID == boardId) ||
+			(GFLT400_ID == boardId) || (GFLT300_ID == boardId) ||
+			(GFLT200_ID == boardId) || (GFLT110_ID == boardId))
 			return cpuDdrTbl6601[idx].l2Clk;
 		else
 			return cpuDdrL2Tbl[idx].l2Clk;
@@ -224,7 +229,8 @@
 	if ((RD_88F6510_SFU_ID == mvBoardId) ||
 		(RD_88F6601_MC_ID == mvBoardId) ||
 		(DB_88F6601_BP_ID == mvBoardId) ||
-	        (GFLT300_ID == mvBoardId) ||
+		(GFLT400_ID == mvBoardId) ||
+		(GFLT300_ID == mvBoardId) ||
 		(GFLT200_ID == mvBoardId) ||
 		(GFLT110_ID == mvBoardId))
 		return MV_FALSE;