]> Pileus Git - ~andy/linux/blobdiff - init/calibrate.c
calibrate: extract fall-back calculation into own helper
[~andy/linux] / init / calibrate.c
index 24fe022c55f976004c7acfb1c22ed6b7f0ce0954..b71643a7acae8e9eba4c3cfe16b02a343f2098c8 100644 (file)
@@ -119,10 +119,47 @@ static unsigned long __cpuinit calibrate_delay_direct(void) {return 0;}
  */
 #define LPS_PREC 8
 
-void __cpuinit calibrate_delay(void)
+static unsigned long __cpuinit calibrate_delay_converge(void)
 {
-       unsigned long ticks, loopbit;
+       unsigned long lpj, ticks, loopbit;
        int lps_precision = LPS_PREC;
+
+       lpj = (1<<12);
+       while ((lpj <<= 1) != 0) {
+               /* wait for "start of" clock tick */
+               ticks = jiffies;
+               while (ticks == jiffies)
+                       /* nothing */;
+               /* Go .. */
+               ticks = jiffies;
+               __delay(lpj);
+               ticks = jiffies - ticks;
+               if (ticks)
+                       break;
+       }
+
+       /*
+        * Do a binary approximation to get lpj set to
+        * equal one clock (up to lps_precision bits)
+        */
+       lpj >>= 1;
+       loopbit = lpj;
+       while (lps_precision-- && (loopbit >>= 1)) {
+               lpj |= loopbit;
+               ticks = jiffies;
+               while (ticks == jiffies)
+                       /* nothing */;
+               ticks = jiffies;
+               __delay(lpj);
+               if (jiffies != ticks)   /* longer than 1 tick */
+                       lpj &= ~loopbit;
+       }
+
+       return lpj;
+}
+
+void __cpuinit calibrate_delay(void)
+{
        static bool printed;
 
        if (preset_lpj) {
@@ -139,39 +176,9 @@ void __cpuinit calibrate_delay(void)
                        pr_info("Calibrating delay using timer "
                                "specific routine.. ");
        } else {
-               loops_per_jiffy = (1<<12);
-
                if (!printed)
                        pr_info("Calibrating delay loop... ");
-               while ((loops_per_jiffy <<= 1) != 0) {
-                       /* wait for "start of" clock tick */
-                       ticks = jiffies;
-                       while (ticks == jiffies)
-                               /* nothing */;
-                       /* Go .. */
-                       ticks = jiffies;
-                       __delay(loops_per_jiffy);
-                       ticks = jiffies - ticks;
-                       if (ticks)
-                               break;
-               }
-
-               /*
-                * Do a binary approximation to get loops_per_jiffy set to
-                * equal one clock (up to lps_precision bits)
-                */
-               loops_per_jiffy >>= 1;
-               loopbit = loops_per_jiffy;
-               while (lps_precision-- && (loopbit >>= 1)) {
-                       loops_per_jiffy |= loopbit;
-                       ticks = jiffies;
-                       while (ticks == jiffies)
-                               /* nothing */;
-                       ticks = jiffies;
-                       __delay(loops_per_jiffy);
-                       if (jiffies != ticks)   /* longer than 1 tick */
-                               loops_per_jiffy &= ~loopbit;
-               }
+               loops_per_jiffy = calibrate_delay_converge();
        }
        if (!printed)
                pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n",