Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[pandora-kernel.git] / arch / i386 / kernel / cpu / cpufreq / acpi-cpufreq.c
index 23f8353..10baa35 100644 (file)
@@ -126,27 +126,6 @@ static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
        }
 }
 
-static void wrport(u16 port, u8 bit_width, u32 value)
-{
-       if (bit_width <= 8)
-               outb(value, port);
-       else if (bit_width <= 16)
-               outw(value, port);
-       else if (bit_width <= 32)
-               outl(value, port);
-}
-
-static void rdport(u16 port, u8 bit_width, u32 * ret)
-{
-       *ret = 0;
-       if (bit_width <= 8)
-               *ret = inb(port);
-       else if (bit_width <= 16)
-               *ret = inw(port);
-       else if (bit_width <= 32)
-               *ret = inl(port);
-}
-
 struct msr_addr {
        u32 reg;
 };
@@ -177,7 +156,9 @@ static void do_drv_read(struct drv_cmd *cmd)
                rdmsr(cmd->addr.msr.reg, cmd->val, h);
                break;
        case SYSTEM_IO_CAPABLE:
-               rdport(cmd->addr.io.port, cmd->addr.io.bit_width, &cmd->val);
+               acpi_os_read_port((acpi_io_address)cmd->addr.io.port,
+                               &cmd->val,
+                               (u32)cmd->addr.io.bit_width);
                break;
        default:
                break;
@@ -193,7 +174,9 @@ static void do_drv_write(struct drv_cmd *cmd)
                wrmsr(cmd->addr.msr.reg, cmd->val, h);
                break;
        case SYSTEM_IO_CAPABLE:
-               wrport(cmd->addr.io.port, cmd->addr.io.bit_width, cmd->val);
+               acpi_os_write_port((acpi_io_address)cmd->addr.io.port,
+                               cmd->val,
+                               (u32)cmd->addr.io.bit_width);
                break;
        default:
                break;
@@ -390,8 +373,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
        cpumask_t online_policy_cpus;
        struct drv_cmd cmd;
        unsigned int msr;
-       unsigned int next_state = 0;
-       unsigned int next_perf_state = 0;
+       unsigned int next_state = 0; /* Index into freq_table */
+       unsigned int next_perf_state = 0; /* Index into perf table */
        unsigned int i;
        int result = 0;
 
@@ -437,6 +420,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
                msr =
                    (u32) perf->states[next_perf_state].
                    control & INTEL_MSR_RANGE;
+               cmd.val = get_cur_val(online_policy_cpus);
                cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr;
                break;
        case SYSTEM_IO_CAPABLE:
@@ -456,8 +440,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
        else
                cpu_set(policy->cpu, cmd.mask);
 
-       freqs.old = data->freq_table[perf->state].frequency;
-       freqs.new = data->freq_table[next_perf_state].frequency;
+       freqs.old = perf->states[perf->state].core_frequency * 1000;
+       freqs.new = data->freq_table[next_state].frequency;
        for_each_cpu_mask(i, cmd.mask) {
                freqs.cpu = i;
                cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
@@ -554,6 +538,7 @@ static int acpi_cpufreq_early_init(void)
        return 0;
 }
 
+#ifdef CONFIG_SMP
 /*
  * Some BIOSes do SW_ANY coordination internally, either set it up in hw
  * or do it in BIOS firmware and won't inform about it to OS. If not
@@ -580,6 +565,7 @@ static struct dmi_system_id sw_any_bug_dmi_table[] = {
        },
        { }
 };
+#endif
 
 static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
@@ -691,20 +677,21 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
                    perf->states[i].core_frequency * 1000;
                valid_states++;
        }
-       data->freq_table[perf->state_count].frequency = CPUFREQ_TABLE_END;
+       data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
+       perf->state = 0;
 
        result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
        if (result)
                goto err_freqfree;
 
-       switch (data->cpu_feature) {
+       switch (perf->control_register.space_id) {
        case ACPI_ADR_SPACE_SYSTEM_IO:
                /* Current speed is unknown and not detectable by IO port */
                policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
                break;
        case ACPI_ADR_SPACE_FIXED_HARDWARE:
                acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
-               get_cur_freq_on_cpu(cpu);
+               policy->cur = get_cur_freq_on_cpu(cpu);
                break;
        default:
                break;