]> git.hungrycats.org Git - linux/commitdiff
[PATCH] cpufreq: move /proc/cpufreq interface code to extra module
authorDominik Brodowski <linux@brodo.de>
Sat, 15 Feb 2003 04:44:20 +0000 (20:44 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 15 Feb 2003 04:44:20 +0000 (20:44 -0800)
The deprecated /proc/cpufreq interface can easily live outside the
cpufreq core now.

arch/arm/Kconfig
arch/i386/Kconfig
arch/sparc64/Kconfig
drivers/cpufreq/Kconfig [new file with mode: 0644]
drivers/cpufreq/Makefile
drivers/cpufreq/proc_intf.c [new file with mode: 0644]
include/linux/cpufreq.h
kernel/cpufreq.c

index eaba03774211893746e907dc92097132f630ce5e..da598aa394e5cf86e3b1e007b2f373a3f4a43492 100644 (file)
@@ -539,8 +539,8 @@ config CPU_FREQ_24_API
        depends on CPU_FREQ
        default y
 
-config CPU_FREQ_26_API
-       bool
+config CPU_FREQ_PROC_INTF
+       tristate
        depends on CPU_FREQ
        default y
 
index 5c86a7951d5b1917c813270cf471d04fc350b63b..10a4e8536fcc1344f7c7eef7f6f08750ad4a979f 100644 (file)
@@ -969,7 +969,7 @@ config CPU_FREQ
          If in doubt, say N.
 
 config CPU_FREQ_PROC_INTF
-       bool "/proc/cpufreq interface (DEPRECATED)"
+       tristate "/proc/cpufreq interface (DEPRECATED)"
        depends on CPU_FREQ && PROC_FS
        help
          This enables the /proc/cpufreq interface for controlling
index e3bf2f1e5ec27825309eeb487b9435acf5ae7585..be9f9f1e86d342d74efc27163f32659b49410409 100644 (file)
@@ -151,7 +151,7 @@ config CPU_FREQ
          If in doubt, say N.
 
 config CPU_FREQ_PROC_INTF
-       bool "/proc/cpufreq interface (DEPRECATED)"
+       tristate "/proc/cpufreq interface (DEPRECATED)"
        depends on CPU_FREQ && PROC_FS
        help
          This enables the /proc/cpufreq interface for controlling
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
new file mode 100644 (file)
index 0000000..5ce2d45
--- /dev/null
@@ -0,0 +1,11 @@
+config CPU_FREQ_PROC_INTF
+       tristate "/proc/cpufreq interface (deprecated)"
+       depends on CPU_FREQ && PROC_FS
+       help
+         This enables the /proc/cpufreq interface for controlling
+         CPUFreq. Please note that it is recommended to use the sysfs
+         interface instead (which is built automatically). 
+         
+         For details, take a look at linux/Documentation/cpufreq. 
+         
+         If in doubt, say N.
index 6be9f5e6998c06c22cfe9e753d097fb4b6badf19..e32b64ae8e9f2e8c82d3e8d1cc51a73fac1ff89f 100644 (file)
@@ -1,2 +1,3 @@
 #CPUfreq governors and cross-arch helpers
 obj-$(CONFIG_CPU_FREQ_TABLE)           += freq_table.o
+obj-$(CONFIG_CPU_FREQ_PROC_INTF)       += proc_intf.o
diff --git a/drivers/cpufreq/proc_intf.c b/drivers/cpufreq/proc_intf.c
new file mode 100644 (file)
index 0000000..5845e34
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * linux/drivers/cpufreq/proc_intf.c
+ *
+ * Copyright (C) 2002 - 2003 Dominik Brodowski
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/cpufreq.h>
+#include <linux/ctype.h>
+#include <linux/proc_fs.h>
+#include <asm/uaccess.h>
+
+
+/**
+ * cpufreq_parse_policy - parse a policy string
+ * @input_string: the string to parse.
+ * @policy: the policy written inside input_string
+ *
+ * This function parses a "policy string" - something the user echo'es into
+ * /proc/cpufreq or gives as boot parameter - into a struct cpufreq_policy.
+ * If there are invalid/missing entries, they are replaced with current
+ * cpufreq policy.
+ */
+static int cpufreq_parse_policy(char input_string[42], struct cpufreq_policy *policy)
+{
+       unsigned int            min = 0;
+       unsigned int            max = 0;
+       unsigned int            cpu = 0;
+       char                    str_governor[16];
+       struct cpufreq_policy   current_policy;
+       unsigned int            result = -EFAULT;
+
+       if (!policy)
+               return -EINVAL;
+
+       policy->min = 0;
+       policy->max = 0;
+       policy->policy = 0;
+       policy->cpu = CPUFREQ_ALL_CPUS;
+
+       if (sscanf(input_string, "%d:%d:%d:%15s", &cpu, &min, &max, str_governor) == 4) 
+       {
+               policy->min = min;
+               policy->max = max;
+               policy->cpu = cpu;
+               result = 0;
+               goto scan_policy;
+       }
+       if (sscanf(input_string, "%d%%%d%%%d%%%15s", &cpu, &min, &max, str_governor) == 4)
+       {
+               if (!cpufreq_get_policy(&current_policy, cpu)) {
+                       policy->min = (min * current_policy.cpuinfo.max_freq) / 100;
+                       policy->max = (max * current_policy.cpuinfo.max_freq) / 100;
+                       policy->cpu = cpu;
+                       result = 0;
+                       goto scan_policy;
+               }
+       }
+
+       if (sscanf(input_string, "%d:%d:%15s", &min, &max, str_governor) == 3) 
+       {
+               policy->min = min;
+               policy->max = max;
+               result = 0;
+               goto scan_policy;
+       }
+
+       if (sscanf(input_string, "%d%%%d%%%15s", &min, &max, str_governor) == 3)
+       {
+               if (!cpufreq_get_policy(&current_policy, cpu)) {
+                       policy->min = (min * current_policy.cpuinfo.max_freq) / 100;
+                       policy->max = (max * current_policy.cpuinfo.max_freq) / 100;
+                       result = 0;
+                       goto scan_policy;
+               }
+       }
+
+       return -EINVAL;
+
+scan_policy:
+       result = cpufreq_parse_governor(str_governor, &policy->policy, &policy->governor);
+
+       return result;
+}
+
+/**
+ * cpufreq_proc_read - read /proc/cpufreq
+ *
+ * This function prints out the current cpufreq policy.
+ */
+static int cpufreq_proc_read (
+       char                    *page,
+       char                    **start,
+       off_t                   off,
+       int                     count,
+       int                     *eof,
+       void                    *data)
+{
+       char                    *p = page;
+       int                     len = 0;
+       struct cpufreq_policy   policy;
+       unsigned int            min_pctg = 0;
+       unsigned int            max_pctg = 0;
+       unsigned int            i = 0;
+
+       if (off != 0)
+               goto end;
+
+       p += sprintf(p, "          minimum CPU frequency  -  maximum CPU frequency  -  policy\n");
+       for (i=0;i<NR_CPUS;i++) {
+               if (!cpu_online(i))
+                       continue;
+
+               if (cpufreq_get_policy(&policy, i))
+                       continue;
+
+               if (!policy.cpuinfo.max_freq)
+                       continue;
+
+               min_pctg = (policy.min * 100) / policy.cpuinfo.max_freq;
+               max_pctg = (policy.max * 100) / policy.cpuinfo.max_freq;
+
+               p += sprintf(p, "CPU%3d    %9d kHz (%3d %%)  -  %9d kHz (%3d %%)  -  ",
+                            i , policy.min, min_pctg, policy.max, max_pctg);
+               switch (policy.policy) {
+               case CPUFREQ_POLICY_POWERSAVE:
+                       p += sprintf(p, "powersave\n");
+                       break;
+               case CPUFREQ_POLICY_PERFORMANCE:
+                       p += sprintf(p, "performance\n");
+                       break;
+               case CPUFREQ_POLICY_GOVERNOR:
+                       p += snprintf(p, CPUFREQ_NAME_LEN, "%s\n", policy.governor->name);
+                       break;
+               default:
+                       p += sprintf(p, "INVALID\n");
+                       break;
+               }
+       }
+end:
+       len = (p - page);
+       if (len <= off+count) 
+               *eof = 1;
+       *start = page + off;
+       len -= off;
+       if (len>count) 
+               len = count;
+       if (len<0) 
+               len = 0;
+
+       return len;
+}
+
+
+/**
+ * cpufreq_proc_write - handles writing into /proc/cpufreq
+ *
+ * This function calls the parsing script and then sets the policy
+ * accordingly.
+ */
+static int cpufreq_proc_write (
+        struct file            *file,
+        const char             *buffer,
+        unsigned long          count,
+        void                   *data)
+{
+       int                     result = 0;
+       char                    proc_string[42] = {'\0'};
+       struct cpufreq_policy   policy;
+       unsigned int            i = 0;
+
+
+       if ((count > sizeof(proc_string) - 1))
+               return -EINVAL;
+       
+       if (copy_from_user(proc_string, buffer, count))
+               return -EFAULT;
+       
+       proc_string[count] = '\0';
+
+       result = cpufreq_parse_policy(proc_string, &policy);
+       if (result)
+               return -EFAULT;
+
+       if (policy.cpu == CPUFREQ_ALL_CPUS)
+       {
+               for (i=0; i<NR_CPUS; i++) 
+               {
+                       policy.cpu = i;
+                       if (cpu_online(i))
+                               cpufreq_set_policy(&policy);
+               }
+       } 
+       else
+               cpufreq_set_policy(&policy);
+
+       return count;
+}
+
+
+/**
+ * cpufreq_proc_init - add "cpufreq" to the /proc root directory
+ *
+ * This function adds "cpufreq" to the /proc root directory.
+ */
+static int __init cpufreq_proc_init (void)
+{
+       struct proc_dir_entry *entry = NULL;
+
+        /* are these acceptable values? */
+       entry = create_proc_entry("cpufreq", S_IFREG|S_IRUGO|S_IWUSR, 
+                                 &proc_root);
+
+       if (!entry) {
+               printk(KERN_ERR "unable to create /proc/cpufreq entry\n");
+               return -EIO;
+       } else {
+               entry->read_proc = cpufreq_proc_read;
+               entry->write_proc = cpufreq_proc_write;
+       }
+
+       return 0;
+}
+
+
+/**
+ * cpufreq_proc_exit - removes "cpufreq" from the /proc root directory.
+ *
+ * This function removes "cpufreq" from the /proc root directory.
+ */
+static void __exit cpufreq_proc_exit (void)
+{
+       remove_proc_entry("cpufreq", &proc_root);
+       return;
+}
+
+MODULE_AUTHOR ("Dominik Brodowski <linux@brodo.de>");
+MODULE_DESCRIPTION ("CPUfreq /proc/cpufreq interface");
+MODULE_LICENSE ("GPL");
+
+module_init(cpufreq_proc_init);
+module_exit(cpufreq_proc_exit);
index a49e134b2b6a26e6d5a96282e74e2bc008c8b01d..683feacc808bde2a061b652382f2d3b6ed2445ab 100644 (file)
@@ -205,6 +205,8 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
 int cpufreq_restore(void);
 #endif
 
+/* the proc_intf.c needs this */
+int cpufreq_parse_governor (char *str_governor, unsigned int *policy, struct cpufreq_governor **governor);
 
 #ifdef CONFIG_CPU_FREQ_24_API
 /*********************************************************************
index 4de004bf4aa65ab49854678dcc77f31b9be5324a..5a1118709aed62445c5ff1d2ddf40ae8a8a22a75 100644 (file)
 #include <linux/device.h>
 #include <linux/slab.h>
 
-#ifdef CONFIG_CPU_FREQ_PROC_INTF
-#include <linux/ctype.h>
-#include <linux/proc_fs.h>
-#include <asm/uaccess.h>
-#endif
-
 #ifdef CONFIG_CPU_FREQ_24_API
 #include <linux/proc_fs.h>
 #include <linux/sysctl.h>
@@ -77,7 +71,7 @@ static int cpufreq_governor(unsigned int cpu, unsigned int event);
 /**
  * cpufreq_parse_governor - parse a governor string
  */
-static int cpufreq_parse_governor (char *str_governor, unsigned int *policy, struct cpufreq_governor **governor)
+int cpufreq_parse_governor (char *str_governor, unsigned int *policy, struct cpufreq_governor **governor)
 {
        if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
                *policy = CPUFREQ_POLICY_PERFORMANCE;
@@ -103,6 +97,7 @@ static int cpufreq_parse_governor (char *str_governor, unsigned int *policy, str
        }
        return -EINVAL;
 }
+EXPORT_SYMBOL_GPL(cpufreq_parse_governor);
 
 
 /* forward declarations */
@@ -429,241 +424,6 @@ static int cpufreq_remove_dev (struct intf_data *intf)
 }
 
 
