Hi Richard,
On Tue, Dec 27, 2011 at 04:24:19PM +0800, Richard Zhao wrote:
The driver get cpu operation point table from device tree cpu0 node, and adjusts operating points using clk and regulator APIs.
It support single core and multi-core ARM SoCs. But currently it assume all cores share the same frequency and voltage.
Signed-off-by: Richard Zhao richard.zhao@linaro.org Reviewed-by: Jamie Iles jamie@jamieiles.com Reviewed-by: Mark Brown broonie@opensource.wolfsonmicro.com
.../devicetree/bindings/cpufreq/clk-reg-cpufreq | 21 ++ drivers/cpufreq/Kconfig | 10 + drivers/cpufreq/Makefile | 2 + drivers/cpufreq/clk-reg-cpufreq.c | 302 ++++++++++++++++++++ 4 files changed, 335 insertions(+), 0 deletions(-) create mode 100644 Documentation/devicetree/bindings/cpufreq/clk-reg-cpufreq create mode 100644 drivers/cpufreq/clk-reg-cpufreq.c
[...]
+static struct cpufreq_driver clk_reg_cpufreq_driver = {
- .flags = CPUFREQ_STICKY,
- .verify = clk_reg_verify_speed,
- .target = clk_reg_set_target,
- .get = clk_reg_get_speed,
- .init = clk_reg_cpufreq_init,
- .exit = clk_reg_cpufreq_exit,
- .name = "clk-reg",
+};
+static u32 max_freq = UINT_MAX / 1000; /* kHz */ +module_param(max_freq, uint, 0); +MODULE_PARM_DESC(max_freq, "max cpu frequency in unit of kHz");
Have you tried to pass this param from kernel cmdline? What's the syntax if we want to pass a 800 MHz max_freq?
And I played this driver on imx6q with pm-qa [1] cpufreq test suit from Linaro PMWG.
### cpufreq_01: ### test the cpufreq framework is available for frequency ### https://wiki.linaro.org/WorkingGroups/PowerManagement/Doc/QA/Scripts#cpufreq... ### cpufreq_01.0/cpu0: checking 'scaling_available_frequencies' exists... fail cpufreq_01.0/cpu1: checking 'scaling_available_frequencies' exists... fail cpufreq_01.0/cpu2: checking 'scaling_available_frequencies' exists... fail cpufreq_01.0/cpu3: checking 'scaling_available_frequencies' exists... fail
### cpufreq_05: ### test 'ondemand' and 'conservative' trigger correctly the configuration directory ### https://wiki.linaro.org/WorkingGroups/PowerManagement/Doc/QA/Scripts#cpufreq... ### cpufreq_05.0: checking 'ondemand' directory exists... pass cpufreq_05.1: checking 'conservative' directory exists... pass cpufreq_05.2: checking 'ondemand' directory is not there... pass cpufreq_05.3: checking 'conservative' directory is not there... pass cpufreq_05.4: checking 'ondemand' directory exists... fail cpufreq_05.5: checking 'conservative' directory exists... pass
The cpufreq_01 can be easily fixed with the following change.
8<----- @@ -146,6 +150,11 @@ static int clk_reg_cpufreq_exit(struct cpufreq_policy *policy) return 0; }
+static struct freq_attr *clk_reg_cpufreq_attr[] = { + &cpufreq_freq_attr_scaling_available_freqs, + NULL, +}; + static struct cpufreq_driver clk_reg_cpufreq_driver = { .flags = CPUFREQ_STICKY, .verify = clk_reg_verify_speed, @@ -153,10 +162,15 @@ static struct cpufreq_driver clk_reg_cpufreq_driver = { .get = clk_reg_get_speed, .init = clk_reg_cpufreq_init, .exit = clk_reg_cpufreq_exit, + .attr = clk_reg_cpufreq_attr, .name = "clk-reg", }; ----->8
And I have not looked into the second one deeply, but maybe you want to :)