Browse Source

cpufreq: create cpufreq_generic_init() routine

Many CPUFreq drivers for SMP system (where all cores share same clock lines), do
similar stuff in their ->init() part.

This patch creates a generic routine in cpufreq core which can be used by these
so that we can remove some redundant code.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Viresh Kumar 12 years ago
parent
commit
70e9e77833
3 changed files with 35 additions and 0 deletions
  1. 1 0
      drivers/cpufreq/Kconfig
  2. 31 0
      drivers/cpufreq/cpufreq.c
  3. 3 0
      include/linux/cpufreq.h

+ 1 - 0
drivers/cpufreq/Kconfig

@@ -2,6 +2,7 @@ menu "CPU Frequency scaling"
 
 
 config CPU_FREQ
 config CPU_FREQ
 	bool "CPU Frequency scaling"
 	bool "CPU Frequency scaling"
+	select CPU_FREQ_TABLE
 	help
 	help
 	  CPU Frequency scaling allows you to change the clock speed of 
 	  CPU Frequency scaling allows you to change the clock speed of 
 	  CPUs on the fly. This is a nice method to save power, because 
 	  CPUs on the fly. This is a nice method to save power, because 

+ 31 - 0
drivers/cpufreq/cpufreq.c

@@ -181,6 +181,37 @@ u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
 }
 }
 EXPORT_SYMBOL_GPL(get_cpu_idle_time);
 EXPORT_SYMBOL_GPL(get_cpu_idle_time);
 
 
+/*
+ * This is a generic cpufreq init() routine which can be used by cpufreq
+ * drivers of SMP systems. It will do following:
+ * - validate & show freq table passed
+ * - set policies transition latency
+ * - policy->cpus with all possible CPUs
+ */
+int cpufreq_generic_init(struct cpufreq_policy *policy,
+		struct cpufreq_frequency_table *table,
+		unsigned int transition_latency)
+{
+	int ret;
+
+	ret = cpufreq_table_validate_and_show(policy, table);
+	if (ret) {
+		pr_err("%s: invalid frequency table: %d\n", __func__, ret);
+		return ret;
+	}
+
+	policy->cpuinfo.transition_latency = transition_latency;
+
+	/*
+	 * The driver only supports the SMP configuartion where all processors
+	 * share the clock and voltage and clock.
+	 */
+	cpumask_setall(policy->cpus);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(cpufreq_generic_init);
+
 struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
 struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
 {
 {
 	struct cpufreq_policy *policy = NULL;
 	struct cpufreq_policy *policy = NULL;

+ 3 - 0
include/linux/cpufreq.h

@@ -424,6 +424,9 @@ void cpufreq_frequency_table_put_attr(unsigned int cpu);
 int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
 int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
 				      struct cpufreq_frequency_table *table);
 				      struct cpufreq_frequency_table *table);
 
 
+int cpufreq_generic_init(struct cpufreq_policy *policy,
+		struct cpufreq_frequency_table *table,
+		unsigned int transition_latency);
 static inline int cpufreq_generic_exit(struct cpufreq_policy *policy)
 static inline int cpufreq_generic_exit(struct cpufreq_policy *policy)
 {
 {
 	cpufreq_frequency_table_put_attr(policy->cpu);
 	cpufreq_frequency_table_put_attr(policy->cpu);