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