Skip to content

Commit

Permalink
cpufreq: Don't call __cpufreq_governor() for drivers without target()
Browse files Browse the repository at this point in the history
Some cpufreq drivers implement their own governor and so don't need
us to call generic governors interface via __cpufreq_governor(). Few
recent commits haven't obeyed this law well and we saw some
regressions.

This patch is an attempt to fix the above issue.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Reported-and-tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Tested-by: Dirk Brandewie <dirk.brandewie@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Viresh Kumar authored and Rafael J. Wysocki committed Apr 21, 2013
1 parent 70eb085 commit 820c6ca
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions drivers/cpufreq/cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -858,13 +858,18 @@ static int cpufreq_add_policy_cpu(unsigned int cpu, unsigned int sibling,
struct device *dev)
{
struct cpufreq_policy *policy;
int ret = 0;
int ret = 0, has_target = 0;
unsigned long flags;

policy = cpufreq_cpu_get(sibling);
WARN_ON(!policy);

__cpufreq_governor(policy, CPUFREQ_GOV_STOP);
rcu_read_lock();
has_target = !!rcu_dereference(cpufreq_driver)->target;
rcu_read_unlock();

if (has_target)
__cpufreq_governor(policy, CPUFREQ_GOV_STOP);

lock_policy_rwsem_write(sibling);

Expand All @@ -877,8 +882,10 @@ static int cpufreq_add_policy_cpu(unsigned int cpu, unsigned int sibling,

unlock_policy_rwsem_write(sibling);

__cpufreq_governor(policy, CPUFREQ_GOV_START);
__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
if (has_target) {
__cpufreq_governor(policy, CPUFREQ_GOV_START);
__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
}

ret = sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
if (ret) {
Expand Down Expand Up @@ -1146,7 +1153,8 @@ static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif

/* If cpu is last user of policy, free policy */
if (cpus == 1) {
__cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
if (has_target)
__cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);

lock_policy_rwsem_read(cpu);
kobj = &data->kobj;
Expand Down

0 comments on commit 820c6ca

Please sign in to comment.