diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2009-03-28 16:29:51 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-03-28 16:29:51 -0400 |
commit | ed40d0c472b136682b2fcba05f89762859c7374f (patch) | |
tree | 076b83a26bcd63d6158463735dd34c10bbc591dc /arch/x86/kernel/cpu/cpufreq/longhaul.c | |
parent | 9e495834e59ca9b29f1a1f63b9f5533bb022ac49 (diff) | |
parent | 5d80f8e5a9dc9c9a94d4aeaa567e219a808b8a4a (diff) |
Merge branch 'origin' into devel
Conflicts:
sound/soc/pxa/pxa2xx-i2s.c
Diffstat (limited to 'arch/x86/kernel/cpu/cpufreq/longhaul.c')
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/longhaul.c | 193 |
1 files changed, 98 insertions, 95 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index a4cff5d6e380..f1c51aea064d 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c | |||
@@ -30,12 +30,12 @@ | |||
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/timex.h> | ||
34 | #include <linux/io.h> | ||
35 | #include <linux/acpi.h> | ||
36 | #include <linux/kernel.h> | ||
33 | 37 | ||
34 | #include <asm/msr.h> | 38 | #include <asm/msr.h> |
35 | #include <asm/timex.h> | ||
36 | #include <asm/io.h> | ||
37 | #include <asm/acpi.h> | ||
38 | #include <linux/acpi.h> | ||
39 | #include <acpi/processor.h> | 39 | #include <acpi/processor.h> |
40 | 40 | ||
41 | #include "longhaul.h" | 41 | #include "longhaul.h" |
@@ -58,7 +58,7 @@ | |||
58 | #define USE_NORTHBRIDGE (1 << 2) | 58 | #define USE_NORTHBRIDGE (1 << 2) |
59 | 59 | ||
60 | static int cpu_model; | 60 | static int cpu_model; |
61 | static unsigned int numscales=16; | 61 | static unsigned int numscales = 16; |
62 | static unsigned int fsb; | 62 | static unsigned int fsb; |
63 | 63 | ||
64 | static const struct mV_pos *vrm_mV_table; | 64 | static const struct mV_pos *vrm_mV_table; |
@@ -67,8 +67,8 @@ static const unsigned char *mV_vrm_table; | |||
67 | static unsigned int highest_speed, lowest_speed; /* kHz */ | 67 | static unsigned int highest_speed, lowest_speed; /* kHz */ |
68 | static unsigned int minmult, maxmult; | 68 | static unsigned int minmult, maxmult; |
69 | static int can_scale_voltage; | 69 | static int can_scale_voltage; |
70 | static struct acpi_processor *pr = NULL; | 70 | static struct acpi_processor *pr; |
71 | static struct acpi_processor_cx *cx = NULL; | 71 | static struct acpi_processor_cx *cx; |
72 | static u32 acpi_regs_addr; | 72 | static u32 acpi_regs_addr; |
73 | static u8 longhaul_flags; | 73 | static u8 longhaul_flags; |
74 | static unsigned int longhaul_index; | 74 | static unsigned int longhaul_index; |
@@ -78,12 +78,13 @@ static int scale_voltage; | |||
78 | static int disable_acpi_c3; | 78 | static int disable_acpi_c3; |
79 | static int revid_errata; | 79 | static int revid_errata; |
80 | 80 | ||
81 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg) | 81 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
82 | "longhaul", msg) | ||
82 | 83 | ||
83 | 84 | ||
84 | /* Clock ratios multiplied by 10 */ | 85 | /* Clock ratios multiplied by 10 */ |
85 | static int clock_ratio[32]; | 86 | static int mults[32]; |
86 | static int eblcr_table[32]; | 87 | static int eblcr[32]; |
87 | static int longhaul_version; | 88 | static int longhaul_version; |
88 | static struct cpufreq_frequency_table *longhaul_table; | 89 | static struct cpufreq_frequency_table *longhaul_table; |
89 | 90 | ||
@@ -93,7 +94,7 @@ static char speedbuffer[8]; | |||
93 | static char *print_speed(int speed) | 94 | static char *print_speed(int speed) |
94 | { | 95 | { |
95 | if (speed < 1000) { | 96 | if (speed < 1000) { |
96 | snprintf(speedbuffer, sizeof(speedbuffer),"%dMHz", speed); | 97 | snprintf(speedbuffer, sizeof(speedbuffer), "%dMHz", speed); |
97 | return speedbuffer; | 98 | return speedbuffer; |
98 | } | 99 | } |
99 | 100 | ||
@@ -122,27 +123,28 @@ static unsigned int calc_speed(int mult) | |||
122 | 123 | ||
123 | static int longhaul_get_cpu_mult(void) | 124 | static int longhaul_get_cpu_mult(void) |
124 | { | 125 | { |
125 | unsigned long invalue=0,lo, hi; | 126 | unsigned long invalue = 0, lo, hi; |
126 | 127 | ||
127 | rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi); | 128 | rdmsr(MSR_IA32_EBL_CR_POWERON, lo, hi); |
128 | invalue = (lo & (1<<22|1<<23|1<<24|1<<25)) >>22; | 129 | invalue = (lo & (1<<22|1<<23|1<<24|1<<25))>>22; |
129 | if (longhaul_version==TYPE_LONGHAUL_V2 || longhaul_version==TYPE_POWERSAVER) { | 130 | if (longhaul_version == TYPE_LONGHAUL_V2 || |
131 | longhaul_version == TYPE_POWERSAVER) { | ||
130 | if (lo & (1<<27)) | 132 | if (lo & (1<<27)) |
131 | invalue+=16; | 133 | invalue += 16; |
132 | } | 134 | } |
133 | return eblcr_table[invalue]; | 135 | return eblcr[invalue]; |
134 | } | 136 | } |
135 | 137 | ||
136 | /* For processor with BCR2 MSR */ | 138 | /* For processor with BCR2 MSR */ |
137 | 139 | ||
138 | static void do_longhaul1(unsigned int clock_ratio_index) | 140 | static void do_longhaul1(unsigned int mults_index) |
139 | { | 141 | { |
140 | union msr_bcr2 bcr2; | 142 | union msr_bcr2 bcr2; |
141 | 143 | ||
142 | rdmsrl(MSR_VIA_BCR2, bcr2.val); | 144 | rdmsrl(MSR_VIA_BCR2, bcr2.val); |
143 | /* Enable software clock multiplier */ | 145 | /* Enable software clock multiplier */ |
144 | bcr2.bits.ESOFTBF = 1; | 146 | bcr2.bits.ESOFTBF = 1; |
145 | bcr2.bits.CLOCKMUL = clock_ratio_index & 0xff; | 147 | bcr2.bits.CLOCKMUL = mults_index & 0xff; |
146 | 148 | ||
147 | /* Sync to timer tick */ | 149 | /* Sync to timer tick */ |
148 | safe_halt(); | 150 | safe_halt(); |
@@ -161,7 +163,7 @@ static void do_longhaul1(unsigned int clock_ratio_index) | |||
161 | 163 | ||
162 | /* For processor with Longhaul MSR */ | 164 | /* For processor with Longhaul MSR */ |
163 | 165 | ||
164 | static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | 166 | static void do_powersaver(int cx_address, unsigned int mults_index, |
165 | unsigned int dir) | 167 | unsigned int dir) |
166 | { | 168 | { |
167 | union msr_longhaul longhaul; | 169 | union msr_longhaul longhaul; |
@@ -173,11 +175,11 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | |||
173 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | 175 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; |
174 | else | 176 | else |
175 | longhaul.bits.RevisionKey = 0; | 177 | longhaul.bits.RevisionKey = 0; |
176 | longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; | 178 | longhaul.bits.SoftBusRatio = mults_index & 0xf; |
177 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; | 179 | longhaul.bits.SoftBusRatio4 = (mults_index & 0x10) >> 4; |
178 | /* Setup new voltage */ | 180 | /* Setup new voltage */ |
179 | if (can_scale_voltage) | 181 | if (can_scale_voltage) |
180 | longhaul.bits.SoftVID = (clock_ratio_index >> 8) & 0x1f; | 182 | longhaul.bits.SoftVID = (mults_index >> 8) & 0x1f; |
181 | /* Sync to timer tick */ | 183 | /* Sync to timer tick */ |
182 | safe_halt(); | 184 | safe_halt(); |
183 | /* Raise voltage if necessary */ | 185 | /* Raise voltage if necessary */ |
@@ -240,14 +242,14 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | |||
240 | 242 | ||
241 | /** | 243 | /** |
242 | * longhaul_set_cpu_frequency() | 244 | * longhaul_set_cpu_frequency() |
243 | * @clock_ratio_index : bitpattern of the new multiplier. | 245 | * @mults_index : bitpattern of the new multiplier. |
244 | * | 246 | * |
245 | * Sets a new clock ratio. | 247 | * Sets a new clock ratio. |
246 | */ | 248 | */ |
247 | 249 | ||
248 | static void longhaul_setstate(unsigned int table_index) | 250 | static void longhaul_setstate(unsigned int table_index) |
249 | { | 251 | { |
250 | unsigned int clock_ratio_index; | 252 | unsigned int mults_index; |
251 | int speed, mult; | 253 | int speed, mult; |
252 | struct cpufreq_freqs freqs; | 254 | struct cpufreq_freqs freqs; |
253 | unsigned long flags; | 255 | unsigned long flags; |
@@ -256,9 +258,9 @@ static void longhaul_setstate(unsigned int table_index) | |||
256 | u32 bm_timeout = 1000; | 258 | u32 bm_timeout = 1000; |
257 | unsigned int dir = 0; | 259 | unsigned int dir = 0; |
258 | 260 | ||
259 | clock_ratio_index = longhaul_table[table_index].index; | 261 | mults_index = longhaul_table[table_index].index; |
260 | /* Safety precautions */ | 262 | /* Safety precautions */ |
261 | mult = clock_ratio[clock_ratio_index & 0x1f]; | 263 | mult = mults[mults_index & 0x1f]; |
262 | if (mult == -1) | 264 | if (mult == -1) |
263 | return; | 265 | return; |
264 | speed = calc_speed(mult); | 266 | speed = calc_speed(mult); |
@@ -274,7 +276,7 @@ static void longhaul_setstate(unsigned int table_index) | |||
274 | 276 | ||
275 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 277 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
276 | 278 | ||
277 | dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", | 279 | dprintk("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", |
278 | fsb, mult/10, mult%10, print_speed(speed/1000)); | 280 | fsb, mult/10, mult%10, print_speed(speed/1000)); |
279 | retry_loop: | 281 | retry_loop: |
280 | preempt_disable(); | 282 | preempt_disable(); |
@@ -282,8 +284,8 @@ retry_loop: | |||
282 | 284 | ||
283 | pic2_mask = inb(0xA1); | 285 | pic2_mask = inb(0xA1); |
284 | pic1_mask = inb(0x21); /* works on C3. save mask. */ | 286 | pic1_mask = inb(0x21); /* works on C3. save mask. */ |
285 | outb(0xFF,0xA1); /* Overkill */ | 287 | outb(0xFF, 0xA1); /* Overkill */ |
286 | outb(0xFE,0x21); /* TMR0 only */ | 288 | outb(0xFE, 0x21); /* TMR0 only */ |
287 | 289 | ||
288 | /* Wait while PCI bus is busy. */ | 290 | /* Wait while PCI bus is busy. */ |
289 | if (acpi_regs_addr && (longhaul_flags & USE_NORTHBRIDGE | 291 | if (acpi_regs_addr && (longhaul_flags & USE_NORTHBRIDGE |
@@ -312,7 +314,7 @@ retry_loop: | |||
312 | * Software controlled multipliers only. | 314 | * Software controlled multipliers only. |
313 | */ | 315 | */ |
314 | case TYPE_LONGHAUL_V1: | 316 | case TYPE_LONGHAUL_V1: |
315 | do_longhaul1(clock_ratio_index); | 317 | do_longhaul1(mults_index); |
316 | break; | 318 | break; |
317 | 319 | ||
318 | /* | 320 | /* |
@@ -327,9 +329,9 @@ retry_loop: | |||
327 | if (longhaul_flags & USE_ACPI_C3) { | 329 | if (longhaul_flags & USE_ACPI_C3) { |
328 | /* Don't allow wakeup */ | 330 | /* Don't allow wakeup */ |
329 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); | 331 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); |
330 | do_powersaver(cx->address, clock_ratio_index, dir); | 332 | do_powersaver(cx->address, mults_index, dir); |
331 | } else { | 333 | } else { |
332 | do_powersaver(0, clock_ratio_index, dir); | 334 | do_powersaver(0, mults_index, dir); |
333 | } | 335 | } |
334 | break; | 336 | break; |
335 | } | 337 | } |
@@ -341,8 +343,8 @@ retry_loop: | |||
341 | /* Enable bus master arbitration */ | 343 | /* Enable bus master arbitration */ |
342 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); | 344 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); |
343 | } | 345 | } |
344 | outb(pic2_mask,0xA1); /* restore mask */ | 346 | outb(pic2_mask, 0xA1); /* restore mask */ |
345 | outb(pic1_mask,0x21); | 347 | outb(pic1_mask, 0x21); |
346 | 348 | ||
347 | local_irq_restore(flags); | 349 | local_irq_restore(flags); |
348 | preempt_enable(); | 350 | preempt_enable(); |
@@ -392,7 +394,8 @@ retry_loop: | |||
392 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 394 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
393 | 395 | ||
394 | if (!bm_timeout) | 396 | if (!bm_timeout) |
395 | printk(KERN_INFO PFX "Warning: Timeout while waiting for idle PCI bus.\n"); | 397 | printk(KERN_INFO PFX "Warning: Timeout while waiting for " |
398 | "idle PCI bus.\n"); | ||
396 | } | 399 | } |
397 | 400 | ||
398 | /* | 401 | /* |
@@ -458,31 +461,32 @@ static int __init longhaul_get_ranges(void) | |||
458 | break; | 461 | break; |
459 | } | 462 | } |
460 | 463 | ||
461 | dprintk ("MinMult:%d.%dx MaxMult:%d.%dx\n", | 464 | dprintk("MinMult:%d.%dx MaxMult:%d.%dx\n", |
462 | minmult/10, minmult%10, maxmult/10, maxmult%10); | 465 | minmult/10, minmult%10, maxmult/10, maxmult%10); |
463 | 466 | ||
464 | highest_speed = calc_speed(maxmult); | 467 | highest_speed = calc_speed(maxmult); |
465 | lowest_speed = calc_speed(minmult); | 468 | lowest_speed = calc_speed(minmult); |
466 | dprintk ("FSB:%dMHz Lowest speed: %s Highest speed:%s\n", fsb, | 469 | dprintk("FSB:%dMHz Lowest speed: %s Highest speed:%s\n", fsb, |
467 | print_speed(lowest_speed/1000), | 470 | print_speed(lowest_speed/1000), |
468 | print_speed(highest_speed/1000)); | 471 | print_speed(highest_speed/1000)); |
469 | 472 | ||
470 | if (lowest_speed == highest_speed) { | 473 | if (lowest_speed == highest_speed) { |
471 | printk (KERN_INFO PFX "highestspeed == lowest, aborting.\n"); | 474 | printk(KERN_INFO PFX "highestspeed == lowest, aborting.\n"); |
472 | return -EINVAL; | 475 | return -EINVAL; |
473 | } | 476 | } |
474 | if (lowest_speed > highest_speed) { | 477 | if (lowest_speed > highest_speed) { |
475 | printk (KERN_INFO PFX "nonsense! lowest (%d > %d) !\n", | 478 | printk(KERN_INFO PFX "nonsense! lowest (%d > %d) !\n", |
476 | lowest_speed, highest_speed); | 479 | lowest_speed, highest_speed); |
477 | return -EINVAL; | 480 | return -EINVAL; |
478 | } | 481 | } |
479 | 482 | ||
480 | longhaul_table = kmalloc((numscales + 1) * sizeof(struct cpufreq_frequency_table), GFP_KERNEL); | 483 | longhaul_table = kmalloc((numscales + 1) * sizeof(*longhaul_table), |
481 | if(!longhaul_table) | 484 | GFP_KERNEL); |
485 | if (!longhaul_table) | ||
482 | return -ENOMEM; | 486 | return -ENOMEM; |
483 | 487 | ||
484 | for (j = 0; j < numscales; j++) { | 488 | for (j = 0; j < numscales; j++) { |
485 | ratio = clock_ratio[j]; | 489 | ratio = mults[j]; |
486 | if (ratio == -1) | 490 | if (ratio == -1) |
487 | continue; | 491 | continue; |
488 | if (ratio > maxmult || ratio < minmult) | 492 | if (ratio > maxmult || ratio < minmult) |
@@ -507,13 +511,10 @@ static int __init longhaul_get_ranges(void) | |||
507 | } | 511 | } |
508 | } | 512 | } |
509 | if (min_i != j) { | 513 | if (min_i != j) { |
510 | unsigned int temp; | 514 | swap(longhaul_table[j].frequency, |
511 | temp = longhaul_table[j].frequency; | 515 | longhaul_table[min_i].frequency); |
512 | longhaul_table[j].frequency = longhaul_table[min_i].frequency; | 516 | swap(longhaul_table[j].index, |
513 | longhaul_table[min_i].frequency = temp; | 517 | longhaul_table[min_i].index); |
514 | temp = longhaul_table[j].index; | ||
515 | longhaul_table[j].index = longhaul_table[min_i].index; | ||
516 | longhaul_table[min_i].index = temp; | ||
517 | } | 518 | } |
518 | } | 519 | } |
519 | 520 | ||
@@ -521,7 +522,7 @@ static int __init longhaul_get_ranges(void) | |||
521 | 522 | ||
522 | /* Find index we are running on */ | 523 | /* Find index we are running on */ |
523 | for (j = 0; j < k; j++) { | 524 | for (j = 0; j < k; j++) { |
524 | if (clock_ratio[longhaul_table[j].index & 0x1f] == mult) { | 525 | if (mults[longhaul_table[j].index & 0x1f] == mult) { |
525 | longhaul_index = j; | 526 | longhaul_index = j; |
526 | break; | 527 | break; |
527 | } | 528 | } |
@@ -559,20 +560,22 @@ static void __init longhaul_setup_voltagescaling(void) | |||
559 | maxvid = vrm_mV_table[longhaul.bits.MaximumVID]; | 560 | maxvid = vrm_mV_table[longhaul.bits.MaximumVID]; |
560 | 561 | ||
561 | if (minvid.mV == 0 || maxvid.mV == 0 || minvid.mV > maxvid.mV) { | 562 | if (minvid.mV == 0 || maxvid.mV == 0 || minvid.mV > maxvid.mV) { |
562 | printk (KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. " | 563 | printk(KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. " |
563 | "Voltage scaling disabled.\n", | 564 | "Voltage scaling disabled.\n", |
564 | minvid.mV/1000, minvid.mV%1000, maxvid.mV/1000, maxvid.mV%1000); | 565 | minvid.mV/1000, minvid.mV%1000, |
566 | maxvid.mV/1000, maxvid.mV%1000); | ||
565 | return; | 567 | return; |
566 | } | 568 | } |
567 | 569 | ||
568 | if (minvid.mV == maxvid.mV) { | 570 | if (minvid.mV == maxvid.mV) { |
569 | printk (KERN_INFO PFX "Claims to support voltage scaling but min & max are " | 571 | printk(KERN_INFO PFX "Claims to support voltage scaling but " |
570 | "both %d.%03d. Voltage scaling disabled\n", | 572 | "min & max are both %d.%03d. " |
573 | "Voltage scaling disabled\n", | ||
571 | maxvid.mV/1000, maxvid.mV%1000); | 574 | maxvid.mV/1000, maxvid.mV%1000); |
572 | return; | 575 | return; |
573 | } | 576 | } |
574 | 577 | ||
575 | /* How many voltage steps */ | 578 | /* How many voltage steps*/ |
576 | numvscales = maxvid.pos - minvid.pos + 1; | 579 | numvscales = maxvid.pos - minvid.pos + 1; |
577 | printk(KERN_INFO PFX | 580 | printk(KERN_INFO PFX |
578 | "Max VID=%d.%03d " | 581 | "Max VID=%d.%03d " |
@@ -586,7 +589,7 @@ static void __init longhaul_setup_voltagescaling(void) | |||
586 | j = longhaul.bits.MinMHzBR; | 589 | j = longhaul.bits.MinMHzBR; |
587 | if (longhaul.bits.MinMHzBR4) | 590 | if (longhaul.bits.MinMHzBR4) |
588 | j += 16; | 591 | j += 16; |
589 | min_vid_speed = eblcr_table[j]; | 592 | min_vid_speed = eblcr[j]; |
590 | if (min_vid_speed == -1) | 593 | if (min_vid_speed == -1) |
591 | return; | 594 | return; |
592 | switch (longhaul.bits.MinMHzFSB) { | 595 | switch (longhaul.bits.MinMHzFSB) { |
@@ -617,7 +620,8 @@ static void __init longhaul_setup_voltagescaling(void) | |||
617 | pos = minvid.pos; | 620 | pos = minvid.pos; |
618 | longhaul_table[j].index |= mV_vrm_table[pos] << 8; | 621 | longhaul_table[j].index |= mV_vrm_table[pos] << 8; |
619 | vid = vrm_mV_table[mV_vrm_table[pos]]; | 622 | vid = vrm_mV_table[mV_vrm_table[pos]]; |
620 | printk(KERN_INFO PFX "f: %d kHz, index: %d, vid: %d mV\n", speed, j, vid.mV); | 623 | printk(KERN_INFO PFX "f: %d kHz, index: %d, vid: %d mV\n", |
624 | speed, j, vid.mV); | ||
621 | j++; | 625 | j++; |
622 | } | 626 | } |
623 | 627 | ||
@@ -640,7 +644,8 @@ static int longhaul_target(struct cpufreq_policy *policy, | |||
640 | unsigned int dir = 0; | 644 | unsigned int dir = 0; |
641 | u8 vid, current_vid; | 645 | u8 vid, current_vid; |
642 | 646 | ||
643 | if (cpufreq_frequency_table_target(policy, longhaul_table, target_freq, relation, &table_index)) | 647 | if (cpufreq_frequency_table_target(policy, longhaul_table, target_freq, |
648 | relation, &table_index)) | ||
644 | return -EINVAL; | 649 | return -EINVAL; |
645 | 650 | ||
646 | /* Don't set same frequency again */ | 651 | /* Don't set same frequency again */ |
@@ -656,7 +661,8 @@ static int longhaul_target(struct cpufreq_policy *policy, | |||
656 | * this in hardware, C3 is old and we need to do this | 661 | * this in hardware, C3 is old and we need to do this |
657 | * in software. */ | 662 | * in software. */ |
658 | i = longhaul_index; | 663 | i = longhaul_index; |
659 | current_vid = (longhaul_table[longhaul_index].index >> 8) & 0x1f; | 664 | current_vid = (longhaul_table[longhaul_index].index >> 8); |
665 | current_vid &= 0x1f; | ||
660 | if (table_index > longhaul_index) | 666 | if (table_index > longhaul_index) |
661 | dir = 1; | 667 | dir = 1; |
662 | while (i != table_index) { | 668 | while (i != table_index) { |
@@ -691,9 +697,9 @@ static acpi_status longhaul_walk_callback(acpi_handle obj_handle, | |||
691 | { | 697 | { |
692 | struct acpi_device *d; | 698 | struct acpi_device *d; |
693 | 699 | ||
694 | if ( acpi_bus_get_device(obj_handle, &d) ) { | 700 | if (acpi_bus_get_device(obj_handle, &d)) |
695 | return 0; | 701 | return 0; |
696 | } | 702 | |
697 | *return_value = acpi_driver_data(d); | 703 | *return_value = acpi_driver_data(d); |
698 | return 1; | 704 | return 1; |
699 | } | 705 | } |
@@ -750,7 +756,7 @@ static int longhaul_setup_southbridge(void) | |||
750 | /* Find VT8235 southbridge */ | 756 | /* Find VT8235 southbridge */ |
751 | dev = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL); | 757 | dev = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL); |
752 | if (dev == NULL) | 758 | if (dev == NULL) |
753 | /* Find VT8237 southbridge */ | 759 | /* Find VT8237 southbridge */ |
754 | dev = pci_get_device(PCI_VENDOR_ID_VIA, | 760 | dev = pci_get_device(PCI_VENDOR_ID_VIA, |
755 | PCI_DEVICE_ID_VIA_8237, NULL); | 761 | PCI_DEVICE_ID_VIA_8237, NULL); |
756 | if (dev != NULL) { | 762 | if (dev != NULL) { |
@@ -769,7 +775,8 @@ static int longhaul_setup_southbridge(void) | |||
769 | if (pci_cmd & 1 << 7) { | 775 | if (pci_cmd & 1 << 7) { |
770 | pci_read_config_dword(dev, 0x88, &acpi_regs_addr); | 776 | pci_read_config_dword(dev, 0x88, &acpi_regs_addr); |
771 | acpi_regs_addr &= 0xff00; | 777 | acpi_regs_addr &= 0xff00; |
772 | printk(KERN_INFO PFX "ACPI I/O at 0x%x\n", acpi_regs_addr); | 778 | printk(KERN_INFO PFX "ACPI I/O at 0x%x\n", |
779 | acpi_regs_addr); | ||
773 | } | 780 | } |
774 | 781 | ||
775 | pci_dev_put(dev); | 782 | pci_dev_put(dev); |
@@ -781,7 +788,7 @@ static int longhaul_setup_southbridge(void) | |||
781 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | 788 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) |
782 | { | 789 | { |
783 | struct cpuinfo_x86 *c = &cpu_data(0); | 790 | struct cpuinfo_x86 *c = &cpu_data(0); |
784 | char *cpuname=NULL; | 791 | char *cpuname = NULL; |
785 | int ret; | 792 | int ret; |
786 | u32 lo, hi; | 793 | u32 lo, hi; |
787 | 794 | ||
@@ -791,8 +798,8 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
791 | cpu_model = CPU_SAMUEL; | 798 | cpu_model = CPU_SAMUEL; |
792 | cpuname = "C3 'Samuel' [C5A]"; | 799 | cpuname = "C3 'Samuel' [C5A]"; |
793 | longhaul_version = TYPE_LONGHAUL_V1; | 800 | longhaul_version = TYPE_LONGHAUL_V1; |
794 | memcpy (clock_ratio, samuel1_clock_ratio, sizeof(samuel1_clock_ratio)); | 801 | memcpy(mults, samuel1_mults, sizeof(samuel1_mults)); |
795 | memcpy (eblcr_table, samuel1_eblcr, sizeof(samuel1_eblcr)); | 802 | memcpy(eblcr, samuel1_eblcr, sizeof(samuel1_eblcr)); |
796 | break; | 803 | break; |
797 | 804 | ||
798 | case 7: | 805 | case 7: |
@@ -803,10 +810,8 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
803 | cpuname = "C3 'Samuel 2' [C5B]"; | 810 | cpuname = "C3 'Samuel 2' [C5B]"; |
804 | /* Note, this is not a typo, early Samuel2's had | 811 | /* Note, this is not a typo, early Samuel2's had |
805 | * Samuel1 ratios. */ | 812 | * Samuel1 ratios. */ |
806 | memcpy(clock_ratio, samuel1_clock_ratio, | 813 | memcpy(mults, samuel1_mults, sizeof(samuel1_mults)); |
807 | sizeof(samuel1_clock_ratio)); | 814 | memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); |
808 | memcpy(eblcr_table, samuel2_eblcr, | ||
809 | sizeof(samuel2_eblcr)); | ||
810 | break; | 815 | break; |
811 | case 1 ... 15: | 816 | case 1 ... 15: |
812 | longhaul_version = TYPE_LONGHAUL_V1; | 817 | longhaul_version = TYPE_LONGHAUL_V1; |
@@ -817,10 +822,8 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
817 | cpu_model = CPU_EZRA; | 822 | cpu_model = CPU_EZRA; |
818 | cpuname = "C3 'Ezra' [C5C]"; | 823 | cpuname = "C3 'Ezra' [C5C]"; |
819 | } | 824 | } |
820 | memcpy(clock_ratio, ezra_clock_ratio, | 825 | memcpy(mults, ezra_mults, sizeof(ezra_mults)); |
821 | sizeof(ezra_clock_ratio)); | 826 | memcpy(eblcr, ezra_eblcr, sizeof(ezra_eblcr)); |
822 | memcpy(eblcr_table, ezra_eblcr, | ||
823 | sizeof(ezra_eblcr)); | ||
824 | break; | 827 | break; |
825 | } | 828 | } |
826 | break; | 829 | break; |
@@ -829,18 +832,16 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
829 | cpu_model = CPU_EZRA_T; | 832 | cpu_model = CPU_EZRA_T; |
830 | cpuname = "C3 'Ezra-T' [C5M]"; | 833 | cpuname = "C3 'Ezra-T' [C5M]"; |
831 | longhaul_version = TYPE_POWERSAVER; | 834 | longhaul_version = TYPE_POWERSAVER; |
832 | numscales=32; | 835 | numscales = 32; |
833 | memcpy (clock_ratio, ezrat_clock_ratio, sizeof(ezrat_clock_ratio)); | 836 | memcpy(mults, ezrat_mults, sizeof(ezrat_mults)); |
834 | memcpy (eblcr_table, ezrat_eblcr, sizeof(ezrat_eblcr)); | 837 | memcpy(eblcr, ezrat_eblcr, sizeof(ezrat_eblcr)); |
835 | break; | 838 | break; |
836 | 839 | ||
837 | case 9: | 840 | case 9: |
838 | longhaul_version = TYPE_POWERSAVER; | 841 | longhaul_version = TYPE_POWERSAVER; |
839 | numscales = 32; | 842 | numscales = 32; |
840 | memcpy(clock_ratio, | 843 | memcpy(mults, nehemiah_mults, sizeof(nehemiah_mults)); |
841 | nehemiah_clock_ratio, | 844 | memcpy(eblcr, nehemiah_eblcr, sizeof(nehemiah_eblcr)); |
842 | sizeof(nehemiah_clock_ratio)); | ||
843 | memcpy(eblcr_table, nehemiah_eblcr, sizeof(nehemiah_eblcr)); | ||
844 | switch (c->x86_mask) { | 845 | switch (c->x86_mask) { |
845 | case 0 ... 1: | 846 | case 0 ... 1: |
846 | cpu_model = CPU_NEHEMIAH; | 847 | cpu_model = CPU_NEHEMIAH; |
@@ -869,14 +870,14 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
869 | longhaul_version = TYPE_LONGHAUL_V1; | 870 | longhaul_version = TYPE_LONGHAUL_V1; |
870 | } | 871 | } |
871 | 872 | ||
872 | printk (KERN_INFO PFX "VIA %s CPU detected. ", cpuname); | 873 | printk(KERN_INFO PFX "VIA %s CPU detected. ", cpuname); |
873 | switch (longhaul_version) { | 874 | switch (longhaul_version) { |
874 | case TYPE_LONGHAUL_V1: | 875 | case TYPE_LONGHAUL_V1: |
875 | case TYPE_LONGHAUL_V2: | 876 | case TYPE_LONGHAUL_V2: |
876 | printk ("Longhaul v%d supported.\n", longhaul_version); | 877 | printk(KERN_CONT "Longhaul v%d supported.\n", longhaul_version); |
877 | break; | 878 | break; |
878 | case TYPE_POWERSAVER: | 879 | case TYPE_POWERSAVER: |
879 | printk ("Powersaver supported.\n"); | 880 | printk(KERN_CONT "Powersaver supported.\n"); |
880 | break; | 881 | break; |
881 | }; | 882 | }; |
882 | 883 | ||
@@ -940,7 +941,7 @@ static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) | |||
940 | return 0; | 941 | return 0; |
941 | } | 942 | } |
942 | 943 | ||
943 | static struct freq_attr* longhaul_attr[] = { | 944 | static struct freq_attr *longhaul_attr[] = { |
944 | &cpufreq_freq_attr_scaling_available_freqs, | 945 | &cpufreq_freq_attr_scaling_available_freqs, |
945 | NULL, | 946 | NULL, |
946 | }; | 947 | }; |
@@ -966,13 +967,15 @@ static int __init longhaul_init(void) | |||
966 | 967 | ||
967 | #ifdef CONFIG_SMP | 968 | #ifdef CONFIG_SMP |
968 | if (num_online_cpus() > 1) { | 969 | if (num_online_cpus() > 1) { |
969 | printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n"); | 970 | printk(KERN_ERR PFX "More than 1 CPU detected, " |
971 | "longhaul disabled.\n"); | ||
970 | return -ENODEV; | 972 | return -ENODEV; |
971 | } | 973 | } |
972 | #endif | 974 | #endif |
973 | #ifdef CONFIG_X86_IO_APIC | 975 | #ifdef CONFIG_X86_IO_APIC |
974 | if (cpu_has_apic) { | 976 | if (cpu_has_apic) { |
975 | printk(KERN_ERR PFX "APIC detected. Longhaul is currently broken in this configuration.\n"); | 977 | printk(KERN_ERR PFX "APIC detected. Longhaul is currently " |
978 | "broken in this configuration.\n"); | ||
976 | return -ENODEV; | 979 | return -ENODEV; |
977 | } | 980 | } |
978 | #endif | 981 | #endif |
@@ -993,8 +996,8 @@ static void __exit longhaul_exit(void) | |||
993 | { | 996 | { |
994 | int i; | 997 | int i; |
995 | 998 | ||
996 | for (i=0; i < numscales; i++) { | 999 | for (i = 0; i < numscales; i++) { |
997 | if (clock_ratio[i] == maxmult) { | 1000 | if (mults[i] == maxmult) { |
998 | longhaul_setstate(i); | 1001 | longhaul_setstate(i); |
999 | break; | 1002 | break; |
1000 | } | 1003 | } |
@@ -1007,11 +1010,11 @@ static void __exit longhaul_exit(void) | |||
1007 | /* Even if BIOS is exporting ACPI C3 state, and it is used | 1010 | /* Even if BIOS is exporting ACPI C3 state, and it is used |
1008 | * with success when CPU is idle, this state doesn't | 1011 | * with success when CPU is idle, this state doesn't |
1009 | * trigger frequency transition in some cases. */ | 1012 | * trigger frequency transition in some cases. */ |
1010 | module_param (disable_acpi_c3, int, 0644); | 1013 | module_param(disable_acpi_c3, int, 0644); |
1011 | MODULE_PARM_DESC(disable_acpi_c3, "Don't use ACPI C3 support"); | 1014 | MODULE_PARM_DESC(disable_acpi_c3, "Don't use ACPI C3 support"); |
1012 | /* Change CPU voltage with frequency. Very usefull to save | 1015 | /* Change CPU voltage with frequency. Very usefull to save |
1013 | * power, but most VIA C3 processors aren't supporting it. */ | 1016 | * power, but most VIA C3 processors aren't supporting it. */ |
1014 | module_param (scale_voltage, int, 0644); | 1017 | module_param(scale_voltage, int, 0644); |
1015 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | 1018 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); |
1016 | /* Force revision key to 0 for processors which doesn't | 1019 | /* Force revision key to 0 for processors which doesn't |
1017 | * support voltage scaling, but are introducing itself as | 1020 | * support voltage scaling, but are introducing itself as |
@@ -1019,9 +1022,9 @@ MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | |||
1019 | module_param(revid_errata, int, 0644); | 1022 | module_param(revid_errata, int, 0644); |
1020 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); | 1023 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); |
1021 | 1024 | ||
1022 | MODULE_AUTHOR ("Dave Jones <davej@redhat.com>"); | 1025 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); |
1023 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); | 1026 | MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors."); |
1024 | MODULE_LICENSE ("GPL"); | 1027 | MODULE_LICENSE("GPL"); |
1025 | 1028 | ||
1026 | late_initcall(longhaul_init); | 1029 | late_initcall(longhaul_init); |
1027 | module_exit(longhaul_exit); | 1030 | module_exit(longhaul_exit); |