Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e3ce74d authored by Amit Pundir's avatar Amit Pundir
Browse files

ANDROID: cpufreq: interactive: build fixes



Refactored cpufreq interactive governor code wrt various upstream
cpufreq API changes in v4.8-rc1.

Use mod_timer and init_timer_pinned_deferrable because
mod_timer_pinned() is deprecated and removed by Upstream commit
177ec0a0 ("timers: Remove the deprecated mod_timer_pinned() API").

Upstream commits 7ab4aabb ("cpufreq: Drop freq-table param to
cpufreq_frequency_table_target()") and d218ed77 ("cpufreq:
Return index from cpufreq_frequency_table_target()"), updated
cpufreq_frequency_table_target function, hence update this function
call accordingly.

CPUFREQ_GOV_POLICY_* events are deprecated and replaced with function
callbacks instead, by upstream commit e788892b ("cpufreq: governor:
Get rid of governor events").

Upstream commit 9a15fb2c ("cpufreq: Drop the 'initialized' field
from struct cpufreq_governor"), dropped governor->initialized field.

cpufreq_frequency_get_table() is dropped by upstream commit
f8bfc116 ("cpufreq: Remove cpufreq_frequency_get_table()"), use
"policy->freq_table" instead.

Signed-off-by: default avatarAmit Pundir <amit.pundir@linaro.org>
parent 67aa2849
Loading
Loading
Loading
Loading
+169 −157
Original line number Diff line number Diff line
@@ -137,12 +137,12 @@ static void cpufreq_interactive_timer_resched(
	pcpu->cputime_speedadj = 0;
	pcpu->cputime_speedadj_timestamp = pcpu->time_in_idle_timestamp;
	expires = jiffies + usecs_to_jiffies(tunables->timer_rate);
	mod_timer_pinned(&pcpu->cpu_timer, expires);
	mod_timer(&pcpu->cpu_timer, expires);

	if (tunables->timer_slack_val >= 0 &&
	    pcpu->target_freq > pcpu->policy->min) {
		expires += usecs_to_jiffies(tunables->timer_slack_val);
		mod_timer_pinned(&pcpu->cpu_slack_timer, expires);
		mod_timer(&pcpu->cpu_slack_timer, expires);
	}

	spin_unlock_irqrestore(&pcpu->load_lock, flags);
@@ -240,10 +240,9 @@ static unsigned int choose_freq(struct cpufreq_interactive_cpuinfo *pcpu,
		 * than or equal to the target load.
		 */

		if (cpufreq_frequency_table_target(
			    pcpu->policy, pcpu->freq_table, loadadjfreq / tl,
			    CPUFREQ_RELATION_L, &index))
			break;
		index = cpufreq_frequency_table_target(
			    pcpu->policy, loadadjfreq / tl,
			    CPUFREQ_RELATION_L);
		freq = pcpu->freq_table[index].frequency;

		if (freq > prevfreq) {
@@ -255,11 +254,9 @@ static unsigned int choose_freq(struct cpufreq_interactive_cpuinfo *pcpu,
				 * Find the highest frequency that is less
				 * than freqmax.
				 */
				if (cpufreq_frequency_table_target(
					    pcpu->policy, pcpu->freq_table,
					    freqmax - 1, CPUFREQ_RELATION_H,
					    &index))
					break;
				index = cpufreq_frequency_table_target(
					    pcpu->policy,
					    freqmax - 1, CPUFREQ_RELATION_H);
				freq = pcpu->freq_table[index].frequency;

				if (freq == freqmin) {
@@ -282,11 +279,9 @@ static unsigned int choose_freq(struct cpufreq_interactive_cpuinfo *pcpu,
				 * Find the lowest frequency that is higher
				 * than freqmin.
				 */
				if (cpufreq_frequency_table_target(
					    pcpu->policy, pcpu->freq_table,
					    freqmin + 1, CPUFREQ_RELATION_L,
					    &index))
					break;
				index = cpufreq_frequency_table_target(
					    pcpu->policy,
					    freqmin + 1, CPUFREQ_RELATION_L);
				freq = pcpu->freq_table[index].frequency;

				/*
@@ -397,13 +392,8 @@ static void cpufreq_interactive_timer(unsigned long data)

	pcpu->loc_hispeed_val_time = now;

	if (cpufreq_frequency_table_target(pcpu->policy, pcpu->freq_table,
					   new_freq, CPUFREQ_RELATION_L,
					   &index)) {
		spin_unlock_irqrestore(&pcpu->target_freq_lock, flags);
		goto rearm;
	}

	index = cpufreq_frequency_table_target(pcpu->policy,
					   new_freq, CPUFREQ_RELATION_L);
	new_freq = pcpu->freq_table[index].frequency;

	/*
@@ -1133,25 +1123,16 @@ static struct notifier_block cpufreq_interactive_idle_nb = {
	.notifier_call = cpufreq_interactive_idle_notifier,
};

static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
		unsigned int event)
static int cpufreq_governor_interactive_init(struct cpufreq_policy *policy)
{
	int rc;
	unsigned int j;
	struct cpufreq_interactive_cpuinfo *pcpu;
	struct cpufreq_frequency_table *freq_table;
	struct cpufreq_interactive_tunables *tunables;
	unsigned long flags;

	if (have_governor_per_policy())
		tunables = policy->governor_data;
	else
		tunables = common_tunables;

	WARN_ON(!tunables && (event != CPUFREQ_GOV_POLICY_INIT));

	switch (event) {
	case CPUFREQ_GOV_POLICY_INIT:
	if (have_governor_per_policy()) {
		WARN_ON(tunables);
	} else if (tunables) {
@@ -1197,21 +1178,28 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
		return rc;
	}

		if (!policy->governor->initialized) {
	idle_notifier_register(&cpufreq_interactive_idle_nb);
	cpufreq_register_notifier(&cpufreq_notifier_block,
			CPUFREQ_TRANSITION_NOTIFIER);

	return 0;
}

		break;
static void cpufreq_governor_interactive_exit(struct cpufreq_policy *policy)
{
	struct cpufreq_interactive_tunables *tunables;

	if (have_governor_per_policy())
		tunables = policy->governor_data;
	else
		tunables = common_tunables;

	WARN_ON(!tunables);

	case CPUFREQ_GOV_POLICY_EXIT:
	if (!--tunables->usage_count) {
			if (policy->governor->initialized == 1) {
		cpufreq_unregister_notifier(&cpufreq_notifier_block,
				CPUFREQ_TRANSITION_NOTIFIER);
		idle_notifier_unregister(&cpufreq_interactive_idle_nb);
			}

		sysfs_remove_group(get_governor_parent_kobj(policy),
				get_sysfs_attr());
@@ -1221,12 +1209,25 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
	}

	policy->governor_data = NULL;
		break;
}

static int cpufreq_governor_interactive_start(struct cpufreq_policy *policy)
{
	unsigned int j;
	struct cpufreq_interactive_cpuinfo *pcpu;
	struct cpufreq_frequency_table *freq_table;
	struct cpufreq_interactive_tunables *tunables;

	if (have_governor_per_policy())
		tunables = policy->governor_data;
	else
		tunables = common_tunables;

	WARN_ON(!tunables);

	case CPUFREQ_GOV_START:
	mutex_lock(&gov_lock);

		freq_table = cpufreq_frequency_get_table(policy->cpu);
	freq_table = policy->freq_table;
	if (!tunables->hispeed_freq)
		tunables->hispeed_freq = policy->max;

@@ -1250,9 +1251,14 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
	}

	mutex_unlock(&gov_lock);
		break;
	return 0;
}

static void cpufreq_governor_interactive_stop(struct cpufreq_policy *policy)
{
	unsigned int j;
	struct cpufreq_interactive_cpuinfo *pcpu;

	case CPUFREQ_GOV_STOP:
	mutex_lock(&gov_lock);
	for_each_cpu(j, policy->cpus) {
		pcpu = &per_cpu(cpuinfo, j);
@@ -1264,9 +1270,14 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
	}

	mutex_unlock(&gov_lock);
		break;
}

static void cpufreq_governor_interactive_limits(struct cpufreq_policy *policy)
{
	unsigned int j;
	struct cpufreq_interactive_cpuinfo *pcpu;
	unsigned long flags;

	case CPUFREQ_GOV_LIMITS:
	if (policy->max < policy->cur)
		__cpufreq_driver_target(policy,
				policy->max, CPUFREQ_RELATION_H);
@@ -1291,14 +1302,15 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
		spin_unlock_irqrestore(&pcpu->target_freq_lock, flags);
		up_read(&pcpu->enable_sem);
	}
		break;
	}
	return 0;
}

static struct cpufreq_governor cpufreq_gov_interactive = {
	.name = "interactive",
	.governor = cpufreq_governor_interactive,
	.init = cpufreq_governor_interactive_init,
	.exit = cpufreq_governor_interactive_exit,
	.start = cpufreq_governor_interactive_start,
	.stop = cpufreq_governor_interactive_stop,
	.limits = cpufreq_governor_interactive_limits,
	.max_transition_latency = 10000000,
	.owner = THIS_MODULE,
};
@@ -1316,7 +1328,7 @@ static int __init cpufreq_interactive_init(void)
	/* Initalize per-cpu timers */
	for_each_possible_cpu(i) {
		pcpu = &per_cpu(cpuinfo, i);
		init_timer_deferrable(&pcpu->cpu_timer);
		init_timer_pinned_deferrable(&pcpu->cpu_timer);
		pcpu->cpu_timer.function = cpufreq_interactive_timer;
		pcpu->cpu_timer.data = i;
		init_timer(&pcpu->cpu_slack_timer);