-/*********************************************************************
- *                      /proc/cpufreq INTERFACE                      *
- *********************************************************************/
-
-#ifdef CONFIG_CPU_FREQ_PROC_INTF
-
-/**
- * cpufreq_parse_policy - parse a policy string
- * @input_string: the string to parse.
- * @policy: the policy written inside input_string
- *
- * This function parses a "policy string" - something the user echo'es into
- * /proc/cpufreq or gives as boot parameter - into a struct cpufreq_policy.
- * If there are invalid/missing entries, they are replaced with current
- * cpufreq policy.
- */
-static int cpufreq_parse_policy(char input_string[42], struct cpufreq_policy *policy)
-{
-       unsigned int            min = 0;
-       unsigned int            max = 0;
-       unsigned int            cpu = 0;
-       char                    str_governor[16];
-       struct cpufreq_policy   current_policy;
-       unsigned int            result = -EFAULT;
-
-       if (!policy)
-               return -EINVAL;
-
-       policy->min = 0;
-       policy->max = 0;
-       policy->policy = 0;
-       policy->cpu = CPUFREQ_ALL_CPUS;
-
-       if (sscanf(input_string, "%d:%d:%d:%15s", &cpu, &min, &max, str_governor) == 4) 
-       {
-               policy->min = min;
-               policy->max = max;
-               policy->cpu = cpu;
-               result = 0;
-               goto scan_policy;
-       }
-       if (sscanf(input_string, "%d%%%d%%%d%%%15s", &cpu, &min, &max, str_governor) == 4)
-       {
-               if (!cpufreq_get_policy(&current_policy, cpu)) {
-                       policy->min = (min * current_policy.cpuinfo.max_freq) / 100;
-                       policy->max = (max * current_policy.cpuinfo.max_freq) / 100;
-                       policy->cpu = cpu;
-                       result = 0;
-                       goto scan_policy;
-               }
-       }
-
-       if (sscanf(input_string, "%d:%d:%15s", &min, &max, str_governor) == 3) 
-       {
-               policy->min = min;
-               policy->max = max;
-               result = 0;
-               goto scan_policy;
-       }
-
-       if (sscanf(input_string, "%d%%%d%%%15s", &min, &max, str_governor) == 3)
-       {
-               if (!cpufreq_get_policy(&current_policy, cpu)) {
-                       policy->min = (min * current_policy.cpuinfo.max_freq) / 100;
-                       policy->max = (max * current_policy.cpuinfo.max_freq) / 100;
-                       result = 0;
-                       goto scan_policy;
-               }
-       }
-
-       return -EINVAL;
-
-scan_policy:
-       result = cpufreq_parse_governor(str_governor, &policy->policy, &policy->governor);
-
-       return result;
-}
-
-/**
- * cpufreq_proc_read - read /proc/cpufreq
- *
- * This function prints out the current cpufreq policy.
- */
-static int cpufreq_proc_read (
-       char                    *page,
-       char                    **start,
-       off_t                   off,
-       int                     count,
-       int                     *eof,
-       void                    *data)
-{
-       char                    *p = page;
-       int                     len = 0;
-       struct cpufreq_policy   policy;
-       unsigned int            min_pctg = 0;
-       unsigned int            max_pctg = 0;
-       unsigned int            i = 0;
-
-       if (off != 0)
-               goto end;
-
-       p += sprintf(p, "          minimum CPU frequency  -  maximum CPU frequency  -  policy\n");
-       for (i=0;i<NR_CPUS;i++) {
-               if (!cpu_online(i))
-                       continue;
-
-               if (cpufreq_get_policy(&policy, i))
-                       continue;
-
-               if (!policy.cpuinfo.max_freq)
-                       continue;
-
-               min_pctg = (policy.min * 100) / policy.cpuinfo.max_freq;
-               max_pctg = (policy.max * 100) / policy.cpuinfo.max_freq;
-
-               p += sprintf(p, "CPU%3d    %9d kHz (%3d %%)  -  %9d kHz (%3d %%)  -  ",
-                            i , policy.min, min_pctg, policy.max, max_pctg);
-               switch (policy.policy) {
-               case CPUFREQ_POLICY_POWERSAVE:
-                       p += sprintf(p, "powersave\n");
-                       break;
-               case CPUFREQ_POLICY_PERFORMANCE:
-                       p += sprintf(p, "performance\n");
-                       break;
-               case CPUFREQ_POLICY_GOVERNOR:
-                       p += snprintf(p, CPUFREQ_NAME_LEN, "%s\n", policy.governor->name);
-                       break;
-               default:
-                       p += sprintf(p, "INVALID\n");
-                       break;
-               }
-       }
-end:
-       len = (p - page);
-       if (len <= off+count) 
-               *eof = 1;
-       *start = page + off;
-       len -= off;
-       if (len>count) 
-               len = count;
-       if (len<0) 
-               len = 0;
-
-       return len;
-}
-
-
-/**
- * cpufreq_proc_write - handles writing into /proc/cpufreq
- *
- * This function calls the parsing script and then sets the policy
- * accordingly.
- */
-static int cpufreq_proc_write (
-        struct file            *file,
-        const char             *buffer,
-        unsigned long          count,
-        void                   *data)
-{
-       int                     result = 0;
-       char                    proc_string[42] = {'\0'};
-       struct cpufreq_policy   policy;
-       unsigned int            i = 0;
-
-
-       if ((count > sizeof(proc_string) - 1))
-               return -EINVAL;
-       
-       if (copy_from_user(proc_string, buffer, count))
-               return -EFAULT;
-       
-       proc_string[count] = '\0';
-
-       result = cpufreq_parse_policy(proc_string, &policy);
-       if (result)
-               return -EFAULT;
-
-       if (policy.cpu == CPUFREQ_ALL_CPUS)
-       {
-               for (i=0; i<NR_CPUS; i++) 
-               {
-                       policy.cpu = i;
-                       if (cpu_online(i))
-                               cpufreq_set_policy(&policy);
-               }
-       } 
-       else
-               cpufreq_set_policy(&policy);
-
-       return count;
-}
-
-
-/**
- * cpufreq_proc_init - add "cpufreq" to the /proc root directory
- *
- * This function adds "cpufreq" to the /proc root directory.
- */
-static unsigned int cpufreq_proc_init (void)
-{
-       struct proc_dir_entry *entry = NULL;
-
-        /* are these acceptable values? */
-       entry = create_proc_entry("cpufreq", S_IFREG|S_IRUGO|S_IWUSR, 
-                                 &proc_root);
-
-       if (!entry) {
-               printk(KERN_ERR "unable to create /proc/cpufreq entry\n");
-               return -EIO;
-       } else {
-               entry->read_proc = cpufreq_proc_read;
-               entry->write_proc = cpufreq_proc_write;
-       }
-
-       return 0;
-}
-
-
-/**
- * cpufreq_proc_exit - removes "cpufreq" from the /proc root directory.
- *
- * This function removes "cpufreq" from the /proc root directory.
- */
-static void cpufreq_proc_exit (void)
-{
-       remove_proc_entry("cpufreq", &proc_root);
-       return;
-}
-#else
-#define cpufreq_proc_init() do {} while(0)
-#define cpufreq_proc_exit() do {} while(0)
-#endif /* CONFIG_CPU_FREQ_PROC_INTF */
-
-
-
 /*********************************************************************
  *                      /proc/sys/cpu/ INTERFACE                     *
  *********************************************************************/
@@ -1485,8 +1245,6 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
        
        up(&cpufreq_driver_sem);
 
-       cpufreq_proc_init();
-
 #ifdef CONFIG_CPU_FREQ_24_API
        cpufreq_sysctl_init();
 #endif
@@ -1516,8 +1274,6 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
                return -EINVAL;
        }
 
-       cpufreq_proc_exit();
-
 #ifdef CONFIG_CPU_FREQ_24_API
        cpufreq_sysctl_exit();
 #endif