From e7040c8dd6e2f411374c3f5c7efcdc60fb67771d Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Tue, 26 Jun 2018 22:15:30 +0800 Subject: [PATCH] cpufreq: rockchip: implement rockchip_cpufreq_check_rate_volt() Change-Id: I707c88d217725e66119aa28e8823ce68ac3abfba Signed-off-by: Finley Xiao --- drivers/cpufreq/cpufreq-dt.c | 10 +++------- drivers/cpufreq/rockchip-cpufreq.c | 17 +++++++++++++++++ include/linux/cpufreq.h | 6 ++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 2632f162e425..c3889bf41545 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -32,8 +32,6 @@ #include #endif -#define MAX_CLUSTERS 2 - struct private_data { struct device *cpu_dev; struct thermal_cooling_device *cdev; @@ -161,7 +159,6 @@ static int cpufreq_init(struct cpufreq_policy *policy) bool opp_v1 = false; const char *name; int ret, scale; - static int check_init; cpu_dev = get_cpu_device(policy->cpu); if (!cpu_dev) { @@ -312,10 +309,9 @@ static int cpufreq_init(struct cpufreq_policy *policy) policy->up_transition_delay_us = transition_latency / NSEC_PER_USEC; policy->down_transition_delay_us = 50000; /* 50ms */ - if (check_init < MAX_CLUSTERS) { - dev_pm_opp_check_rate_volt(cpu_dev, true); - check_init++; - } +#ifdef CONFIG_ARCH_ROCKCHIP + rockchip_cpufreq_check_rate_volt(cpu_dev); +#endif return 0; diff --git a/drivers/cpufreq/rockchip-cpufreq.c b/drivers/cpufreq/rockchip-cpufreq.c index cd8bcdac0e45..73ebcf3f7037 100644 --- a/drivers/cpufreq/rockchip-cpufreq.c +++ b/drivers/cpufreq/rockchip-cpufreq.c @@ -48,6 +48,7 @@ struct cluster_info { bool offline; bool rebooting; bool freq_limit; + bool is_check_init; }; static LIST_HEAD(cluster_info_list); @@ -172,6 +173,22 @@ int rockchip_cpufreq_set_scale_rate(struct device *dev, unsigned long rate) } EXPORT_SYMBOL_GPL(rockchip_cpufreq_set_scale_rate); +int rockchip_cpufreq_check_rate_volt(struct device *dev) +{ + struct cluster_info *cluster; + + cluster = rockchip_cluster_lookup_by_dev(dev); + if (!cluster) + return -EINVAL; + if (cluster->is_check_init) + return 0; + dev_pm_opp_check_rate_volt(dev, true); + cluster->is_check_init = true; + + return 0; +} +EXPORT_SYMBOL_GPL(rockchip_cpufreq_check_rate_volt); + static int rockchip_cpufreq_cluster_init(int cpu, struct cluster_info *cluster) { struct device_node *np; diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 24b9e4e137b4..be27ec362a9d 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -699,6 +699,7 @@ unsigned long cpufreq_scale_max_freq_capacity(int cpu); unsigned int rockchip_cpufreq_adjust_target(int cpu, unsigned int freq); int rockchip_cpufreq_get_scale(int cpu); int rockchip_cpufreq_set_scale_rate(struct device *dev, unsigned long rate); +int rockchip_cpufreq_check_rate_volt(struct device *dev); #else static inline unsigned int rockchip_cpufreq_adjust_target(int cpu, unsigned int freq) @@ -716,5 +717,10 @@ static inline int rockchip_cpufreq_set_scale_rate(struct device *dev, { return -EINVAL; } + +static inline int rockchip_cpufreq_check_rate_volt(struct device *dev) +{ + return -EINVAL; +} #endif #endif /* _LINUX_CPUFREQ_H */