Skip to contentSkip to conversation

cpufreq: per-CPU initialization in x86 + ACPI drivers

PATCH New Dominik Brodowski 1 participant 1 message Jan 13, 2003 ACPI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cpufreq: per-CPU initialization in x86 + ACPI drivers

This patch adds per-CPU initialization to a couple of cpufreq drivers. It's a large simplification of many code paths, but especially in the ACPI cpufreq driver.

Dominik

 arch/i386/kernel/cpu/cpufreq/elanfreq.c    |  104 ++++++--------
 arch/i386/kernel/cpu/cpufreq/longrun.c     |  102 ++++++--------
 arch/i386/kernel/cpu/cpufreq/p4-clockmod.c |  136 ++++++++----------
 arch/i386/kernel/cpu/cpufreq/powernow-k6.c |  122 ++++++++--------
 arch/i386/kernel/cpu/cpufreq/speedstep.c   |  130 +++++++-----------
 drivers/acpi/processor.c                   |  209 ++++++++++-------------------
 6 files changed, 359 insertions(+), 444 deletions(-)
arch/i386/kernel/cpu/cpufreq/elanfreq.c +50 -54
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/elanfreq.c linux/arch/i386/kernel/cpu/cpufreq/elanfreq.c
@@ -31,15 +31,11 @@
 #define REG_CSCIR 0x22 		/* Chip Setup and Control Index Register    */
 #define REG_CSCDR 0x23		/* Chip Setup and Control Data  Register    */
 
-static struct cpufreq_driver *elanfreq_driver;
+static struct cpufreq_driver elanfreq_driver;
 
 /* Module parameter */
 static int max_freq;
 
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Robert Schwebel <[email protected]>, Sven Geggus <[email protected]>");
-MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs");
-
 struct s_elan_multiplier {
 	int clock;		/* frequency in kHz                         */
 	int val40h;		/* PMU Force Mode register                  */
@@ -204,6 +200,37 @@
  *	Module init and exit code
  */
 
+static int elanfreq_cpu_init(struct cpufreq_policy *policy)
+{
+	struct cpuinfo_x86 *c = cpu_data;
+	unsigned int i;
+
+	/* capability check */
+	if ((c->x86_vendor != X86_VENDOR_AMD) ||
+	    (c->x86 != 4) || (c->x86_model!=10))
+		return -ENODEV;
+
+	/* max freq */
+	if (!max_freq)
+		max_freq = elanfreq_get_cpu_frequency();
+
+	/* table init */
+ 	for (i=0; (elanfreq_table[i].frequency != CPUFREQ_TABLE_END); i++) {
+		if (elanfreq_table[i].frequency > max_freq)
+			elanfreq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+	}
+
+	/* cpuinfo and default policy values */
+	policy->policy = CPUFREQ_POLICY_PERFORMANCE;
+	policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+#ifdef CONFIG_CPU_FREQ_24_API
+	elanfreq_driver.cpu_cur_freq[policy->cpu] = elanfreq_get_cpu_frequency();
+#endif
+
+	return cpufreq_frequency_table_cpuinfo(policy, &elanfreq_table[0]);;
+}
+
+
 #ifndef MODULE
 /**
  * elanfreq_setup - elanfreq command line parameter parsing
@@ -238,63 +265,32 @@
                 return -ENODEV;
 	}
 	
-	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);
-
-	if (!max_freq)
-		max_freq = elanfreq_get_cpu_frequency();
-
-	/* table init */
- 	for (i=0; (elanfreq_table[i].frequency != CPUFREQ_TABLE_END); i++) {
-		if (elanfreq_table[i].frequency > max_freq)
-			elanfreq_table[i].frequency = CPUFREQ_ENTRY_INVALID;
-	}
+	return cpufreq_register_driver(driver);
+}
 
-#ifdef CONFIG_CPU_FREQ_24_API
-	driver->cpu_cur_freq[0] = elanfreq_get_cpu_frequency();
-#endif
 
-	driver->verify        = &elanfreq_verify;
-	driver->setpolicy     = &elanfreq_setpolicy;
-	driver->init = NULL;
-	driver->exit = NULL;
-	strncpy(driver->name, "elanfrep\0", CPUFREQ_NAME_LEN);
-
-	driver->policy[0].cpu    = 0;
-	ret = cpufreq_frequency_table_cpuinfo(&driver->policy[0], &elanfreq_table[0]);
-	if (ret) {
-		kfree(driver);
-		return ret;
-	}
-	driver->policy[0].policy = CPUFREQ_POLICY_PERFORMANCE;
-	driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+static void __exit elanfreq_exit(void) 
+{
+	cpufreq_unregister_driver(&elanfreq_driver);
+}
 
-	elanfreq_driver = driver;
 
-	ret = cpufreq_register(driver);
-	if (ret) {
-		elanfreq_driver = NULL;
-		kfree(driver);
-	}
+static struct cpufreq_driver elanfreq_driver = {
+	.verify 	= elanfreq_verify,
+	.setpolicy 	= elanfreq_setpolicy,
+	.init		= elanfreq_cpu_init,
+	.exit		= NULL,
+	.policy		= NULL,
+	.name		= "elanfreq",
+};
 
-	return ret;
-}
 
+MODULE_PARM (max_freq, "i");
 
-static void __exit elanfreq_exit(void) 
-{
-	if (elanfreq_driver) {
-		cpufreq_unregister();
-		kfree(elanfreq_driver);
-	}
-}
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Robert Schwebel <[email protected]>, Sven Geggus <[email protected]>");
+MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs");
 
 module_init(elanfreq_init);
 module_exit(elanfreq_exit);
 
-MODULE_PARM (max_freq, "i");
-
arch/i386/kernel/cpu/cpufreq/longrun.c +50 -52

159 lines not on this page · raw message

arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +63 -73

191 lines not on this page · raw message

arch/i386/kernel/cpu/cpufreq/powernow-k6.c +62 -60

173 lines not on this page · raw message

arch/i386/kernel/cpu/cpufreq/speedstep.c +56 -74

171 lines not on this page · raw message

drivers/acpi/processor.c +78 -131

307 lines not on this page · raw message