clocksource: add common i8253 PIT clocksource
[linux-2.6.git] / drivers / clocksource / acpi_pm.c
index ee19b6e..effe797 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/acpi_pmtmr.h>
 #include <linux/clocksource.h>
+#include <linux/timex.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/pci.h>
@@ -57,7 +58,7 @@ u32 acpi_pm_read_verified(void)
        return v2;
 }
 
-static cycle_t acpi_pm_read(void)
+static cycle_t acpi_pm_read(struct clocksource *cs)
 {
        return (cycle_t)read_pmtmr();
 }
@@ -67,10 +68,7 @@ static struct clocksource clocksource_acpi_pm = {
        .rating         = 200,
        .read           = acpi_pm_read,
        .mask           = (cycle_t)ACPI_PM_MASK,
-       .mult           = 0, /*to be calculated*/
-       .shift          = 22,
        .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-
 };
 
 
@@ -83,7 +81,7 @@ static int __init acpi_pm_good_setup(char *__str)
 }
 __setup("acpi_pm_good", acpi_pm_good_setup);
 
-static cycle_t acpi_pm_read_slow(void)
+static cycle_t acpi_pm_read_slow(struct clocksource *cs)
 {
        return (cycle_t)acpi_pm_read_verified();
 }
@@ -156,9 +154,9 @@ static int verify_pmtmr_rate(void)
        unsigned long count, delta;
 
        mach_prepare_counter();
-       value1 = clocksource_acpi_pm.read();
+       value1 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
        mach_countup(&count);
-       value2 = clocksource_acpi_pm.read();
+       value2 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
        delta = (value2 - value1) & ACPI_PM_MASK;
 
        /* Check that the PMTMR delta is within 5% of what we expect */
@@ -189,15 +187,12 @@ static int __init init_acpi_pm_clocksource(void)
        if (!pmtmr_ioport)
                return -ENODEV;
 
-       clocksource_acpi_pm.mult = clocksource_hz2mult(PMTMR_TICKS_PER_SEC,
-                                               clocksource_acpi_pm.shift);
-
        /* "verify" this timing source: */
        for (j = 0; j < ACPI_PM_MONOTONICITY_CHECKS; j++) {
                udelay(100 * j);
-               value1 = clocksource_acpi_pm.read();
+               value1 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
                for (i = 0; i < ACPI_PM_READ_CHECKS; i++) {
-                       value2 = clocksource_acpi_pm.read();
+                       value2 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
                        if (value2 == value1)
                                continue;
                        if (value2 > value1)
@@ -207,19 +202,24 @@ static int __init init_acpi_pm_clocksource(void)
                        printk(KERN_INFO "PM-Timer had inconsistent results:"
                               " 0x%#llx, 0x%#llx - aborting.\n",
                               value1, value2);
+                       pmtmr_ioport = 0;
                        return -EINVAL;
                }
                if (i == ACPI_PM_READ_CHECKS) {
                        printk(KERN_INFO "PM-Timer failed consistency check "
                               " (0x%#llx) - aborting.\n", value1);
+                       pmtmr_ioport = 0;
                        return -ENODEV;
                }
        }
 
-       if (verify_pmtmr_rate() != 0)
+       if (verify_pmtmr_rate() != 0){
+               pmtmr_ioport = 0;
                return -ENODEV;
+       }
 
-       return clocksource_register(&clocksource_acpi_pm);
+       return clocksource_register_hz(&clocksource_acpi_pm,
+                                               PMTMR_TICKS_PER_SEC);
 }
 
 /* We use fs_initcall because we want the PCI fixups to have run