ide: pdc202xx_new PLL input clock fix
[linux-2.6.git] / drivers / ide / pci / pdc202xx_new.c
index cc0bfdc..0765dce 100644 (file)
@@ -306,11 +306,13 @@ static long __devinit read_counter(u32 dma_base)
  */
 static long __devinit detect_pll_input_clock(unsigned long dma_base)
 {
+       struct timeval start_time, end_time;
        long start_count, end_count;
-       long pll_input;
+       long pll_input, usec_elapsed;
        u8 scr1;
 
        start_count = read_counter(dma_base);
+       do_gettimeofday(&start_time);
 
        /* Start the test mode */
        outb(0x01, dma_base + 0x01);
@@ -322,6 +324,7 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base)
        mdelay(10);
 
        end_count = read_counter(dma_base);
+       do_gettimeofday(&end_time);
 
        /* Stop the test mode */
        outb(0x01, dma_base + 0x01);
@@ -333,7 +336,10 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base)
         * Calculate the input clock in Hz
         * (the clock counter is 30 bit wide and counts down)
         */
-       pll_input = ((start_count - end_count) & 0x3ffffff) * 100;
+       usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 +
+               (end_time.tv_usec - start_time.tv_usec);
+       pll_input = ((start_count - end_count) & 0x3ffffff) / 10 *
+               (10000000 / usec_elapsed);
 
        DBG("start[%ld] end[%ld]\n", start_count, end_count);