aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-06-02 17:24:15 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-06-02 17:24:15 -0400
commite788892ba3cc71d385b75895f7a375fbc659ce86 (patch)
treef8a66153a91408f050eb7eb8d909c98d85a75ba9 /drivers/cpufreq/cpufreq.c
parenta92604b419f47e1c5098632742d8e031f6e8fab1 (diff)
cpufreq: governor: Get rid of governor events
The design of the cpufreq governor API is not very straightforward, as struct cpufreq_governor provides only one callback to be invoked from different code paths for different purposes. The purpose it is invoked for is determined by its second "event" argument, causing it to act as a "callback multiplexer" of sorts. Unfortunately, that leads to extra complexity in governors, some of which implement the ->governor() callback as a switch statement that simply checks the event argument and invokes a separate function to handle that specific event. That extra complexity can be eliminated by replacing the all-purpose ->governor() callback with a family of callbacks to carry out specific governor operations: initialization and exit, start and stop and policy limits updates. That also turns out to reduce the code size too, so do it. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r--drivers/cpufreq/cpufreq.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 268566e40684..d98ff688b2f1 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -2023,10 +2023,12 @@ static int cpufreq_init_governor(struct cpufreq_policy *policy)
2023 2023
2024 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); 2024 pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
2025 2025
2026 ret = policy->governor->governor(policy, CPUFREQ_GOV_POLICY_INIT); 2026 if (policy->governor->init) {
2027 if (ret) { 2027 ret = policy->governor->init(policy);
2028 module_put(policy->governor->owner); 2028 if (ret) {
2029 return ret; 2029 module_put(policy->governor->owner);
2030 return ret;
2031 }
2030 } 2032 }
2031 2033
2032 policy->governor->initialized++; 2034 policy->governor->initialized++;
@@ -2040,7 +2042,8 @@ static void cpufreq_exit_governor(struct cpufreq_policy *policy)
2040 2042
2041 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); 2043 pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
2042 2044
2043 policy->governor->governor(policy, CPUFREQ_GOV_POLICY_EXIT); 2045 if (policy->governor->exit)
2046 policy->governor->exit(policy);
2044 2047
2045 policy->governor->initialized--; 2048 policy->governor->initialized--;
2046 module_put(policy->governor->owner); 2049 module_put(policy->governor->owner);
@@ -2061,11 +2064,15 @@ static int cpufreq_start_governor(struct cpufreq_policy *policy)
2061 if (cpufreq_driver->get && !cpufreq_driver->setpolicy) 2064 if (cpufreq_driver->get && !cpufreq_driver->setpolicy)
2062 cpufreq_update_current_freq(policy); 2065 cpufreq_update_current_freq(policy);
2063 2066
2064 ret = policy->governor->governor(policy, CPUFREQ_GOV_START); 2067 if (policy->governor->start) {
2065 if (ret) 2068 ret = policy->governor->start(policy);
2066 return ret; 2069 if (ret)
2070 return ret;
2071 }
2072
2073 if (policy->governor->limits)
2074 policy->governor->limits(policy);
2067 2075
2068 policy->governor->governor(policy, CPUFREQ_GOV_LIMITS);
2069 return 0; 2076 return 0;
2070} 2077}
2071 2078
@@ -2076,7 +2083,8 @@ static void cpufreq_stop_governor(struct cpufreq_policy *policy)
2076 2083
2077 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); 2084 pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
2078 2085
2079 policy->governor->governor(policy, CPUFREQ_GOV_STOP); 2086 if (policy->governor->stop)
2087 policy->governor->stop(policy);
2080} 2088}
2081 2089
2082static void cpufreq_governor_limits(struct cpufreq_policy *policy) 2090static void cpufreq_governor_limits(struct cpufreq_policy *policy)
@@ -2086,7 +2094,8 @@ static void cpufreq_governor_limits(struct cpufreq_policy *policy)
2086 2094
2087 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); 2095 pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
2088 2096
2089 policy->governor->governor(policy, CPUFREQ_GOV_LIMITS); 2097 if (policy->governor->limits)
2098 policy->governor->limits(policy);
2090} 2099}
2091 2100
2092int cpufreq_register_governor(struct cpufreq_governor *governor) 2101int cpufreq_register_governor(struct cpufreq_governor *governor)