From c8354165416bf37e3ad6ab96ecddf0d5caaf9fcd Mon Sep 17 00:00:00 2001 From: mythos234 <stefan@st-t.de> Date: Tue, 22 Mar 2016 18:09:47 +0000 Subject: [PATCH] Introduce CPUFREQ_RELATION_C It selects the frequency with the minimum euclidean distance to target. In case of equal distance between 2 frequencies, it will select the greater freq. Created by Stratos Karafotis <stratosk@semaphore.gr> Original commit: https://github.com/XileForce/Vindicator-S6/commit/4b113d38e8f62ea5810d2b4d134cc6f7a81198dd --- drivers/cpufreq/freq_table.c | 13 ++++++++++++- include/linux/cpufreq.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c index d7a79662e24..0e769006ef8 100644 --- a/drivers/cpufreq/freq_table.c +++ b/drivers/cpufreq/freq_table.c @@ -104,7 +104,8 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy, .index = ~0, .frequency = 0, }; - unsigned int i; + unsigned int i, diff; + pr_debug("request for target %u kHz (relation: %u) for cpu %u\n", target_freq, relation, policy->cpu); @@ -114,6 +115,7 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy, suboptimal.frequency = ~0; break; case CPUFREQ_RELATION_L: + case CPUFREQ_RELATION_C: optimal.frequency = ~0; break; } @@ -151,6 +153,15 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy, } } break; + case CPUFREQ_RELATION_C: + diff = abs(freq - target_freq); + if (diff < optimal.frequency || + (diff == optimal.frequency && + freq > table[optimal.index].frequency)) { + optimal.frequency = diff; + optimal.index = i; + } + break; } } if (optimal.index > i) { diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 280453ea15b..030a45efbac 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -228,6 +228,7 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor); #define CPUFREQ_RELATION_L 0 /* lowest frequency at or above target */ #define CPUFREQ_RELATION_H 1 /* highest frequency below or at target */ +#define CPUFREQ_RELATION_C 2 /* closest frequency to target */ struct freq_attr; -- 2.20.1