[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/devdrv/rstctl/src/dcl_rstctl.c b/mcu/driver/devdrv/rstctl/src/dcl_rstctl.c
new file mode 100644
index 0000000..359cc68
--- /dev/null
+++ b/mcu/driver/devdrv/rstctl/src/dcl_rstctl.c
@@ -0,0 +1,562 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2012
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    dcl_rstctl.c
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This Module defines DCL (Driver Common Layer) of the wdt driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#include "drv_comm.h"
+#include "rstctl_reg.h"
+#include "drv_rstctl.h"
+#include "intrCtrl.h"
+
+
+#include "dcl_wdt.h"
+#include "dcl.h"
+#include "kal_general_types.h"
+#include "kal_public_api.h"
+#include "kal_internal_api.h"
+#include "kal_ex_api.h"
+
+
+/*Begin: for share memory debug information dump*/
+#include "ex_mem_manager_public.h"
+#include "ex_public.h"
+#include "ccci_if.h"
+#include "us_timer.h"
+/*End: for share memory debug information dump*/
+
+
+#if defined(MT6290_S00)
+#include "drv_bsi.h"
+#define PMIC_6339_ANALDO_CON1_ADDR  (0x21)
+/*VTCXO1_ON_CTRL : 0: SW controll by RG_VTXCO1_EN*/
+/*                 1: SRCLKEN                    */
+#define VTCXO1_ON_CTRL_BIT          (0x1)
+/*RG_VTCXO1_EN : 0: Disable                   */
+/*               1: Enable                    */
+#define RG_VTCXO1_EN_BIT            (0x0)
+
+#endif
+
+// Global variable for DCL WDT API usage
+#define DCL_WDT_DEV_MAGIC_NUM		(0x80000000)
+
+#define DCL_WDT_GET_DEV(handle_) ((handle_) & (~DCL_WDT_DEV_MAGIC_NUM))
+
+kal_atomic_uint32 dcl_wdt_handle_count = 0;
+
+
+// The event is presented by 32-bit variable
+kal_atomic_uint32 handle_assign[32];
+#define MAX_DCL_WDT_EVENT_NUM		1
+PFN_DCL_CALLBACK dcl_wdt_event_callback[MAX_DCL_WDT_EVENT_NUM];
+
+void dcl_wdt_hisr(){
+	// Try to call rgistered callback function
+	// Search mapping array and assign callback to specofic array entry
+	{
+		kal_uint32 i;
+		kal_uint32 event_bit;
+		// TODO: integrate the code bellow in the call back function mechanism. 
+		for (i=0;i<MAX_DCL_WDT_EVENT_NUM;i++){
+			event_bit = 1 << i;
+			if ((event_bit & EVENT_WDT_TIMEOUT) != 0){
+				if (dcl_wdt_event_callback[i] != NULL){
+					dcl_wdt_event_callback[i](EVENT_WDT_TIMEOUT);
+				}
+			}
+		}
+	}
+}
+
+#if defined(MT6297)
+void dcl_wdt_ap2md_wdt_lisr()
+{
+    // Just Need to Trigger Fatal Error !!!    
+    kal_fatal_error_handler(KAL_ERROR_CC_SAP_WDT_TIMEOUT_EXCP, 0);
+}
+
+void dcl_wdt_register_ap2md_wdt_isr()
+{
+    //IRQ_Register_LISR(IRQ_AP2MD_APWDT_IRQ_CODE, dcl_wdt_ap2md_wdt_lisr, "AP2MD WDT LISR");
+    //IRQSensitivity(IRQ_AP2MD_APWDT_IRQ_CODE, KAL_FALSE);  // Low Level Active
+    IRQUnmask(IRQ_AP2MD_APWDT_IRQ_CODE);
+}
+#else
+#define dcl_wdt_register_ap2md_wdt_isr()
+#endif
+
+
+void dcl_wdt_lisr()
+{
+    mips_isr_mdwdt_handler();
+}
+
+
+void dcl_wdt_register_md_wdt_isr()
+{
+    //IRQ_Register_LISR(IRQ_MDWDT_CODE, dcl_wdt_lisr,"DCL WDT LISR");
+    //IRQSensitivity(IRQ_MDWDT_CODE,KAL_TRUE);
+    IRQUnmask(IRQ_MDWDT_CODE); 
+}
+
+
+kal_bool dcl_wdt_lisr_register_flag = KAL_FALSE;
+void dcl_wdt_register_lisr(){
+	if (dcl_wdt_lisr_register_flag){
+		return;
+	}
+
+    dcl_wdt_register_md_wdt_isr();
+    dcl_wdt_register_ap2md_wdt_isr();
+	dcl_wdt_lisr_register_flag=KAL_TRUE;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_Initialize
+*
+* DESCRIPTION
+*  This function is to initialize WDT module
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_OK
+*
+*************************************************************************/
+DCL_STATUS DclWDT_Initialize(void)
+{
+	kal_uint8 count = 0;
+	drv_rstctl_wdt_init();
+	for(count=0;count<32;count++)
+		kal_atomic_set(&(handle_assign[count]), 0);
+
+	kal_atomic_set(&dcl_wdt_handle_count, 0);
+
+	return STATUS_OK;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_Open
+*
+* DESCRIPTION
+*  This function is to open the WDT module and return a handle
+*
+* PARAMETERS
+*  dev: only valid for DCL_WDT
+*  flags: no sepcial flags is needed. Please use FLAGS_NONE
+*
+* RETURNS
+*  DCL_HANDLE_INVALID: Open failed.
+*  other value: a valid handle
+*
+*************************************************************************/
+DCL_HANDLE DclWDT_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+	kal_uint32 handle;
+	kal_uint8 index=0;
+
+
+	if (dev != DCL_WDT){
+		return DCL_HANDLE_INVALID;		// Incorrecr device ID
+	}
+	for(index=0;index<32;index++)
+	{
+		if(kal_atomic_compare_and_swap_return(&handle_assign[index],0,1)==0)
+			break;
+	}
+	if (index==32)
+    	return DCL_HANDLE_INVALID;
+	kal_atomic_inc(&dcl_wdt_handle_count);
+	handle = (DCL_WDT_DEV_MAGIC_NUM | index);
+
+	// Register DCL default lisr
+	return handle;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_ReadData
+*
+* DESCRIPTION
+*  This function is not supported for the WDT module now.
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclWDT_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+	return STATUS_UNSUPPORTED;
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_WriteData
+*
+* DESCRIPTION
+*  This function is not supported for the WDT module now.
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclWDT_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+	return STATUS_UNSUPPORTED;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_Configure
+*
+* DESCRIPTION
+*  This function is not supported for the WDT module now.
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclWDT_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+	return STATUS_UNSUPPORTED;
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_RegisterCallback
+*
+* DESCRIPTION
+*  This function is to set callback function for the WDT module.
+*
+* PARAMETERS
+*  handle: the returned handle value of DclWDT_Open
+*  event: Supported events:
+*         EVENT_WDT_TIMEOUT: Watch dog time out interrupt
+*  callback: the callback function for registered events
+*
+* RETURNS
+*  STATUS_OK: Successfully register the callback function.
+*  STATUS_INVALID_DCL_HANDLE: It's a invalid handle.
+*  STATUS_NOT_OPENED: The module has not been opened.
+*  STATUS_INVALID_EVENT: The event parameter is invalid.
+*
+*************************************************************************/
+DCL_STATUS DclWDT_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+	//kal_uint32 i;
+	// Check magic number
+	if ((handle & DCL_WDT_DEV_MAGIC_NUM) != DCL_WDT_DEV_MAGIC_NUM){
+		DEBUG_ASSERT(0);
+		return STATUS_INVALID_DCL_HANDLE;
+	}
+
+	// Error check
+	if (kal_atomic_read(&dcl_wdt_handle_count) == 0){
+		DEBUG_ASSERT(0);
+		return STATUS_NOT_OPENED;
+	}
+	// Check if the passed-in event bitmap is supported or NOT
+	if (((kal_uint32)event & (~(EVENT_WDT_TIMEOUT))) != 0){
+		DEBUG_ASSERT(0);
+		return STATUS_INVALID_EVENT;
+	}
+
+	//i=DCL_WDT_GET_DEV(handle);
+
+    dcl_wdt_register_lisr();
+
+	return STATUS_OK;
+
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_Control
+*
+* DESCRIPTION
+*  This function is to send command to control the WDT module.
+*
+* PARAMETERS
+*  handle: The handle value returned from DclWDT_Open
+*  cmd: a control command for WDT module
+*          1. WDT_CMD_ENABLE: to enable/disable WDT
+*          2. WDT_CMD_SET_EXT_POL: to set ploarity of external pin when WDT expired
+*          3. WDT_CMD_SET_EXT_RESET: to generate an external watchdog reset signal when WDT expired
+*          4. WDT_CMD_SET_VALUE: to set WDT count value
+*          5  WDT_CMD_RESTART: to restart counter
+*          6. WDT_CMD_DRV_RESET: to reset device
+*          7. WDT_CMD_ABN_RESET: to reset device with abnormal flag set to indicate it is a abnormal reset
+*          8. WDT_CMD_IRQ: to generate interrupt instead of reseting device
+*  data: The data of the control command
+*          1. WDT_CMD_ENABLE: pointer to a WDT_CTRL_ENABLE_T structure
+*          2. WDT_CMD_SET_EXT_POL: pointer to a WDT_CTRL_SET_EXT_POL_T structure
+*          3. WDT_CMD_SET_EXT_RESET: pointer to a WDT_CTRL_SET_EXT_RESET_T structure
+*          4. WDT_CMD_SET_VALUE: pointer to a WDT_CTRL_SET_VALUE_T structure
+*          5  WDT_CMD_RESTART: A null pointer
+*          6. WDT_CMD_DRV_RESET: A null pointer
+*          7. WDT_CMD_ABN_RESET: A null pointer
+*          8. WDT_CMD_IRQ: pointer to a WDT_CTRL_IRQ_T structure
+*
+* RETURNS
+*  STATUS_OK: command is executed successfully.
+*  STATUS_FAIL: command is failed.
+*  STATUS_INVALID_CMD: It's a invalid command.
+*
+*************************************************************************/
+DCL_STATUS DclWDT_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+	WDT_CTRL_GET_RSTINTERVAL_T *prst;
+	WDT_CTRL_SET_VALUE_T *prSetValue;
+	WDT_CTRL_ENABLE_T  *prEnable;
+	WDT_CTRL_IRQ_T *prIRQ;
+	WDT_CTRL_DEBUG_T *prWDTDebug;
+	/*Begin: preserve debug information in share memory.  */
+	volatile kal_uint32 callerAddr;
+	volatile kal_uint32 callerVPE;
+	volatile kal_uint32 usTime;
+	/*End: preserve debug information in share memory. */
+#if defined(MT6290_S00)
+    kal_uint16 val;
+#endif
+
+    if (sst_get_exception_count() == 0) {
+    	// Check magic number
+    	if ((handle & DCL_WDT_DEV_MAGIC_NUM) != DCL_WDT_DEV_MAGIC_NUM){
+    		DEBUG_ASSERT(0);
+    		return STATUS_INVALID_DCL_HANDLE;
+    	}
+
+    	// Error check
+    	if (kal_atomic_read(&dcl_wdt_handle_count) == 0){
+    		DEBUG_ASSERT(0);
+    		return STATUS_NOT_OPENED;
+    	}
+	}
+	
+	/*Begin: preserve debug information in share memory.  */
+	GET_RETURN_ADDRESS(callerAddr);
+	callerVPE = kal_get_current_vpe_id();
+	usTime = ust_get_current_time();
+	/*End: preserve debug information in share memory.  */
+	switch (cmd)
+	{
+		case WDT_CMD_ENABLE:
+			prEnable = &(data->rWDTEnable);
+			/*Begin: preserve debug information in share memory. */
+			if(prEnable->fgEnable)
+				{
+				 EMM_WriteDbgInfo(EMM_WDT1_EN_CALLER, (void*)&callerAddr);
+				 EMM_WriteDbgInfo(EMM_WDT1_EN_TIME, (void*)&usTime);
+				 EMM_WriteDbgInfo(EMM_WDT2_EN_CALLER, (void*)&callerAddr);
+				 EMM_WriteDbgInfo(EMM_WDT2_EN_TIME, (void*)&usTime);
+				}
+			else
+				{
+				 EMM_WriteDbgInfo(EMM_WDT1_DIS_CALLER, (void*)&callerAddr);
+				 EMM_WriteDbgInfo(EMM_WDT1_DIS_TIME, (void*)&usTime);
+				 EMM_WriteDbgInfo(EMM_WDT2_DIS_CALLER, (void*)&callerAddr);
+				 EMM_WriteDbgInfo(EMM_WDT2_DIS_TIME, (void*)&usTime);
+				}
+			/*End: preserve debug information in share memory. */
+			drv_rstctl_wdt_enable((kal_bool)prEnable->fgEnable);
+			drv_rstctl_wdt_enable_aux((kal_bool)prEnable->fgEnable);
+			break;
+		case WDT_CMD_SET_EXT_POL:
+			//MT6290 wait for new feature release
+			break;
+		case WDT_CMD_SET_EXT_RESET:
+			//MT6290 wait for new feature release
+			break;
+		case WDT_CMD_SET_VALUE:
+			prSetValue = &(data->rWDTSetValue);
+			drv_rstctl_wdt_setInterval(prSetValue->u2Value);
+			drv_rstctl_wdt_setInterval_aux(prSetValue->u2Value);
+			break;
+		case WDT_CMD_RESTART:
+			drv_rstctl_restartWDT();
+			break;
+		case WDT_CMD_DRV_RESET:
+		    /*Begin: preserve debug information in share memory. */
+			EMM_WriteDbgInfo(EMM_WDT_DRV_RST_CALLER, (void*)&callerAddr);
+			EMM_WriteDbgInfo(EMM_WDT_DRV_RST_TIME, (void*)&usTime);
+			/*End: preserve debug information in share memory. */
+			drv_rstctl_wdt_reset();
+			break;
+		case WDT_CMD_GET_RSTINTERVAL:
+			prst = &(data->rRstValue);
+			prst->rstInterval = drv_rstctl_wd_getInterval();
+			break;
+		case WDT_CMD_GET_RSTINTERVAL_AUX:
+			prst = &(data->rRstValue);
+			prst->rstInterval = drv_rstctl_wd_getInterval_aux();
+			break;
+		case WDT_CMD_ABN_RESET:
+			/*Begin: preserve debug information in share memory. */
+			EMM_WriteDbgInfo(EMM_WDT_ABN_RST_CALLER, (void*)&callerAddr);
+			EMM_WriteDbgInfo(EMM_WDT_ABN_RST_TIME, (void*)&usTime);
+			/*End: preserve debug information in share memory. */
+			drv_rstctl_wdt_abnReset();
+			break;
+		case WDT_CMD_IRQ:
+			prIRQ = &(data->rWDTIRQ);
+			drv_rstctl_wdt_enableInterrupt((kal_bool)prIRQ->fgEnable);
+			break;
+		case WDT_CMD_IRQ_AUX:
+			prIRQ = &(data->rWDTIRQ);
+			drv_rstctl_wdt_enableInterrupt_aux((kal_bool)prIRQ->fgEnable);
+			break;
+		case WDT_CMD_ENABLE_DEBUG:
+			prWDTDebug=&(data->rWDTDebug);
+			drv_rstctl_wdt_enableDebugMode(prWDTDebug->fgEnable);
+			break;
+		case WDT_CMD_CLR_CHECK:
+			prSetValue = &(data->rWDTSetValue);
+			EMM_WriteDbgInfo(EMM_VPE0_WDT_CLR_CHK_CALLER + ((prSetValue->u2Value)*3), (void*)&callerAddr);
+			EMM_WriteDbgInfo(EMM_VPE0_WDT_CLR_CHK_CALLERVPE + ((prSetValue->u2Value)*3), (void*)&callerVPE);
+			EMM_WriteDbgInfo(EMM_VPE0_WDT_CLR_CHK_TIME + ((prSetValue->u2Value)*3), (void*)&usTime);
+			drv_rstctl_clr_check_bit(prSetValue->u2Value);
+			break;
+		case WDT_CMD_SET_CHECK:
+			prSetValue = &(data->rWDTSetValue);
+			EMM_WriteDbgInfo(EMM_VPE0_WDT_SET_CHK_CALLER + ((prSetValue->u2Value)*3), (void*)&callerAddr);
+			EMM_WriteDbgInfo(EMM_VPE0_WDT_SET_CHK_CALLERVPE + ((prSetValue->u2Value)*3), (void*)&callerVPE);
+			EMM_WriteDbgInfo(EMM_VPE0_WDT_SET_CHK_TIME + ((prSetValue->u2Value)*3), (void*)&usTime);
+			drv_rstctl_set_check_bit(prSetValue->u2Value);
+			break;
+		case WDT_CMD_CLR_KICK:
+			prSetValue = &(data->rWDTSetValue);
+			drv_rstctl_clr_kick_bit(prSetValue->u2Value);
+			break;
+		case WDT_CMD_SET_KICK:
+			prSetValue = &(data->rWDTSetValue);
+			drv_rstctl_set_kick_bit(prSetValue->u2Value);
+			break;
+		default:
+			return STATUS_INVALID_CMD;
+	}
+	return STATUS_OK;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclWDT_Close
+*
+* DESCRIPTION
+*  This function is to close the WDT module.
+*
+* PARAMETERS
+*  handle: the returned handle value of DclWDT_Open
+*
+* RETURNS
+*  STATUS_OK
+*
+*************************************************************************/
+DCL_STATUS DclWDT_Close(DCL_HANDLE handle)
+{
+	kal_uint32 i;
+	// Check magic number
+	if ((handle & DCL_WDT_DEV_MAGIC_NUM) != DCL_WDT_DEV_MAGIC_NUM){
+		DEBUG_ASSERT(0);
+		return STATUS_INVALID_DCL_HANDLE;
+	}
+
+	// Error check
+	if (kal_atomic_read(&dcl_wdt_handle_count) == 0){
+		DEBUG_ASSERT(0);
+		return STATUS_NOT_OPENED;
+	}
+/*
+	// Clear all registered event callbacks for the specific handle
+	// Note: If we support multiple handles, we need to take care of the clear
+	{
+		kal_uint32 i;
+		for (i=0;i<MAX_DCL_WDT_EVENT_NUM;i++){
+			dcl_wdt_event_callback[i] = NULL;
+		}
+	}
+*/
+	i=(handle & ~DCL_WDT_DEV_MAGIC_NUM);
+
+	kal_atomic_set(&(handle_assign[i]), 0);
+	dcl_wdt_event_callback[i%MAX_DCL_WDT_EVENT_NUM] = NULL;
+
+	kal_atomic_dec(&dcl_wdt_handle_count);
+
+	return STATUS_OK;
+}
+
+