You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
cpufreq: Notify all policy->cpus in cpufreq_notify_transition()
policy->cpus contains all online cpus that have single shared clock line. And their frequencies are always updated together. Many SMP system's cpufreq drivers take care of this in individual drivers but the best place for this code is in cpufreq core. This patch modifies cpufreq_notify_transition() to notify frequency change for all cpus in policy->cpus and hence updates all users of this API. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Acked-by: Stephen Warren <swarren@nvidia.com> Tested-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
fd143b4d6f
commit
b43a7ffbf3
@@ -90,7 +90,6 @@ static int davinci_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = davinci_getspeed(0);
|
||||
freqs.new = clk_round_rate(armclk, target_freq * 1000) / 1000;
|
||||
freqs.cpu = 0;
|
||||
|
||||
if (freqs.old == freqs.new)
|
||||
return ret;
|
||||
@@ -102,7 +101,7 @@ static int davinci_target(struct cpufreq_policy *policy,
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* if moving to higher frequency, up the voltage beforehand */
|
||||
if (pdata->set_voltage && freqs.new > freqs.old) {
|
||||
@@ -126,7 +125,7 @@ static int davinci_target(struct cpufreq_policy *policy,
|
||||
pdata->set_voltage(idx);
|
||||
|
||||
out:
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -87,13 +87,12 @@ static int mxc_set_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = clk_get_rate(cpu_clk) / 1000;
|
||||
freqs.new = freq_Hz / 1000;
|
||||
freqs.cpu = 0;
|
||||
freqs.flags = 0;
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
ret = set_cpu_freq(freq_Hz);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -123,14 +123,12 @@ static int integrator_set_target(struct cpufreq_policy *policy,
|
||||
vco = icst_hz_to_vco(&cclk_params, target_freq * 1000);
|
||||
freqs.new = icst_hz(&cclk_params, vco) / 1000;
|
||||
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
if (freqs.old == freqs.new) {
|
||||
set_cpus_allowed(current, cpus_allowed);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
cm_osc = __raw_readl(CM_OSC);
|
||||
|
||||
@@ -151,7 +149,7 @@ static int integrator_set_target(struct cpufreq_policy *policy,
|
||||
*/
|
||||
set_cpus_allowed(current, cpus_allowed);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -311,7 +311,6 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
||||
new_freq_mem = pxa_freq_settings[idx].membus;
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = new_freq_cpu;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
if (freq_debug)
|
||||
pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n",
|
||||
@@ -327,7 +326,7 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
||||
* you should add a notify client with any platform specific
|
||||
* Vcc changing capability
|
||||
*/
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* Calculate the next MDREFR. If we're slowing down the SDRAM clock
|
||||
* we need to preset the smaller DRI before the change. If we're
|
||||
@@ -382,7 +381,7 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
||||
* you should add a notify client with any platform specific
|
||||
* SDRAM refresh timer adjustments
|
||||
*/
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
/*
|
||||
* Even if voltage setting fails, we don't report it, as the frequency
|
||||
|
||||
@@ -184,7 +184,6 @@ static int pxa3xx_cpufreq_set(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = next->cpufreq_mhz * 1000;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
pr_debug("CPU frequency from %d MHz to %d MHz%s\n",
|
||||
freqs.old / 1000, freqs.new / 1000,
|
||||
@@ -193,14 +192,14 @@ static int pxa3xx_cpufreq_set(struct cpufreq_policy *policy,
|
||||
if (freqs.old == target_freq)
|
||||
return 0;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
local_irq_save(flags);
|
||||
__update_core_freq(next);
|
||||
__update_bus_freq(next);
|
||||
local_irq_restore(flags);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -204,7 +204,6 @@ static int s3c_cpufreq_settarget(struct cpufreq_policy *policy,
|
||||
freqs.old = cpu_cur.freq;
|
||||
freqs.new = cpu_new.freq;
|
||||
|
||||
freqs.freqs.cpu = 0;
|
||||
freqs.freqs.old = cpu_cur.freq.armclk / 1000;
|
||||
freqs.freqs.new = cpu_new.freq.armclk / 1000;
|
||||
|
||||
@@ -218,9 +217,7 @@ static int s3c_cpufreq_settarget(struct cpufreq_policy *policy,
|
||||
s3c_cpufreq_updateclk(clk_pclk, cpu_new.freq.pclk);
|
||||
|
||||
/* start the frequency change */
|
||||
|
||||
if (policy)
|
||||
cpufreq_notify_transition(&freqs.freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs.freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* If hclk is staying the same, then we do not need to
|
||||
* re-write the IO or the refresh timings whilst we are changing
|
||||
@@ -264,8 +261,7 @@ static int s3c_cpufreq_settarget(struct cpufreq_policy *policy,
|
||||
local_irq_restore(flags);
|
||||
|
||||
/* notify everyone we've done this */
|
||||
if (policy)
|
||||
cpufreq_notify_transition(&freqs.freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs.freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
s3c_freq_dbg("%s: finished\n", __func__);
|
||||
return 0;
|
||||
|
||||
@@ -201,9 +201,8 @@ static int sa1100_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = cur;
|
||||
freqs.new = sa11x0_ppcr_to_freq(new_ppcr);
|
||||
freqs.cpu = 0;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
if (freqs.new > cur)
|
||||
sa1100_update_dram_timings(cur, freqs.new);
|
||||
@@ -213,7 +212,7 @@ static int sa1100_target(struct cpufreq_policy *policy,
|
||||
if (freqs.new < cur)
|
||||
sa1100_update_dram_timings(cur, freqs.new);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -258,7 +258,6 @@ static int sa1110_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = sa11x0_getspeed(0);
|
||||
freqs.new = sa11x0_ppcr_to_freq(ppcr);
|
||||
freqs.cpu = 0;
|
||||
|
||||
sdram_calculate_timing(&sd, freqs.new, sdram);
|
||||
|
||||
@@ -279,7 +278,7 @@ static int sa1110_target(struct cpufreq_policy *policy,
|
||||
sd.mdcas[2] = 0xaaaaaaaa;
|
||||
#endif
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/*
|
||||
* The clock could be going away for some time. Set the SDRAMs
|
||||
@@ -327,7 +326,7 @@ static int sa1110_target(struct cpufreq_policy *policy,
|
||||
*/
|
||||
sdram_update_refresh(freqs.new, sdram);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -106,7 +106,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tegra_update_cpu_speed(unsigned long rate)
|
||||
static int tegra_update_cpu_speed(struct cpufreq_policy *policy,
|
||||
unsigned long rate)
|
||||
{
|
||||
int ret = 0;
|
||||
struct cpufreq_freqs freqs;
|
||||
@@ -128,8 +129,7 @@ static int tegra_update_cpu_speed(unsigned long rate)
|
||||
else
|
||||
clk_set_rate(emc_clk, 100000000); /* emc 50Mhz */
|
||||
|
||||
for_each_online_cpu(freqs.cpu)
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ_DEBUG
|
||||
printk(KERN_DEBUG "cpufreq-tegra: transition: %u --> %u\n",
|
||||
@@ -143,8 +143,7 @@ static int tegra_update_cpu_speed(unsigned long rate)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for_each_online_cpu(freqs.cpu)
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -181,7 +180,7 @@ static int tegra_target(struct cpufreq_policy *policy,
|
||||
|
||||
target_cpu_speed[policy->cpu] = freq;
|
||||
|
||||
ret = tegra_update_cpu_speed(tegra_cpu_highest_speed());
|
||||
ret = tegra_update_cpu_speed(policy, tegra_cpu_highest_speed());
|
||||
|
||||
out:
|
||||
mutex_unlock(&tegra_cpu_lock);
|
||||
@@ -193,10 +192,12 @@ static int tegra_pm_notify(struct notifier_block *nb, unsigned long event,
|
||||
{
|
||||
mutex_lock(&tegra_cpu_lock);
|
||||
if (event == PM_SUSPEND_PREPARE) {
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(0);
|
||||
is_suspended = true;
|
||||
pr_info("Tegra cpufreq suspend: setting frequency to %d kHz\n",
|
||||
freq_table[0].frequency);
|
||||
tegra_update_cpu_speed(freq_table[0].frequency);
|
||||
tegra_update_cpu_speed(policy, freq_table[0].frequency);
|
||||
cpufreq_cpu_put(policy);
|
||||
} else if (event == PM_POST_SUSPEND) {
|
||||
is_suspended = false;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,6 @@ static int at32_set_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = at32_get_speed(0);
|
||||
freqs.new = (freq + 500) / 1000;
|
||||
freqs.cpu = 0;
|
||||
freqs.flags = 0;
|
||||
|
||||
if (!ref_freq) {
|
||||
@@ -69,7 +68,7 @@ static int at32_set_target(struct cpufreq_policy *policy,
|
||||
loops_per_jiffy_ref = boot_cpu_data.loops_per_jiffy;
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
if (freqs.old < freqs.new)
|
||||
boot_cpu_data.loops_per_jiffy = cpufreq_scale(
|
||||
loops_per_jiffy_ref, ref_freq, freqs.new);
|
||||
@@ -77,7 +76,7 @@ static int at32_set_target(struct cpufreq_policy *policy,
|
||||
if (freqs.new < freqs.old)
|
||||
boot_cpu_data.loops_per_jiffy = cpufreq_scale(
|
||||
loops_per_jiffy_ref, ref_freq, freqs.new);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: set frequency %lu Hz\n", freq);
|
||||
|
||||
|
||||
@@ -127,13 +127,13 @@ unsigned long cpu_set_cclk(int cpu, unsigned long new)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int bfin_target(struct cpufreq_policy *poli,
|
||||
static int bfin_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq, unsigned int relation)
|
||||
{
|
||||
#ifndef CONFIG_BF60x
|
||||
unsigned int plldiv;
|
||||
#endif
|
||||
unsigned int index, cpu;
|
||||
unsigned int index;
|
||||
unsigned long cclk_hz;
|
||||
struct cpufreq_freqs freqs;
|
||||
static unsigned long lpj_ref;
|
||||
@@ -144,59 +144,48 @@ static int bfin_target(struct cpufreq_policy *poli,
|
||||
cycles_t cycles;
|
||||
#endif
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||
if (cpufreq_frequency_table_target(policy, bfin_freq_table, target_freq,
|
||||
relation, &index))
|
||||
return -EINVAL;
|
||||
|
||||
if (!policy)
|
||||
continue;
|
||||
cclk_hz = bfin_freq_table[index].frequency;
|
||||
|
||||
if (cpufreq_frequency_table_target(policy, bfin_freq_table,
|
||||
target_freq, relation, &index))
|
||||
return -EINVAL;
|
||||
freqs.old = bfin_getfreq_khz(0);
|
||||
freqs.new = cclk_hz;
|
||||
|
||||
cclk_hz = bfin_freq_table[index].frequency;
|
||||
pr_debug("cpufreq: changing cclk to %lu; target = %u, oldfreq = %u\n",
|
||||
cclk_hz, target_freq, freqs.old);
|
||||
|
||||
freqs.old = bfin_getfreq_khz(0);
|
||||
freqs.new = cclk_hz;
|
||||
freqs.cpu = cpu;
|
||||
|
||||
pr_debug("cpufreq: changing cclk to %lu; target = %u, oldfreq = %u\n",
|
||||
cclk_hz, target_freq, freqs.old);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
if (cpu == CPUFREQ_CPU) {
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
#ifndef CONFIG_BF60x
|
||||
plldiv = (bfin_read_PLL_DIV() & SSEL) |
|
||||
dpm_state_table[index].csel;
|
||||
bfin_write_PLL_DIV(plldiv);
|
||||
plldiv = (bfin_read_PLL_DIV() & SSEL) | dpm_state_table[index].csel;
|
||||
bfin_write_PLL_DIV(plldiv);
|
||||
#else
|
||||
ret = cpu_set_cclk(cpu, freqs.new * 1000);
|
||||
if (ret != 0) {
|
||||
WARN_ONCE(ret, "cpufreq set freq failed %d\n", ret);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
on_each_cpu(bfin_adjust_core_timer, &index, 1);
|
||||
#if defined(CONFIG_CYCLES_CLOCKSOURCE)
|
||||
cycles = get_cycles();
|
||||
SSYNC();
|
||||
cycles += 10; /* ~10 cycles we lose after get_cycles() */
|
||||
__bfin_cycles_off +=
|
||||
(cycles << __bfin_cycles_mod) - (cycles << index);
|
||||
__bfin_cycles_mod = index;
|
||||
#endif
|
||||
if (!lpj_ref_freq) {
|
||||
lpj_ref = loops_per_jiffy;
|
||||
lpj_ref_freq = freqs.old;
|
||||
}
|
||||
if (freqs.new != freqs.old) {
|
||||
loops_per_jiffy = cpufreq_scale(lpj_ref,
|
||||
lpj_ref_freq, freqs.new);
|
||||
}
|
||||
}
|
||||
/* TODO: just test case for cycles clock source, remove later */
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
ret = cpu_set_cclk(policy->cpu, freqs.new * 1000);
|
||||
if (ret != 0) {
|
||||
WARN_ONCE(ret, "cpufreq set freq failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
on_each_cpu(bfin_adjust_core_timer, &index, 1);
|
||||
#if defined(CONFIG_CYCLES_CLOCKSOURCE)
|
||||
cycles = get_cycles();
|
||||
SSYNC();
|
||||
cycles += 10; /* ~10 cycles we lose after get_cycles() */
|
||||
__bfin_cycles_off += (cycles << __bfin_cycles_mod) - (cycles << index);
|
||||
__bfin_cycles_mod = index;
|
||||
#endif
|
||||
if (!lpj_ref_freq) {
|
||||
lpj_ref = loops_per_jiffy;
|
||||
lpj_ref_freq = freqs.old;
|
||||
}
|
||||
if (freqs.new != freqs.old) {
|
||||
loops_per_jiffy = cpufreq_scale(lpj_ref,
|
||||
lpj_ref_freq, freqs.new);
|
||||
}
|
||||
|
||||
/* TODO: just test case for cycles clock source, remove later */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: done\n");
|
||||
return ret;
|
||||
|
||||
@@ -27,23 +27,17 @@ static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
|
||||
return clk_ctrl.pll ? 200000 : 6000;
|
||||
}
|
||||
|
||||
static void cris_freq_set_cpu_state(unsigned int state)
|
||||
static void cris_freq_set_cpu_state(struct cpufreq_policy *policy,
|
||||
unsigned int state)
|
||||
{
|
||||
int i = 0;
|
||||
struct cpufreq_freqs freqs;
|
||||
reg_clkgen_rw_clk_ctrl clk_ctrl;
|
||||
clk_ctrl = REG_RD(clkgen, regi_clkgen, rw_clk_ctrl);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
for_each_present_cpu(i)
|
||||
#endif
|
||||
{
|
||||
freqs.old = cris_freq_get_cpu_frequency(i);
|
||||
freqs.new = cris_freq_table[state].frequency;
|
||||
freqs.cpu = i;
|
||||
}
|
||||
freqs.old = cris_freq_get_cpu_frequency(policy->cpu);
|
||||
freqs.new = cris_freq_table[state].frequency;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
@@ -57,7 +51,7 @@ static void cris_freq_set_cpu_state(unsigned int state)
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
};
|
||||
|
||||
static int cris_freq_verify(struct cpufreq_policy *policy)
|
||||
@@ -75,7 +69,7 @@ static int cris_freq_target(struct cpufreq_policy *policy,
|
||||
target_freq, relation, &newstate))
|
||||
return -EINVAL;
|
||||
|
||||
cris_freq_set_cpu_state(newstate);
|
||||
cris_freq_set_cpu_state(policy, newstate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -27,20 +27,17 @@ static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
|
||||
return clk_ctrl.pll ? 200000 : 6000;
|
||||
}
|
||||
|
||||
static void cris_freq_set_cpu_state(unsigned int state)
|
||||
static void cris_freq_set_cpu_state(struct cpufreq_policy *policy,
|
||||
unsigned int state)
|
||||
{
|
||||
int i;
|
||||
struct cpufreq_freqs freqs;
|
||||
reg_config_rw_clk_ctrl clk_ctrl;
|
||||
clk_ctrl = REG_RD(config, regi_config, rw_clk_ctrl);
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
freqs.old = cris_freq_get_cpu_frequency(i);
|
||||
freqs.new = cris_freq_table[state].frequency;
|
||||
freqs.cpu = i;
|
||||
}
|
||||
freqs.old = cris_freq_get_cpu_frequency(policy->cpu);
|
||||
freqs.new = cris_freq_table[state].frequency;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
@@ -54,7 +51,7 @@ static void cris_freq_set_cpu_state(unsigned int state)
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
};
|
||||
|
||||
static int cris_freq_verify(struct cpufreq_policy *policy)
|
||||
@@ -71,7 +68,7 @@ static int cris_freq_target(struct cpufreq_policy *policy,
|
||||
(policy, cris_freq_table, target_freq, relation, &newstate))
|
||||
return -EINVAL;
|
||||
|
||||
cris_freq_set_cpu_state(newstate);
|
||||
cris_freq_set_cpu_state(policy, newstate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -137,7 +137,7 @@ migrate_end:
|
||||
static int
|
||||
processor_set_freq (
|
||||
struct cpufreq_acpi_io *data,
|
||||
unsigned int cpu,
|
||||
struct cpufreq_policy *policy,
|
||||
int state)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -149,8 +149,8 @@ processor_set_freq (
|
||||
pr_debug("processor_set_freq\n");
|
||||
|
||||
saved_mask = current->cpus_allowed;
|
||||
set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
if (smp_processor_id() != cpu) {
|
||||
set_cpus_allowed_ptr(current, cpumask_of(policy->cpu));
|
||||
if (smp_processor_id() != policy->cpu) {
|
||||
retval = -EAGAIN;
|
||||
goto migrate_end;
|
||||
}
|
||||
@@ -170,12 +170,11 @@ processor_set_freq (
|
||||
data->acpi_data.state, state);
|
||||
|
||||
/* cpufreq frequency struct */
|
||||
cpufreq_freqs.cpu = cpu;
|
||||
cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency;
|
||||
cpufreq_freqs.new = data->freq_table[state].frequency;
|
||||
|
||||
/* notify cpufreq */
|
||||
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/*
|
||||
* First we write the target state's 'control' value to the
|
||||
@@ -189,17 +188,20 @@ processor_set_freq (
|
||||
ret = processor_set_pstate(value);
|
||||
if (ret) {
|
||||
unsigned int tmp = cpufreq_freqs.new;
|
||||
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs,
|
||||
CPUFREQ_POSTCHANGE);
|
||||
cpufreq_freqs.new = cpufreq_freqs.old;
|
||||
cpufreq_freqs.old = tmp;
|
||||
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs,
|
||||
CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs,
|
||||
CPUFREQ_POSTCHANGE);
|
||||
printk(KERN_WARNING "Transition failed with error %d\n", ret);
|
||||
retval = -ENODEV;
|
||||
goto migrate_end;
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
data->acpi_data.state = state;
|
||||
|
||||
@@ -240,7 +242,7 @@ acpi_cpufreq_target (
|
||||
if (result)
|
||||
return (result);
|
||||
|
||||
result = processor_set_freq(data, policy->cpu, next_state);
|
||||
result = processor_set_freq(data, policy, next_state);
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
@@ -80,7 +80,6 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
|
||||
|
||||
pr_debug("cpufreq: requested frequency %u Hz\n", target_freq * 1000);
|
||||
|
||||
freqs.cpu = cpu;
|
||||
freqs.old = loongson2_cpufreq_get(cpu);
|
||||
freqs.new = freq;
|
||||
freqs.flags = 0;
|
||||
@@ -89,7 +88,7 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
|
||||
return 0;
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
|
||||
@@ -97,7 +96,7 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
|
||||
clk_set_rate(cpuclk, freq);
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: set frequency %u kHz\n", freq);
|
||||
|
||||
|
||||
@@ -156,10 +156,9 @@ static int cbe_cpufreq_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = cbe_freqs[cbe_pmode_new].frequency;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
mutex_lock(&cbe_switch_mutex);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
pr_debug("setting frequency for cpu %d to %d kHz, " \
|
||||
"1/%d of max frequency\n",
|
||||
@@ -169,7 +168,7 @@ static int cbe_cpufreq_target(struct cpufreq_policy *policy,
|
||||
|
||||
rc = set_pmode(policy->cpu, cbe_pmode_new);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
mutex_unlock(&cbe_switch_mutex);
|
||||
|
||||
return rc;
|
||||
|
||||
@@ -273,10 +273,9 @@ static int pas_cpufreq_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = pas_freqs[pas_astate_new].frequency;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
mutex_lock(&pas_switch_mutex);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
pr_debug("setting frequency for cpu %d to %d kHz, 1/%d of max frequency\n",
|
||||
policy->cpu,
|
||||
@@ -288,7 +287,7 @@ static int pas_cpufreq_target(struct cpufreq_policy *policy,
|
||||
for_each_online_cpu(i)
|
||||
set_astate(i, pas_astate_new);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
mutex_unlock(&pas_switch_mutex);
|
||||
|
||||
ppc_proc_freq = freqs.new * 1000ul;
|
||||
|
||||
@@ -335,7 +335,8 @@ static int pmu_set_cpu_speed(int low_speed)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_set_cpu_speed(int speed_mode, int notify)
|
||||
static int do_set_cpu_speed(struct cpufreq_policy *policy, int speed_mode,
|
||||
int notify)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned long l3cr;
|
||||
@@ -343,13 +344,12 @@ static int do_set_cpu_speed(int speed_mode, int notify)
|
||||
|
||||
freqs.old = cur_freq;
|
||||
freqs.new = (speed_mode == CPUFREQ_HIGH) ? hi_freq : low_freq;
|
||||
freqs.cpu = smp_processor_id();
|
||||
|
||||
if (freqs.old == freqs.new)
|
||||
return 0;
|
||||
|
||||
if (notify)
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
if (speed_mode == CPUFREQ_LOW &&
|
||||
cpu_has_feature(CPU_FTR_L3CR)) {
|
||||
l3cr = _get_L3CR();
|
||||
@@ -366,7 +366,7 @@ static int do_set_cpu_speed(int speed_mode, int notify)
|
||||
_set_L3CR(prev_l3cr);
|
||||
}
|
||||
if (notify)
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
cur_freq = (speed_mode == CPUFREQ_HIGH) ? hi_freq : low_freq;
|
||||
|
||||
return 0;
|
||||
@@ -393,7 +393,7 @@ static int pmac_cpufreq_target( struct cpufreq_policy *policy,
|
||||
target_freq, relation, &newstate))
|
||||
return -EINVAL;
|
||||
|
||||
rc = do_set_cpu_speed(newstate, 1);
|
||||
rc = do_set_cpu_speed(policy, newstate, 1);
|
||||
|
||||
ppc_proc_freq = cur_freq * 1000ul;
|
||||
return rc;
|
||||
@@ -442,7 +442,7 @@ static int pmac_cpufreq_suspend(struct cpufreq_policy *policy)
|
||||
no_schedule = 1;
|
||||
sleep_freq = cur_freq;
|
||||
if (cur_freq == low_freq && !is_pmu_based)
|
||||
do_set_cpu_speed(CPUFREQ_HIGH, 0);
|
||||
do_set_cpu_speed(policy, CPUFREQ_HIGH, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -458,7 +458,7 @@ static int pmac_cpufreq_resume(struct cpufreq_policy *policy)
|
||||
* is that we force a switch to whatever it was, which is
|
||||
* probably high speed due to our suspend() routine
|
||||
*/
|
||||
do_set_cpu_speed(sleep_freq == low_freq ?
|
||||
do_set_cpu_speed(policy, sleep_freq == low_freq ?
|
||||
CPUFREQ_LOW : CPUFREQ_HIGH, 0);
|
||||
|
||||
ppc_proc_freq = cur_freq * 1000ul;
|
||||
|
||||
@@ -339,11 +339,10 @@ static int g5_cpufreq_target(struct cpufreq_policy *policy,
|
||||
|
||||
freqs.old = g5_cpu_freqs[g5_pmode_cur].frequency;
|
||||
freqs.new = g5_cpu_freqs[newstate].frequency;
|
||||
freqs.cpu = 0;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
rc = g5_switch_freq(newstate);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
mutex_unlock(&g5_switch_mutex);
|
||||
|
||||
|
||||
@@ -69,15 +69,14 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy,
|
||||
|
||||
dev_dbg(dev, "requested frequency %u Hz\n", target_freq * 1000);
|
||||
|
||||
freqs.cpu = cpu;
|
||||
freqs.old = sh_cpufreq_get(cpu);
|
||||
freqs.new = (freq + 500) / 1000;
|
||||
freqs.flags = 0;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
clk_set_rate(cpuclk, freq);
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
dev_dbg(dev, "set frequency %lu Hz\n", freq);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user