aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_stats.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2014-01-06 20:40:13 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-01-16 20:00:44 -0500
commitb3f9ff88db6e149086dc111e5652106005fd5923 (patch)
treeafd842df87af91dd21e2626f7215e01b7c902fd1 /drivers/cpufreq/cpufreq_stats.c
parent2d13594dcb7eaa41fa180e8a3b27a8f10845381f (diff)
cpufreq: stats: create sysfs entries when cpufreq_stats is a module
When cpufreq_stats is compiled in as a module, cpufreq driver would have already been registered. And so the CPUFREQ_CREATE_POLICY notifiers wouldn't be called for it. Hence no sysfs entries for stats. :( This patch calls cpufreq_stats_create_table() for each online CPU from cpufreq_stats_init() and so if policy is already created for CPUx then we will register sysfs stats for it. When its not compiled as module, we will return early as policy wouldn't be found for any of the CPUs. Acked-by: Nicolas Pitre <nico@linaro.org> Tested-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq/cpufreq_stats.c')
-rw-r--r--drivers/cpufreq/cpufreq_stats.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
index 9dd58835456e..5793e1447fb1 100644
--- a/drivers/cpufreq/cpufreq_stats.c
+++ b/drivers/cpufreq/cpufreq_stats.c
@@ -180,7 +180,7 @@ static void cpufreq_stats_free_table(unsigned int cpu)
180 cpufreq_cpu_put(policy); 180 cpufreq_cpu_put(policy);
181} 181}
182 182
183static int cpufreq_stats_create_table(struct cpufreq_policy *policy, 183static int __cpufreq_stats_create_table(struct cpufreq_policy *policy,
184 struct cpufreq_frequency_table *table) 184 struct cpufreq_frequency_table *table)
185{ 185{
186 unsigned int i, j, count = 0, ret = 0; 186 unsigned int i, j, count = 0, ret = 0;
@@ -253,6 +253,26 @@ error_get_fail:
253 return ret; 253 return ret;
254} 254}
255 255
256static void cpufreq_stats_create_table(unsigned int cpu)
257{
258 struct cpufreq_policy *policy;
259 struct cpufreq_frequency_table *table;
260
261 /*
262 * "likely(!policy)" because normally cpufreq_stats will be registered
263 * before cpufreq driver
264 */
265 policy = cpufreq_cpu_get(cpu);
266 if (likely(!policy))
267 return;
268
269 table = cpufreq_frequency_get_table(policy->cpu);
270 if (likely(table))
271 __cpufreq_stats_create_table(policy, table);
272
273 cpufreq_cpu_put(policy);
274}
275
256static void cpufreq_stats_update_policy_cpu(struct cpufreq_policy *policy) 276static void cpufreq_stats_update_policy_cpu(struct cpufreq_policy *policy)
257{ 277{
258 struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table, 278 struct cpufreq_stats *stat = per_cpu(cpufreq_stats_table,
@@ -284,7 +304,7 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb,
284 return 0; 304 return 0;
285 305
286 if (val == CPUFREQ_CREATE_POLICY) 306 if (val == CPUFREQ_CREATE_POLICY)
287 ret = cpufreq_stats_create_table(policy, table); 307 ret = __cpufreq_stats_create_table(policy, table);
288 else if (val == CPUFREQ_REMOVE_POLICY) 308 else if (val == CPUFREQ_REMOVE_POLICY)
289 __cpufreq_stats_free_table(policy); 309 __cpufreq_stats_free_table(policy);
290 310
@@ -346,6 +366,9 @@ static int __init cpufreq_stats_init(void)
346 if (ret) 366 if (ret)
347 return ret; 367 return ret;
348 368
369 for_each_online_cpu(cpu)
370 cpufreq_stats_create_table(cpu);
371
349 ret = cpufreq_register_notifier(&notifier_trans_block, 372 ret = cpufreq_register_notifier(&notifier_trans_block,
350 CPUFREQ_TRANSITION_NOTIFIER); 373 CPUFREQ_TRANSITION_NOTIFIER);
351 if (ret) { 374 if (ret) {