--- 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();
