[PATCH] PPC32: Update pmac_cpufreq driver back to working conditions

From: Benjamin Herrenschmidt (benh@kernel.crashing.org)
Date: Tue Jul 29 2003 - 08:16:02 EST


This patch updates the PowerMac cpufreq driver so that
it builds & works in current 2.6

Please apply,
Ben.

diff -urN linux-2.5/arch/ppc/platforms/pmac_cpufreq.c linuxppc-2.5-benh/arch/ppc/platforms/pmac_cpufreq.c
--- linux-2.5/arch/ppc/platforms/pmac_cpufreq.c 2003-07-29 08:50:25.000000000 -0400
+++ linuxppc-2.5-benh/arch/ppc/platforms/pmac_cpufreq.c 2003-07-23 20:04:23.000000000 -0400
@@ -1,4 +1,16 @@
+/*
+ * arch/ppc/platforms/pmac_cpufreq.c
+ *
+ * Copyright (C) 2002 - 2003 Benjamin Herrenschmidt <benh@kernel.crashing.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
@@ -36,6 +48,18 @@
 #define PMAC_CPU_LOW_SPEED 1
 #define PMAC_CPU_HIGH_SPEED 0
 
+/* There are only two frequency states for each processor. Values
+ * are in kHz for the time being.
+ */
+#define CPUFREQ_HIGH PMAC_CPU_HIGH_SPEED
+#define CPUFREQ_LOW PMAC_CPU_LOW_SPEED
+
+static struct cpufreq_frequency_table pmac_cpu_freqs[] = {
+ {CPUFREQ_HIGH, 0},
+ {CPUFREQ_LOW, 0},
+ {0, CPUFREQ_TABLE_END},
+};
+
 static inline void
 wakeup_decrementer(void)
 {
@@ -192,37 +216,21 @@
 static int __pmac
 pmac_cpufreq_verify(struct cpufreq_policy *policy)
 {
- if (!policy)
- return -EINVAL;
-
- policy->cpu = 0; /* UP only */
-
- cpufreq_verify_within_limits(policy, low_freq, hi_freq);
-
- if ((policy->min > low_freq) &&
- (policy->max < hi_freq))
- policy->max = hi_freq;
-
- return 0;
+ return cpufreq_frequency_table_verify(policy, pmac_cpu_freqs);
 }
 
 static int __pmac
-pmac_cpufreq_setpolicy(struct cpufreq_policy *policy)
+pmac_cpufreq_target( struct cpufreq_policy *policy,
+ unsigned int target_freq,
+ unsigned int relation)
 {
- int rc;
-
- if (!policy)
+ unsigned int newstate = 0;
+
+ if (cpufreq_frequency_table_target(policy, pmac_cpu_freqs,
+ target_freq, relation, &newstate))
                 return -EINVAL;
- if (policy->min > low_freq)
- rc = do_set_cpu_speed(PMAC_CPU_HIGH_SPEED);
- else if (policy->max < hi_freq)
- rc = do_set_cpu_speed(PMAC_CPU_LOW_SPEED);
- else if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
- rc = do_set_cpu_speed(PMAC_CPU_LOW_SPEED);
- else
- rc = do_set_cpu_speed(PMAC_CPU_HIGH_SPEED);
 
- return rc;
+ return do_set_cpu_speed(newstate);
 }
 
 unsigned int __pmac
@@ -232,6 +240,27 @@
         return (i == 0) ? cur_freq : 0;
 }
 
+static int __pmac
+pmac_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+ if (policy->cpu != 0)
+ return -ENODEV;
+
+ policy->policy = (cur_freq == low_freq) ?
+ CPUFREQ_POLICY_POWERSAVE : CPUFREQ_POLICY_PERFORMANCE;
+ policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+ policy->cur = cur_freq;
+
+ return cpufreq_frequency_table_cpuinfo(policy, &pmac_cpu_freqs[0]);
+}
+
+static struct cpufreq_driver pmac_cpufreq_driver = {
+ .verify = pmac_cpufreq_verify,
+ .target = pmac_cpufreq_target,
+ .init = pmac_cpufreq_cpu_init,
+ .name = "powermac",
+ .owner = THIS_MODULE,
+};
 
 /* Currently, we support the following machines:
  *
@@ -244,13 +273,9 @@
 pmac_cpufreq_setup(void)
 {
         struct device_node *cpunode;
- struct cpufreq_driver *driver;
         u32 *value;
         int has_freq_ctl = 0;
- int rc;
         
- memset(&driver, 0, sizeof(driver));
-
         /* Assume only one CPU */
         cpunode = find_type_devices("cpu");
         if (!cpunode)
@@ -318,34 +343,11 @@
         if (!has_freq_ctl)
                 return -ENODEV;
         
- /* initialization of main "cpufreq" code*/
- driver = kmalloc(sizeof(struct cpufreq_driver) +
- NR_CPUS * sizeof(struct cpufreq_policy), GFP_KERNEL);
- if (!driver)
- return -ENOMEM;
-
- driver->policy = (struct cpufreq_policy *) (driver + 1);
-
- driver->verify = &pmac_cpufreq_verify;
- driver->setpolicy = &pmac_cpufreq_setpolicy;
- driver->init = NULL;
- driver->exit = NULL;
- strlcpy(driver->name, "powermac", sizeof(driver->name));
-
- driver->policy[0].cpu = 0;
- driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
- driver->policy[0].cpuinfo.min_freq = low_freq;
- driver->policy[0].min = low_freq;
- driver->policy[0].max = cur_freq;
- driver->policy[0].cpuinfo.max_freq = cur_freq;
- driver->policy[0].policy = (cur_freq == low_freq) ?
- CPUFREQ_POLICY_POWERSAVE : CPUFREQ_POLICY_PERFORMANCE;
-
- rc = cpufreq_register_driver(driver);
- if (rc)
- kfree(driver);
- return rc;
+ pmac_cpu_freqs[CPUFREQ_LOW].frequency = low_freq;
+ pmac_cpu_freqs[CPUFREQ_HIGH].frequency = hi_freq;
+
+ return cpufreq_register_driver(&pmac_cpufreq_driver);
 }
 
-__initcall(pmac_cpufreq_setup);
+module_init(pmac_cpufreq_setup);
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Jul 31 2003 - 22:00:40 EST