|
@@ -65,66 +65,66 @@ static int cpufreq_userspace_policy_init(struct cpufreq_policy *policy)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
|
|
|
- unsigned int event)
|
|
|
+static void cpufreq_userspace_policy_exit(struct cpufreq_policy *policy)
|
|
|
+{
|
|
|
+ mutex_lock(&userspace_mutex);
|
|
|
+ kfree(policy->governor_data);
|
|
|
+ policy->governor_data = NULL;
|
|
|
+ mutex_unlock(&userspace_mutex);
|
|
|
+}
|
|
|
+
|
|
|
+static int cpufreq_userspace_policy_start(struct cpufreq_policy *policy)
|
|
|
{
|
|
|
unsigned int *setspeed = policy->governor_data;
|
|
|
- unsigned int cpu = policy->cpu;
|
|
|
- int rc = 0;
|
|
|
|
|
|
- if (event == CPUFREQ_GOV_POLICY_INIT)
|
|
|
- return cpufreq_userspace_policy_init(policy);
|
|
|
+ BUG_ON(!policy->cur);
|
|
|
+ pr_debug("started managing cpu %u\n", policy->cpu);
|
|
|
|
|
|
- if (!setspeed)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- switch (event) {
|
|
|
- case CPUFREQ_GOV_POLICY_EXIT:
|
|
|
- mutex_lock(&userspace_mutex);
|
|
|
- policy->governor_data = NULL;
|
|
|
- kfree(setspeed);
|
|
|
- mutex_unlock(&userspace_mutex);
|
|
|
- break;
|
|
|
- case CPUFREQ_GOV_START:
|
|
|
- BUG_ON(!policy->cur);
|
|
|
- pr_debug("started managing cpu %u\n", cpu);
|
|
|
-
|
|
|
- mutex_lock(&userspace_mutex);
|
|
|
- per_cpu(cpu_is_managed, cpu) = 1;
|
|
|
- *setspeed = policy->cur;
|
|
|
- mutex_unlock(&userspace_mutex);
|
|
|
- break;
|
|
|
- case CPUFREQ_GOV_STOP:
|
|
|
- pr_debug("managing cpu %u stopped\n", cpu);
|
|
|
-
|
|
|
- mutex_lock(&userspace_mutex);
|
|
|
- per_cpu(cpu_is_managed, cpu) = 0;
|
|
|
- *setspeed = 0;
|
|
|
- mutex_unlock(&userspace_mutex);
|
|
|
- break;
|
|
|
- case CPUFREQ_GOV_LIMITS:
|
|
|
- mutex_lock(&userspace_mutex);
|
|
|
- pr_debug("limit event for cpu %u: %u - %u kHz, currently %u kHz, last set to %u kHz\n",
|
|
|
- cpu, policy->min, policy->max, policy->cur, *setspeed);
|
|
|
-
|
|
|
- if (policy->max < *setspeed)
|
|
|
- __cpufreq_driver_target(policy, policy->max,
|
|
|
- CPUFREQ_RELATION_H);
|
|
|
- else if (policy->min > *setspeed)
|
|
|
- __cpufreq_driver_target(policy, policy->min,
|
|
|
- CPUFREQ_RELATION_L);
|
|
|
- else
|
|
|
- __cpufreq_driver_target(policy, *setspeed,
|
|
|
- CPUFREQ_RELATION_L);
|
|
|
- mutex_unlock(&userspace_mutex);
|
|
|
- break;
|
|
|
- }
|
|
|
- return rc;
|
|
|
+ mutex_lock(&userspace_mutex);
|
|
|
+ per_cpu(cpu_is_managed, policy->cpu) = 1;
|
|
|
+ *setspeed = policy->cur;
|
|
|
+ mutex_unlock(&userspace_mutex);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void cpufreq_userspace_policy_stop(struct cpufreq_policy *policy)
|
|
|
+{
|
|
|
+ unsigned int *setspeed = policy->governor_data;
|
|
|
+
|
|
|
+ pr_debug("managing cpu %u stopped\n", policy->cpu);
|
|
|
+
|
|
|
+ mutex_lock(&userspace_mutex);
|
|
|
+ per_cpu(cpu_is_managed, policy->cpu) = 0;
|
|
|
+ *setspeed = 0;
|
|
|
+ mutex_unlock(&userspace_mutex);
|
|
|
+}
|
|
|
+
|
|
|
+static void cpufreq_userspace_policy_limits(struct cpufreq_policy *policy)
|
|
|
+{
|
|
|
+ unsigned int *setspeed = policy->governor_data;
|
|
|
+
|
|
|
+ mutex_lock(&userspace_mutex);
|
|
|
+
|
|
|
+ pr_debug("limit event for cpu %u: %u - %u kHz, currently %u kHz, last set to %u kHz\n",
|
|
|
+ policy->cpu, policy->min, policy->max, policy->cur, *setspeed);
|
|
|
+
|
|
|
+ if (policy->max < *setspeed)
|
|
|
+ __cpufreq_driver_target(policy, policy->max, CPUFREQ_RELATION_H);
|
|
|
+ else if (policy->min > *setspeed)
|
|
|
+ __cpufreq_driver_target(policy, policy->min, CPUFREQ_RELATION_L);
|
|
|
+ else
|
|
|
+ __cpufreq_driver_target(policy, *setspeed, CPUFREQ_RELATION_L);
|
|
|
+
|
|
|
+ mutex_unlock(&userspace_mutex);
|
|
|
}
|
|
|
|
|
|
static struct cpufreq_governor cpufreq_gov_userspace = {
|
|
|
.name = "userspace",
|
|
|
- .governor = cpufreq_governor_userspace,
|
|
|
+ .init = cpufreq_userspace_policy_init,
|
|
|
+ .exit = cpufreq_userspace_policy_exit,
|
|
|
+ .start = cpufreq_userspace_policy_start,
|
|
|
+ .stop = cpufreq_userspace_policy_stop,
|
|
|
+ .limits = cpufreq_userspace_policy_limits,
|
|
|
.store_setspeed = cpufreq_set,
|
|
|
.show_setspeed = show_speed,
|
|
|
.owner = THIS_MODULE,
|