|
@@ -951,10 +951,13 @@ err_out_kobj_put:
|
|
|
static int cpufreq_add_dev(struct sys_device *sys_dev)
|
|
|
{
|
|
|
unsigned int cpu = sys_dev->id;
|
|
|
- int ret = 0;
|
|
|
+ int ret = 0, found = 0;
|
|
|
struct cpufreq_policy *policy;
|
|
|
unsigned long flags;
|
|
|
unsigned int j;
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+ int sibling;
|
|
|
+#endif
|
|
|
|
|
|
if (cpu_is_offline(cpu))
|
|
|
return 0;
|
|
@@ -1001,7 +1004,19 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
|
|
|
INIT_WORK(&policy->update, handle_update);
|
|
|
|
|
|
/* Set governor before ->init, so that driver could check it */
|
|
|
- policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+ for_each_online_cpu(sibling) {
|
|
|
+ struct cpufreq_policy *cp = per_cpu(cpufreq_cpu_data, sibling);
|
|
|
+ if (cp && cp->governor &&
|
|
|
+ (cpumask_test_cpu(cpu, cp->related_cpus))) {
|
|
|
+ policy->governor = cp->governor;
|
|
|
+ found = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ if (!found)
|
|
|
+ policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
|
|
/* call driver. From then on the cpufreq must be able
|
|
|
* to accept all calls to ->verify and ->setpolicy for this CPU
|
|
|
*/
|
|
@@ -1610,9 +1625,22 @@ EXPORT_SYMBOL_GPL(cpufreq_register_governor);
|
|
|
|
|
|
void cpufreq_unregister_governor(struct cpufreq_governor *governor)
|
|
|
{
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+ int cpu;
|
|
|
+#endif
|
|
|
+
|
|
|
if (!governor)
|
|
|
return;
|
|
|
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+ for_each_present_cpu(cpu) {
|
|
|
+ if (cpu_online(cpu))
|
|
|
+ continue;
|
|
|
+ if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
|
|
|
+ strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
mutex_lock(&cpufreq_governor_mutex);
|
|
|
list_del(&governor->governor_list);
|
|
|
mutex_unlock(&cpufreq_governor_mutex);
|