/************************************************************************ * FUNCTION * start_om_hard_timer * DESCRIPTION * start hard timer * INPUTS * value -- timer's value.uint is 32K cycle * OUTPUTS * NONE *************************************************************************/ int start_om_hard_timer(unsigned int value) { volatile unsigned int tmp_val = 0; unsigned long timer1_addr = 0; if(TIMER_UNINITED == g_om_timer_inited) { printk("%s: om hardware timer uninitialized\n",__func__); return -1; } timer1_addr = timer1_base; /*停止timer*/ tmp_val = readl(SOC_TIMER_TIMERN_CONTROL_ADDR(timer1_addr, OSA_TIMER_INDEX)); tmp_val = (tmp_val & TIMER_DEF_TC_ENABLE_BIT_MSK) | TIMER_DEF_TC_DISABLE; writel(tmp_val, SOC_TIMER_TIMERN_CONTROL_ADDR(timer1_addr, OSA_TIMER_INDEX)); /*将超时值配置到timer load寄存器*/ writel(value, SOC_TIMER_TIMERN_LOAD_ADDR(timer1_addr, OSA_TIMER_INDEX)); /*启动timer*/ writel(TIMER_INT_CLEAR, SOC_TIMER_TIMERN_INTCLR_ADDR(timer1_addr, OSA_TIMER_INDEX));/* clear timer int*/ tmp_val = (tmp_val & TIMER_DEF_TC_ENABLE_BIT_MSK) | TIMER_DEF_TC_ENABLE; tmp_val = (tmp_val & TIMER_DEF_TC_INT_BIT_MSK)| TIMER_DEF_TC_INTENABLE; writel(tmp_val, SOC_TIMER_TIMERN_CONTROL_ADDR(timer1_addr, OSA_TIMER_INDEX)); return 0; }
/************************************************************************ * FUNCTION * stop_om_hard_timer * DESCRIPTION * Stop hard timer * INPUTS * NONE * OUTPUTS * NONE *************************************************************************/ int stop_om_hard_timer(void) { volatile unsigned int value = 0; unsigned long timer1_addr = 0; if(TIMER_UNINITED == g_om_timer_inited) { printk("%s: om hardware timer uninitialized\n",__func__); return -1; } timer1_addr = timer1_base; value = readl(SOC_TIMER_TIMERN_CONTROL_ADDR(timer1_addr, OSA_TIMER_INDEX)); value = (value & TIMER_DEF_TC_ENABLE_BIT_MSK) | TIMER_DEF_TC_DISABLE; value = (value & TIMER_DEF_TC_INT_BIT_MSK) | TIMER_DEF_TC_INTDISABLE; writel(value, SOC_TIMER_TIMERN_CONTROL_ADDR(timer1_addr, OSA_TIMER_INDEX)); return 0; }
/***************************************************************************** 函 数 名 : pwrctrl_test_time_set 功能描述 : 睡眠压力测试函数 输入参数 : 无 输出参数 : 无 返 回 值 : RET_OK 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年8月31日 作 者 : 刘永富 56193 修改内容 : 新生成函数 *****************************************************************************/ s32_t pwrctrl_test_time_set(u32_t time) { #if 0 /*after acpu softtimer ready, should be deleted*/ /*注册硬件定时器中断*/ setup_irq ( PWRCTRL_ACPU_TST_TIMER_INT_ID, &pwrctrl_tst_timer_irq); /*配置timer参数*/ pwrctrl_write_reg32(SOC_TIMER_TIMERN_LOAD_ADDR(SOC_Timer4_BASE_ADDR,1),time); pwrctrl_write_reg32(SOC_TIMER_TIMERN_CONTROL_ADDR(SOC_Timer4_BASE_ADDR,1),PWCTRL_ACPU_TST_TIMER_CTRL); #endif return RET_OK; }
/***************************************************************************** 函 数 名 : init_om_hardware_timer 功能描述 : 初始化OM使用的timer 输入参数 : 无 输出参数 : 无 返 回 值 : int 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年9月7日 作 者 : 王振伟 176398 修改内容 : 新生成函数 *****************************************************************************/ int __init init_om_hardware_timer(void) { volatile unsigned int tmp_val = 0; unsigned long timer1_addr = 0; unsigned long sctrl_addr = HISI_VA_ADDRESS(SOC_AO_SCTRL_BASE_ADDR); timer1_base = (unsigned long)ioremap(OSA_TIMER_REG_BASE, OSA_TIMER_REG_SIZE); if (!timer1_base) { printk(KERN_ERR "timer1 reg ioremap error.\n"); return -1; } timer1_addr = timer1_base; /*对系统控制器的操作,使用spin_lock锁住*/ spin_lock(&g_sysctrl_lock); /*选择32K时钟*/ tmp_val = readl(SOC_AO_SCTRL_SC_TIMER_EN0_ADDR(sctrl_addr)); tmp_val = (tmp_val & SC_TIMER_EN0_MSK_TIMER1_0_MSK) | (TIMER_32K << SC_TIMER_EN0_MSK_TIMER1_0_START_BIT); /* DTS2013012804205 lkf71598 2013-3-4 */ tmp_val = (tmp_val & SC_TIMER_EN0_TIMER1_0_MSK) | (TIMER_32K << SC_TIMER_EN0_TIMER1_0_START_BIT); writel(tmp_val, SOC_AO_SCTRL_SC_TIMER_EN0_ADDR(sctrl_addr)); /*释放中断互斥*/ spin_unlock(&g_sysctrl_lock); /*初始化timer*/ tmp_val = TIMER_DEF_TC_DISABLE | TIMER_DEF_TC_PERIODIC | TIMER_DEF_TC_INTDISABLE |\ TIMER_DEF_TC_CLK_DIV_1 | TIMER_DEF_TC_32BITS_MODE; tmp_val = (tmp_val & TIMER_DEF_TC_ONESHOT_MODE_BIT_MSK) | TIMER_DEF_TC_ONCE_MODE; writel(tmp_val, SOC_TIMER_TIMERN_CONTROL_ADDR(timer1_addr, OSA_TIMER_INDEX)); g_om_timer_inited = TIMER_INITED; return 0; }