void __init edison_init_timer(void) { #if 1 //calculate mult and shift for sched_clock u32 shift,mult; #endif #ifdef CONFIG_MSTAR_EDISON_BD_FPGA GLB_TIMER_FREQ_KHZ= 24*1000 ; // PERIPHCLK = CPU Clock / 2, // div 2 later,when CONFIG_GENERIC_CLOCKEVENTS // clock event will handle this value //clock event will handle this value #else GLB_TIMER_FREQ_KHZ=(query_frequency()*1000/2); // PERIPHCLK = CPU Clock / 2 // div 2 later,when CONFIG_GENERIC_CLOCKEVENTS // clock event will handle this value #endif printk("Global Timer Frequency = %d MHz\n",GLB_TIMER_FREQ_KHZ/1000); printk("CPU Clock Frequency = %d MHz\n",query_frequency()); #ifdef CONFIG_HAVE_SCHED_CLOCK #if 1 //calculate mult and shift for sched_clock clocks_calc_mult_shift(&mult, &shift, (u32)(GLB_TIMER_FREQ_KHZ*1000), NSEC_PER_SEC,0); printk("fre = %d, mult= %u, shift= %u\n",(GLB_TIMER_FREQ_KHZ*1000),mult,shift); SC_SHIFT=shift; SC_MULT=mult; #endif mstar_sched_clock_init((void __iomem *)(PERI_VIRT+0x200), (unsigned long)(GLB_TIMER_FREQ_KHZ*1000)); #endif #ifdef CONFIG_GENERIC_CLOCKEVENTS //mstar_local_timer_init(((void __iomem *)PERI_ADDRESS(PERI_PHYS+0x600))); //private_timer base edison_clocksource_init(EDISON_BASE_REG_TIMER1_PA); edison_clockevents_init(INT_WDT_IRQ); #else setup_irq(E_FIQ_EXTIMER0 , &edison_timer_irq); //enable timer interrupt SETREG16(EDISON_BASE_REG_TIMER0_PA,TIMER_INTERRUPT); //set interval interval = ( 12*1000*1000 ) / HZ ; OUTREG16(EDISON_BASE_REG_TIMER0_PA + ADDR_TIMER_MAX_LOW, (interval & 0xffff)); OUTREG16(EDISON_BASE_REG_TIMER0_PA + ADDR_TIMER_MAX_HIGH, (interval >>16)); //trig timer0 SETREG16(EDISON_BASE_REG_TIMER0_PA, TIMER_TRIG); #endif }
performance_timer() : start_(0) , finish_(0) { query_frequency(); start(); }
void __init chip_init_ptimer(void){ unsigned long interval,temp; /* set up interrupt controller attributes for the timer interrupt */ #ifdef CONFIG_MSTAR_ARM_BD_FPGA GLB_TIMER_FREQ_KHZ= 24*1000/2 ; // PERIPHCLK = CPU Clock / 2 #else GLB_TIMER_FREQ_KHZ=(query_frequency()*1000)/ 2; // PERIPHCLK = CPU Clock / 2 #endif printk("CPU Clock Frequency = %d MHz\n",GLB_TIMER_FREQ_KHZ*2/1000); //clear timer event flag PERI_W(PT_STATUS,FLAG_EVENT); //set timer interrupt interval interval = ( GLB_TIMER_FREQ_KHZ * 1000 / HZ ); PERI_W(PT_LOADER,interval); //Interrupt Set Enable Register temp=PERI_R(GIC_DIST_SET_EANBLE); temp= temp | (0x1 << INT_ID_PTIMER); PERI_W(GIC_DIST_SET_EANBLE,temp); //setup timer IRQ setup_irq(INT_ID_PTIMER, &chip_ptimer_irq); //set AUTO Reload & Timer Interrupt //PERI_W(PT_CONTROL,(FLAG_IT_ENABLE | FLAG_AUTO_RELOAD)); //start timer PERI_W(PT_CONTROL,(FLAG_TIMER_PRESCALAR | FLAG_IT_ENABLE | FLAG_AUTO_RELOAD| FLAG_TIMER_ENABLE)); }