|
@@ -3,6 +3,7 @@
|
|
|
*
|
|
|
* Copyright (C) 2001 Russell King
|
|
|
* (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
|
|
|
+ * (C) 2013 Viresh Kumar <viresh.kumar@linaro.org>
|
|
|
*
|
|
|
* Oct 2005 - Ashok Raj <ashok.raj@intel.com>
|
|
|
* Added handling for CPU hotplug
|
|
@@ -12,7 +13,6 @@
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
|
* published by the Free Software Foundation.
|
|
|
- *
|
|
|
*/
|
|
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
@@ -44,12 +44,13 @@
|
|
|
*/
|
|
|
static struct cpufreq_driver *cpufreq_driver;
|
|
|
static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
|
|
|
+static DEFINE_RWLOCK(cpufreq_driver_lock);
|
|
|
+static DEFINE_MUTEX(cpufreq_governor_lock);
|
|
|
+
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
/* This one keeps track of the previously set governor of a removed CPU */
|
|
|
static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
|
|
|
#endif
|
|
|
-static DEFINE_RWLOCK(cpufreq_driver_lock);
|
|
|
-static DEFINE_MUTEX(cpufreq_governor_lock);
|
|
|
|
|
|
/*
|
|
|
* cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
|
|
@@ -199,7 +200,6 @@ static struct cpufreq_policy *__cpufreq_cpu_get(unsigned int cpu, bool sysfs)
|
|
|
if (!try_module_get(cpufreq_driver->owner))
|
|
|
goto err_out_unlock;
|
|
|
|
|
|
-
|
|
|
/* get the CPU */
|
|
|
data = per_cpu(cpufreq_cpu_data, cpu);
|
|
|
|
|
@@ -269,7 +269,7 @@ static void cpufreq_cpu_put_sysfs(struct cpufreq_policy *data)
|
|
|
*/
|
|
|
#ifndef CONFIG_SMP
|
|
|
static unsigned long l_p_j_ref;
|
|
|
-static unsigned int l_p_j_ref_freq;
|
|
|
+static unsigned int l_p_j_ref_freq;
|
|
|
|
|
|
static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
|
|
|
{
|
|
@@ -282,7 +282,7 @@ static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
|
|
|
pr_debug("saving %lu as reference value for loops_per_jiffy; "
|
|
|
"freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
|
|
|
}
|
|
|
- if ((val == CPUFREQ_POSTCHANGE && ci->old != ci->new) ||
|
|
|
+ if ((val == CPUFREQ_POSTCHANGE && ci->old != ci->new) ||
|
|
|
(val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
|
|
|
loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
|
|
|
ci->new);
|
|
@@ -297,7 +297,6 @@ static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
void __cpufreq_notify_transition(struct cpufreq_policy *policy,
|
|
|
struct cpufreq_freqs *freqs, unsigned int state)
|
|
|
{
|
|
@@ -343,6 +342,7 @@ void __cpufreq_notify_transition(struct cpufreq_policy *policy,
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* cpufreq_notify_transition - call notifier chain and adjust_jiffies
|
|
|
* on frequency transition.
|
|
@@ -360,7 +360,6 @@ void cpufreq_notify_transition(struct cpufreq_policy *policy,
|
|
|
EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
|
|
|
|
|
|
|
|
|
-
|
|
|
/*********************************************************************
|
|
|
* SYSFS INTERFACE *
|
|
|
*********************************************************************/
|
|
@@ -425,7 +424,6 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* cpufreq_per_cpu_attr_read() / show_##file_name() -
|
|
|
* print out cpufreq information
|
|
@@ -490,7 +488,6 @@ static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
|
|
|
return sprintf(buf, "%u\n", cur_freq);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* show_scaling_governor - show the current policy for the specified CPU
|
|
|
*/
|
|
@@ -506,7 +503,6 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* store_scaling_governor - store policy for the specified CPU
|
|
|
*/
|
|
@@ -529,8 +525,10 @@ static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
|
|
|
&new_policy.governor))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- /* Do not use cpufreq_set_policy here or the user_policy.max
|
|
|
- will be wrongly overridden */
|
|
|
+ /*
|
|
|
+ * Do not use cpufreq_set_policy here or the user_policy.max
|
|
|
+ * will be wrongly overridden
|
|
|
+ */
|
|
|
ret = __cpufreq_set_policy(policy, &new_policy);
|
|
|
|
|
|
policy->user_policy.policy = policy->policy;
|
|
@@ -1094,7 +1092,8 @@ static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
|
|
|
* Caller should already have policy_rwsem in write mode for this CPU.
|
|
|
* This routine frees the rwsem before returning.
|
|
|
*/
|
|
|
-static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
|
|
|
+static int __cpufreq_remove_dev(struct device *dev,
|
|
|
+ struct subsys_interface *sif)
|
|
|
{
|
|
|
unsigned int cpu = dev->id, ret, cpus;
|
|
|
unsigned long flags;
|
|
@@ -1201,7 +1200,6 @@ static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
|
|
|
{
|
|
|
unsigned int cpu = dev->id;
|
|
@@ -1214,7 +1212,6 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static void handle_update(struct work_struct *work)
|
|
|
{
|
|
|
struct cpufreq_policy *policy =
|
|
@@ -1225,7 +1222,8 @@ static void handle_update(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're in deep trouble.
|
|
|
+ * cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're
|
|
|
+ * in deep trouble.
|
|
|
* @cpu: cpu number
|
|
|
* @old_freq: CPU frequency the kernel thinks the CPU runs at
|
|
|
* @new_freq: CPU frequency the CPU actually runs at
|
|
@@ -1240,7 +1238,6 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
|
|
|
struct cpufreq_freqs freqs;
|
|
|
unsigned long flags;
|
|
|
|
|
|
-
|
|
|
pr_debug("Warning: CPU frequency out of sync: cpufreq and timing "
|
|
|
"core thinks of %u, is %u kHz.\n", old_freq, new_freq);
|
|
|
|
|
@@ -1255,7 +1252,6 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
|
|
|
cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
|
|
|
* @cpu: CPU number
|
|
@@ -1301,7 +1297,6 @@ unsigned int cpufreq_quick_get_max(unsigned int cpu)
|
|
|
}
|
|
|
EXPORT_SYMBOL(cpufreq_quick_get_max);
|
|
|
|
|
|
-
|
|
|
static unsigned int __cpufreq_get(unsigned int cpu)
|
|
|
{
|
|
|
struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
|
|
@@ -1360,7 +1355,6 @@ static struct subsys_interface cpufreq_interface = {
|
|
|
.remove_dev = cpufreq_remove_dev,
|
|
|
};
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* cpufreq_bp_suspend - Prepare the boot CPU for system suspend.
|
|
|
*
|
|
@@ -1497,11 +1491,10 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
|
|
|
}
|
|
|
EXPORT_SYMBOL(cpufreq_register_notifier);
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* cpufreq_unregister_notifier - unregister a driver with cpufreq
|
|
|
* @nb: notifier block to be unregistered
|
|
|
- * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
|
|
|
+ * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
|
|
|
*
|
|
|
* Remove a driver from the CPU frequency notifier list.
|
|
|
*
|
|
@@ -1537,7 +1530,6 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier);
|
|
|
* GOVERNORS *
|
|
|
*********************************************************************/
|
|
|
|
|
|
-
|
|
|
int __cpufreq_driver_target(struct cpufreq_policy *policy,
|
|
|
unsigned int target_freq,
|
|
|
unsigned int relation)
|
|
@@ -1678,7 +1670,6 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
int cpufreq_register_governor(struct cpufreq_governor *governor)
|
|
|
{
|
|
|
int err;
|
|
@@ -1703,7 +1694,6 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(cpufreq_register_governor);
|
|
|
|
|
|
-
|
|
|
void cpufreq_unregister_governor(struct cpufreq_governor *governor)
|
|
|
{
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
@@ -1733,7 +1723,6 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor)
|
|
|
EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
|
|
|
|
|
|
|
|
|
-
|
|
|
/*********************************************************************
|
|
|
* POLICY INTERFACE *
|
|
|
*********************************************************************/
|
|
@@ -1762,7 +1751,6 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
|
|
|
}
|
|
|
EXPORT_SYMBOL(cpufreq_get_policy);
|
|
|
|
|
|
-
|
|
|
/*
|
|
|
* data : current policy.
|
|
|
* policy : policy to be set.
|
|
@@ -1796,8 +1784,10 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data,
|
|
|
blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
|
|
|
CPUFREQ_INCOMPATIBLE, policy);
|
|
|
|
|
|
- /* verify the cpu speed can be set within this limit,
|
|
|
- which might be different to the first one */
|
|
|
+ /*
|
|
|
+ * verify the cpu speed can be set within this limit, which might be
|
|
|
+ * different to the first one
|
|
|
+ */
|
|
|
ret = cpufreq_driver->verify(policy);
|
|
|
if (ret)
|
|
|
goto error_out;
|
|
@@ -1899,8 +1889,10 @@ int cpufreq_update_policy(unsigned int cpu)
|
|
|
policy.policy = data->user_policy.policy;
|
|
|
policy.governor = data->user_policy.governor;
|
|
|
|
|
|
- /* BIOS might change freq behind our back
|
|
|
- -> ask driver for current freq and notify governors about a change */
|
|
|
+ /*
|
|
|
+ * BIOS might change freq behind our back
|
|
|
+ * -> ask driver for current freq and notify governors about a change
|
|
|
+ */
|
|
|
if (cpufreq_driver->get) {
|
|
|
policy.cur = cpufreq_driver->get(cpu);
|
|
|
if (!data->cur) {
|
|
@@ -1949,7 +1941,7 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
|
|
|
}
|
|
|
|
|
|
static struct notifier_block __refdata cpufreq_cpu_notifier = {
|
|
|
- .notifier_call = cpufreq_cpu_callback,
|
|
|
+ .notifier_call = cpufreq_cpu_callback,
|
|
|
};
|
|
|
|
|
|
/*********************************************************************
|
|
@@ -1961,7 +1953,7 @@ static struct notifier_block __refdata cpufreq_cpu_notifier = {
|
|
|
* @driver_data: A struct cpufreq_driver containing the values#
|
|
|
* submitted by the CPU Frequency driver.
|
|
|
*
|
|
|
- * Registers a CPU Frequency driver to this core code. This code
|
|
|
+ * Registers a CPU Frequency driver to this core code. This code
|
|
|
* returns zero on success, -EBUSY when another driver got here first
|
|
|
* (and isn't unregistered in the meantime).
|
|
|
*
|
|
@@ -2028,11 +2020,10 @@ err_null_driver:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(cpufreq_register_driver);
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* cpufreq_unregister_driver - unregister the current CPUFreq driver
|
|
|
*
|
|
|
- * Unregister the current CPUFreq driver. Only call this if you have
|
|
|
+ * Unregister the current CPUFreq driver. Only call this if you have
|
|
|
* the right to do so, i.e. if you have succeeded in initialising before!
|
|
|
* Returns zero if successful, and -EINVAL if the cpufreq_driver is
|
|
|
* currently not initialised.
|