OSDN Git Service

cpufreq: Introduce new relation for freq selection
authorStratos Karafotis <stratosk@semaphore.gr>
Mon, 30 Jun 2014 16:59:33 +0000 (19:59 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 21 Jul 2014 11:43:19 +0000 (13:43 +0200)
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 <stratosk@semaphore.gr>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/freq_table.c
include/linux/cpufreq.h

index 1632981..df14766 100644 (file)
@@ -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) {
index 8f8ae95..7d1955a 100644 (file)
@@ -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;