[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/devdrv/pmic/src/dcl_pmu.c b/mcu/driver/devdrv/pmic/src/dcl_pmu.c
new file mode 100644
index 0000000..771117c
--- /dev/null
+++ b/mcu/driver/devdrv/pmic/src/dcl_pmu.c
@@ -0,0 +1,389 @@
+/*****************************************************************************
+*  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) 2005
+*
+*  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_pmu.c
+ *
+ * Project:
+ * --------
+ *   MOLY
+ *
+ * Description:
+ * ------------
+ *   This Module defines DCL (Driver Common Layer) of the PMIC driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ ****************************************************************************/
+#include "kal_debug.h"
+#include "kal_public_api.h"
+#include "kal_hrt_api.h"
+#include "intrCtrl.h"
+#include "dcl.h"
+#include "dcl_pmu_sw.h"
+#include "dcl_pmu_common_sw.h"
+#include "us_timer.h"
+
+#ifndef DRV_PMIC_OFF
+
+#if defined(DCL_PMIC_ACCESS_TIME_LOG)
+PMIC_ACCESS_DURATION_DBG pmic_access_duration_log[PMIC_LOG_TYPE_MAX][PMIC_DURATION_LOG_MAX][MAX_PMIC_DURATION_INFO_SIZE];
+DCL_UINT32 pmic_access_duration_index [PMIC_LOG_TYPE_MAX] = {0};
+DCL_UINT32 pmic_access_timing_issue_log [PMIC_LOG_TYPE_MAX][MAX_PMIC_DURATION_INFO_SIZE];
+DCL_UINT32 pmic_access_timing_issue_index [PMIC_LOG_TYPE_MAX]= {0};
+#endif // End of #if defined(DCL_PMIC_ACCESS_TIME_LOG)
+
+kal_spinlockid dcl_pmic_control_spinlock;
+kal_atomic_uint32 dcl_pmic_hrt_flag = 0;
+
+PMU_CONTROL_HANDLER pmu_control_handler = 0;
+static DCL_UINT32 dcl_pmu_handle_count = 0;
+
+#if defined(DCL_PMIC_MODULE_CONTROL)
+DCL_FLAGS dcl_pmu_handle_flags = FLAGS_NONE;
+
+DCL_FLAGS DclPMU_GetCurrentHandlerFlag(DCL_HANDLE handle)
+{
+	if( handle == dcl_pmu_handle_count )
+		return dcl_pmu_handle_flags ;
+
+	return FLAGS_NONE;
+}
+#endif
+
+kal_atomic_uint32 DclPMU_GetHrtFlag(void)
+{
+	return kal_atomic_read(&dcl_pmic_hrt_flag);
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclPMU_Initialize
+*
+* DESCRIPTION
+*  This function is to initialize PMU module
+*
+* PARAMETERS
+*  None
+*
+* RETURNS
+*  STATUS_OK
+*
+*************************************************************************/
+DCL_STATUS DclPMU_Initialize(void)
+{
+#if defined(MT6353)
+extern void dcl_pmic6353_init(void);
+	dcl_pmic6353_init();
+#else
+extern void dcl_pmic_init(void);
+	dcl_pmic_init();
+#endif
+
+	return STATUS_OK;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclPMU_Open
+*
+* DESCRIPTION
+*  This function is to open the PMU module and return a handle
+*
+* PARAMETERS
+*  dev: only valid for DCL_PMU
+*  flags: no sepcial flags is needed. Please use FLAGS_NONE
+*
+* RETURNS
+*  DCL_HANDLE_INVALID: Open failed.
+*  other value: a valid handle
+*
+*************************************************************************/
+DCL_HANDLE DclPMU_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+	kal_uint32 handle;
+	kal_uint32 savedMask=0;
+
+	if (dev != DCL_PMU){
+		return DCL_HANDLE_INVALID;		// Incorrecr device ID
+	}
+	savedMask = kal_hrt_SaveAndSetIRQMask();
+	dcl_pmu_handle_count++;
+	handle = dcl_pmu_handle_count;
+#if defined(DCL_PMIC_MODULE_CONTROL)
+	dcl_pmu_handle_flags = flags;
+#endif
+	kal_hrt_RestoreIRQMask(savedMask);
+
+	// Register DCL default lisr
+	return handle;
+}
+/*************************************************************************
+* FUNCTION
+*  DclPMU_ReadData
+*
+* DESCRIPTION
+*  This function is not supported for the PMU module now.
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclPMU_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+
+	return STATUS_UNSUPPORTED;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclPMU_WriteData
+*
+* DESCRIPTION
+*  This function is not supported for the PMU module now.
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclPMU_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+
+	return STATUS_UNSUPPORTED;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclPMU_Configure
+*
+* DESCRIPTION
+*  This function is not supported for the PMU module now.
+*
+* PARAMETERS
+*	N/A
+*
+* RETURNS
+*	STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclPMU_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+
+	return STATUS_UNSUPPORTED;
+}
+
+/*************************************************************************
+* FUNCTION
+*  DclPMU_RegisterCallback
+*
+* DESCRIPTION
+*  This function is to set callback function for the PMU module.
+*
+* PARAMETERS
+*  handle: the returned handle value of DclPMU_Open
+*  event: Supported events:
+*         EVENT_PMU_TIMEOUT: Watch dog time out interrupt
+*  callback: the callback function for registered events
+*
+* RETURNS
+*  STATUS_OK: Successfully register the callback function.
+*  STATUS_INVALID_HANDLE: It's a invalid handle.
+*  STATUS_NOT_OPENED: The module has not been opened.
+*  STATUS_INVALID_EVENT: The event parameter is invalid.
+*  STATUS_UNSUPPORTED: The function is NOT supported
+*
+*************************************************************************/
+DCL_STATUS DclPMU_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+	return STATUS_UNSUPPORTED;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  DclPMU_Control
+*
+* DESCRIPTION
+*  This function is to send command to control the PMU module.
+*
+* PARAMETERS
+*  handle: The handle value returned from DclPMU_Open
+*  cmd: a control command for PMU module
+*       PMU38: Refer dcl_pmu38.c
+*
+*
+*  data: The data of the control command
+*        PMU38: Refer dcl_pmu38.c
+*
+*
+* RETURNS
+*  STATUS_OK: command is executed successfully.
+*  STATUS_FAIL: command is failed.
+*  STATUS_INVALID_CMD: It's a invalid command.
+*
+*************************************************************************/
+DCL_STATUS DclPMU_Control_Wrap(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data, PMIC_LOG_TYPE_ENUM type)
+{
+
+#if defined(DCL_PMIC_ACCESS_TIME_LOG)
+	DCL_STATUS pmu_control_status;
+	DCL_UINT32 duration_idx = pmic_access_duration_index[type];
+	DCL_UINT32 issue_idx = pmic_access_timing_issue_index[type];
+
+
+	if(type == PMIC_LOG_TYPE_NORMAL_DOMAIN)
+		kal_take_spinlock(dcl_pmic_control_spinlock, KAL_INFINITE_WAIT);
+
+	pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].start_time = ust_get_current_time();
+
+    pmu_control_status = pmu_control_handler(handle,cmd,data);
+
+    pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].end_time = ust_get_current_time();
+    pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].cmd = cmd;
+    pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].duration_time = ust_us_duration(pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].start_time, 																							  pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].end_time);
+
+    if(pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].duration_time > PMIC_ACCESS_DURATION_THRESHOLD)
+    {
+        pmic_access_timing_issue_log[type][issue_idx] = duration_idx;
+        issue_idx++;
+        issue_idx = issue_idx &(MAX_PMIC_DURATION_INFO_SIZE - 1);
+		pmic_access_timing_issue_index[type] = issue_idx;
+    }
+
+    duration_idx++;
+    duration_idx = duration_idx &(MAX_PMIC_DURATION_INFO_SIZE - 1);
+	pmic_access_duration_index[type] = duration_idx;
+
+	if(type == PMIC_LOG_TYPE_NORMAL_DOMAIN)
+		kal_give_spinlock(dcl_pmic_control_spinlock);
+
+	return pmu_control_status;
+
+#else
+	return pmu_control_handler(handle, cmd, data);
+#endif
+}
+
+DCL_STATUS DclPMU_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+	DCL_STATUS pmu_control_status;
+	
+	if (kal_get_current_domain() == KAL_DOMAIN_NORMAL)
+	{
+		pmu_control_status = DclPMU_Control_Wrap(handle, cmd, data, PMIC_LOG_TYPE_NORMAL_DOMAIN);
+	} else {  //HRT/CHRT domain
+		kal_atomic_inc(&dcl_pmic_hrt_flag);
+		pmu_control_status = DclPMU_Control_Wrap(handle, cmd, data, PMIC_LOG_TYPE_HRT_DOMAIN);
+		kal_atomic_dec(&dcl_pmic_hrt_flag);
+	}
+
+	return pmu_control_status;
+}
+/*************************************************************************
+* FUNCTION
+*  DclPMU_Close
+*
+* DESCRIPTION
+*  This function is to close the PMU module.
+*
+* PARAMETERS
+*  handle: the returned handle value of DclPMU_Open
+*
+* RETURNS
+*  STATUS_OK
+*
+*************************************************************************/
+DCL_STATUS DclPMU_Close(DCL_HANDLE handle)
+{
+	return STATUS_OK;
+}
+
+
+#else // DRV_PMIC_OFF
+DCL_STATUS DclPMU_Initialize(void)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_HANDLE DclPMU_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclPMU_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclPMU_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclPMU_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclPMU_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclPMU_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+DCL_STATUS DclPMU_Close(DCL_HANDLE handle)
+{
+    return STATUS_UNSUPPORTED;
+}
+
+#endif // DRV_PMIC_OFF
+
+