diff options
| author | Linus Torvalds <torvalds@woody.osdl.org> | 2007-01-03 20:34:12 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.osdl.org> | 2007-01-03 20:34:12 -0500 |
| commit | de9e957f12d09793aac7d44ee0f7987dc8019b94 (patch) | |
| tree | 216081044a7df1ce3e8ae6482148fedb7d1f1b73 | |
| parent | 9c5b0ce43d0e4e4799c6cdc77c5ed7a95b763035 (diff) | |
| parent | 43c8f12f9f4a7cb4140693fc9baed35a02165898 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
* master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq:
[CPUFREQ] longhaul: Kill off warnings introduced by recent changes.
[CPUFREQ] Uninitialized use of cmd.val in arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c:acpi_cpufreq_target()
[CPUFREQ] Longhaul - Always guess FSB
[CPUFREQ] Longhaul - Fix up powersaver assumptions.
[CPUFREQ] longhaul: Fix up unreachable code.
[CPUFREQ] speedstep-centrino: missing space and bracket
[CPUFREQ] Bug fix for acpi-cpufreq and cpufreq_stats oops on frequency change notification
[CPUFREQ] select consistently
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 10 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/longhaul.c | 120 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | 6 | ||||
| -rw-r--r-- | arch/x86_64/kernel/cpufreq/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 4 |
5 files changed, 67 insertions, 74 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c index b735458c6e3a..10baa3501ed3 100644 --- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
| @@ -373,8 +373,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
| 373 | cpumask_t online_policy_cpus; | 373 | cpumask_t online_policy_cpus; |
| 374 | struct drv_cmd cmd; | 374 | struct drv_cmd cmd; |
| 375 | unsigned int msr; | 375 | unsigned int msr; |
| 376 | unsigned int next_state = 0; | 376 | unsigned int next_state = 0; /* Index into freq_table */ |
| 377 | unsigned int next_perf_state = 0; | 377 | unsigned int next_perf_state = 0; /* Index into perf table */ |
| 378 | unsigned int i; | 378 | unsigned int i; |
| 379 | int result = 0; | 379 | int result = 0; |
| 380 | 380 | ||
| @@ -420,6 +420,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
| 420 | msr = | 420 | msr = |
| 421 | (u32) perf->states[next_perf_state]. | 421 | (u32) perf->states[next_perf_state]. |
| 422 | control & INTEL_MSR_RANGE; | 422 | control & INTEL_MSR_RANGE; |
| 423 | cmd.val = get_cur_val(online_policy_cpus); | ||
| 423 | cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr; | 424 | cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr; |
| 424 | break; | 425 | break; |
| 425 | case SYSTEM_IO_CAPABLE: | 426 | case SYSTEM_IO_CAPABLE: |
| @@ -439,8 +440,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
| 439 | else | 440 | else |
| 440 | cpu_set(policy->cpu, cmd.mask); | 441 | cpu_set(policy->cpu, cmd.mask); |
| 441 | 442 | ||
| 442 | freqs.old = data->freq_table[perf->state].frequency; | 443 | freqs.old = perf->states[perf->state].core_frequency * 1000; |
| 443 | freqs.new = data->freq_table[next_perf_state].frequency; | 444 | freqs.new = data->freq_table[next_state].frequency; |
| 444 | for_each_cpu_mask(i, cmd.mask) { | 445 | for_each_cpu_mask(i, cmd.mask) { |
| 445 | freqs.cpu = i; | 446 | freqs.cpu = i; |
| 446 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 447 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
| @@ -677,6 +678,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 677 | valid_states++; | 678 | valid_states++; |
| 678 | } | 679 | } |
| 679 | data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END; | 680 | data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END; |
| 681 | perf->state = 0; | ||
| 680 | 682 | ||
| 681 | result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table); | 683 | result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table); |
| 682 | if (result) | 684 | if (result) |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index 6d9c97a690fd..e940e00b96c9 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c | |||
| @@ -52,6 +52,10 @@ | |||
| 52 | #define CPU_EZRA_T 4 | 52 | #define CPU_EZRA_T 4 |
| 53 | #define CPU_NEHEMIAH 5 | 53 | #define CPU_NEHEMIAH 5 |
| 54 | 54 | ||
| 55 | /* Flags */ | ||
| 56 | #define USE_ACPI_C3 (1 << 1) | ||
| 57 | #define USE_NORTHBRIDGE (1 << 2) | ||
| 58 | |||
| 55 | static int cpu_model; | 59 | static int cpu_model; |
| 56 | static unsigned int numscales=16; | 60 | static unsigned int numscales=16; |
| 57 | static unsigned int fsb; | 61 | static unsigned int fsb; |
| @@ -68,7 +72,7 @@ static unsigned int minmult, maxmult; | |||
| 68 | static int can_scale_voltage; | 72 | static int can_scale_voltage; |
| 69 | static struct acpi_processor *pr = NULL; | 73 | static struct acpi_processor *pr = NULL; |
| 70 | static struct acpi_processor_cx *cx = NULL; | 74 | static struct acpi_processor_cx *cx = NULL; |
| 71 | static int port22_en; | 75 | static u8 longhaul_flags; |
| 72 | 76 | ||
| 73 | /* Module parameters */ | 77 | /* Module parameters */ |
| 74 | static int scale_voltage; | 78 | static int scale_voltage; |
| @@ -80,7 +84,6 @@ static int ignore_latency; | |||
| 80 | /* Clock ratios multiplied by 10 */ | 84 | /* Clock ratios multiplied by 10 */ |
| 81 | static int clock_ratio[32]; | 85 | static int clock_ratio[32]; |
| 82 | static int eblcr_table[32]; | 86 | static int eblcr_table[32]; |
| 83 | static unsigned int highest_speed, lowest_speed; /* kHz */ | ||
| 84 | static int longhaul_version; | 87 | static int longhaul_version; |
| 85 | static struct cpufreq_frequency_table *longhaul_table; | 88 | static struct cpufreq_frequency_table *longhaul_table; |
| 86 | 89 | ||
| @@ -178,7 +181,7 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index) | |||
| 178 | safe_halt(); | 181 | safe_halt(); |
| 179 | /* Change frequency on next halt or sleep */ | 182 | /* Change frequency on next halt or sleep */ |
| 180 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); | 183 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
| 181 | if (port22_en) { | 184 | if (!cx_address) { |
| 182 | ACPI_FLUSH_CPU_CACHE(); | 185 | ACPI_FLUSH_CPU_CACHE(); |
| 183 | /* Invoke C1 */ | 186 | /* Invoke C1 */ |
| 184 | halt(); | 187 | halt(); |
| @@ -189,7 +192,6 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index) | |||
| 189 | /* Dummy op - must do something useless after P_LVL3 read */ | 192 | /* Dummy op - must do something useless after P_LVL3 read */ |
| 190 | t = inl(acpi_fadt.xpm_tmr_blk.address); | 193 | t = inl(acpi_fadt.xpm_tmr_blk.address); |
| 191 | } | 194 | } |
| 192 | |||
| 193 | /* Disable bus ratio bit */ | 195 | /* Disable bus ratio bit */ |
| 194 | local_irq_disable(); | 196 | local_irq_disable(); |
| 195 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | 197 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; |
| @@ -243,15 +245,14 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
| 243 | outb(0xFF,0xA1); /* Overkill */ | 245 | outb(0xFF,0xA1); /* Overkill */ |
| 244 | outb(0xFE,0x21); /* TMR0 only */ | 246 | outb(0xFE,0x21); /* TMR0 only */ |
| 245 | 247 | ||
| 246 | if (pr->flags.bm_control) { | 248 | if (longhaul_flags & USE_NORTHBRIDGE) { |
| 249 | /* Disable AGP and PCI arbiters */ | ||
| 250 | outb(3, 0x22); | ||
| 251 | } else if ((pr != NULL) && pr->flags.bm_control) { | ||
| 247 | /* Disable bus master arbitration */ | 252 | /* Disable bus master arbitration */ |
| 248 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, | 253 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, |
| 249 | ACPI_MTX_DO_NOT_LOCK); | 254 | ACPI_MTX_DO_NOT_LOCK); |
| 250 | } else if (port22_en) { | ||
| 251 | /* Disable AGP and PCI arbiters */ | ||
| 252 | outb(3, 0x22); | ||
| 253 | } | 255 | } |
| 254 | |||
| 255 | switch (longhaul_version) { | 256 | switch (longhaul_version) { |
| 256 | 257 | ||
| 257 | /* | 258 | /* |
| @@ -278,22 +279,25 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
| 278 | * to work in practice. | 279 | * to work in practice. |
| 279 | */ | 280 | */ |
| 280 | case TYPE_POWERSAVER: | 281 | case TYPE_POWERSAVER: |
| 281 | /* Don't allow wakeup */ | 282 | if (longhaul_flags & USE_ACPI_C3) { |
| 282 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, | 283 | /* Don't allow wakeup */ |
| 283 | ACPI_MTX_DO_NOT_LOCK); | 284 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, |
| 284 | do_powersaver(cx->address, clock_ratio_index); | 285 | ACPI_MTX_DO_NOT_LOCK); |
| 286 | do_powersaver(cx->address, clock_ratio_index); | ||
| 287 | } else { | ||
| 288 | do_powersaver(0, clock_ratio_index); | ||
| 289 | } | ||
| 285 | break; | 290 | break; |
| 286 | } | 291 | } |
| 287 | 292 | ||
| 288 | if (pr->flags.bm_control) { | 293 | if (longhaul_flags & USE_NORTHBRIDGE) { |
| 294 | /* Enable arbiters */ | ||
| 295 | outb(0, 0x22); | ||
| 296 | } else if ((pr != NULL) && pr->flags.bm_control) { | ||
| 289 | /* Enable bus master arbitration */ | 297 | /* Enable bus master arbitration */ |
| 290 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, | 298 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, |
| 291 | ACPI_MTX_DO_NOT_LOCK); | 299 | ACPI_MTX_DO_NOT_LOCK); |
| 292 | } else if (port22_en) { | ||
| 293 | /* Enable arbiters */ | ||
| 294 | outb(0, 0x22); | ||
| 295 | } | 300 | } |
| 296 | |||
| 297 | outb(pic2_mask,0xA1); /* restore mask */ | 301 | outb(pic2_mask,0xA1); /* restore mask */ |
| 298 | outb(pic1_mask,0x21); | 302 | outb(pic1_mask,0x21); |
| 299 | 303 | ||
| @@ -314,12 +318,12 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
| 314 | 318 | ||
| 315 | #define ROUNDING 0xf | 319 | #define ROUNDING 0xf |
| 316 | 320 | ||
| 317 | static int _guess(int guess) | 321 | static int _guess(int guess, int mult) |
| 318 | { | 322 | { |
| 319 | int target; | 323 | int target; |
| 320 | 324 | ||
| 321 | target = ((maxmult/10)*guess); | 325 | target = ((mult/10)*guess); |
| 322 | if (maxmult%10 != 0) | 326 | if (mult%10 != 0) |
| 323 | target += (guess/2); | 327 | target += (guess/2); |
| 324 | target += ROUNDING/2; | 328 | target += ROUNDING/2; |
| 325 | target &= ~ROUNDING; | 329 | target &= ~ROUNDING; |
| @@ -327,17 +331,17 @@ static int _guess(int guess) | |||
| 327 | } | 331 | } |
| 328 | 332 | ||
| 329 | 333 | ||
| 330 | static int guess_fsb(void) | 334 | static int guess_fsb(int mult) |
| 331 | { | 335 | { |
| 332 | int speed = (cpu_khz/1000); | 336 | int speed = (cpu_khz/1000); |
| 333 | int i; | 337 | int i; |
| 334 | int speeds[3] = { 66, 100, 133 }; | 338 | int speeds[] = { 66, 100, 133, 200 }; |
| 335 | 339 | ||
| 336 | speed += ROUNDING/2; | 340 | speed += ROUNDING/2; |
| 337 | speed &= ~ROUNDING; | 341 | speed &= ~ROUNDING; |
| 338 | 342 | ||
| 339 | for (i=0; i<3; i++) { | 343 | for (i=0; i<4; i++) { |
| 340 | if (_guess(speeds[i]) == speed) | 344 | if (_guess(speeds[i], mult) == speed) |
| 341 | return speeds[i]; | 345 | return speeds[i]; |
| 342 | } | 346 | } |
| 343 | return 0; | 347 | return 0; |
| @@ -354,9 +358,7 @@ static int __init longhaul_get_ranges(void) | |||
| 354 | 130, 150, 160, 140, -1, 155, -1, 145 }; | 358 | 130, 150, 160, 140, -1, 155, -1, 145 }; |
| 355 | unsigned int j, k = 0; | 359 | unsigned int j, k = 0; |
| 356 | union msr_longhaul longhaul; | 360 | union msr_longhaul longhaul; |
| 357 | unsigned long lo, hi; | 361 | int mult = 0; |
| 358 | unsigned int eblcr_fsb_table_v1[] = { 66, 133, 100, -1 }; | ||
| 359 | unsigned int eblcr_fsb_table_v2[] = { 133, 100, -1, 66 }; | ||
| 360 | 362 | ||
| 361 | switch (longhaul_version) { | 363 | switch (longhaul_version) { |
| 362 | case TYPE_LONGHAUL_V1: | 364 | case TYPE_LONGHAUL_V1: |
| @@ -364,30 +366,18 @@ static int __init longhaul_get_ranges(void) | |||
| 364 | /* Ugh, Longhaul v1 didn't have the min/max MSRs. | 366 | /* Ugh, Longhaul v1 didn't have the min/max MSRs. |
| 365 | Assume min=3.0x & max = whatever we booted at. */ | 367 | Assume min=3.0x & max = whatever we booted at. */ |
| 366 | minmult = 30; | 368 | minmult = 30; |
| 367 | maxmult = longhaul_get_cpu_mult(); | 369 | maxmult = mult = longhaul_get_cpu_mult(); |
| 368 | rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi); | ||
| 369 | invalue = (lo & (1<<18|1<<19)) >>18; | ||
| 370 | if (cpu_model==CPU_SAMUEL || cpu_model==CPU_SAMUEL2) | ||
| 371 | fsb = eblcr_fsb_table_v1[invalue]; | ||
| 372 | else | ||
| 373 | fsb = guess_fsb(); | ||
| 374 | break; | 370 | break; |
| 375 | 371 | ||
| 376 | case TYPE_POWERSAVER: | 372 | case TYPE_POWERSAVER: |
| 377 | /* Ezra-T */ | 373 | /* Ezra-T */ |
| 378 | if (cpu_model==CPU_EZRA_T) { | 374 | if (cpu_model==CPU_EZRA_T) { |
| 375 | minmult = 30; | ||
| 379 | rdmsrl (MSR_VIA_LONGHAUL, longhaul.val); | 376 | rdmsrl (MSR_VIA_LONGHAUL, longhaul.val); |
| 380 | invalue = longhaul.bits.MaxMHzBR; | 377 | invalue = longhaul.bits.MaxMHzBR; |
| 381 | if (longhaul.bits.MaxMHzBR4) | 378 | if (longhaul.bits.MaxMHzBR4) |
| 382 | invalue += 16; | 379 | invalue += 16; |
| 383 | maxmult=ezra_t_multipliers[invalue]; | 380 | maxmult = mult = ezra_t_multipliers[invalue]; |
| 384 | |||
| 385 | invalue = longhaul.bits.MinMHzBR; | ||
| 386 | if (longhaul.bits.MinMHzBR4 == 1) | ||
| 387 | minmult = 30; | ||
| 388 | else | ||
| 389 | minmult = ezra_t_multipliers[invalue]; | ||
| 390 | fsb = eblcr_fsb_table_v2[longhaul.bits.MaxMHzFSB]; | ||
| 391 | break; | 381 | break; |
| 392 | } | 382 | } |
| 393 | 383 | ||
| @@ -407,21 +397,16 @@ static int __init longhaul_get_ranges(void) | |||
| 407 | * But it works, so we don't grumble. | 397 | * But it works, so we don't grumble. |
| 408 | */ | 398 | */ |
| 409 | minmult=40; | 399 | minmult=40; |
| 410 | maxmult=longhaul_get_cpu_mult(); | 400 | maxmult = mult = longhaul_get_cpu_mult(); |
| 411 | |||
| 412 | /* Starting with the 1.2GHz parts, theres a 200MHz bus. */ | ||
| 413 | if ((cpu_khz/maxmult) > 13400) | ||
| 414 | fsb = 200; | ||
| 415 | else | ||
| 416 | fsb = eblcr_fsb_table_v2[longhaul.bits.MaxMHzFSB]; | ||
| 417 | break; | 401 | break; |
| 418 | } | 402 | } |
| 419 | } | 403 | } |
| 404 | fsb = guess_fsb(mult); | ||
| 420 | 405 | ||
| 421 | dprintk ("MinMult:%d.%dx MaxMult:%d.%dx\n", | 406 | dprintk ("MinMult:%d.%dx MaxMult:%d.%dx\n", |
| 422 | minmult/10, minmult%10, maxmult/10, maxmult%10); | 407 | minmult/10, minmult%10, maxmult/10, maxmult%10); |
| 423 | 408 | ||
| 424 | if (fsb == -1) { | 409 | if (fsb == 0) { |
| 425 | printk (KERN_INFO PFX "Invalid (reserved) FSB!\n"); | 410 | printk (KERN_INFO PFX "Invalid (reserved) FSB!\n"); |
| 426 | return -EINVAL; | 411 | return -EINVAL; |
| 427 | } | 412 | } |
| @@ -691,27 +676,32 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
| 691 | /* Find ACPI data for processor */ | 676 | /* Find ACPI data for processor */ |
| 692 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, | 677 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, |
| 693 | &longhaul_walk_callback, NULL, (void *)&pr); | 678 | &longhaul_walk_callback, NULL, (void *)&pr); |
| 694 | if (pr == NULL) | ||
| 695 | goto err_acpi; | ||
| 696 | 679 | ||
| 697 | if (longhaul_version == TYPE_POWERSAVER) { | 680 | /* Check ACPI support for C3 state */ |
| 698 | /* Check ACPI support for C3 state */ | 681 | if ((pr != NULL) && (longhaul_version == TYPE_POWERSAVER)) { |
| 699 | cx = &pr->power.states[ACPI_STATE_C3]; | 682 | cx = &pr->power.states[ACPI_STATE_C3]; |
| 700 | if (cx->address > 0 && | 683 | if (cx->address > 0 && |
| 701 | (cx->latency <= 1000 || ignore_latency != 0) ) { | 684 | (cx->latency <= 1000 || ignore_latency != 0) ) { |
| 685 | longhaul_flags |= USE_ACPI_C3; | ||
| 702 | goto print_support_type; | 686 | goto print_support_type; |
| 703 | } | 687 | } |
| 704 | } | 688 | } |
| 689 | /* Check if northbridge is friendly */ | ||
| 690 | if (enable_arbiter_disable()) { | ||
| 691 | longhaul_flags |= USE_NORTHBRIDGE; | ||
| 692 | goto print_support_type; | ||
| 693 | } | ||
| 694 | |||
| 695 | /* No ACPI C3 or we can't use it */ | ||
| 705 | /* Check ACPI support for bus master arbiter disable */ | 696 | /* Check ACPI support for bus master arbiter disable */ |
| 706 | if (!pr->flags.bm_control) { | 697 | if ((pr == NULL) || !(pr->flags.bm_control)) { |
| 707 | if (enable_arbiter_disable()) { | 698 | printk(KERN_ERR PFX |
| 708 | port22_en = 1; | 699 | "No ACPI support. Unsupported northbridge.\n"); |
| 709 | } else { | 700 | return -ENODEV; |
| 710 | goto err_acpi; | ||
| 711 | } | ||
| 712 | } | 701 | } |
| 702 | |||
| 713 | print_support_type: | 703 | print_support_type: |
| 714 | if (!port22_en) { | 704 | if (!(longhaul_flags & USE_NORTHBRIDGE)) { |
| 715 | printk (KERN_INFO PFX "Using ACPI support.\n"); | 705 | printk (KERN_INFO PFX "Using ACPI support.\n"); |
| 716 | } else { | 706 | } else { |
| 717 | printk (KERN_INFO PFX "Using northbridge support.\n"); | 707 | printk (KERN_INFO PFX "Using northbridge support.\n"); |
| @@ -736,10 +726,6 @@ print_support_type: | |||
| 736 | cpufreq_frequency_table_get_attr(longhaul_table, policy->cpu); | 726 | cpufreq_frequency_table_get_attr(longhaul_table, policy->cpu); |
| 737 | 727 | ||
| 738 | return 0; | 728 | return 0; |
| 739 | |||
| 740 | err_acpi: | ||
| 741 | printk(KERN_ERR PFX "No ACPI support. Unsupported northbridge. Aborting.\n"); | ||
| 742 | return -ENODEV; | ||
| 743 | } | 729 | } |
| 744 | 730 | ||
| 745 | static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) | 731 | static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) |
| @@ -774,8 +760,8 @@ static int __init longhaul_init(void) | |||
| 774 | 760 | ||
| 775 | #ifdef CONFIG_SMP | 761 | #ifdef CONFIG_SMP |
| 776 | if (num_online_cpus() > 1) { | 762 | if (num_online_cpus() > 1) { |
| 777 | return -ENODEV; | ||
| 778 | printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n"); | 763 | printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n"); |
| 764 | return -ENODEV; | ||
| 779 | } | 765 | } |
| 780 | #endif | 766 | #endif |
| 781 | #ifdef CONFIG_X86_IO_APIC | 767 | #ifdef CONFIG_X86_IO_APIC |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c index 5113e9231634..f43b987f952b 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | |||
| @@ -533,9 +533,9 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) | |||
| 533 | 533 | ||
| 534 | /* notify BIOS that we exist */ | 534 | /* notify BIOS that we exist */ |
| 535 | acpi_processor_notify_smm(THIS_MODULE); | 535 | acpi_processor_notify_smm(THIS_MODULE); |
| 536 | printk("speedstep-centrino with X86_SPEEDSTEP_CENTRINO_ACPI" | 536 | printk("speedstep-centrino with X86_SPEEDSTEP_CENTRINO_ACPI " |
| 537 | "config is deprecated.\n " | 537 | "config is deprecated.\n " |
| 538 | "Use X86_ACPI_CPUFREQ (acpi-cpufreq instead.\n" ); | 538 | "Use X86_ACPI_CPUFREQ (acpi-cpufreq) instead.\n" ); |
| 539 | 539 | ||
| 540 | return 0; | 540 | return 0; |
| 541 | 541 | ||
diff --git a/arch/x86_64/kernel/cpufreq/Kconfig b/arch/x86_64/kernel/cpufreq/Kconfig index 3abcfa3e1ed7..45a6a1fd14ac 100644 --- a/arch/x86_64/kernel/cpufreq/Kconfig +++ b/arch/x86_64/kernel/cpufreq/Kconfig | |||
| @@ -49,6 +49,7 @@ config X86_SPEEDSTEP_CENTRINO_ACPI | |||
| 49 | 49 | ||
| 50 | config X86_ACPI_CPUFREQ | 50 | config X86_ACPI_CPUFREQ |
| 51 | tristate "ACPI Processor P-States driver" | 51 | tristate "ACPI Processor P-States driver" |
| 52 | select CPU_FREQ_TABLE | ||
| 52 | depends on ACPI_PROCESSOR | 53 | depends on ACPI_PROCESSOR |
| 53 | help | 54 | help |
| 54 | This driver adds a CPUFreq driver which utilizes the ACPI | 55 | This driver adds a CPUFreq driver which utilizes the ACPI |
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 6742b1adf2c8..91ad342a6051 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
| @@ -285,6 +285,7 @@ cpufreq_stat_notifier_trans (struct notifier_block *nb, unsigned long val, | |||
| 285 | stat = cpufreq_stats_table[freq->cpu]; | 285 | stat = cpufreq_stats_table[freq->cpu]; |
| 286 | if (!stat) | 286 | if (!stat) |
| 287 | return 0; | 287 | return 0; |
| 288 | |||
| 288 | old_index = freq_table_get_index(stat, freq->old); | 289 | old_index = freq_table_get_index(stat, freq->old); |
| 289 | new_index = freq_table_get_index(stat, freq->new); | 290 | new_index = freq_table_get_index(stat, freq->new); |
| 290 | 291 | ||
| @@ -292,6 +293,9 @@ cpufreq_stat_notifier_trans (struct notifier_block *nb, unsigned long val, | |||
| 292 | if (old_index == new_index) | 293 | if (old_index == new_index) |
| 293 | return 0; | 294 | return 0; |
| 294 | 295 | ||
| 296 | if (old_index == -1 || new_index == -1) | ||
| 297 | return 0; | ||
| 298 | |||
| 295 | spin_lock(&cpufreq_stats_lock); | 299 | spin_lock(&cpufreq_stats_lock); |
| 296 | stat->last_index = new_index; | 300 | stat->last_index = new_index; |
| 297 | #ifdef CONFIG_CPU_FREQ_STAT_DETAILS | 301 | #ifdef CONFIG_CPU_FREQ_STAT_DETAILS |
