From 23121ee6adaae07cd45d2941aeb18cab7e4df76b Mon Sep 17 00:00:00 2001 From: Jonghwa Lee Date: Sat, 18 Apr 2015 01:49:22 +0900 Subject: [PATCH] cpufreq: arm_big_little_dt: Parse suspend frequency from CPU's dt node Some bigLittle system needs safety CPU freqeuncy to enter suspend state. And it provides the way to get the frequency via devicetree. Obtained suspend-safe frequency will be preset before the CPU goes into sleep through the help of CPUFREQ subsystem. Signed-off-by: Jonghwa Lee --- drivers/cpufreq/arm_big_little_dt.c | 42 ++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/arm_big_little_dt.c b/drivers/cpufreq/arm_big_little_dt.c index e29fb37..c70d0db 100644 --- a/drivers/cpufreq/arm_big_little_dt.c +++ b/drivers/cpufreq/arm_big_little_dt.c @@ -85,16 +85,56 @@ static struct cpufreq_arm_bL_ops dt_bL_ops = { .free_opp_table = of_free_opp_table, }; +static int bL_cpufreq_add_dev(struct device *dev, struct subsys_interface *sif) +{ + int cpu = dev->id; + u32 freq; + + if (!dev->of_node) + return -ENODEV; + + if (!of_property_read_u32(dev->of_node, "suspend-freq", &freq)) { + struct cpufreq_policy *policy; + + policy = cpufreq_cpu_get(cpu); + if (!policy) + goto out; + + policy->suspend_freq = freq; + + cpufreq_cpu_put(policy); + + if (!dt_bL_ops.suspend) + dt_bL_ops.suspend = cpufreq_generic_suspend; + } +out: + return 0; +} + +static struct subsys_interface bL_cpufreq_interface = { + .name = "arm-bL-cpufreq", + .subsys = &cpu_subsys, + .add_dev = bL_cpufreq_add_dev, +}; + static int generic_bL_probe(struct platform_device *pdev) { struct device_node *np; + int ret; np = get_cpu_node_with_valid_op(0); if (!np) return -ENODEV; of_node_put(np); - return bL_cpufreq_register(&dt_bL_ops); + + ret = bL_cpufreq_register(&dt_bL_ops); + if (ret) + return ret; + + subsys_interface_register(&bL_cpufreq_interface); + + return 0; } static int generic_bL_remove(struct platform_device *pdev) -- 2.7.4