提交 2cab224d 编写于 作者: D David S. Miller

[SPARC64]: Fix 2 bugs in cpufreq drivers.

1) cpufreq wants frequenceis in KHZ not MHZ
2) provide ->get() method so curfreq node is created
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 6be382ea
...@@ -88,7 +88,6 @@ static void frob_mem_refresh(int cpu_slowing_down, ...@@ -88,7 +88,6 @@ static void frob_mem_refresh(int cpu_slowing_down,
{ {
unsigned long old_refr_count, refr_count, mctrl; unsigned long old_refr_count, refr_count, mctrl;
refr_count = (clock_tick * MCTRL0_REFR_INTERVAL); refr_count = (clock_tick * MCTRL0_REFR_INTERVAL);
refr_count /= (MCTRL0_REFR_CLKS_P_CNT * divisor * 1000000000UL); refr_count /= (MCTRL0_REFR_CLKS_P_CNT * divisor * 1000000000UL);
...@@ -230,6 +229,25 @@ static unsigned long estar_to_divisor(unsigned long estar) ...@@ -230,6 +229,25 @@ static unsigned long estar_to_divisor(unsigned long estar)
return ret; return ret;
} }
static unsigned int us2e_freq_get(unsigned int cpu)
{
cpumask_t cpus_allowed;
unsigned long clock_tick, estar;
if (!cpu_online(cpu))
return 0;
cpus_allowed = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu));
clock_tick = sparc64_get_clock_tick(cpu) / 1000;
estar = read_hbreg(HBIRD_ESTAR_MODE_ADDR);
set_cpus_allowed(current, cpus_allowed);
return clock_tick / estar_to_divisor(estar);
}
static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index) static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
{ {
unsigned long new_bits, new_freq; unsigned long new_bits, new_freq;
...@@ -243,7 +261,7 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index) ...@@ -243,7 +261,7 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
cpus_allowed = current->cpus_allowed; cpus_allowed = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu)); set_cpus_allowed(current, cpumask_of_cpu(cpu));
new_freq = clock_tick = sparc64_get_clock_tick(cpu); new_freq = clock_tick = sparc64_get_clock_tick(cpu) / 1000;
new_bits = index_to_estar_mode(index); new_bits = index_to_estar_mode(index);
divisor = index_to_divisor(index); divisor = index_to_divisor(index);
new_freq /= divisor; new_freq /= divisor;
...@@ -258,7 +276,8 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index) ...@@ -258,7 +276,8 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
if (old_divisor != divisor) if (old_divisor != divisor)
us2e_transition(estar, new_bits, clock_tick, old_divisor, divisor); us2e_transition(estar, new_bits, clock_tick * 1000,
old_divisor, divisor);
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
...@@ -273,9 +292,7 @@ static int us2e_freq_target(struct cpufreq_policy *policy, ...@@ -273,9 +292,7 @@ static int us2e_freq_target(struct cpufreq_policy *policy,
if (cpufreq_frequency_table_target(policy, if (cpufreq_frequency_table_target(policy,
&us2e_freq_table[policy->cpu].table[0], &us2e_freq_table[policy->cpu].table[0],
target_freq, target_freq, relation, &new_index))
relation,
&new_index))
return -EINVAL; return -EINVAL;
us2e_set_cpu_divider_index(policy->cpu, new_index); us2e_set_cpu_divider_index(policy->cpu, new_index);
...@@ -292,7 +309,7 @@ static int us2e_freq_verify(struct cpufreq_policy *policy) ...@@ -292,7 +309,7 @@ static int us2e_freq_verify(struct cpufreq_policy *policy)
static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy) static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
{ {
unsigned int cpu = policy->cpu; unsigned int cpu = policy->cpu;
unsigned long clock_tick = sparc64_get_clock_tick(cpu); unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
struct cpufreq_frequency_table *table = struct cpufreq_frequency_table *table =
&us2e_freq_table[cpu].table[0]; &us2e_freq_table[cpu].table[0];
...@@ -351,9 +368,10 @@ static int __init us2e_freq_init(void) ...@@ -351,9 +368,10 @@ static int __init us2e_freq_init(void)
memset(us2e_freq_table, 0, memset(us2e_freq_table, 0,
(NR_CPUS * sizeof(struct us2e_freq_percpu_info))); (NR_CPUS * sizeof(struct us2e_freq_percpu_info)));
driver->init = us2e_freq_cpu_init;
driver->verify = us2e_freq_verify; driver->verify = us2e_freq_verify;
driver->target = us2e_freq_target; driver->target = us2e_freq_target;
driver->init = us2e_freq_cpu_init; driver->get = us2e_freq_get;
driver->exit = us2e_freq_cpu_exit; driver->exit = us2e_freq_cpu_exit;
driver->owner = THIS_MODULE, driver->owner = THIS_MODULE,
strcpy(driver->name, "UltraSPARC-IIe"); strcpy(driver->name, "UltraSPARC-IIe");
......
...@@ -56,7 +56,7 @@ static void write_safari_cfg(unsigned long val) ...@@ -56,7 +56,7 @@ static void write_safari_cfg(unsigned long val)
static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg) static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg)
{ {
unsigned long clock_tick = sparc64_get_clock_tick(cpu); unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
unsigned long ret; unsigned long ret;
switch (safari_cfg & SAFARI_CFG_DIV_MASK) { switch (safari_cfg & SAFARI_CFG_DIV_MASK) {
...@@ -76,6 +76,26 @@ static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg ...@@ -76,6 +76,26 @@ static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg
return ret; return ret;
} }
static unsigned int us3_freq_get(unsigned int cpu)
{
cpumask_t cpus_allowed;
unsigned long reg;
unsigned int ret;
if (!cpu_online(cpu))
return 0;
cpus_allowed = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu));
reg = read_safari_cfg();
ret = get_current_freq(cpu, reg);
set_cpus_allowed(current, cpus_allowed);
return ret;
}
static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index) static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
{ {
unsigned long new_bits, new_freq, reg; unsigned long new_bits, new_freq, reg;
...@@ -88,7 +108,7 @@ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index) ...@@ -88,7 +108,7 @@ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
cpus_allowed = current->cpus_allowed; cpus_allowed = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu)); set_cpus_allowed(current, cpumask_of_cpu(cpu));
new_freq = sparc64_get_clock_tick(cpu); new_freq = sparc64_get_clock_tick(cpu) / 1000;
switch (index) { switch (index) {
case 0: case 0:
new_bits = SAFARI_CFG_DIV_1; new_bits = SAFARI_CFG_DIV_1;
...@@ -150,7 +170,7 @@ static int us3_freq_verify(struct cpufreq_policy *policy) ...@@ -150,7 +170,7 @@ static int us3_freq_verify(struct cpufreq_policy *policy)
static int __init us3_freq_cpu_init(struct cpufreq_policy *policy) static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
{ {
unsigned int cpu = policy->cpu; unsigned int cpu = policy->cpu;
unsigned long clock_tick = sparc64_get_clock_tick(cpu); unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
struct cpufreq_frequency_table *table = struct cpufreq_frequency_table *table =
&us3_freq_table[cpu].table[0]; &us3_freq_table[cpu].table[0];
...@@ -206,9 +226,10 @@ static int __init us3_freq_init(void) ...@@ -206,9 +226,10 @@ static int __init us3_freq_init(void)
memset(us3_freq_table, 0, memset(us3_freq_table, 0,
(NR_CPUS * sizeof(struct us3_freq_percpu_info))); (NR_CPUS * sizeof(struct us3_freq_percpu_info)));
driver->init = us3_freq_cpu_init;
driver->verify = us3_freq_verify; driver->verify = us3_freq_verify;
driver->target = us3_freq_target; driver->target = us3_freq_target;
driver->init = us3_freq_cpu_init; driver->get = us3_freq_get;
driver->exit = us3_freq_cpu_exit; driver->exit = us3_freq_cpu_exit;
driver->owner = THIS_MODULE, driver->owner = THIS_MODULE,
strcpy(driver->name, "UltraSPARC-III"); strcpy(driver->name, "UltraSPARC-III");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册