cpufreq: per-CPU initialization
Subsystems (4)
PATCH 1/1 cpufreq: per-CPU initialization
(depends on the sysfs interface patch sent a few minutes ago)
Allow for per-CPU initialization of CPUfreq. Therefore, it's not necessary any longer to kmalloc the per-CPU policy struct. To use this, cpufreq_driver->policy has to be set to NULL. Of course, cpufreq_driver->init is needed then, which is the appropriate function for CPU initialization. cpufreq_driver->exit is available for cleanup.
All existing drivers continue to work without any changes, just for clarity ->init and ->exit are set to NULL, and the names are set accordingly.
Dominik
arch/arm/mach-integrator/cpu.c +3 -0
@@ -166,6 +166,9 @@ .verify = integrator_verify_speed, .setpolicy = integrator_set_policy, .policy = &integrator_policy, + .init = NULL, + .exit = NULL, + .name = "integrator\0", };#endif
arch/arm/mach-sa1100/cpu-sa1100.c +3 -0
@@ -214,6 +214,9 @@ .verify = sa11x0_verify_speed, .setpolicy = sa1100_setspeed, .policy = &sa1100_policy, + .init = NULL, + .exit = NULL, + .name = "sa1100\0", };static int __init sa1100_dram_init (void )
arch/arm/mach-sa1100/cpu-sa1110.c +3 -0
@@ -309,6 +309,9 @@ .verify = sa11x0_verify_speed, .setpolicy = sa1110_setspeed, .policy = &sa1110_policy, + .init = NULL, + .exit = NULL, + .name = "sa1110\0", };static int __init sa1110_clk_init (void )
arch/i386/kernel/cpu/cpufreq/elanfreq.c +3 -0
@@ -260,6 +260,9 @@ 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 ]);
arch/i386/kernel/cpu/cpufreq/gx-suspmod.c +3 -0
@@ -482,6 +482,9 @@ driver->policy[0 ].cpuinfo.transition_latency =CPUFREQ_ETERNAL ; driver->verify = &cpufreq_gx_verify; driver->setpolicy = &cpufreq_gx_setpolicy; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"gx-suspmod\0" ,CPUFREQ_NAME_LEN ); gx_driver = driver;
arch/i386/kernel/cpu/cpufreq/longhaul.c +3 -0
@@ -771,6 +771,9 @@ driver->verify = &longhaul_verify; driver->setpolicy = &longhaul_setpolicy; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"longhaul\0" ,CPUFREQ_NAME_LEN ); driver->policy[0 ].cpu =0 ; driver->policy[0 ].min = (unsigned int ) lowest_speed;
arch/i386/kernel/cpu/cpufreq/longrun.c +3 -0
@@ -251,6 +251,9 @@ driver->policy[0 ].cpuinfo.min_freq = longrun_low_freq; driver->policy[0 ].cpuinfo.max_freq = longrun_high_freq; driver->policy[0 ].cpuinfo.transition_latency =CPUFREQ_ETERNAL ; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"longrun\0" ,CPUFREQ_NAME_LEN );longrun_get_policy (&driver->policy[0 ]);
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +3 -0
@@ -240,6 +240,9 @@ driver->verify = &cpufreq_p4_verify; driver->setpolicy = &cpufreq_p4_setpolicy; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"p4-clockmod\0" ,CPUFREQ_NAME_LEN );for (i=0 ;i<NR_CPUS ;i++) { driver->policy[i].cpu = i;
arch/i386/kernel/cpu/cpufreq/powernow-k6.c +3 -0
@@ -184,6 +184,9 @@ driver->verify = &powernow_k6_verify; driver->setpolicy = &powernow_k6_setpolicy; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"powernow-k6\0" ,CPUFREQ_NAME_LEN );/* cpuinfo and default policy values */ driver->policy[0 ].cpu =0 ;
arch/i386/kernel/cpu/cpufreq/speedstep.c +3 -0
@@ -690,6 +690,9 @@ driver->verify = &speedstep_verify; driver->setpolicy = &speedstep_setpolicy; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"speedstep\0" ,CPUFREQ_NAME_LEN ); driver->policy[0 ].cpuinfo.transition_latency =CPUFREQ_ETERNAL ;
drivers/acpi/processor.c +3 -0
@@ -1823,6 +1823,9 @@ driver->verify = &acpi_cpufreq_verify; driver->setpolicy = &acpi_cpufreq_setpolicy; + driver->init =NULL ; + driver->exit =NULL ; +strncpy (driver->name,"acpi-processor\0" ,CPUFREQ_NAME_LEN );for (i=0 ;i<NR_CPUS ;i++) { driver->policy[i].cpu = pr->id;
include/linux/cpufreq.h +12 -2
@@ -109,19 +109,29 @@* CPUFREQ DRIVER INTERFACE * *********************************************************************/ +#define CPUFREQ_NAME_LEN 16 +struct cpufreq_driver {/* needed by all drivers */ int (*verify) (struct cpufreq_policy *policy);int (*setpolicy) (struct cpufreq_policy *policy);struct cpufreq_policy *policy; +char name[CPUFREQ_NAME_LEN ]; +/* optional, for the moment */ +int (*init) (struct cpufreq_policy *policy); +int (*exit) (struct cpufreq_policy *policy);/* 2.4. compatible API */ #ifdef CONFIG_CPU_FREQ_24_API unsigned int cpu_cur_freq[NR_CPUS ];#endif }; -int cpufreq_register (struct cpufreq_driver *driver_data); -int cpufreq_unregister (void ); +int cpufreq_register_driver (struct cpufreq_driver *driver_data); +int cpufreq_unregister_driver (struct cpufreq_driver *driver_data); +/* deprecated */ +#define cpufreq_register (x) cpufreq_register_driver(x) +#define cpufreq_unregister (x) cpufreq_unregister_driver(NULL) +void cpufreq_notify_transition (struct cpufreq_freqs *freqs,unsigned int state);
kernel/cpufreq.c +98 -80
290 lines not on this page · raw message