diff options
author | Thomas Renninger <trenn@suse.de> | 2009-07-24 09:25:05 -0400 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2009-09-01 12:45:14 -0400 |
commit | 8aa84ad8d6c740a04386f599694609ee4998e82e (patch) | |
tree | b5bedf4203f038c0f624d3240d9d23dbc9e20e63 | |
parent | 4bfa042cd304aa48cf05cd0a13c2d0794a675c0e (diff) |
[CPUFREQ] Introduce global, not per core: /sys/devices/system/cpu/cpufreq
Currently everything in the cpufreq layer is per core based.
This does not reflect reality, for example ondemand on conservative
governors have global sysfs variables.
Introduce a global cpufreq directory and add the kobject to the governor
struct, so that governors can easily access it.
The directory is initialized in the cpufreq_core_init initcall and thus will
always be created if cpufreq is compiled in, even if no cpufreq driver is
active later.
Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Dave Jones <davej@redhat.com>
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 9 | ||||
-rw-r--r-- | include/linux/cpufreq.h | 10 |
2 files changed, 18 insertions, 1 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index bbd5c2164ab6..4da28444b235 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -686,6 +686,9 @@ static struct attribute *default_attrs[] = { | |||
686 | NULL | 686 | NULL |
687 | }; | 687 | }; |
688 | 688 | ||
689 | struct kobject *cpufreq_global_kobject; | ||
690 | EXPORT_SYMBOL(cpufreq_global_kobject); | ||
691 | |||
689 | #define to_policy(k) container_of(k, struct cpufreq_policy, kobj) | 692 | #define to_policy(k) container_of(k, struct cpufreq_policy, kobj) |
690 | #define to_attr(a) container_of(a, struct freq_attr, attr) | 693 | #define to_attr(a) container_of(a, struct freq_attr, attr) |
691 | 694 | ||
@@ -1935,7 +1938,11 @@ static int __init cpufreq_core_init(void) | |||
1935 | per_cpu(policy_cpu, cpu) = -1; | 1938 | per_cpu(policy_cpu, cpu) = -1; |
1936 | init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); | 1939 | init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); |
1937 | } | 1940 | } |
1941 | |||
1942 | cpufreq_global_kobject = kobject_create_and_add("cpufreq", | ||
1943 | &cpu_sysdev_class.kset.kobj); | ||
1944 | BUG_ON(!cpufreq_global_kobject); | ||
1945 | |||
1938 | return 0; | 1946 | return 0; |
1939 | } | 1947 | } |
1940 | |||
1941 | core_initcall(cpufreq_core_init); | 1948 | core_initcall(cpufreq_core_init); |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 161042746afc..44717eb47639 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
@@ -65,6 +65,9 @@ static inline int cpufreq_unregister_notifier(struct notifier_block *nb, | |||
65 | 65 | ||
66 | struct cpufreq_governor; | 66 | struct cpufreq_governor; |
67 | 67 | ||
68 | /* /sys/devices/system/cpu/cpufreq: entry point for global variables */ | ||
69 | extern struct kobject *cpufreq_global_kobject; | ||
70 | |||
68 | #define CPUFREQ_ETERNAL (-1) | 71 | #define CPUFREQ_ETERNAL (-1) |
69 | struct cpufreq_cpuinfo { | 72 | struct cpufreq_cpuinfo { |
70 | unsigned int max_freq; | 73 | unsigned int max_freq; |
@@ -274,6 +277,13 @@ struct freq_attr { | |||
274 | ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count); | 277 | ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count); |
275 | }; | 278 | }; |
276 | 279 | ||
280 | struct global_attr { | ||
281 | struct attribute attr; | ||
282 | ssize_t (*show)(struct kobject *kobj, | ||
283 | struct attribute *attr, char *buf); | ||
284 | ssize_t (*store)(struct kobject *a, struct attribute *b, | ||
285 | const char *c, size_t count); | ||
286 | }; | ||
277 | 287 | ||
278 | /********************************************************************* | 288 | /********************************************************************* |
279 | * CPUFREQ 2.6. INTERFACE * | 289 | * CPUFREQ 2.6. INTERFACE * |