示例#1
0
void GPIO_WriteIO(unsigned int data, unsigned int pin)
{
    unsigned int no;
    unsigned int remainder;
    no = pin >>4;
    remainder = pin & 0xf ;
    if (data == 1)
        DRV_WriteReg16(GPIO_DOUT_SET(no),(1 << remainder));
    else
        DRV_WriteReg16(GPIO_DOUT_CLR(no),(1 << remainder));
}
void mtk_wdt_restart(void)
{
    // Reset WatchDogTimer's counting value to time out value
    // ie., keepalive()

    DRV_WriteReg16(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY);
}
示例#3
0
void MT6573_wdt_Restart(void)
{
	// Reset WatchDogTimer's counting value to default value
	// ie., keepalive()

	DRV_WriteReg16(MT6573_WDT_RESTART, MT6573_WDT_RESTART_KEY);
}
示例#4
0
void MT6573_wdt_ModeSelection(kal_bool en, kal_bool auto_rstart, kal_bool IRQ )
{
	unsigned short tmp;
    
	tmp = DRV_Reg16(MT6573_WDT_MODE);
	tmp |= MT6573_WDT_MODE_KEY;
	
	// Bit 0 : Whether enable watchdog or not
	if(en == KAL_TRUE)
		tmp |= MT6573_WDT_MODE_ENABLE;
	else
		tmp &= ~MT6573_WDT_MODE_ENABLE;
	
	// Bit 4 : Whether enable auto-restart or not for counting value
	if(auto_rstart == KAL_TRUE)
		tmp |= MT6573_WDT_MODE_AUTORST;
	else
		tmp &= ~MT6573_WDT_MODE_AUTORST;

	// Bit 3 : TRUE for generating Interrupt (False for generating Reset) when WDT timer reaches zero
	if(IRQ == KAL_TRUE)
		tmp |= MT6573_WDT_RESET_IRQ;
	else
		tmp &= ~MT6573_WDT_RESET_IRQ;

	DRV_WriteReg16(MT6573_WDT_MODE,tmp);
}
示例#5
0
static void mtk_wdt_reset(char mode)
{
    /* Watchdog Rest */
    unsigned short wdt_mode_val;
    DRV_WriteReg16(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY); 

    wdt_mode_val = DRV_Reg(MTK_WDT_MODE);
    /* clear autorestart bit: autoretart: 1, bypass power key, 0: not bypass power key */
    wdt_mode_val &=(~MTK_WDT_MODE_AUTO_RESTART);
    /* make sure WDT mode is hw reboot mode, can not config isr mode  */
    wdt_mode_val &=(~(MTK_WDT_MODE_IRQ|MTK_WDT_MODE_ENABLE));
    
    if(mode){ /* mode != 0 means by pass power key reboot, We using auto_restart bit as by pass power key flag */
        wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN|MTK_WDT_MODE_AUTO_RESTART);
        //DRV_WriteReg(MTK_WDT_MODE, wdt_mode_val);
        //DRV_WriteReg(MTK_WDT_MODE, (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN|MTK_WDT_MODE_AUTO_RESTART));
    }else{
         wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN);
         //DRV_WriteReg(MTK_WDT_MODE,wdt_mode_val); 
        //DRV_WriteReg(MTK_WDT_MODE, (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN));
    }
    DRV_WriteReg(MTK_WDT_MODE,wdt_mode_val);  
    //DRV_WriteReg(MTK_WDT_LENGTH, MTK_WDT_LENGTH_KEY);
    gpt_busy_wait_us(100);
    DRV_WriteReg(MTK_WDT_SWRST, MTK_WDT_SWRST_KEY);
}
示例#6
0
void uart_setbrg()
{
	unsigned int byte,speed;
	unsigned int highspeed;
	unsigned int quot, divisor, remainder;
	unsigned int uartclk;
	unsigned short data, high_speed_div, sample_count, sample_point;
	unsigned int tmp_div;

	speed = g_brg;
		
	uartclk = (unsigned int)(mt6575_get_bus_freq()*1000/4);
	if (speed <= 115200 ) {
		highspeed = 0;
		quot = 16;
	} else {
		highspeed = 3;
		quot = 1;
	}

	if (highspeed < 3) { /*0~2*/
		/* Set divisor DLL and DLH	*/			   
		divisor   =  uartclk / (quot * speed);
		remainder =  uartclk % (quot * speed);
		  
		if (remainder >= (quot / 2) * speed)
			divisor += 1;

		DRV_WriteReg16(UART_HIGHSPEED(g_uart),highspeed);
		byte = DRV_Reg32(UART_LCR(g_uart));	  /* DLAB start */
		DRV_WriteReg32( UART_LCR(g_uart),(byte | UART_LCR_DLAB));
		DRV_WriteReg32( UART_DLL(g_uart),(divisor & 0x00ff));
		DRV_WriteReg32( UART_DLH(g_uart),((divisor >> 8)&0x00ff));
		DRV_WriteReg32( UART_LCR(g_uart),byte);	  /* DLAB end */
	}
示例#7
0
void MT6573_sw_watchdog_reset(void)
{
    /* Watchdog Rest */
    DRV_WriteReg16(MT6573_WDT_RESTART, MT6573_WDT_RESTART_KEY); 
    DRV_WriteReg(MT6573_WDT_MODE, (MT6573_WDT_MODE_KEY|MT6573_WDT_MODE_EXTEN|MT6573_WDT_MODE_ENABLE));
    //DRV_WriteReg(MT6573_WDT_LENGTH, MT6573_WDT_LENGTH_KEY);
    DRV_WriteReg(MT6573_WDT_SWRST, MT6573_WDT_SWRST_KEY);
}
示例#8
0
void GPIO_InitIO(unsigned int dir, unsigned int pin)
{  
    unsigned int no,remainder;
    no = pin >>4;
    remainder = pin & 0xf;

    if (dir == OUTPUT)
    {   
        DRV_WriteReg16(GPIO_PULLEN_SET(no),(1 << remainder));
        DRV_WriteReg16(GPIO_DIR_SET(no),(1 << remainder));
    }
    else
    {   
        DRV_WriteReg16(GPIO_PULLEN_CLR(no),(1 << remainder));
        DRV_WriteReg16(GPIO_DIR_CLR(no),(1 << remainder));
    }
    I2C_DUMMY_DELAY(100);
}
示例#9
0
DRV_STATUS_CODE DRV_SD_Init(void)
{
#if (defined(__UBL__) || defined(__FUE__)) && defined(MT6256_S00)
    // enable GPIO for MSDC
    DRV_WriteReg16(0x701D0610, 0x1110);
    DRV_WriteReg16(0x701D0620, 0x0111);
    // enable GPT3
    DRV_WriteReg32(0x7007001C, 1);
#endif

#if !defined(DCL_MSDC_INTERFACE)
	MSDC_Initialize();
#else
	DclSD_Initialize();
#endif//!defined(DCL_MSDC_INTERFACE)

    return DRV_SUCCESS;
}
示例#10
0
void MT6573_wdt_SetTimeOutValue(unsigned short value)
{
	/*
	 * TimeOut = BitField 15:5
	 * Key	   = BitField  4:0 = 0x08
	 */
	
	// sec * 32768 / 512 = sec * 64 = sec * 1 << 6
	timeout = (unsigned short)(value * ( 1 << 6) );
	timeout = timeout << 5; 
	DRV_WriteReg16(MT6573_WDT_LENGTH, (timeout | MT6573_WDT_LENGTH_KEY) );	
}
void mtk_wdt_set_time_out_value(UINT16 value)
{
    /*
    * TimeOut = BitField 15:5
    * Key      = BitField  4:0 = 0x08
    */

    // sec * 32768 / 512 = sec * 64 = sec * 1 << 6
    timeout = (unsigned short)(value * ( 1 << 6) );
    timeout = timeout << 5; 
    DRV_WriteReg16(MTK_WDT_LENGTH, (timeout | MTK_WDT_LENGTH_KEY) );  
}
static void mtk_wdt_mode_config(BOOL debug_en, 
                         BOOL irq, 
                         BOOL ext_en, 
                         BOOL ext_pol, 
                         BOOL wdt_en )
{
    unsigned short tmp;

    tmp = DRV_Reg16(MTK_WDT_MODE);
    tmp |= MTK_WDT_MODE_KEY;

    // Bit 0 : Whether enable watchdog or not
    if(wdt_en == TRUE)
        tmp |= MTK_WDT_MODE_ENABLE;
    else
        tmp &= ~MTK_WDT_MODE_ENABLE;

    // Bit 1 : Configure extern reset signal polarity.
    if(ext_pol == TRUE)
        tmp |= MTK_WDT_MODE_EXT_POL;
    else
        tmp &= ~MTK_WDT_MODE_EXT_POL;

    // Bit 2 : Whether enable external reset signal
    if(ext_en == TRUE)
        tmp |= MTK_WDT_MODE_EXTEN;
    else
        tmp &= ~MTK_WDT_MODE_EXTEN;

    // Bit 3 : Whether generating interrupt instead of reset signal
    if(irq == TRUE)
        tmp |= MTK_WDT_MODE_IRQ;
    else
        tmp &= ~MTK_WDT_MODE_IRQ;

    // Bit 6 : Whether enable debug module reset
    if(debug_en == TRUE)
        tmp |= MTK_WDT_MODE_DEBUG_EN;
    else
        tmp &= ~MTK_WDT_MODE_DEBUG_EN;

    DRV_WriteReg16(MTK_WDT_MODE,tmp);
}
static void mtk_wdt_reset(char mode)
{
    /* Watchdog Rest */
    unsigned short wdt_mode_val;
    DRV_WriteReg16(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY); 

    wdt_mode_val = DRV_Reg(MTK_WDT_MODE);
    if(mode){ /* mode != 0 means by pass power key reboot, We using auto_restart bit as by pass power key flag */
        wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN|MTK_WDT_MODE_AUTO_RESTART);
        DRV_WriteReg(MTK_WDT_MODE, wdt_mode_val);
        //DRV_WriteReg(MTK_WDT_MODE, (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN|MTK_WDT_MODE_AUTO_RESTART));
    }else{
         wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN);
         DRV_WriteReg(MTK_WDT_MODE,wdt_mode_val); 
        //DRV_WriteReg(MTK_WDT_MODE, (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN));
    }
    //DRV_WriteReg(MTK_WDT_LENGTH, MTK_WDT_LENGTH_KEY);
    gpt_busy_wait_us(100);
    DRV_WriteReg(MTK_WDT_SWRST, MTK_WDT_SWRST_KEY);
}
示例#14
0
PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData)
{
#if !defined(NO_HARDWARE)
	SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;

	
	if (atomic_read(&psSysSpecData->sSGXClocksEnabled) != 0)
	{
		return PVRSRV_OK;
	}

	PVR_DPF((PVR_DBG_MESSAGE, "EnableSGXClocks: Enabling SGX Clocks"));

#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) && defined(CONFIG_PM_RUNTIME)
	{
		
		int res = pm_runtime_get_sync(&gpsPVRLDMDev->dev);
		if (res < 0)
		{
			PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: pm_runtime_get_sync failed (%d)", -res));
			return PVRSRV_ERROR_UNABLE_TO_ENABLE_CLOCK;
		}
	}
#endif


	//disable_clock(MT65XX_PDN_MM_MFG_HALF, "MFG");
	//disable_clock(MT65XX_PDN_MM_MFG, "MFG");
	//disable_clock(MT65XX_PDN_MM_G3D, "MFG");

#if USE_SYS_CLOCK
    #if !defined(MTK_CLK_CTRL)
	DRV_WriteReg16(PLL_CON11, DRV_Reg16(PLL_CON11)|0x0C00); // F3D_CK_SEL
    #endif
	DRV_WriteReg32(MMSYS2_CONFG_BASE + 0x0504, 0x4); // MFG_CORE_CK_SEL DCM
#else
    #if !defined(MTK_CLK_CTRL)
	DRV_WriteReg16(PLL_CON11, DRV_Reg16(PLL_CON11)|0x0C00); // F3D_CK_SEL
    #endif
	DRV_WriteReg32(MMSYS2_CONFG_BASE + 0x0504, 0x6); // MFG_CORE_CK_SEL DCM
#endif

	//DRV_WriteReg32(MMSYS2_CONFG_BASE+0x400, DRV_Reg32(MMSYS2_CONFG_BASE+0x400)|0x4);
	enable_clock(MT65XX_PDN_MM_G3D, "MFG");
	enable_clock(MT65XX_PDN_MM_MFG, "MFG");
	enable_clock(MT65XX_PDN_MM_MFG_HALF, "MFG");
	DRV_WriteReg32(MMSYS2_CONFG_BASE+0x400, DRV_Reg32(MMSYS2_CONFG_BASE+0x400)|0x4);


#if defined(MTK_USE_GDC)
	SysInitGDC();
#endif

#if 0
	DRV_WriteReg16(0xF0007404, 0x6);
	DRV_WriteReg16(0xF0007400, 0x4800);
	DRV_WriteReg16(0xF0007400, 0x0800);
	DRV_WriteReg16(0xF0007400, 0x8800);
	while(DRV_Reg16(0xF0007404) & 0x8000){}
	PVRSRVReleasePrintf("MainPLL: 0x%x", DRV_Reg16(0xF0007410));

	DRV_WriteReg16(0xF0007404, 0x15);
	DRV_WriteReg16(0xF0007400, 0x4800);
	DRV_WriteReg16(0xF0007400, 0x0800);
	DRV_WriteReg16(0xF0007400, 0x8800);
	while(DRV_Reg16(0xF0007404) & 0x8000){}
	PVRSRVReleasePrintf("MEMPLL: 0x%x", DRV_Reg16(0xF0007410));
#endif

	SysEnableSGXInterrupts(psSysData);

	atomic_set(&psSysSpecData->sSGXClocksEnabled, 1);

#else	
	PVR_UNREFERENCED_PARAMETER(psSysData);
#endif
	return PVRSRV_OK;
}
示例#15
0
kal_uint16 mtk_cpe_one_shot_handler(kal_uint16 path1, kal_uint16 path2, kal_uint16 path3)
{
    kal_uint16 count, try_count, ret;
    
    DRV_WriteReg16(CA9_ROSC_CON0, 0x8);  // reset the overflow bit of CA9 frequency meter
    DRV_WriteReg16(CA9_ROSC_CON0, 0x4);  // reset the circuit of CA9 frequency meter
    
    DRV_WriteReg16(CA9_ROSC_MON_CTRL_0, 0x0);   // switch back to CA9 control
    
    DRV_WriteReg16(CA9_ROSC_CON3, path1);  // CA9 ROSC delay path selection [15:0]
    DRV_WriteReg16(CA9_ROSC_CON4, path2);  // CA9 ROSC delay path selection [31:16]
    DRV_WriteReg16(CA9_ROSC_CON5, path3);  // CA9 ROSC delay path selection [47:32]
    
    ret = DRV_Reg16(CA9_ROSC_CON6); // CA9 ROSC toggle count during window is high
    cpe_dprintk("[before toggling] the CA9 frequency meter value is %d\n", ret);
    
    DRV_WriteReg16(CA9_ROSC_CON0, 0x5);  // enable ROSC to start
    
    DRV_WriteReg16(CA9_ROSC_CON1, 0x44); // frequency meter window duration
    DRV_WriteReg16(CA9_ROSC_CON2, 0x1);  // frequency meter clock divider
    
    DRV_WriteReg16(CA9_ROSC_CON0, 0x7);  // reload window duration, enable ROSC to start and start to count
    
    try_count = 5;
    ret = DRV_Reg16(CA9_ROSC_CON6); // CA9 ROSC toggle count during window is high
    while (ret == 0 && try_count--)
    {
        ret = DRV_Reg16(CA9_ROSC_CON6); // CA9 ROSC toggle count during window is high
        udelay(10);
    }
    
    try_count = 5;
    while (try_count--)
    {
        while (1)
        {
            ret = DRV_Reg16(CA9_ROSC_CON6); // CA9 ROSC toggle count during window is high
            udelay(10);
            
            if (ret == DRV_Reg16(CA9_ROSC_CON6)) break;
        }
        
        ret = DRV_Reg16(CA9_ROSC_CON_STATUS);
        if ((ret & CA9_FQMTR_BUSY) == 0)
        {
            break;
        }
        else
        {
            udelay(10);
        }
    }
    
    ret = DRV_Reg16(CA9_ROSC_CON_STATUS);
    if ((ret & CA9_FQMTR_OVERFLOW) == CA9_FQMTR_OVERFLOW)
        cpe_dprintk("overflow condition occurred\n");
    
    count = DRV_Reg16(CA9_ROSC_CON6); // CA9 ROSC toggle count during window is high
    cpe_dprintk("[after  toggling] the CA9 frequency meter value is %d\n", count);
    
    DRV_WriteReg16(CA9_ROSC_MON_CTRL_0, 0x0);   // switch back to CA9 control
    
    DRV_WriteReg16(CA9_ROSC_CON0, 0x8);  // disable ROSC and reset the overflow bit of CA9 frequency meter
    DRV_WriteReg16(CA9_ROSC_CON0, 0x4);  // reset the circuit of CA9 frequency meter
    
    return count;
}
示例#16
0
int mtk_pmic_dvfs_wrapper_test(int loop_count)
{
    int i = 0, try_count = 0, ap_dvfs_con = 0;
    //PWRAPFUC();
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR0, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR1, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR2, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR3, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR4, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR5, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR6, 0x021A);
    DRV_WriteReg16(PMIC_WRAP_DVFS_ADR7, 0x021A);

    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA0, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA1, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA2, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA3, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA4, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA5, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA6, 0x58);
    DRV_WriteReg16(PMIC_WRAP_DVFS_WDATA7, 0x58);

    while (loop_count--)
    {
        for (i = 0; i < 8; i++)
        {
            ap_dvfs_con = DRV_Reg32(AP_DVFS_CON_SET);
            DRV_WriteReg32(AP_DVFS_CON_SET, (ap_dvfs_con & ~(0x7)) | i);

            while ((DRV_Reg32(AP_DVFS_CON_SET) & 0x80000000) == 0)
            {
                try_count++;

                if (try_count >= MAX_RETRY_COUNT)
                {

    switch ( raw_smp_processor_id())
				  {
      case 0:
				    g_spm_fail_cpu0++;
        break;
      case 1:
			        g_spm_fail_cpu1++;
        break;
      case 2:
        g_spm_fail_cpu2++;
        break;
      case 3:
        g_spm_fail_cpu3++;
        break;
      default:
        break;
				  }
                    //PWRAPLOG("FAIL: no response from PMIC wrapper\n");
                    return -1;
                }

                //PWRAPLOG("wait for PMIC response an ACK signal, retry count = %d\n", try_count);
                msleep(10);
            }
            try_count = 0;
        }
    }

    switch ( raw_smp_processor_id())
				{
      case 0:
				  g_spm_pass_cpu0++;
        break;
      case 1:
			      g_spm_pass_cpu1++;
        break;
      case 2:
        g_spm_pass_cpu2++;
        break;
      case 3:
        g_spm_pass_cpu3++;
        break;
      default:
        break;
				}
    //PWRAPLOG("PASS: PMIC DVFS Wrapper stress pass\n");
    return 0;
}