Add laser enabling code.

- Change pon type to PON_NONE in board config since WDMPON is P2P PON.
- If the driver mode is not changed, return OK in IOCTL handler.
- Add code to enable TX laser. We use BOARD_GPP_PON_XVR_TX which is
  currently not used for the chip 88F6601 A0.

Change-Id: Idcc35bb25bf41c8677984b227e5b937979edf10e
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
index 7367ea4..7e8ca8c 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
@@ -1204,6 +1204,7 @@
 	/* {{MV_BOARD_GPP_CLASS devClass, MV_U8 gppPinNum}} */
 	/*{BOARD_GPP_PON_XVR_TX, 17, 0},*/
 	/*{BOARD_GPP_PON_XVR_TX_IND, 24, 0},*/
+	{BOARD_GPP_PON_XVR_TX, 21, 1},
 	{BOARD_GPP_PON_XVR_TX_POWER, 37, 1},
 };
 
@@ -1278,7 +1279,7 @@
 	.switchInfoNum = 0,
 
 	/* PON configuration. */
-	.ponConfigValue = BOARD_GPON_CONFIG,
+	.ponConfigValue = BOARD_PON_NONE,
 
 	/* TDM configuration */
 	/* We hold a different configuration array for each possible slic that
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c
index 3bf0dae..9c670b9 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c
@@ -228,6 +228,7 @@
       {

         linkStatusCallback(MV_TRUE);

       }

+      onuPonTxLaserOn(MV_TRUE);

     }

 

     onuEponPreviousAlarm = onuEponCurrentAlarmState;  

diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c
index 6242d8d..ede0df9 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c
@@ -1164,6 +1164,11 @@
     {
       linkStatusCallback(MV_TRUE);
     }
+    /* TODO(kedong): Enable laser when the RX is ready. Need to be cleaned up
+     * when wavelength selection code is ready.
+     */
+    onuPonTxLaserOn(MV_TRUE);
+
 #endif
 
     return(MV_OK);
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c
index c889c69..9327c8f 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c
@@ -629,6 +629,10 @@
     if (onuEponForceTxDownStateGet(0) != MV_TRUE)
       linkStatusCallback(MV_FALSE);
   }
+  /* TODO(kedong): Disable laser when the RX is gone. Need to be cleaned up
+   * when wavelength selection code is ready.
+   */
+  onuPonTxLaserOn(MV_FALSE);
 
   if (onuEponDbOnuHoldoverStateGet() != ONU_HOLDOVER_NOT_ACTIVE)
   {
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c
index 34e3840..60a9653 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c
@@ -249,13 +249,25 @@
 				goto ioctlErr;
 			}
 			ponDev.drvMode = drvMode;
-
 		} else {
+			ret = get_user(drvMode, (E_PonDriverMode __user *)arg);
+			if (ret != 0) {
+				mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
+					"ERROR: (%s:%d) copy from user failed\n", __FILE_DESC__, __LINE__);
+				goto ioctlErr;
+			}
+			if (ponDev.drvMode == drvMode) {
+					mvPonPrint(PON_PRINT_INFO, PON_API_MODULE,
+							"INFO: (%s:%d) Same driver mode, no change\n",
+							__FILE_DESC__, __LINE__);
+					ret = 0;
+			} else {
 			/* Switching between EPON-GPON modes requires reboot initiated by US application */
-			mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
-					"ERROR: (%s:%d) command MVPON_IOCTL_INIT is not supported in this mode\n",
-					__FILE_DESC__, __LINE__);
-			goto ioctlErr;
+					mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
+							"ERROR: (%s:%d) command MVPON_IOCTL_INIT is not supported in this mode\n",
+							__FILE_DESC__, __LINE__);
+					goto ioctlErr;
+			}
 		}
 		break;
 
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c
index a9f877e..3e6cc2b 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c
@@ -850,4 +850,41 @@
 	return(status);
 }
 
+/*******************************************************************************
+**
+**  onuPonTxLaserOn
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function turns ON/OFF TX laser using MPP
+**
+**  PARAMETERS:  MV_BOOL on - MV_TRUE - turn TX laser ON, othervise OFF
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     MV_OK or error
+**
+*******************************************************************************/
+MV_STATUS onuPonTxLaserOn(MV_BOOL on)
+{
+	MV_STATUS status;
+	MV_U32    gpioGroup, gpioMask;
+	MV_U8     gpioPolarity;
+	MV_U32    trans_value = 0;
+	MV_U32    board_id = mvBoardIdGet();
+
+	if (GFLT200_ID == board_id) {
+		PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
+		if (gpioMask == PON_GPIO_NOT_USED)
+			return(MV_ERROR);
+		gpioPolarity = mvBoardGpioPolarityGet(BOARD_GPP_PON_XVR_TX);
+		if ((on && gpioPolarity) || (!on && !gpioPolarity))
+			status = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
+		else
+			status = mvGppValueSet(gpioGroup, gpioMask, 0);
+		transmit_up = on;
+	}
+
+	return(MV_OK);
+}
+
 #endif /* PON_FPGA */
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h
index 1231b55..ec15f89 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h
@@ -146,6 +146,7 @@
 void      onuPonPatternBurstTimerHndl(void);
 MV_STATUS onuPonTxPowerOn(MV_BOOL txOn);
 MV_STATUS onuPonTxPowerControlInit(void);
+MV_STATUS onuPonTxLaserOn(MV_BOOL txOn);
 
 #endif /* PON_FPGA */