Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cab224d authored by David S. Miller's avatar David S. Miller
Browse files

[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: default avatarDavid S. Miller <davem@davemloft.net>
parent 6be382ea
Loading
Loading
Loading
Loading
+27 −9
Original line number Diff line number Diff line
@@ -88,7 +88,6 @@ static void frob_mem_refresh(int cpu_slowing_down,
{
	unsigned long old_refr_count, refr_count, mctrl;


	refr_count  = (clock_tick * MCTRL0_REFR_INTERVAL);
	refr_count /= (MCTRL0_REFR_CLKS_P_CNT * divisor * 1000000000UL);

@@ -230,6 +229,25 @@ static unsigned long estar_to_divisor(unsigned long estar)
	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)
{
	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;
	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);
	divisor = index_to_divisor(index);
	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);

	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);

@@ -273,9 +292,7 @@ static int us2e_freq_target(struct cpufreq_policy *policy,

	if (cpufreq_frequency_table_target(policy,
					   &us2e_freq_table[policy->cpu].table[0],
					      target_freq,
					      relation,
					      &new_index))
					   target_freq, relation, &new_index))
		return -EINVAL;

	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)
{
	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 =
		&us2e_freq_table[cpu].table[0];

@@ -351,9 +368,10 @@ static int __init us2e_freq_init(void)
		memset(us2e_freq_table, 0,
		       (NR_CPUS * sizeof(struct us2e_freq_percpu_info)));

		driver->init = us2e_freq_cpu_init;
		driver->verify = us2e_freq_verify;
		driver->target = us2e_freq_target;
		driver->init = us2e_freq_cpu_init;
		driver->get = us2e_freq_get;
		driver->exit = us2e_freq_cpu_exit;
		driver->owner = THIS_MODULE,
		strcpy(driver->name, "UltraSPARC-IIe");
+25 −4
Original line number Diff line number Diff line
@@ -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)
{
	unsigned long clock_tick = sparc64_get_clock_tick(cpu);
	unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
	unsigned long ret;

	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;
}

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)
{
	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;
	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) {
	case 0:
		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)
{
	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 =
		&us3_freq_table[cpu].table[0];

@@ -206,9 +226,10 @@ static int __init us3_freq_init(void)
		memset(us3_freq_table, 0,
		       (NR_CPUS * sizeof(struct us3_freq_percpu_info)));

		driver->init = us3_freq_cpu_init;
		driver->verify = us3_freq_verify;
		driver->target = us3_freq_target;
		driver->init = us3_freq_cpu_init;
		driver->get = us3_freq_get;
		driver->exit = us3_freq_cpu_exit;
		driver->owner = THIS_MODULE,
		strcpy(driver->name, "UltraSPARC-III");