[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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6be382ea0c
commit
2cab224d1f
2 changed files with 52 additions and 13 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
||||||
|
@ -272,10 +291,8 @@ static int us2e_freq_target(struct cpufreq_policy *policy,
|
||||||
unsigned int new_index = 0;
|
unsigned int new_index = 0;
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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");
|
||||||
|
|
Loading…
Reference in a new issue