Merge branch 'from-linus' into upstream
[sfrench/cifs-2.6.git] / arch / i386 / kernel / acpi / earlyquirk.c
index 1ae2aeeda18bddbbc23ec37702d2ed4878ee23d0..1649a175a206ab4bd6ed0add0040580ff83d036e 100644 (file)
@@ -5,26 +5,41 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
+#include <linux/acpi.h>
+
 #include <asm/pci-direct.h>
 #include <asm/acpi.h>
 #include <asm/apic.h>
 
+#ifdef CONFIG_ACPI
+
+static int nvidia_hpet_detected __initdata;
+
+static int __init nvidia_hpet_check(unsigned long phys, unsigned long size)
+{
+       nvidia_hpet_detected = 1;
+       return 0;
+}
+#endif
+
 static int __init check_bridge(int vendor, int device)
 {
-       /* According to Nvidia all timer overrides are bogus. Just ignore
-          them all. */
+#ifdef CONFIG_ACPI
+       /* According to Nvidia all timer overrides are bogus unless HPET
+          is enabled. */
        if (vendor == PCI_VENDOR_ID_NVIDIA) {
-               acpi_skip_timer_override = 1;
+               nvidia_hpet_detected = 0;
+               acpi_table_parse(ACPI_HPET, nvidia_hpet_check);
+               if (nvidia_hpet_detected == 0) {
+                       acpi_skip_timer_override = 1;
+               }
        }
-#ifdef CONFIG_X86_LOCAL_APIC
-       /*
-        * ATI IXP chipsets get double timer interrupts.
-        * For now just do this for all ATI chipsets.
-        * FIXME: this needs to be checked for the non ACPI case too.
-        */
-       if (vendor == PCI_VENDOR_ID_ATI)
-               disable_timer_pin_1 = 1;
 #endif
+       if (vendor == PCI_VENDOR_ID_ATI && timer_over_8254 == 1) {
+               timer_over_8254 = 0;
+               printk(KERN_INFO "ATI board detected. Disabling timer routing "
+                               "over 8254.\n");
+       }
        return 0;
 }