Re: Timer Interrupt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 17 Jan 2006, Kevin D. Kissell wrote:

> You were on the right track when you tried hacking mips_timer_ack(),
> but note that both cycles_per_jiffy and mips_hpt_frequency end up
> being used in Count-based time calculations.

I fixed the CPU Clock down and Timer interrupt problem like this:

static void c0_timer_ack(void)
{
  int count;
 /* Bharathi: To maintain the Timer in clock down mode.
  * cpu_clk_change is set by PMU Driver */

 if(test_and_clear_bit(0, &cpu_clk_change))
 {
   READ_REG( PMU_CLKMODE, cpu_clk_div);
   /* Divide the orginal timer count */
   my_cycles_per_jiffy = cycles_per_jiffy >> (cpu_clk_divA);
 }
 /* Ack this timer interrupt and set the next one. */
 expirelo += my_cycles_per_jiffy;
 write_c0_compare(expirelo);

 /* Check to see if we have missed any timer interrupts. */
 count = read_c0_count();

 if ((count - expirelo) < 0x7fffffff) {
    expirelo = count + my_cycles_per_jiffy;
    write_c0_compare(expirelo);
 }
}

NOTE:

0. cpu_clk_change is global, static and exported to access in PMU Drv.

1. In time_init(), set my_cycles_per_jiffy = cycles_per_jiffy to
   handle initial state.

2. If needed, Change the SDRAM Refresh Rate during clk dwn.

3. Force few uSec delay after clock-up for smooth & stable transition.

4. I am NOT an expert in Kernel/MIPS. Feel free to correct me.

Kindly CC me.

Thanks :)
-- 
Bharathi S



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux