[CPUFREQ] Longhaul: Magic timer frobbing.
authorDave Jones <davej@redhat.com>
Wed, 1 Jun 2005 02:03:51 +0000 (19:03 -0700)
committerDave Jones <davej@redhat.com>
Wed, 1 Jun 2005 02:03:51 +0000 (19:03 -0700)
As mandated by the spec, disable timer around transitions.

From code by : Ken Staton <ken_staton@agilent.com
Signed-off-by: Dave Jones <davej@redhat.com>
arch/i386/kernel/cpu/cpufreq/longhaul.c

index 8ea545e35b3a57ce7eda144f55eb5fc329162d22..48899f0956f7416f64ef3115e580f6b9753ba16c 100644 (file)
@@ -120,9 +120,10 @@ static int longhaul_get_cpu_mult(void)
 static void do_powersaver(union msr_longhaul *longhaul,
                        unsigned int clock_ratio_index)
 {
-       int version;
-       unsigned long flags;
        struct pci_dev *dev;
+       unsigned long flags;
+       unsigned int tmp_mask;
+       int version;
        int i;
        u16 pci_cmd;
        u16 cmd_state[64];
@@ -163,6 +164,10 @@ static void do_powersaver(union msr_longhaul *longhaul,
                }
        } while (dev != NULL);
 
+       tmp_mask=inb(0x21);     /* works on C3. save mask. */
+       outb(0xFE,0x21);        /* TMR0 only */
+       outb(0xFF,0x80);        /* delay */
+
        local_irq_enable();
 
        __hlt();
@@ -171,6 +176,8 @@ static void do_powersaver(union msr_longhaul *longhaul,
 
        local_irq_disable();
 
+       outb(tmp_mask,0x21);    /* restore mask */
+
        /* restore pci bus master state for all devices */
        dev = NULL;
        i = 0;