--- cpufreq/arch/i386/kernel/cpu/cpufreq/longhaul.c~ 2005-06-08 20:16:35.147014375 -0700 +++ cpufreq/arch/i386/kernel/cpu/cpufreq/longhaul.c 2005-06-08 20:19:56.224056441 -0700 @@ -224,11 +224,13 @@ static void do_powersaver(union msr_long static void longhaul_setstate(unsigned int clock_ratio_index) { + unsigned long flags; int speed, mult; struct cpufreq_freqs freqs; union msr_longhaul longhaul; union msr_bcr2 bcr2; static unsigned int old_ratio=-1; + unsigned int tmp_mask; if (old_ratio == clock_ratio_index) return; @@ -266,6 +268,10 @@ static void longhaul_setstate(unsigned i local_irq_save(flags); disable_mastering(); + tmp_mask=inb(0x21); /* works on C3. save mask. */ + outb(0xFE,0x21); /* TMR0 only */ + outb(0xFF,0x80); /* delay */ + rdmsrl (MSR_VIA_BCR2, bcr2.val); /* Enable software clock multiplier */ bcr2.bits.ESOFTBF = 1; @@ -283,6 +289,8 @@ static void longhaul_setstate(unsigned i wrmsrl (MSR_VIA_BCR2, bcr2.val); local_irq_enable(); + outb(tmp_mask,0x21); /* restore mask */ + restore_mastering(); local_irq_restore(flags); preempt_enable();