vserver 1.9.5.x5
[linux-2.6.git] / arch / ia64 / sn / kernel / sn2 / timer.c
index 57844fe..deb9baf 100644 (file)
 #include <asm/system.h>
 
 #include <asm/sn/leds.h>
+#include <asm/sn/shub_mmr.h>
 #include <asm/sn/clksupport.h>
 
-
 extern unsigned long sn_rtc_cycles_per_second;
-static volatile unsigned long last_wall_rtc;
-
-static unsigned long rtc_offset;       /* updated only when xtime write-lock is held! */
-static long rtc_nsecs_per_cycle;
-static long rtc_per_timer_tick;
-
-static unsigned long
-getoffset(void)
-{
-       return rtc_offset + (GET_RTC_COUNTER() - last_wall_rtc)*rtc_nsecs_per_cycle;
-}
-
-
-static void
-update(long delta_nsec)
-{
-       unsigned long rtc_counter = GET_RTC_COUNTER();
-       unsigned long offset = rtc_offset + (rtc_counter - last_wall_rtc)*rtc_nsecs_per_cycle;
-
-       /* Be careful about signed/unsigned comparisons here: */
-       if (delta_nsec < 0 || (unsigned long) delta_nsec < offset)
-               rtc_offset = offset - delta_nsec;
-       else
-               rtc_offset = 0;
-       last_wall_rtc = rtc_counter;
-}
-
-
-static void
-reset(void)
-{
-       rtc_offset = 0;
-       last_wall_rtc = GET_RTC_COUNTER();
-}
-
 
 static struct time_interpolator sn2_interpolator = {
-       .get_offset =   getoffset,
-       .update =       update,
-       .reset =        reset
+       .drift = -1,
+       .shift = 10,
+       .mask = (1LL << 55) - 1,
+       .source = TIME_SOURCE_MMIO64
 };
 
-void __init
-sn_timer_init(void)
+void __init sn_timer_init(void)
 {
        sn2_interpolator.frequency = sn_rtc_cycles_per_second;
-       sn2_interpolator.drift = -1;    /* unknown */
+       sn2_interpolator.addr = RTC_COUNTER_ADDR;
        register_time_interpolator(&sn2_interpolator);
-
-       rtc_per_timer_tick = sn_rtc_cycles_per_second / HZ;
-       rtc_nsecs_per_cycle = 1000000000 / sn_rtc_cycles_per_second;
-
-       last_wall_rtc = GET_RTC_COUNTER();
 }