neofb: simplify clock calculation
authorKrzysztof Helt <krzysztof.h1@wp.pl>
Thu, 24 Jul 2008 04:31:44 +0000 (21:31 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 24 Jul 2008 17:47:41 +0000 (10:47 -0700)
There is nothing to gain by converting value in kHz to fixed point MHz.
Just calculate everything in kHz.

A reorder of the loop allows reducing number of iterations (check if
frequency is not too high already).

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/neofb.c

index 5246b0402d76ce7bedd9504c460b34a36bcca9b2..b033e5a4dc863d0548ef8bc0631eaba0167cd678 100644 (file)
@@ -201,7 +201,6 @@ static int neoFindMode(int xres, int yres, int depth)
  *
  * Determine the closest clock frequency to the one requested.
  */
-#define REF_FREQ 0xe517                /* 14.31818 in 20.12 fixed point */
 #define MAX_N 127
 #define MAX_D 31
 #define MAX_F 1
@@ -211,27 +210,24 @@ static void neoCalcVCLK(const struct fb_info *info,
 {
        int n, d, f;
        int n_best = 0, d_best = 0, f_best = 0;
-       long f_best_diff = (0x7ffff << 12);     /* 20.12 */
-       long f_target = (freq << 12) / 1000;    /* 20.12 */
+       long f_best_diff = 0x7ffff;
 
        for (f = 0; f <= MAX_F; f++)
-               for (n = 0; n <= MAX_N; n++)
-                       for (d = 0; d <= MAX_D; d++) {
-                               long f_out;     /* 20.12 */
-                               long f_diff;    /* 20.12 */
-
-                               f_out =
-                                   ((((n + 1) << 12) / ((d +
-                                                         1) *
-                                                        (1 << f))) >> 12)
-                                   * REF_FREQ;
-                               f_diff = abs(f_out - f_target);
-                               if (f_diff < f_best_diff) {
+               for (d = 0; d <= MAX_D; d++)
+                       for (n = 0; n <= MAX_N; n++) {
+                               long f_out;
+                               long f_diff;
+
+                               f_out = ((14318 * (n + 1)) / (d + 1)) >> f;
+                               f_diff = abs(f_out - freq);
+                               if (f_diff <= f_best_diff) {
                                        f_best_diff = f_diff;
                                        n_best = n;
                                        d_best = d;
                                        f_best = f;
                                }
+                               if (f_out > freq)
+                                       break;
                        }
 
        if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 ||
@@ -248,11 +244,11 @@ static void neoCalcVCLK(const struct fb_info *info,
        par->VCLK3Denominator = d_best;
 
 #ifdef NEOFB_DEBUG
-       printk("neoVCLK: f:%d NumLow=%d NumHi=%d Den=%d Df=%d\n",
-              f_target >> 12,
+       printk(KERN_DEBUG "neoVCLK: f:%ld NumLow=%d NumHi=%d Den=%d Df=%ld\n",
+              freq,
               par->VCLK3NumeratorLow,
               par->VCLK3NumeratorHigh,
-              par->VCLK3Denominator, f_best_diff >> 12);
+              par->VCLK3Denominator, f_best_diff);
 #endif
 }