|
@@ -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",
|