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: move freq change notifications to cpufreq core
Most of the drivers do following in their ->target_index() routines: struct cpufreq_freqs freqs; freqs.old = old freq... freqs.new = new freq... cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE); /* Change rate here */ cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE); This is replicated over all cpufreq drivers today and there doesn't exists a good enough reason why this shouldn't be moved to cpufreq core instead. There are few special cases though, like exynos5440, which doesn't do everything on the call to ->target_index() routine and call some kind of bottom halves for doing this work, work/tasklet/etc.. They may continue doing notification from their own code as flag: CPUFREQ_ASYNC_NOTIFICATION is already set for them. All drivers are also modified in this patch to avoid breaking 'git bisect', as double notification would happen otherwise. Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no> Acked-by: Jesper Nilsson <jesper.nilsson@axis.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Russell King <linux@arm.linux.org.uk> Acked-by: Stephen Warren <swarren@nvidia.com> Tested-by: Andrew Lunn <andrew@lunn.ch> Tested-by: Nicolas Pitre <nicolas.pitre@linaro.org> Reviewed-by: Lan Tianyu <tianyu.lan@intel.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
7dbf694db6
commit
d4019f0a92
@@ -428,14 +428,10 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
|
||||
{
|
||||
struct acpi_cpufreq_data *data = per_cpu(acfreq_data, policy->cpu);
|
||||
struct acpi_processor_performance *perf;
|
||||
struct cpufreq_freqs freqs;
|
||||
struct drv_cmd cmd;
|
||||
unsigned int next_perf_state = 0; /* Index into perf table */
|
||||
int result = 0;
|
||||
|
||||
pr_debug("acpi_cpufreq_target %d (%d)\n",
|
||||
data->freq_table[index].frequency, policy->cpu);
|
||||
|
||||
if (unlikely(data == NULL ||
|
||||
data->acpi_data == NULL || data->freq_table == NULL)) {
|
||||
return -ENODEV;
|
||||
@@ -483,23 +479,17 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
|
||||
else
|
||||
cmd.mask = cpumask_of(policy->cpu);
|
||||
|
||||
freqs.old = perf->states[perf->state].core_frequency * 1000;
|
||||
freqs.new = data->freq_table[index].frequency;
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
drv_write(&cmd);
|
||||
|
||||
if (acpi_pstate_strict) {
|
||||
if (!check_freqs(cmd.mask, freqs.new, data)) {
|
||||
if (!check_freqs(cmd.mask, data->freq_table[index].frequency,
|
||||
data)) {
|
||||
pr_debug("acpi_cpufreq_target failed (%d)\n",
|
||||
policy->cpu);
|
||||
result = -EAGAIN;
|
||||
freqs.new = freqs.old;
|
||||
}
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
if (!result)
|
||||
perf->state = next_perf_state;
|
||||
|
||||
|
||||
@@ -192,39 +192,25 @@ bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate)
|
||||
static int bL_cpufreq_set_target(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
u32 cpu = policy->cpu, cur_cluster, new_cluster, actual_cluster;
|
||||
int ret = 0;
|
||||
unsigned int freqs_new;
|
||||
|
||||
cur_cluster = cpu_to_cluster(cpu);
|
||||
new_cluster = actual_cluster = per_cpu(physical_cluster, cpu);
|
||||
|
||||
freqs.old = bL_cpufreq_get_rate(cpu);
|
||||
freqs.new = freq_table[cur_cluster][index].frequency;
|
||||
|
||||
pr_debug("%s: cpu: %d, cluster: %d, oldfreq: %d, target freq: %d, new freq: %d\n",
|
||||
__func__, cpu, cur_cluster, freqs.old, freqs.new,
|
||||
freqs.new);
|
||||
freqs_new = freq_table[cur_cluster][index].frequency;
|
||||
|
||||
if (is_bL_switching_enabled()) {
|
||||
if ((actual_cluster == A15_CLUSTER) &&
|
||||
(freqs.new < clk_big_min)) {
|
||||
(freqs_new < clk_big_min)) {
|
||||
new_cluster = A7_CLUSTER;
|
||||
} else if ((actual_cluster == A7_CLUSTER) &&
|
||||
(freqs.new > clk_little_max)) {
|
||||
(freqs_new > clk_little_max)) {
|
||||
new_cluster = A15_CLUSTER;
|
||||
}
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
ret = bL_cpufreq_set_rate(cpu, actual_cluster, new_cluster, freqs.new);
|
||||
if (ret)
|
||||
freqs.new = freqs.old;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
return bL_cpufreq_set_rate(cpu, actual_cluster, new_cluster, freqs_new);
|
||||
}
|
||||
|
||||
static inline u32 get_table_count(struct cpufreq_frequency_table *table)
|
||||
|
||||
@@ -37,27 +37,23 @@ static unsigned long loops_per_jiffy_ref;
|
||||
|
||||
static int at32_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned int old_freq, new_freq;
|
||||
|
||||
freqs.old = at32_get_speed(0);
|
||||
freqs.new = freq_table[index].frequency;
|
||||
old_freq = at32_get_speed(0);
|
||||
new_freq = freq_table[index].frequency;
|
||||
|
||||
if (!ref_freq) {
|
||||
ref_freq = freqs.old;
|
||||
ref_freq = old_freq;
|
||||
loops_per_jiffy_ref = boot_cpu_data.loops_per_jiffy;
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
if (freqs.old < freqs.new)
|
||||
if (old_freq < new_freq)
|
||||
boot_cpu_data.loops_per_jiffy = cpufreq_scale(
|
||||
loops_per_jiffy_ref, ref_freq, freqs.new);
|
||||
clk_set_rate(cpuclk, freqs.new * 1000);
|
||||
if (freqs.new < freqs.old)
|
||||
loops_per_jiffy_ref, ref_freq, new_freq);
|
||||
clk_set_rate(cpuclk, new_freq * 1000);
|
||||
if (new_freq < old_freq)
|
||||
boot_cpu_data.loops_per_jiffy = cpufreq_scale(
|
||||
loops_per_jiffy_ref, ref_freq, freqs.new);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: set frequency %u Hz\n", freqs.new * 1000);
|
||||
loops_per_jiffy_ref, ref_freq, new_freq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -132,27 +132,23 @@ static int bfin_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
#ifndef CONFIG_BF60x
|
||||
unsigned int plldiv;
|
||||
#endif
|
||||
struct cpufreq_freqs freqs;
|
||||
static unsigned long lpj_ref;
|
||||
static unsigned int lpj_ref_freq;
|
||||
unsigned int old_freq, new_freq;
|
||||
int ret = 0;
|
||||
|
||||
#if defined(CONFIG_CYCLES_CLOCKSOURCE)
|
||||
cycles_t cycles;
|
||||
#endif
|
||||
|
||||
freqs.old = bfin_getfreq_khz(0);
|
||||
freqs.new = bfin_freq_table[index].frequency;
|
||||
old_freq = bfin_getfreq_khz(0);
|
||||
new_freq = bfin_freq_table[index].frequency;
|
||||
|
||||
pr_debug("cpufreq: changing cclk to %lu; target = %u, oldfreq = %u\n",
|
||||
freqs.new, freqs.new, freqs.old);
|
||||
|
||||
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);
|
||||
#else
|
||||
ret = cpu_set_cclk(policy->cpu, freqs.new * 1000);
|
||||
ret = cpu_set_cclk(policy->cpu, new_freq * 1000);
|
||||
if (ret != 0) {
|
||||
WARN_ONCE(ret, "cpufreq set freq failed %d\n", ret);
|
||||
return ret;
|
||||
@@ -168,17 +164,13 @@ static int bfin_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
#endif
|
||||
if (!lpj_ref_freq) {
|
||||
lpj_ref = loops_per_jiffy;
|
||||
lpj_ref_freq = freqs.old;
|
||||
lpj_ref_freq = old_freq;
|
||||
}
|
||||
if (freqs.new != freqs.old) {
|
||||
if (new_freq != old_freq) {
|
||||
loops_per_jiffy = cpufreq_scale(lpj_ref,
|
||||
lpj_ref_freq, freqs.new);
|
||||
lpj_ref_freq, new_freq);
|
||||
}
|
||||
|
||||
/* TODO: just test case for cycles clock source, remove later */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: done\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,20 +37,19 @@ static unsigned int cpu0_get_speed(unsigned int cpu)
|
||||
|
||||
static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
struct dev_pm_opp *opp;
|
||||
unsigned long volt = 0, volt_old = 0, tol = 0;
|
||||
unsigned int old_freq, new_freq;
|
||||
long freq_Hz, freq_exact;
|
||||
int ret;
|
||||
|
||||
freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000);
|
||||
if (freq_Hz < 0)
|
||||
freq_Hz = freq_table[index].frequency * 1000;
|
||||
freq_exact = freq_Hz;
|
||||
freqs.new = freq_Hz / 1000;
|
||||
freqs.old = clk_get_rate(cpu_clk) / 1000;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
freq_exact = freq_Hz;
|
||||
new_freq = freq_Hz / 1000;
|
||||
old_freq = clk_get_rate(cpu_clk) / 1000;
|
||||
|
||||
if (!IS_ERR(cpu_reg)) {
|
||||
rcu_read_lock();
|
||||
@@ -58,9 +57,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
if (IS_ERR(opp)) {
|
||||
rcu_read_unlock();
|
||||
pr_err("failed to find OPP for %ld\n", freq_Hz);
|
||||
freqs.new = freqs.old;
|
||||
ret = PTR_ERR(opp);
|
||||
goto post_notify;
|
||||
return PTR_ERR(opp);
|
||||
}
|
||||
volt = dev_pm_opp_get_voltage(opp);
|
||||
rcu_read_unlock();
|
||||
@@ -69,16 +66,15 @@ static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
}
|
||||
|
||||
pr_debug("%u MHz, %ld mV --> %u MHz, %ld mV\n",
|
||||
freqs.old / 1000, volt_old ? volt_old / 1000 : -1,
|
||||
freqs.new / 1000, volt ? volt / 1000 : -1);
|
||||
old_freq / 1000, volt_old ? volt_old / 1000 : -1,
|
||||
new_freq / 1000, volt ? volt / 1000 : -1);
|
||||
|
||||
/* scaling up? scale voltage before frequency */
|
||||
if (!IS_ERR(cpu_reg) && freqs.new > freqs.old) {
|
||||
if (!IS_ERR(cpu_reg) && new_freq > old_freq) {
|
||||
ret = regulator_set_voltage_tol(cpu_reg, volt, tol);
|
||||
if (ret) {
|
||||
pr_err("failed to scale voltage up: %d\n", ret);
|
||||
freqs.new = freqs.old;
|
||||
goto post_notify;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,23 +83,18 @@ static int cpu0_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
pr_err("failed to set clock rate: %d\n", ret);
|
||||
if (!IS_ERR(cpu_reg))
|
||||
regulator_set_voltage_tol(cpu_reg, volt_old, tol);
|
||||
freqs.new = freqs.old;
|
||||
goto post_notify;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* scaling down? scale voltage after frequency */
|
||||
if (!IS_ERR(cpu_reg) && freqs.new < freqs.old) {
|
||||
if (!IS_ERR(cpu_reg) && new_freq < old_freq) {
|
||||
ret = regulator_set_voltage_tol(cpu_reg, volt, tol);
|
||||
if (ret) {
|
||||
pr_err("failed to scale voltage down: %d\n", ret);
|
||||
clk_set_rate(cpu_clk, freqs.old * 1000);
|
||||
freqs.new = freqs.old;
|
||||
clk_set_rate(cpu_clk, old_freq * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
post_notify:
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1669,6 +1669,8 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
|
||||
retval = cpufreq_driver->target(policy, target_freq, relation);
|
||||
else if (cpufreq_driver->target_index) {
|
||||
struct cpufreq_frequency_table *freq_table;
|
||||
struct cpufreq_freqs freqs;
|
||||
bool notify;
|
||||
int index;
|
||||
|
||||
freq_table = cpufreq_frequency_get_table(policy->cpu);
|
||||
@@ -1684,10 +1686,42 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (freq_table[index].frequency == policy->cur)
|
||||
if (freq_table[index].frequency == policy->cur) {
|
||||
retval = 0;
|
||||
else
|
||||
retval = cpufreq_driver->target_index(policy, index);
|
||||
goto out;
|
||||
}
|
||||
|
||||
notify = !(cpufreq_driver->flags & CPUFREQ_ASYNC_NOTIFICATION);
|
||||
|
||||
if (notify) {
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = freq_table[index].frequency;
|
||||
freqs.flags = 0;
|
||||
|
||||
pr_debug("%s: cpu: %d, oldfreq: %u, new freq: %u\n",
|
||||
__func__, policy->cpu, freqs.old,
|
||||
freqs.new);
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs,
|
||||
CPUFREQ_PRECHANGE);
|
||||
}
|
||||
|
||||
retval = cpufreq_driver->target_index(policy, index);
|
||||
if (retval)
|
||||
pr_err("%s: Failed to change cpu frequency: %d\n",
|
||||
__func__, retval);
|
||||
|
||||
if (notify) {
|
||||
/*
|
||||
* Notify with old freq in case we failed to change
|
||||
* frequency
|
||||
*/
|
||||
if (retval)
|
||||
freqs.new = freqs.old;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs,
|
||||
CPUFREQ_POSTCHANGE);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
@@ -29,15 +29,9 @@ static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
|
||||
|
||||
static int cris_freq_target(struct cpufreq_policy *policy, unsigned int state)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
reg_clkgen_rw_clk_ctrl clk_ctrl;
|
||||
clk_ctrl = REG_RD(clkgen, regi_clkgen, rw_clk_ctrl);
|
||||
|
||||
freqs.old = cris_freq_get_cpu_frequency(policy->cpu);
|
||||
freqs.new = cris_freq_table[state].frequency;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
/* Even though we may be SMP they will share the same clock
|
||||
@@ -50,8 +44,6 @@ static int cris_freq_target(struct cpufreq_policy *policy, unsigned int state)
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,15 +29,9 @@ static unsigned int cris_freq_get_cpu_frequency(unsigned int cpu)
|
||||
|
||||
static int cris_freq_target(struct cpufreq_policy *policy, unsigned int state)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
reg_config_rw_clk_ctrl clk_ctrl;
|
||||
clk_ctrl = REG_RD(config, regi_config, rw_clk_ctrl);
|
||||
|
||||
freqs.old = cris_freq_get_cpu_frequency(policy->cpu);
|
||||
freqs.new = cris_freq_table[state].frequency;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
/* Even though we may be SMP they will share the same clock
|
||||
@@ -50,8 +44,6 @@ static int cris_freq_target(struct cpufreq_policy *policy, unsigned int state)
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,46 +68,36 @@ static unsigned int davinci_getspeed(unsigned int cpu)
|
||||
|
||||
static int davinci_target(struct cpufreq_policy *policy, unsigned int idx)
|
||||
{
|
||||
int ret = 0;
|
||||
struct cpufreq_freqs freqs;
|
||||
struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data;
|
||||
struct clk *armclk = cpufreq.armclk;
|
||||
unsigned int old_freq, new_freq;
|
||||
int ret = 0;
|
||||
|
||||
freqs.old = davinci_getspeed(0);
|
||||
freqs.new = pdata->freq_table[idx].frequency;
|
||||
|
||||
dev_dbg(cpufreq.dev, "transition: %u --> %u\n", freqs.old, freqs.new);
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
old_freq = davinci_getspeed(0);
|
||||
new_freq = pdata->freq_table[idx].frequency;
|
||||
|
||||
/* if moving to higher frequency, up the voltage beforehand */
|
||||
if (pdata->set_voltage && freqs.new > freqs.old) {
|
||||
if (pdata->set_voltage && new_freq > old_freq) {
|
||||
ret = pdata->set_voltage(idx);
|
||||
if (ret)
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = clk_set_rate(armclk, idx);
|
||||
if (ret)
|
||||
goto out;
|
||||
return ret;
|
||||
|
||||
if (cpufreq.asyncclk) {
|
||||
ret = clk_set_rate(cpufreq.asyncclk, cpufreq.asyncrate);
|
||||
if (ret)
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* if moving to lower freq, lower the voltage after lowering freq */
|
||||
if (pdata->set_voltage && freqs.new < freqs.old)
|
||||
if (pdata->set_voltage && new_freq < old_freq)
|
||||
pdata->set_voltage(idx);
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
freqs.new = freqs.old;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int davinci_cpu_init(struct cpufreq_policy *policy)
|
||||
|
||||
@@ -22,28 +22,8 @@ static struct clk *armss_clk;
|
||||
static int dbx500_cpufreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
int ret;
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = freq_table[index].frequency;
|
||||
|
||||
/* pre-change notification */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* update armss clk frequency */
|
||||
ret = clk_set_rate(armss_clk, freqs.new * 1000);
|
||||
|
||||
if (ret) {
|
||||
pr_err("dbx500-cpufreq: Failed to set armss_clk to %d Hz: error %d\n",
|
||||
freqs.new * 1000, ret);
|
||||
freqs.new = freqs.old;
|
||||
}
|
||||
|
||||
/* post change notification */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
return clk_set_rate(armss_clk, freq_table[index].frequency * 1000);
|
||||
}
|
||||
|
||||
static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu)
|
||||
|
||||
@@ -107,15 +107,9 @@ static int eps_set_state(struct eps_cpu_data *centaur,
|
||||
struct cpufreq_policy *policy,
|
||||
u32 dest_state)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
u32 lo, hi;
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
freqs.old = eps_get(policy->cpu);
|
||||
freqs.new = centaur->fsb * ((dest_state >> 8) & 0xff);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* Wait while CPU is busy */
|
||||
rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
|
||||
i = 0;
|
||||
@@ -124,8 +118,7 @@ static int eps_set_state(struct eps_cpu_data *centaur,
|
||||
rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
|
||||
i++;
|
||||
if (unlikely(i > 64)) {
|
||||
err = -ENODEV;
|
||||
goto postchange;
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
/* Set new multiplier and voltage */
|
||||
@@ -137,16 +130,10 @@ static int eps_set_state(struct eps_cpu_data *centaur,
|
||||
rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
|
||||
i++;
|
||||
if (unlikely(i > 64)) {
|
||||
err = -ENODEV;
|
||||
goto postchange;
|
||||
return -ENODEV;
|
||||
}
|
||||
} while (lo & ((1 << 16) | (1 << 17)));
|
||||
|
||||
/* Return current frequency */
|
||||
postchange:
|
||||
rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
|
||||
freqs.new = centaur->fsb * ((lo >> 8) & 0xff);
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
u8 current_multiplier, current_voltage;
|
||||
@@ -161,11 +148,7 @@ postchange:
|
||||
current_multiplier);
|
||||
}
|
||||
#endif
|
||||
if (err)
|
||||
freqs.new = freqs.old;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int eps_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
|
||||
@@ -108,17 +108,6 @@ static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu)
|
||||
static int elanfreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int state)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
|
||||
freqs.old = elanfreq_get_cpu_frequency(0);
|
||||
freqs.new = elan_multiplier[state].clock;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n",
|
||||
elan_multiplier[state].clock);
|
||||
|
||||
|
||||
/*
|
||||
* Access to the Elan's internal registers is indexed via
|
||||
* 0x22: Chip Setup & Control Register Index Register (CSCI)
|
||||
@@ -149,8 +138,6 @@ static int elanfreq_target(struct cpufreq_policy *policy,
|
||||
udelay(10000);
|
||||
local_irq_enable();
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
static struct exynos_dvfs_info *exynos_info;
|
||||
|
||||
static struct regulator *arm_regulator;
|
||||
static struct cpufreq_freqs freqs;
|
||||
|
||||
static unsigned int locking_frequency;
|
||||
static bool frequency_locked;
|
||||
@@ -59,18 +58,18 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(0);
|
||||
unsigned int arm_volt, safe_arm_volt = 0;
|
||||
unsigned int mpll_freq_khz = exynos_info->mpll_freq_khz;
|
||||
unsigned int old_freq;
|
||||
int index, old_index;
|
||||
int ret = 0;
|
||||
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = target_freq;
|
||||
old_freq = policy->cur;
|
||||
|
||||
/*
|
||||
* The policy max have been changed so that we cannot get proper
|
||||
* old_index with cpufreq_frequency_table_target(). Thus, ignore
|
||||
* policy and get the index from the raw freqeuncy table.
|
||||
*/
|
||||
old_index = exynos_cpufreq_get_index(freqs.old);
|
||||
old_index = exynos_cpufreq_get_index(old_freq);
|
||||
if (old_index < 0) {
|
||||
ret = old_index;
|
||||
goto out;
|
||||
@@ -95,17 +94,14 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
|
||||
}
|
||||
arm_volt = volt_table[index];
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* When the new frequency is higher than current frequency */
|
||||
if ((freqs.new > freqs.old) && !safe_arm_volt) {
|
||||
if ((target_freq > old_freq) && !safe_arm_volt) {
|
||||
/* Firstly, voltage up to increase frequency */
|
||||
ret = regulator_set_voltage(arm_regulator, arm_volt, arm_volt);
|
||||
if (ret) {
|
||||
pr_err("%s: failed to set cpu voltage to %d\n",
|
||||
__func__, arm_volt);
|
||||
freqs.new = freqs.old;
|
||||
goto post_notify;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,22 +111,15 @@ static int exynos_cpufreq_scale(unsigned int target_freq)
|
||||
if (ret) {
|
||||
pr_err("%s: failed to set cpu voltage to %d\n",
|
||||
__func__, safe_arm_volt);
|
||||
freqs.new = freqs.old;
|
||||
goto post_notify;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
exynos_info->set_freq(old_index, index);
|
||||
|
||||
post_notify:
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* When the new frequency is lower than current frequency */
|
||||
if ((freqs.new < freqs.old) ||
|
||||
((freqs.new > freqs.old) && safe_arm_volt)) {
|
||||
if ((target_freq < old_freq) ||
|
||||
((target_freq > old_freq) && safe_arm_volt)) {
|
||||
/* down the voltage after frequency change */
|
||||
ret = regulator_set_voltage(arm_regulator, arm_volt,
|
||||
arm_volt);
|
||||
@@ -142,7 +131,6 @@ post_notify:
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
cpufreq_cpu_put(policy);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -141,7 +141,6 @@ processor_set_freq (
|
||||
{
|
||||
int ret = 0;
|
||||
u32 value = 0;
|
||||
struct cpufreq_freqs cpufreq_freqs;
|
||||
cpumask_t saved_mask;
|
||||
int retval;
|
||||
|
||||
@@ -168,13 +167,6 @@ processor_set_freq (
|
||||
pr_debug("Transitioning from P%d to P%d\n",
|
||||
data->acpi_data.state, state);
|
||||
|
||||
/* cpufreq frequency struct */
|
||||
cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency;
|
||||
cpufreq_freqs.new = data->freq_table[state].frequency;
|
||||
|
||||
/* notify cpufreq */
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/*
|
||||
* First we write the target state's 'control' value to the
|
||||
* control_register.
|
||||
@@ -186,22 +178,11 @@ processor_set_freq (
|
||||
|
||||
ret = processor_set_pstate(value);
|
||||
if (ret) {
|
||||
unsigned int tmp = cpufreq_freqs.new;
|
||||
cpufreq_notify_transition(policy, &cpufreq_freqs,
|
||||
CPUFREQ_POSTCHANGE);
|
||||
cpufreq_freqs.new = cpufreq_freqs.old;
|
||||
cpufreq_freqs.old = tmp;
|
||||
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(policy, &cpufreq_freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
data->acpi_data.state = state;
|
||||
|
||||
retval = 0;
|
||||
|
||||
@@ -42,14 +42,14 @@ static unsigned int imx6q_get_speed(unsigned int cpu)
|
||||
|
||||
static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
struct dev_pm_opp *opp;
|
||||
unsigned long freq_hz, volt, volt_old;
|
||||
unsigned int old_freq, new_freq;
|
||||
int ret;
|
||||
|
||||
freqs.new = freq_table[index].frequency;
|
||||
freq_hz = freqs.new * 1000;
|
||||
freqs.old = clk_get_rate(arm_clk) / 1000;
|
||||
new_freq = freq_table[index].frequency;
|
||||
freq_hz = new_freq * 1000;
|
||||
old_freq = clk_get_rate(arm_clk) / 1000;
|
||||
|
||||
rcu_read_lock();
|
||||
opp = dev_pm_opp_find_freq_ceil(cpu_dev, &freq_hz);
|
||||
@@ -64,26 +64,23 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
volt_old = regulator_get_voltage(arm_reg);
|
||||
|
||||
dev_dbg(cpu_dev, "%u MHz, %ld mV --> %u MHz, %ld mV\n",
|
||||
freqs.old / 1000, volt_old / 1000,
|
||||
freqs.new / 1000, volt / 1000);
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
old_freq / 1000, volt_old / 1000,
|
||||
new_freq / 1000, volt / 1000);
|
||||
|
||||
/* scaling up? scale voltage before frequency */
|
||||
if (freqs.new > freqs.old) {
|
||||
if (new_freq > old_freq) {
|
||||
ret = regulator_set_voltage_tol(arm_reg, volt, 0);
|
||||
if (ret) {
|
||||
dev_err(cpu_dev,
|
||||
"failed to scale vddarm up: %d\n", ret);
|
||||
freqs.new = freqs.old;
|
||||
goto post_notify;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Need to increase vddpu and vddsoc for safety
|
||||
* if we are about to run at 1.2 GHz.
|
||||
*/
|
||||
if (freqs.new == FREQ_1P2_GHZ / 1000) {
|
||||
if (new_freq == FREQ_1P2_GHZ / 1000) {
|
||||
regulator_set_voltage_tol(pu_reg,
|
||||
PU_SOC_VOLTAGE_HIGH, 0);
|
||||
regulator_set_voltage_tol(soc_reg,
|
||||
@@ -103,21 +100,20 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
clk_set_parent(step_clk, pll2_pfd2_396m_clk);
|
||||
clk_set_parent(pll1_sw_clk, step_clk);
|
||||
if (freq_hz > clk_get_rate(pll2_pfd2_396m_clk)) {
|
||||
clk_set_rate(pll1_sys_clk, freqs.new * 1000);
|
||||
clk_set_rate(pll1_sys_clk, new_freq * 1000);
|
||||
clk_set_parent(pll1_sw_clk, pll1_sys_clk);
|
||||
}
|
||||
|
||||
/* Ensure the arm clock divider is what we expect */
|
||||
ret = clk_set_rate(arm_clk, freqs.new * 1000);
|
||||
ret = clk_set_rate(arm_clk, new_freq * 1000);
|
||||
if (ret) {
|
||||
dev_err(cpu_dev, "failed to set clock rate: %d\n", ret);
|
||||
regulator_set_voltage_tol(arm_reg, volt_old, 0);
|
||||
freqs.new = freqs.old;
|
||||
goto post_notify;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* scaling down? scale voltage after frequency */
|
||||
if (freqs.new < freqs.old) {
|
||||
if (new_freq < old_freq) {
|
||||
ret = regulator_set_voltage_tol(arm_reg, volt, 0);
|
||||
if (ret) {
|
||||
dev_warn(cpu_dev,
|
||||
@@ -125,7 +121,7 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (freqs.old == FREQ_1P2_GHZ / 1000) {
|
||||
if (old_freq == FREQ_1P2_GHZ / 1000) {
|
||||
regulator_set_voltage_tol(pu_reg,
|
||||
PU_SOC_VOLTAGE_NORMAL, 0);
|
||||
regulator_set_voltage_tol(soc_reg,
|
||||
@@ -133,10 +129,7 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
}
|
||||
}
|
||||
|
||||
post_notify:
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx6q_cpufreq_init(struct cpufreq_policy *policy)
|
||||
|
||||
@@ -58,48 +58,34 @@ static unsigned int kirkwood_cpufreq_get_cpu_frequency(unsigned int cpu)
|
||||
static int kirkwood_cpufreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned int state = kirkwood_freq_table[index].driver_data;
|
||||
unsigned long reg;
|
||||
|
||||
freqs.old = kirkwood_cpufreq_get_cpu_frequency(0);
|
||||
freqs.new = kirkwood_freq_table[index].frequency;
|
||||
local_irq_disable();
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
/* Disable interrupts to the CPU */
|
||||
reg = readl_relaxed(priv.base);
|
||||
reg |= CPU_SW_INT_BLK;
|
||||
writel_relaxed(reg, priv.base);
|
||||
|
||||
dev_dbg(priv.dev, "Attempting to set frequency to %i KHz\n",
|
||||
kirkwood_freq_table[index].frequency);
|
||||
dev_dbg(priv.dev, "old frequency was %i KHz\n",
|
||||
kirkwood_cpufreq_get_cpu_frequency(0));
|
||||
|
||||
if (freqs.old != freqs.new) {
|
||||
local_irq_disable();
|
||||
|
||||
/* Disable interrupts to the CPU */
|
||||
reg = readl_relaxed(priv.base);
|
||||
reg |= CPU_SW_INT_BLK;
|
||||
writel_relaxed(reg, priv.base);
|
||||
|
||||
switch (state) {
|
||||
case STATE_CPU_FREQ:
|
||||
clk_disable(priv.powersave_clk);
|
||||
break;
|
||||
case STATE_DDR_FREQ:
|
||||
clk_enable(priv.powersave_clk);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Wait-for-Interrupt, while the hardware changes frequency */
|
||||
cpu_do_idle();
|
||||
|
||||
/* Enable interrupts to the CPU */
|
||||
reg = readl_relaxed(priv.base);
|
||||
reg &= ~CPU_SW_INT_BLK;
|
||||
writel_relaxed(reg, priv.base);
|
||||
|
||||
local_irq_enable();
|
||||
switch (state) {
|
||||
case STATE_CPU_FREQ:
|
||||
clk_disable(priv.powersave_clk);
|
||||
break;
|
||||
case STATE_DDR_FREQ:
|
||||
clk_enable(priv.powersave_clk);
|
||||
break;
|
||||
}
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
/* Wait-for-Interrupt, while the hardware changes frequency */
|
||||
cpu_do_idle();
|
||||
|
||||
/* Enable interrupts to the CPU */
|
||||
reg = readl_relaxed(priv.base);
|
||||
reg &= ~CPU_SW_INT_BLK;
|
||||
writel_relaxed(reg, priv.base);
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -57,7 +57,6 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
|
||||
{
|
||||
unsigned int cpu = policy->cpu;
|
||||
cpumask_t cpus_allowed;
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned int freq;
|
||||
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
@@ -67,26 +66,11 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
|
||||
((cpu_clock_freq / 1000) *
|
||||
loongson2_clockmod_table[index].driver_data) / 8;
|
||||
|
||||
pr_debug("cpufreq: requested frequency %u Hz\n",
|
||||
loongson2_clockmod_table[index].frequency * 1000);
|
||||
|
||||
freqs.old = loongson2_cpufreq_get(cpu);
|
||||
freqs.new = freq;
|
||||
freqs.flags = 0;
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
|
||||
/* setting the cpu frequency */
|
||||
clk_set_rate(cpuclk, freq);
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
pr_debug("cpufreq: set frequency %u kHz\n", freq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,8 +69,6 @@ static struct cpufreq_frequency_table maple_cpu_freqs[] = {
|
||||
*/
|
||||
static int maple_pmode_cur;
|
||||
|
||||
static DEFINE_MUTEX(maple_switch_mutex);
|
||||
|
||||
static const u32 *maple_pmode_data;
|
||||
static int maple_pmode_max;
|
||||
|
||||
@@ -133,21 +131,7 @@ static int maple_scom_query_freq(void)
|
||||
static int maple_cpufreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
int rc;
|
||||
|
||||
mutex_lock(&maple_switch_mutex);
|
||||
|
||||
freqs.old = maple_cpu_freqs[maple_pmode_cur].frequency;
|
||||
freqs.new = maple_cpu_freqs[index].frequency;
|
||||
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
rc = maple_scom_switch_freq(index);
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
mutex_unlock(&maple_switch_mutex);
|
||||
|
||||
return rc;
|
||||
return maple_scom_switch_freq(index);
|
||||
}
|
||||
|
||||
static unsigned int maple_cpufreq_get_speed(unsigned int cpu)
|
||||
|
||||
@@ -53,15 +53,14 @@ static unsigned int omap_getspeed(unsigned int cpu)
|
||||
|
||||
static int omap_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
int r, ret = 0;
|
||||
struct cpufreq_freqs freqs;
|
||||
struct dev_pm_opp *opp;
|
||||
unsigned long freq, volt = 0, volt_old = 0, tol = 0;
|
||||
unsigned int old_freq, new_freq;
|
||||
|
||||
freqs.old = omap_getspeed(policy->cpu);
|
||||
freqs.new = freq_table[index].frequency;
|
||||
old_freq = omap_getspeed(policy->cpu);
|
||||
new_freq = freq_table[index].frequency;
|
||||
|
||||
freq = freqs.new * 1000;
|
||||
freq = new_freq * 1000;
|
||||
ret = clk_round_rate(mpu_clk, freq);
|
||||
if (IS_ERR_VALUE(ret)) {
|
||||
dev_warn(mpu_dev,
|
||||
@@ -77,7 +76,7 @@ static int omap_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
if (IS_ERR(opp)) {
|
||||
rcu_read_unlock();
|
||||
dev_err(mpu_dev, "%s: unable to find MPU OPP for %d\n",
|
||||
__func__, freqs.new);
|
||||
__func__, new_freq);
|
||||
return -EINVAL;
|
||||
}
|
||||
volt = dev_pm_opp_get_voltage(opp);
|
||||
@@ -87,43 +86,32 @@ static int omap_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
}
|
||||
|
||||
dev_dbg(mpu_dev, "cpufreq-omap: %u MHz, %ld mV --> %u MHz, %ld mV\n",
|
||||
freqs.old / 1000, volt_old ? volt_old / 1000 : -1,
|
||||
freqs.new / 1000, volt ? volt / 1000 : -1);
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
old_freq / 1000, volt_old ? volt_old / 1000 : -1,
|
||||
new_freq / 1000, volt ? volt / 1000 : -1);
|
||||
|
||||
/* scaling up? scale voltage before frequency */
|
||||
if (mpu_reg && (freqs.new > freqs.old)) {
|
||||
if (mpu_reg && (new_freq > old_freq)) {
|
||||
r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
|
||||
if (r < 0) {
|
||||
dev_warn(mpu_dev, "%s: unable to scale voltage up.\n",
|
||||
__func__);
|
||||
freqs.new = freqs.old;
|
||||
goto done;
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_set_rate(mpu_clk, freqs.new * 1000);
|
||||
ret = clk_set_rate(mpu_clk, new_freq * 1000);
|
||||
|
||||
/* scaling down? scale voltage after frequency */
|
||||
if (mpu_reg && (freqs.new < freqs.old)) {
|
||||
if (mpu_reg && (new_freq < old_freq)) {
|
||||
r = regulator_set_voltage(mpu_reg, volt - tol, volt + tol);
|
||||
if (r < 0) {
|
||||
dev_warn(mpu_dev, "%s: unable to scale voltage down.\n",
|
||||
__func__);
|
||||
ret = clk_set_rate(mpu_clk, freqs.old * 1000);
|
||||
freqs.new = freqs.old;
|
||||
goto done;
|
||||
clk_set_rate(mpu_clk, old_freq * 1000);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
freqs.new = omap_getspeed(policy->cpu);
|
||||
|
||||
done:
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -107,15 +107,8 @@ static struct cpufreq_frequency_table p4clockmod_table[] = {
|
||||
|
||||
static int cpufreq_p4_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
struct cpufreq_freqs freqs;
|
||||
int i;
|
||||
|
||||
freqs.old = cpufreq_p4_get(policy->cpu);
|
||||
freqs.new = stock_freq * p4clockmod_table[index].driver_data / 8;
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* run on each logical CPU,
|
||||
* see section 13.15.3 of IA32 Intel Architecture Software
|
||||
* Developer's Manual, Volume 3
|
||||
@@ -123,9 +116,6 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
for_each_cpu(i, policy->cpus)
|
||||
cpufreq_p4_setdc(i, p4clockmod_table[index].driver_data);
|
||||
|
||||
/* notifiers */
|
||||
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user