Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm
[sfrench/cifs-2.6.git] / arch / x86 / kernel / hpet.c
index a198b7c87a123d2f80c6313261e9b80e8346cad1..33dbcc4ec5ff285435c7c184be50e485c58a9ca2 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/hpet.h>
 
 #define HPET_MASK                      CLOCKSOURCE_MASK(32)
-#define HPET_SHIFT                     22
 
 /* FSEC = 10^-15
    NSEC = 10^-9 */
@@ -787,7 +786,6 @@ static struct clocksource clocksource_hpet = {
        .rating         = 250,
        .read           = read_hpet,
        .mask           = HPET_MASK,
-       .shift          = HPET_SHIFT,
        .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
        .resume         = hpet_resume_counter,
 #ifdef CONFIG_X86_64
@@ -798,6 +796,7 @@ static struct clocksource clocksource_hpet = {
 static int hpet_clocksource_register(void)
 {
        u64 start, now;
+       u64 hpet_freq;
        cycle_t t1;
 
        /* Start the counter */
@@ -832,9 +831,15 @@ static int hpet_clocksource_register(void)
         *  mult = (hpet_period * 2^shift)/10^6
         *  mult = (hpet_period << shift)/FSEC_PER_NSEC
         */
-       clocksource_hpet.mult = div_sc(hpet_period, FSEC_PER_NSEC, HPET_SHIFT);
 
-       clocksource_register(&clocksource_hpet);
+       /* Need to convert hpet_period (fsec/cyc) to cyc/sec:
+        *
+        * cyc/sec = FSEC_PER_SEC/hpet_period(fsec/cyc)
+        * cyc/sec = (FSEC_PER_NSEC * NSEC_PER_SEC)/hpet_period
+        */
+       hpet_freq = FSEC_PER_NSEC * NSEC_PER_SEC;
+       do_div(hpet_freq, hpet_period);
+       clocksource_register_hz(&clocksource_hpet, (u32)hpet_freq);
 
        return 0;
 }
@@ -964,7 +969,7 @@ fs_initcall(hpet_late_init);
 
 void hpet_disable(void)
 {
-       if (is_hpet_capable()) {
+       if (is_hpet_capable() && hpet_virt_address) {
                unsigned int cfg = hpet_readl(HPET_CFG);
 
                if (hpet_legacy_int_enabled) {