Merge remote-tracking branch 'gfiber-internal/prism_dev' into work3

Change-Id: I0d072c15200db94707fb17d6bcd428e99e53e20e
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 a1be610..4e525aa 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.c
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.c
@@ -137,8 +137,8 @@
 	}
 
 	pBoardInfo = mvBoardInfoGet();
-	if (pBoardInfo->pBoardInit)
-		pBoardInfo->pBoardInit(pBoardInfo);
+	if (pBoardInfo->pBoardEnvInit)
+		pBoardInfo->pBoardEnvInit(pBoardInfo);
 
 	nandDev = boardGetDevCSNum(0, BOARD_DEV_NAND_FLASH);
 	if (nandDev != 0xFFFFFFFF) {
diff --git a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.h b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.h
index 0207a74..d8b74cd 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.h
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvLib.h
@@ -401,7 +401,8 @@
 
 typedef struct _boardInfo {
 	char boardName[MV_BOARD_NAME_LEN];
-	MV_VOID (*pBoardInit)(struct _boardInfo *);
+	MV_VOID (*pBoardEnvInit)(struct _boardInfo *);
+	MV_VOID (*pBoardEgigaPhyInit)(struct _boardInfo *);
 	MV_U8 numBoardMppTypeValue;
 	MV_BOARD_MPP_TYPE_INFO *pBoardMppTypeValue;
 	MV_U8 numBoardMppConfigValue;
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 93f1019..c0edfa5 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
@@ -64,6 +64,7 @@
 #include "mvCommon.h"
 #include "mvBoardEnvLib.h"
 #include "mvBoardEnvSpec.h"
+#include "eth-phy/mvEthPhy.h"
 #include "gpp/mvGpp.h"
 #include "twsi/mvTwsi.h"
 
@@ -1192,9 +1193,9 @@
 MV_BOARD_GPP_INFO gflt200Evt2InfoBoardGppInfo[] = {
 	/* {{MV_BOARD_GPP_CLASS devClass, MV_U8 gppPinNum}} */
 	{BOARD_GPP_PON_XVR_TX, 17},
-	{BOARD_GPP_LED, 11, .name = "pon-red"},
-	{BOARD_GPP_LED, 12, .name = "pon-blue"},
-	{BOARD_GPP_LED, 14, .activeLow = 1, .name = "eth-link"},
+	{BOARD_GPP_LED, 9, .activeLow = 1, .name = "pon-blue"},
+	{BOARD_GPP_LED, 10, .activeLow = 1, .name = "pon-red"},
+	{BOARD_GPP_LED, 14, .activeLow = 0, .name = "eth-link"},
 	{BOARD_GPP_LED, 26, .activeLow = 1, .name = "eth-data"},
 };
 
@@ -1248,7 +1249,7 @@
 #define GFLT200_EVT1_BOARD_VER		(0)
 #define GFLT200_EVT2_BOARD_VER		(1 << 13)
 
-static MV_VOID gflt200BoardInit(MV_BOARD_INFO *pBoardInfo)
+static MV_VOID gflt200BoardEnvInit(MV_BOARD_INFO *pBoardInfo)
 {
 	mvGppTypeSet(0, GFLT200_GPP_BOARD_VER_MASK, GFLT200_GPP_BOARD_VER_MASK);
 
@@ -1289,9 +1290,37 @@
 	}
 }
 
+static MV_VOID gflt200BoardEgigaPhyInit(MV_BOARD_INFO *pBoardInfo)
+{
+	/* pass led control to internal phy */
+	MV_REG_WRITE(LED_MATRIX_CTRL_REG(0), 0x82);
+
+	switch (mvGppValueGet(0, GFLT200_GPP_BOARD_VER_MASK)) {
+	case GFLT200_EVT1_BOARD_VER:
+		/* link = mpp 24 = p2 = phy led[5] */
+		/* data = mpp 23 = p1 = phy led[4] */
+		mvEthPhyRegWrite(0, 22, 3);
+		mvEthPhyRegWrite(0, 19, 0x64);
+		mvEthPhyRegWrite(0, 22, 0);
+		break;
+
+	default:
+		/* fallthrough */
+	case GFLT200_EVT2_BOARD_VER:
+		/* link = mpp 14 = c2 = phy led[2] */
+		/* data = mpp 26 = c1 = phy led[1] */
+		mvEthPhyRegWrite(0, 22, 3);
+		mvEthPhyRegWrite(0, 16, 0x40);
+		mvEthPhyRegWrite(0, 17, 0x10);
+		mvEthPhyRegWrite(0, 22, 0);
+		break;
+	}
+}
+
 MV_BOARD_INFO gflt200Info = {
 	.boardName = "GFLT200",
-	.pBoardInit = gflt200BoardInit,
+	.pBoardEnvInit = gflt200BoardEnvInit,
+	.pBoardEgigaPhyInit = gflt200BoardEgigaPhyInit,
 	.numBoardMppTypeValue = MV_ARRAY_SIZE(gflt200InfoBoardMppTypeInfo),
 	.pBoardMppTypeValue = gflt200InfoBoardMppTypeInfo,
 	.intsGppMaskLow = 0,
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 631b235..ddcd400 100644
--- a/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
+++ b/board/mv_feroceon/mv_kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
@@ -468,14 +468,14 @@
 ****************************************************************************/
 #define GFLT200_EVT1_MPP0_7		0x22222220
 #define GFLT200_EVT1_MPP8_15		0x00000002
-#define GFLT200_EVT1_MPP16_23		0x00000000
-#define GFLT200_EVT1_MPP24_31		0x40200000
+#define GFLT200_EVT1_MPP16_23		0x50000000
+#define GFLT200_EVT1_MPP24_31		0x40200005
 #define GFLT200_EVT1_MPP32_37		0x00000004
 
 #define GFLT200_EVT2_MPP0_7		0x22222220
-#define GFLT200_EVT2_MPP8_15		0x00000002
+#define GFLT200_EVT2_MPP8_15		0x05000002
 #define GFLT200_EVT2_MPP16_23		0x00000000
-#define GFLT200_EVT2_MPP24_31		0x40200004
+#define GFLT200_EVT2_MPP24_31		0x40200504
 #define GFLT200_EVT2_MPP32_37		0x00000004
 
 /* GPPs
@@ -491,22 +491,21 @@
  6 I2C_SCLK (out)         ...
  7 UART0_TX (out)         ...
  8 UART0_RX (in)          ...
- 9 VDD_MARGIN_EN (out)    ---
-10 VDD_MARGIN_CTRL (out)  ---
-11 PON_LINK_LED (out)     PON_LED_RED (out)
-12 PON_ERROR_LED (out)    PON_LED_BLUE (out)
+ 9 VDD_MARGIN_EN (out)    PON_LED_BLUE (out)
+10 VDD_MARGIN_CTRL (out)  PON_LED_RED (out)
+11 PON_LINK_LED (out)     ---
+12 PON_ERROR_LED (out)    ---
 13 BOARD_VER[0] (in)      ...
 14 ---                    GE_LINK_LED (out)
 15 BOARD_VER[1] (in)      ...
 17 SW_RESET (out)         ...
 18 BOARD_VER[2] (in)      ...
 21 PON_TX_DIS (out)       ...
-22 ---                    DOLOS_DETECT (in)
 23 GE_DATA_LED (out)      ---
 24 GE_LINK_LED (out)      PTP_TRIG_GEN (out)
 25 ---                    PTP_EVENT_REQ (in)
 26 PON_C2_DATA (out)      GE_DATA_LED (out)
-27 PON_C2_CLK (out)       PTP_CLK (in)
+27 PON_C2_CLK (out)       DOLOS_DETECT (in)
 28 SPI_WP_L (out)         ...
 29 PON_RX_LOS (in)        ...
 31 UART1_RX (out)         ...
@@ -518,17 +517,17 @@
 #define GFLT200_EVT1_GPP_OUT_ENA_LOW	(BIT13 | BIT15 | BIT18 | BIT29)
 #define GFLT200_EVT1_GPP_OUT_ENA_MID	(BIT4)
 
-#define GFLT200_EVT1_GPP_OUT_VAL_LOW	(BIT9 | BIT10 | BIT21 | BIT26 | BIT27 | BIT28)
+#define GFLT200_EVT1_GPP_OUT_VAL_LOW	(BIT9 | BIT10 | BIT12 | BIT21 | BIT26 | BIT27 | BIT28)
 #define GFLT200_EVT1_GPP_OUT_VAL_MID	0x0
 
 #define GFLT200_EVT1_GPP_POL_LOW	0x0
 #define GFLT200_EVT1_GPP_POL_MID	0x0
 
-#define GFLT200_EVT2_GPP_OUT_ENA_LOW	(BIT13 | BIT15 | BIT18 | BIT22 | BIT29)
+#define GFLT200_EVT2_GPP_OUT_ENA_LOW	(BIT9 | BIT13 | BIT15 | BIT18 | BIT27 | BIT29)
 #define GFLT200_EVT2_GPP_OUT_ENA_MID	(BIT4)
 
 #define GFLT200_EVT2_GPP_OUT_VAL_LOW	(BIT21 | BIT28)
-#define GFLT200_EVT2_GPP_OUT_VAL_MID	0x0
+#define GFLT200_EVT2_GPP_OUT_VAL_MID	(BIT5)
 
 #define GFLT200_EVT2_GPP_POL_LOW	0x0
 #define GFLT200_EVT2_GPP_POL_MID	0x0
diff --git a/board/mv_feroceon/mv_kw2/mv_phy.c b/board/mv_feroceon/mv_kw2/mv_phy.c
index 5ab569d..d36d68b 100755
--- a/board/mv_feroceon/mv_kw2/mv_phy.c
+++ b/board/mv_feroceon/mv_kw2/mv_phy.c
@@ -197,9 +197,14 @@
 	MV_U32 reg;
 	MV_U32 i;
 	char *env;
+	MV_BOARD_INFO *pBoardInfo;
 
 	mvSysEthPhyInit();
 
+	pBoardInfo = mvBoardInfoGet();
+	if (pBoardInfo->pBoardEgigaPhyInit)
+		pBoardInfo->pBoardEgigaPhyInit(pBoardInfo);
+
 	if (ethComplex & (ESC_OPT_RGMIIA_MAC0 | ESC_OPT_RGMIIB_MAC0))
 		mvEthPhyInit(0, MV_FALSE);
 
diff --git a/board/mv_feroceon/mv_kw2/prism_cmd.c b/board/mv_feroceon/mv_kw2/prism_cmd.c
index b3ee087..324ee1c 100644
--- a/board/mv_feroceon/mv_kw2/prism_cmd.c
+++ b/board/mv_feroceon/mv_kw2/prism_cmd.c
@@ -566,6 +566,15 @@
 	}
 }
 
+static void mux_led(MV_U8 mpp)
+{
+	MV_U32 reg = mvCtrlMppRegGet(mpp / 8);
+	MV_U32 val = MV_REG_READ(reg);
+
+	val &= ~(0xf << ((mpp % 8) * 4));
+	MV_REG_WRITE(reg, val);
+}
+
 static int do_prism_diag_leds(int level, int argc, char *argv[])
 {
 	int hz = 1;
@@ -607,9 +616,11 @@
 			&& (!name || (gpp->name && !strcmp(name, gpp->name)))) {
 			if (mode == LEDS_MODE_LIST)
 				printf("%s\n", gpp->name);
-			else
+			else {
+				mux_led(gpp->gppPinNum);
 				config_led(gpp->gppPinNum, !gpp->activeLow,
 						mode, hz);
+			}
 		}
 	}