cpufreq: per-CPU initialization in x86 + ACPI drivers
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
@@ -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