blob: 096b4048e1d5193695ce5e6b2c31c6136d913f63 [file] [log] [blame]
/*****************************************************************************
* 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:
* ---------
* drv_gpt.c
*
* Project:
* --------
* TATAKA
*
* Description:
* ------------
* Low level GPT driver
*
* Author:
* -------
* -------
*
* ==========================================================================
* $Log$
*
* 07 02 2019 yaoyong.ju
* [MOLY00418290] [VMOLY]Remove IRQ_Register_LISR() and IRQSensitivity() From IRQ Initialization Source Code
* .Remove IRQ_Restier_LISR and IRQSensitivity API in GPT
*
* 04 26 2019 yaoyong.ju
* [MOLY00399544] [MT6297][Apollo][PreSQC][MP0.5][HQ][MTBF][Lab][Ericsson][ErrorTimes:1][1][core2,vpe1,tc2(vpe7)]Assert fail: drv_gpt.c 287 - (LISR)GPT_DSCC0_Lisr for
* .
* 1.Remove the debug info
* 2.Remove unused code
*
* 03 25 2019 yaoyong.ju
* [MOLY00390408] [MT6297][Apollo][PreSQC][MP0.5][NVIOT][Nokia][Oulu][4G][Overnight]: Assert fail: nicc_ctrl.c 317 - USBCORE
* .Add the debug info for the MOLY
*
* 05 04 2017 way.chen
* [MOLY00246761] [UMOLYA] Replace PDN API with OF API, Request by PDN owner(Devin )
* Remove 26M on/off API.
*
* 07 06 2016 way.chen
* [MOLY00185478] [UMOLYA] Check in 93 serial GPT driver
* Add 26M clock operation.
*
* 06 20 2016 way.chen
* [MOLY00185478] [UMOLYA] Check in 93 serial GPT driver
* Check in 93 GPT driver.
*
* 01 06 2016 way.chen
* [MOLY00156138] [UMOLY] Patch GPT driver for U4G FPGA
* Patch GPT Driver for U4G FPGA, the FPGA Start Version is 20151231_u4g_ltel2_elbrus_vivado_2015.
*
* 12 10 2013 chin-chieh.hung
* [MOLY00049464] [Driver][GPT] Add debug GPT, request by MS Lin
* Add Debug GPT APIs
*
* 08 26 2013 chin-chieh.hung
* [MOLY00011352] [Driver] Update for common devdrv driver
* remove compiling warning
*
* 07 03 2013 chin-chieh.hung
* [MOLY00027330] [ARM7toMOLY] ARM7 Build/SYSGEN/Functions Update to TRUNK
* .
*
* 05 13 2013 chin-chieh.hung
* [MOLY00013348] [MT6290 Bring-up] Basic Platform Support
* MT6290E1_FristCall Branch sync back to MOLY Trunk
*
* 04 28 2013 chin-chieh.hung
* [MOLY00013021] [MT6290 PO admit] Move the LISR context to HISR context
* LISR 2 HISR support, driver part
*
* 04 23 2013 chin-chieh.hung
* [MOLY00013021] [MT6290 PO admit] Move the LISR context to HISR context
* MOLY LISR2HISR, Driver part
****************************************************************************/
#include "drv_features_gpt.h"
#include "drv_comm.h"
#include "drv_gpt.h"
#include "intrCtrl.h"
#include "dcl.h"
#include "kal_general_types.h"
#include "kal_public_api.h"
#include "sync_data.h"
#if !defined(DRV_GPT_OFF)
/*****************************************************************************
* SYMBOL Definition *
*****************************************************************************/
/*****************************************************************************
* Global/External Variable *
*****************************************************************************/
static PFN_DCL_CALLBACK pfHGPTCallback[DRV_GPT_TOTAL_COUNTER];
static DCL_EVENT eHGPTEvent[DRV_GPT_TOTAL_COUNTER];
/*****************************************************************************
* function declaration *
*****************************************************************************/
//function declaration.
/*****************************************************************************
* LISR/HISR/Callback Functions *
*****************************************************************************/
static void drv_default_callback(DCL_EVENT event)
{
kal_uint32 ASSERT_IN_GPT_DEFAULT_CALLBACK = 0;
ASSERT(ASSERT_IN_GPT_DEFAULT_CALLBACK);
return;
}
/*****************************************************************************
* Basic Driver Implementation *
*****************************************************************************/
/*-----------------------------------------------------------------------*
* FUNCTION
* drv_gpt_lisr
*
* DESCRIPTION
* GPT interrupt handler (LISR)
*
* CALLS
* It is called when GPT interrupt is coming
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*------------------------------------------------------------------------*/
void drv_gpt_lisr(kal_uint32 v)
{
ASSERT(MDGPT_INTR_ID(DRV_GPT_BASE_COUNTER_NUM) <= v && v <= MDGPT_INTR_ID(DRV_GPT_TOTAL_COUNTER));
pfHGPTCallback[MDGPT_INTR_ID2TIMER(v)-1](eHGPTEvent[MDGPT_INTR_ID2TIMER(v)-1]);
}
/*-----------------------------------------------------------------------*
* FUNCTION
* drv_gpt_reset
*
* DESCRIPTION
* This function is to reset the hardware GPT module.
*
* PARAMETERS
* None
*
* RETURNS
* DCL_STATUS_OK
*
*------------------------------------------------------------------------*/
void drv_gpt_reset(void)
{
kal_uint32 i;
for(i = DRV_GPT_BASE_COUNTER_NUM; i <= DRV_GPT_TOTAL_COUNTER; i++)
{
DRV_WriteReg32(MDGPT_CTRL_REG(i), 0);
DRV_WriteReg32(MDGPT_CNT_REG(i), 0xFFFFF);
DRV_WriteReg32(MDGPT_PSR_REG(i), 0);
IRQClearInt(MDGPT_INTR_ID(i));
pfHGPTCallback[i-1] = drv_default_callback;
//IRQUnmask(MDGPT_INTR_ID(i));
}
}
/*-----------------------------------------------------------------------*
* FUNCTION
* drv_gpt_set_timer
*
* DESCRIPTION
* This function is to configure the gpt timer.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
*------------------------------------------------------------------------*/
void drv_gpt_set_timer(kal_uint32 num, kal_uint32 time, kal_uint32 mode)
{
ASSERT( (DRV_GPT_BASE_COUNTER_NUM <= num) && (num <= DRV_GPT_TOTAL_COUNTER) && (time <= 0xFFFFFFFUL) );
DRV_WriteReg32(MDGPT_CNT_REG(num), time);
mode &= MDGPT_CTRL_MODE_REPEAT | MDGPT_CTRL_MODE_ONESHOT;
DRV_WriteReg32_NPW(MDGPT_CTRL_REG(num), mode); //1<<1 enable timer
}
/*-----------------------------------------------------------------------*
* FUNCTION
* drv_gpt_get_data
*
* DESCRIPTION
* This function is to get the current data value.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
*------------------------------------------------------------------------*/
kal_uint32 drv_gpt_get_data(kal_uint32 num)
{
ASSERT( (DRV_GPT_BASE_COUNTER_NUM <= num) && (num <= DRV_GPT_TOTAL_COUNTER));
return DRV_Reg32(MDGPT_DATA_REG(num));
}
void drv_gpt_set_data(kal_uint32 num, kal_uint32 time)
{
ASSERT( (DRV_GPT_BASE_COUNTER_NUM <= num) && (num <= DRV_GPT_TOTAL_COUNTER) && (time <= 0xFFFFFFFUL) );
DRV_WriteReg32(MDGPT_CNT_REG(num), time);
}
/*-----------------------------------------------------------------------*
* FUNCTION
* drv_gpt_start_timer
*
* DESCRIPTION
* This function is to start the gpt timer.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
*------------------------------------------------------------------------*/
void drv_gpt_start_timer(kal_uint32 num)
{
unsigned int timer_status;
ASSERT( (num >= DRV_GPT_BASE_COUNTER_NUM) && (DRV_GPT_TOTAL_COUNTER >= num) );
timer_status = DRV_Reg32(MDGPT_CTRL_REG(num));
if( timer_status & MDGPT_CTRL_MODE_ENABLE ){
//ASSERT(0);
return;
}
DRV_WriteReg32_NPW(MDGPT_CTRL_REG(num), timer_status | MDGPT_CTRL_MODE_ENABLE);
Data_Sync_Barrier();
}
/*-----------------------------------------------------------------------*
* FUNCTION
* drv_gpt_stop_timer
*
* DESCRIPTION
* This function is to start the gpt timer.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
*------------------------------------------------------------------------*/
void drv_gpt_stop_timer(kal_uint32 num)
{
unsigned int timer_status;
ASSERT( (num >= DRV_GPT_BASE_COUNTER_NUM) && (DRV_GPT_TOTAL_COUNTER >= num) );
timer_status = DRV_Reg32(MDGPT_CTRL_REG(num));
DRV_WriteReg32_NPW(MDGPT_CTRL_REG(num), timer_status & (~MDGPT_CTRL_MODE_ENABLE));
Data_Sync_Barrier();
}
kal_uint32 drv_gpt_get_version(void)
{
return DRV_Reg32(MDGPT_BASE);
}
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
#else /*!defined(DRV_GPT_OFF)*/
#endif /*!defined(DRV_GPT_OFF)*/
void startSystemTimer(void){
IRQUnmask(MDGPT_INTR_ID(DRV_GPT_SYSTEM_TIMER));
drv_gpt_start_timer(DRV_GPT_SYSTEM_TIMER);
}