Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[pandora-kernel.git] / arch / mips / kernel / time.c
index e535f86..545fcbc 100644 (file)
@@ -11,7 +11,6 @@
  * Free Software Foundation;  either version 2 of the  License, or (at your
  * option) any later version.
  */
-#include <linux/clocksource.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
@@ -83,17 +82,11 @@ static void null_timer_ack(void) { /* nothing */ }
 /*
  * Null high precision timer functions for systems lacking one.
  */
-static unsigned int null_hpt_read(void)
+static cycle_t null_hpt_read(void)
 {
        return 0;
 }
 
-static void __init null_hpt_init(void)
-{
-       /* nothing */
-}
-
-
 /*
  * Timer ack for an R4k-compatible timer of a known frequency.
  */
@@ -101,10 +94,8 @@ static void c0_timer_ack(void)
 {
        unsigned int count;
 
-#ifndef CONFIG_SOC_PNX8550     /* pnx8550 resets to zero */
        /* Ack this timer interrupt and set the next one.  */
        expirelo += cycles_per_jiffy;
-#endif
        write_c0_compare(expirelo);
 
        /* Check to see if we have missed any timer interrupts.  */
@@ -118,7 +109,7 @@ static void c0_timer_ack(void)
 /*
  * High precision timer functions for a R4k-compatible timer.
  */
-static unsigned int c0_hpt_read(void)
+static cycle_t c0_hpt_read(void)
 {
        return read_c0_count();
 }
@@ -132,9 +123,6 @@ static void __init c0_hpt_timer_init(void)
 
 int (*mips_timer_state)(void);
 void (*mips_timer_ack)(void);
-unsigned int (*mips_hpt_read)(void);
-void (*mips_hpt_init)(void) __initdata = null_hpt_init;
-unsigned int mips_hpt_mask = 0xffffffff;
 
 /* last time when xtime and rtc are sync'ed up */
 static long last_rtc_update;
@@ -276,8 +264,7 @@ static struct irqaction timer_irqaction = {
 
 static unsigned int __init calibrate_hpt(void)
 {
-       u64 frequency;
-       u32 hpt_start, hpt_end, hpt_count, hz;
+       cycle_t frequency, hpt_start, hpt_end, hpt_count, hz;
 
        const int loops = HZ / 10;
        int log_2_loops = 0;
@@ -303,28 +290,23 @@ static unsigned int __init calibrate_hpt(void)
         * during the calculated number of periods between timer
         * interrupts.
         */
-       hpt_start = mips_hpt_read();
+       hpt_start = clocksource_mips.read();
        do {
                while (mips_timer_state());
                while (!mips_timer_state());
        } while (--i);
-       hpt_end = mips_hpt_read();
+       hpt_end = clocksource_mips.read();
 
-       hpt_count = (hpt_end - hpt_start) & mips_hpt_mask;
+       hpt_count = (hpt_end - hpt_start) & clocksource_mips.mask;
        hz = HZ;
-       frequency = (u64)hpt_count * (u64)hz;
+       frequency = hpt_count * hz;
 
        return frequency >> log_2_loops;
 }
 
-static cycle_t read_mips_hpt(void)
-{
-       return (cycle_t)mips_hpt_read();
-}
-
-static struct clocksource clocksource_mips = {
+struct clocksource clocksource_mips = {
        .name           = "MIPS",
-       .read           = read_mips_hpt,
+       .mask           = 0xffffffff,
        .is_continuous  = 1,
 };
 
@@ -333,7 +315,7 @@ static void __init init_mips_clocksource(void)
        u64 temp;
        u32 shift;
 
-       if (!mips_hpt_frequency || mips_hpt_read == null_hpt_read)
+       if (!mips_hpt_frequency || clocksource_mips.read == null_hpt_read)
                return;
 
        /* Calclate a somewhat reasonable rating value */
@@ -347,7 +329,6 @@ static void __init init_mips_clocksource(void)
        }
        clocksource_mips.shift = shift;
        clocksource_mips.mult = (u32)temp;
-       clocksource_mips.mask = mips_hpt_mask;
 
        clocksource_register(&clocksource_mips);
 }
@@ -367,32 +348,36 @@ void __init time_init(void)
                                -xtime.tv_sec, -xtime.tv_nsec);
 
        /* Choose appropriate high precision timer routines.  */
-       if (!cpu_has_counter && !mips_hpt_read)
+       if (!cpu_has_counter && !clocksource_mips.read)
                /* No high precision timer -- sorry.  */
-               mips_hpt_read = null_hpt_read;
+               clocksource_mips.read = null_hpt_read;
        else if (!mips_hpt_frequency && !mips_timer_state) {
                /* A high precision timer of unknown frequency.  */
-               if (!mips_hpt_read)
+               if (!clocksource_mips.read)
                        /* No external high precision timer -- use R4k.  */
-                       mips_hpt_read = c0_hpt_read;
+                       clocksource_mips.read = c0_hpt_read;
        } else {
                /* We know counter frequency.  Or we can get it.  */
-               if (!mips_hpt_read) {
+               if (!clocksource_mips.read) {
                        /* No external high precision timer -- use R4k.  */
-                       mips_hpt_read = c0_hpt_read;
+                       clocksource_mips.read = c0_hpt_read;
 
                        if (!mips_timer_state) {
                                /* No external timer interrupt -- use R4k.  */
-                               mips_hpt_init = c0_hpt_timer_init;
                                mips_timer_ack = c0_timer_ack;
+                               /* Calculate cache parameters.  */
+                               cycles_per_jiffy =
+                                       (mips_hpt_frequency + HZ / 2) / HZ;
+                               /*
+                                * This sets up the high precision
+                                * timer for the first interrupt.
+                                */
+                               c0_hpt_timer_init();
                        }
                }
                if (!mips_hpt_frequency)
                        mips_hpt_frequency = calibrate_hpt();
 
-               /* Calculate cache parameters.  */
-               cycles_per_jiffy = (mips_hpt_frequency + HZ / 2) / HZ;
-
                /* Report the high precision timer rate for a reference.  */
                printk("Using %u.%03u MHz high precision timer.\n",
                       ((mips_hpt_frequency + 500) / 1000) / 1000,
@@ -403,9 +388,6 @@ void __init time_init(void)
                /* No timer interrupt ack (e.g. i8254).  */
                mips_timer_ack = null_timer_ack;
 
-       /* This sets up the high precision timer for the first interrupt.  */
-       mips_hpt_init();
-
        /*
         * Call board specific timer interrupt setup.
         *
@@ -473,8 +455,3 @@ EXPORT_SYMBOL(rtc_lock);
 EXPORT_SYMBOL(to_tm);
 EXPORT_SYMBOL(rtc_mips_set_time);
 EXPORT_SYMBOL(rtc_mips_get_time);
-
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies*(1000000000/HZ);
-}