|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/pci.h>
|
|
|
+#include <linux/delay.h>
|
|
|
#include <asm/io.h>
|
|
|
|
|
|
/*
|
|
@@ -175,10 +176,13 @@ static int verify_pmtmr_rate(void)
|
|
|
#define verify_pmtmr_rate() (0)
|
|
|
#endif
|
|
|
|
|
|
+/* Number of monotonicity checks to perform during initialization */
|
|
|
+#define ACPI_PM_MONOTONICITY_CHECKS 10
|
|
|
+
|
|
|
static int __init init_acpi_pm_clocksource(void)
|
|
|
{
|
|
|
cycle_t value1, value2;
|
|
|
- unsigned int i;
|
|
|
+ unsigned int i, j, good = 0;
|
|
|
|
|
|
if (!pmtmr_ioport)
|
|
|
return -ENODEV;
|
|
@@ -187,24 +191,32 @@ static int __init init_acpi_pm_clocksource(void)
|
|
|
clocksource_acpi_pm.shift);
|
|
|
|
|
|
/* "verify" this timing source: */
|
|
|
- value1 = clocksource_acpi_pm.read();
|
|
|
- for (i = 0; i < 10000; i++) {
|
|
|
- value2 = clocksource_acpi_pm.read();
|
|
|
- if (value2 == value1)
|
|
|
- continue;
|
|
|
- if (value2 > value1)
|
|
|
- goto pm_good;
|
|
|
- if ((value2 < value1) && ((value2) < 0xFFF))
|
|
|
- goto pm_good;
|
|
|
- printk(KERN_INFO "PM-Timer had inconsistent results:"
|
|
|
- " 0x%#llx, 0x%#llx - aborting.\n", value1, value2);
|
|
|
- return -EINVAL;
|
|
|
+ for (j = 0; j < ACPI_PM_MONOTONICITY_CHECKS; j++) {
|
|
|
+ value1 = clocksource_acpi_pm.read();
|
|
|
+ for (i = 0; i < 10000; i++) {
|
|
|
+ value2 = clocksource_acpi_pm.read();
|
|
|
+ if (value2 == value1)
|
|
|
+ continue;
|
|
|
+ if (value2 > value1)
|
|
|
+ good++;
|
|
|
+ break;
|
|
|
+ if ((value2 < value1) && ((value2) < 0xFFF))
|
|
|
+ good++;
|
|
|
+ break;
|
|
|
+ printk(KERN_INFO "PM-Timer had inconsistent results:"
|
|
|
+ " 0x%#llx, 0x%#llx - aborting.\n",
|
|
|
+ value1, value2);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ udelay(300 * i);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (good != ACPI_PM_MONOTONICITY_CHECKS) {
|
|
|
+ printk(KERN_INFO "PM-Timer failed consistency check "
|
|
|
+ " (0x%#llx) - aborting.\n", value1);
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
- printk(KERN_INFO "PM-Timer had no reasonable result:"
|
|
|
- " 0x%#llx - aborting.\n", value1);
|
|
|
- return -ENODEV;
|
|
|
|
|
|
-pm_good:
|
|
|
if (verify_pmtmr_rate() != 0)
|
|
|
return -ENODEV;
|
|
|
|