Introduce CPUFREQ_RELATION_C for frequency selection.
It selects the frequency with the minimum euclidean distance to target.
In case of equal distance between 2 frequencies, it will select the
greater frequency.

Signed-off-by: Stratos Karafotis <[email protected]>
---
 drivers/cpufreq/freq_table.c | 12 +++++++++++-
 include/linux/cpufreq.h      |  1 +
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index 1632981..df14766 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -117,7 +117,7 @@ int cpufreq_frequency_table_target(struct cpufreq_policy 
*policy,
                .frequency = 0,
        };
        struct cpufreq_frequency_table *pos;
-       unsigned int freq, i = 0;
+       unsigned int freq, diff, i = 0;
 
        pr_debug("request for target %u kHz (relation: %u) for cpu %u\n",
                                        target_freq, relation, policy->cpu);
@@ -127,6 +127,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;
        }
@@ -168,6 +169,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.driver_data].frequency)) {
+                               optimal.frequency = diff;
+                               optimal.driver_data = i;
+                       }
+                       break;
                }
        }
        if (optimal.driver_data > i) {
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index ec4112d..00fad91 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -176,6 +176,7 @@ static inline void disable_cpufreq(void) { }
 
 #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 {
        struct attribute attr;
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to