| From 146b625d1e94f4a2a7c3956a524d6eecb87c43ef Mon Sep 17 00:00:00 2001 |
| From: Stratos Karafotis <stratosk@semaphore.gr> |
| Date: Fri, 25 Apr 2014 23:15:23 +0300 |
| Subject: cpufreq: Introduce macros for cpufreq_frequency_table iteration |
| |
| Many cpufreq drivers need to iterate over the cpufreq_frequency_table |
| for various tasks. |
| |
| This patch introduces two macros which can be used for iteration over |
| cpufreq_frequency_table keeping a common coding style across drivers: |
| |
| - cpufreq_for_each_entry: iterate over each entry of the table |
| - cpufreq_for_each_valid_entry: iterate over each entry that contains |
| a valid frequency. |
| |
| It should have no functional changes. |
| |
| Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr> |
| Acked-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| (cherry picked from commit 27e289dce29764e488c1e13e9aa6950cad1f4aab) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| Documentation/cpu-freq/cpu-drivers.txt | 19 +++++++++++++++++++ |
| drivers/cpufreq/cpufreq.c | 11 +++++++++++ |
| include/linux/cpufreq.h | 21 +++++++++++++++++++++ |
| 3 files changed, 51 insertions(+) |
| |
| diff --git a/Documentation/cpu-freq/cpu-drivers.txt b/Documentation/cpu-freq/cpu-drivers.txt |
| index 8b1a4451422e..d3cb4d3d9bb2 100644 |
| --- a/Documentation/cpu-freq/cpu-drivers.txt |
| +++ b/Documentation/cpu-freq/cpu-drivers.txt |
| @@ -222,3 +222,22 @@ is the corresponding frequency table helper for the ->target |
| stage. Just pass the values to this function, and the unsigned int |
| index returns the number of the frequency table entry which contains |
| the frequency the CPU shall be set to. |
| + |
| +The following macros can be used as iterators over cpufreq_frequency_table: |
| + |
| +cpufreq_for_each_entry(pos, table) - iterates over all entries of frequency |
| +table. |
| + |
| +cpufreq-for_each_valid_entry(pos, table) - iterates over all entries, |
| +excluding CPUFREQ_ENTRY_INVALID frequencies. |
| +Use arguments "pos" - a cpufreq_frequency_table * as a loop cursor and |
| +"table" - the cpufreq_frequency_table * you want to iterate over. |
| + |
| +For example: |
| + |
| + struct cpufreq_frequency_table *pos, *driver_freq_table; |
| + |
| + cpufreq_for_each_entry(pos, driver_freq_table) { |
| + /* Do something with pos */ |
| + pos->frequency = ... |
| + } |
| diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c |
| index dc1447dc173e..e9ab2efcc37f 100644 |
| --- a/drivers/cpufreq/cpufreq.c |
| +++ b/drivers/cpufreq/cpufreq.c |
| @@ -230,6 +230,17 @@ void cpufreq_cpu_put(struct cpufreq_policy *policy) |
| } |
| EXPORT_SYMBOL_GPL(cpufreq_cpu_put); |
| |
| +bool cpufreq_next_valid(struct cpufreq_frequency_table **pos) |
| +{ |
| + while ((*pos)->frequency != CPUFREQ_TABLE_END) |
| + if ((*pos)->frequency != CPUFREQ_ENTRY_INVALID) |
| + return true; |
| + else |
| + (*pos)++; |
| + return false; |
| +} |
| +EXPORT_SYMBOL_GPL(cpufreq_next_valid); |
| + |
| /********************************************************************* |
| * EXTERNALLY AFFECTING FREQUENCY CHANGES * |
| *********************************************************************/ |
| diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h |
| index 945313ca4bbf..e8d7b6b7e3b7 100644 |
| --- a/include/linux/cpufreq.h |
| +++ b/include/linux/cpufreq.h |
| @@ -446,6 +446,27 @@ struct cpufreq_frequency_table { |
| * order */ |
| }; |
| |
| +bool cpufreq_next_valid(struct cpufreq_frequency_table **pos); |
| + |
| +/* |
| + * cpufreq_for_each_entry - iterate over a cpufreq_frequency_table |
| + * @pos: the cpufreq_frequency_table * to use as a loop cursor. |
| + * @table: the cpufreq_frequency_table * to iterate over. |
| + */ |
| + |
| +#define cpufreq_for_each_entry(pos, table) \ |
| + for (pos = table; pos->frequency != CPUFREQ_TABLE_END; pos++) |
| + |
| +/* |
| + * cpufreq_for_each_valid_entry - iterate over a cpufreq_frequency_table |
| + * excluding CPUFREQ_ENTRY_INVALID frequencies. |
| + * @pos: the cpufreq_frequency_table * to use as a loop cursor. |
| + * @table: the cpufreq_frequency_table * to iterate over. |
| + */ |
| + |
| +#define cpufreq_for_each_valid_entry(pos, table) \ |
| + for (pos = table; cpufreq_next_valid(&pos); pos++) |
| + |
| int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, |
| struct cpufreq_frequency_table *table); |
| |
| -- |
| 2.1.2 |
| |