[CPUFREQ] Support Model D parts and newer in e_powersaver

Patch by VIA that updates e_powersaver.c to work with our model D parts
and newer.

From: Jesse Ahrens <jahrens@centtech.com>
Signed-off-by: Dave Jones <davej@redhat.com>
diff --git a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c
index 326a4c8..34a227e 100644
--- a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c
+++ b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c
@@ -23,6 +23,7 @@
 #define EPS_BRAND_C7	1
 #define EPS_BRAND_EDEN	2
 #define EPS_BRAND_C3	3
+#define EPS_BRAND_C7D	4
 
 struct eps_cpu_data {
 	u32 fsb;
@@ -54,6 +55,7 @@
 {
 	struct cpufreq_freqs freqs;
 	u32 lo, hi;
+	u8 current_multiplier, current_voltage;
 	int err = 0;
 	int i;
 
@@ -93,6 +95,15 @@
 	rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
 	freqs.new = centaur->fsb * ((lo >> 8) & 0xff);
 
+	/* Print voltage and multiplier */
+	rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+	current_voltage = lo & 0xff;
+	printk(KERN_INFO "eps: Current voltage = %dmV\n",
+		current_voltage * 16 + 700);
+	current_multiplier = (lo >> 8) & 0xff;
+	printk(KERN_INFO "eps: Current multiplier = %d\n",
+		current_multiplier);
+
 	cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 	return err;
 }
@@ -141,9 +152,10 @@
 	u8 current_multiplier, current_voltage;
 	u8 max_multiplier, max_voltage;
 	u8 min_multiplier, min_voltage;
-	u8 brand;
+	u8 brand = 0;
 	u32 fsb;
 	struct eps_cpu_data *centaur;
+	struct cpuinfo_x86 *c = &cpu_data(0);
 	struct cpufreq_frequency_table *f_table;
 	int k, step, voltage;
 	int ret;
@@ -154,8 +166,20 @@
 
 	/* Check brand */
 	printk("eps: Detected VIA ");
-	rdmsr(0x1153, lo, hi);
-	brand = (((lo >> 2) ^ lo) >> 18) & 3;
+
+	switch (c->x86_model) {
+	case 10:
+		rdmsr(0x1153, lo, hi);
+		brand = (((lo >> 2) ^ lo) >> 18) & 3;
+		printk(KERN_CONT "Model A ");
+		break;
+	case 13:
+		rdmsr(0x1154, lo, hi);
+		brand = (((lo >> 4) ^ (lo >> 2))) & 0x000000ff;
+		printk(KERN_CONT "Model D ");
+		break;
+	}
+
 	switch(brand) {
 	case EPS_BRAND_C7M:
 		printk("C7-M\n");
@@ -166,6 +190,9 @@
 	case EPS_BRAND_EDEN:
 		printk("Eden\n");
 		break;
+	case EPS_BRAND_C7D:
+		printk(KERN_CONT "C7-D\n");
+		break;
 	case EPS_BRAND_C3:
 		printk("C3\n");
 		return -ENODEV;
@@ -208,7 +235,7 @@
 	if (current_multiplier > max_multiplier
 	    || max_multiplier <= min_multiplier)
 		return -EINVAL;
-	if (current_voltage > 0x1c || max_voltage > 0x1c)
+	if (current_voltage > 0x1f || max_voltage > 0x1f)
 		return -EINVAL;
 	if (max_voltage < min_voltage)
 		return -EINVAL;
@@ -310,7 +337,7 @@
 	/* This driver will work only on Centaur C7 processors with
 	 * Enhanced SpeedStep/PowerSaver registers */
 	if (c->x86_vendor != X86_VENDOR_CENTAUR
-	    || c->x86 != 6 || c->x86_model != 10)
+	    || c->x86 != 6 || c->x86_model < 10)
 		return -ENODEV;
 	if (!cpu_has(c, X86_FEATURE_EST))
 		return -ENODEV;