diff options
| author | Dominik Brodowski <linux@dominikbrodowski.net> | 2018-01-30 00:42:37 -0500 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-02-08 04:21:39 -0500 |
| commit | ffd81dcfef85a33729f90e4acd2f61a68e56b993 (patch) | |
| tree | 4160debd7778d436e027edf810e438266953dc11 | |
| parent | 70f6bf2a3b7e40c3f802b0ea837762a8bc6c1430 (diff) | |
cpufreq: Add and use cpufreq_for_each_{valid_,}entry_idx()
Pointer subtraction is slow and tedious. Therefore, replace all instances
where cpufreq_for_each_{valid_,}entry loops contained such substractions
with an iteration macro providing an index to the frequency_table entry.
Suggested-by: Al Viro <viro@ZenIV.linux.org.uk>
Link: http://lkml.kernel.org/r/20180120020237.GM13338@ZenIV.linux.org.uk
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
| -rw-r--r-- | Documentation/cpu-freq/cpu-drivers.txt | 4 | ||||
| -rw-r--r-- | drivers/cpufreq/exynos5440-cpufreq.c | 7 | ||||
| -rw-r--r-- | drivers/cpufreq/freq_table.c | 8 | ||||
| -rw-r--r-- | drivers/cpufreq/longhaul.c | 4 | ||||
| -rw-r--r-- | drivers/cpufreq/pasemi-cpufreq.c | 6 | ||||
| -rw-r--r-- | drivers/sh/clk/core.c | 5 | ||||
| -rw-r--r-- | drivers/staging/irda/drivers/sh_sir.c | 4 | ||||
| -rw-r--r-- | include/linux/cpufreq.h | 125 |
8 files changed, 100 insertions, 63 deletions
diff --git a/Documentation/cpu-freq/cpu-drivers.txt b/Documentation/cpu-freq/cpu-drivers.txt index 434c49cc7330..61546ac578d6 100644 --- a/Documentation/cpu-freq/cpu-drivers.txt +++ b/Documentation/cpu-freq/cpu-drivers.txt | |||
| @@ -291,3 +291,7 @@ For example: | |||
| 291 | /* Do something with pos */ | 291 | /* Do something with pos */ |
| 292 | pos->frequency = ... | 292 | pos->frequency = ... |
| 293 | } | 293 | } |
| 294 | |||
| 295 | If you need to work with the position of pos within driver_freq_table, | ||
| 296 | do not subtract the pointers, as it is quite costly. Instead, use the | ||
| 297 | macros cpufreq_for_each_entry_idx() and cpufreq_for_each_valid_entry_idx(). | ||
diff --git a/drivers/cpufreq/exynos5440-cpufreq.c b/drivers/cpufreq/exynos5440-cpufreq.c index b6b369c22272..932caa386ece 100644 --- a/drivers/cpufreq/exynos5440-cpufreq.c +++ b/drivers/cpufreq/exynos5440-cpufreq.c | |||
| @@ -115,10 +115,10 @@ static struct cpufreq_freqs freqs; | |||
| 115 | static int init_div_table(void) | 115 | static int init_div_table(void) |
| 116 | { | 116 | { |
| 117 | struct cpufreq_frequency_table *pos, *freq_tbl = dvfs_info->freq_table; | 117 | struct cpufreq_frequency_table *pos, *freq_tbl = dvfs_info->freq_table; |
| 118 | unsigned int tmp, clk_div, ema_div, freq, volt_id; | 118 | unsigned int tmp, clk_div, ema_div, freq, volt_id, idx; |
| 119 | struct dev_pm_opp *opp; | 119 | struct dev_pm_opp *opp; |
| 120 | 120 | ||
| 121 | cpufreq_for_each_entry(pos, freq_tbl) { | 121 | cpufreq_for_each_entry_idx(pos, freq_tbl, idx) { |
| 122 | opp = dev_pm_opp_find_freq_exact(dvfs_info->dev, | 122 | opp = dev_pm_opp_find_freq_exact(dvfs_info->dev, |
| 123 | pos->frequency * 1000, true); | 123 | pos->frequency * 1000, true); |
| 124 | if (IS_ERR(opp)) { | 124 | if (IS_ERR(opp)) { |
| @@ -154,8 +154,7 @@ static int init_div_table(void) | |||
| 154 | tmp = (clk_div | ema_div | (volt_id << P0_7_VDD_SHIFT) | 154 | tmp = (clk_div | ema_div | (volt_id << P0_7_VDD_SHIFT) |
| 155 | | ((freq / FREQ_UNIT) << P0_7_FREQ_SHIFT)); | 155 | | ((freq / FREQ_UNIT) << P0_7_FREQ_SHIFT)); |
| 156 | 156 | ||
| 157 | __raw_writel(tmp, dvfs_info->base + XMU_PMU_P0_7 + 4 * | 157 | __raw_writel(tmp, dvfs_info->base + XMU_PMU_P0_7 + 4 * idx); |
| 158 | (pos - freq_tbl)); | ||
| 159 | dev_pm_opp_put(opp); | 158 | dev_pm_opp_put(opp); |
| 160 | } | 159 | } |
| 161 | 160 | ||
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c index 3bbbf9e6960c..6d007f824ca7 100644 --- a/drivers/cpufreq/freq_table.c +++ b/drivers/cpufreq/freq_table.c | |||
| @@ -143,10 +143,9 @@ int cpufreq_table_index_unsorted(struct cpufreq_policy *policy, | |||
| 143 | break; | 143 | break; |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | cpufreq_for_each_valid_entry(pos, table) { | 146 | cpufreq_for_each_valid_entry_idx(pos, table, i) { |
| 147 | freq = pos->frequency; | 147 | freq = pos->frequency; |
| 148 | 148 | ||
| 149 | i = pos - table; | ||
| 150 | if ((freq < policy->min) || (freq > policy->max)) | 149 | if ((freq < policy->min) || (freq > policy->max)) |
| 151 | continue; | 150 | continue; |
| 152 | if (freq == target_freq) { | 151 | if (freq == target_freq) { |
| @@ -211,15 +210,16 @@ int cpufreq_frequency_table_get_index(struct cpufreq_policy *policy, | |||
| 211 | unsigned int freq) | 210 | unsigned int freq) |
| 212 | { | 211 | { |
| 213 | struct cpufreq_frequency_table *pos, *table = policy->freq_table; | 212 | struct cpufreq_frequency_table *pos, *table = policy->freq_table; |
| 213 | int idx; | ||
| 214 | 214 | ||
| 215 | if (unlikely(!table)) { | 215 | if (unlikely(!table)) { |
| 216 | pr_debug("%s: Unable to find frequency table\n", __func__); | 216 | pr_debug("%s: Unable to find frequency table\n", __func__); |
| 217 | return -ENOENT; | 217 | return -ENOENT; |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | cpufreq_for_each_valid_entry(pos, table) | 220 | cpufreq_for_each_valid_entry_idx(pos, table, idx) |
| 221 | if (pos->frequency == freq) | 221 | if (pos->frequency == freq) |
| 222 | return pos - table; | 222 | return idx; |
| 223 | 223 | ||
| 224 | return -EINVAL; | 224 | return -EINVAL; |
| 225 | } | 225 | } |
diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c index 5faa37c5b091..942632a27b50 100644 --- a/drivers/cpufreq/longhaul.c +++ b/drivers/cpufreq/longhaul.c | |||
| @@ -600,7 +600,7 @@ static void longhaul_setup_voltagescaling(void) | |||
| 600 | /* Calculate kHz for one voltage step */ | 600 | /* Calculate kHz for one voltage step */ |
| 601 | kHz_step = (highest_speed - min_vid_speed) / numvscales; | 601 | kHz_step = (highest_speed - min_vid_speed) / numvscales; |
| 602 | 602 | ||
| 603 | cpufreq_for_each_entry(freq_pos, longhaul_table) { | 603 | cpufreq_for_each_entry_idx(freq_pos, longhaul_table, j) { |
| 604 | speed = freq_pos->frequency; | 604 | speed = freq_pos->frequency; |
| 605 | if (speed > min_vid_speed) | 605 | if (speed > min_vid_speed) |
| 606 | pos = (speed - min_vid_speed) / kHz_step + minvid.pos; | 606 | pos = (speed - min_vid_speed) / kHz_step + minvid.pos; |
| @@ -609,7 +609,7 @@ static void longhaul_setup_voltagescaling(void) | |||
| 609 | freq_pos->driver_data |= mV_vrm_table[pos] << 8; | 609 | freq_pos->driver_data |= mV_vrm_table[pos] << 8; |
| 610 | vid = vrm_mV_table[mV_vrm_table[pos]]; | 610 | vid = vrm_mV_table[mV_vrm_table[pos]]; |
| 611 | pr_info("f: %d kHz, index: %d, vid: %d mV\n", | 611 | pr_info("f: %d kHz, index: %d, vid: %d mV\n", |
| 612 | speed, (int)(freq_pos - longhaul_table), vid.mV); | 612 | speed, j, vid.mV); |
| 613 | } | 613 | } |
| 614 | 614 | ||
| 615 | can_scale_voltage = 1; | 615 | can_scale_voltage = 1; |
diff --git a/drivers/cpufreq/pasemi-cpufreq.c b/drivers/cpufreq/pasemi-cpufreq.c index b257fc7d5204..75dfbd2a58ea 100644 --- a/drivers/cpufreq/pasemi-cpufreq.c +++ b/drivers/cpufreq/pasemi-cpufreq.c | |||
| @@ -139,7 +139,7 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 139 | struct cpufreq_frequency_table *pos; | 139 | struct cpufreq_frequency_table *pos; |
| 140 | const u32 *max_freqp; | 140 | const u32 *max_freqp; |
| 141 | u32 max_freq; | 141 | u32 max_freq; |
| 142 | int cur_astate; | 142 | int cur_astate, idx; |
| 143 | struct resource res; | 143 | struct resource res; |
| 144 | struct device_node *cpu, *dn; | 144 | struct device_node *cpu, *dn; |
| 145 | int err = -ENODEV; | 145 | int err = -ENODEV; |
| @@ -198,9 +198,9 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 198 | pr_debug("initializing frequency table\n"); | 198 | pr_debug("initializing frequency table\n"); |
| 199 | 199 | ||
| 200 | /* initialize frequency table */ | 200 | /* initialize frequency table */ |
| 201 | cpufreq_for_each_entry(pos, pas_freqs) { | 201 | cpufreq_for_each_entry_idx(pos, pas_freqs, idx) { |
| 202 | pos->frequency = get_astate_freq(pos->driver_data) * 100000; | 202 | pos->frequency = get_astate_freq(pos->driver_data) * 100000; |
| 203 | pr_debug("%d: %d\n", (int)(pos - pas_freqs), pos->frequency); | 203 | pr_debug("%d: %d\n", idx, pos->frequency); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | cur_astate = get_cur_astate(policy->cpu); | 206 | cur_astate = get_cur_astate(policy->cpu); |
diff --git a/drivers/sh/clk/core.c b/drivers/sh/clk/core.c index 92863e3818e5..9475353f49d6 100644 --- a/drivers/sh/clk/core.c +++ b/drivers/sh/clk/core.c | |||
| @@ -197,10 +197,11 @@ int clk_rate_table_find(struct clk *clk, | |||
| 197 | unsigned long rate) | 197 | unsigned long rate) |
| 198 | { | 198 | { |
| 199 | struct cpufreq_frequency_table *pos; | 199 | struct cpufreq_frequency_table *pos; |
| 200 | int idx; | ||
| 200 | 201 | ||
| 201 | cpufreq_for_each_valid_entry(pos, freq_table) | 202 | cpufreq_for_each_valid_entry_idx(pos, freq_table, idx) |
| 202 | if (pos->frequency == rate) | 203 | if (pos->frequency == rate) |
| 203 | return pos - freq_table; | 204 | return idx; |
| 204 | 205 | ||
| 205 | return -ENOENT; | 206 | return -ENOENT; |
| 206 | } | 207 | } |
diff --git a/drivers/staging/irda/drivers/sh_sir.c b/drivers/staging/irda/drivers/sh_sir.c index fede6864c737..0d0687cc454a 100644 --- a/drivers/staging/irda/drivers/sh_sir.c +++ b/drivers/staging/irda/drivers/sh_sir.c | |||
| @@ -226,7 +226,7 @@ static u32 sh_sir_find_sclk(struct clk *irda_clk) | |||
| 226 | clk_put(pclk); | 226 | clk_put(pclk); |
| 227 | 227 | ||
| 228 | /* IrDA can not set over peripheral_clk */ | 228 | /* IrDA can not set over peripheral_clk */ |
| 229 | cpufreq_for_each_valid_entry(pos, freq_table) { | 229 | cpufreq_for_each_valid_entry_idx(pos, freq_table, index) { |
| 230 | u32 freq = pos->frequency; | 230 | u32 freq = pos->frequency; |
| 231 | 231 | ||
| 232 | /* IrDA should not over peripheral_clk */ | 232 | /* IrDA should not over peripheral_clk */ |
| @@ -236,7 +236,7 @@ static u32 sh_sir_find_sclk(struct clk *irda_clk) | |||
| 236 | tmp = freq % SCLK_BASE; | 236 | tmp = freq % SCLK_BASE; |
| 237 | if (tmp < min) { | 237 | if (tmp < min) { |
| 238 | min = tmp; | 238 | min = tmp; |
| 239 | index = pos - freq_table; | 239 | break; |
| 240 | } | 240 | } |
| 241 | } | 241 | } |
| 242 | 242 | ||
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 065f3a8eb486..21e8d248d956 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -629,6 +629,18 @@ static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, | |||
| 629 | for (pos = table; pos->frequency != CPUFREQ_TABLE_END; pos++) | 629 | for (pos = table; pos->frequency != CPUFREQ_TABLE_END; pos++) |
| 630 | 630 | ||
| 631 | /* | 631 | /* |
| 632 | * cpufreq_for_each_entry_idx - iterate over a cpufreq_frequency_table | ||
| 633 | * with index | ||
| 634 | * @pos: the cpufreq_frequency_table * to use as a loop cursor. | ||
| 635 | * @table: the cpufreq_frequency_table * to iterate over. | ||
| 636 | * @idx: the table entry currently being processed | ||
| 637 | */ | ||
| 638 | |||
| 639 | #define cpufreq_for_each_entry_idx(pos, table, idx) \ | ||
| 640 | for (pos = table, idx = 0; pos->frequency != CPUFREQ_TABLE_END; \ | ||
| 641 | pos++, idx++) | ||
| 642 | |||
| 643 | /* | ||
| 632 | * cpufreq_for_each_valid_entry - iterate over a cpufreq_frequency_table | 644 | * cpufreq_for_each_valid_entry - iterate over a cpufreq_frequency_table |
| 633 | * excluding CPUFREQ_ENTRY_INVALID frequencies. | 645 | * excluding CPUFREQ_ENTRY_INVALID frequencies. |
| 634 | * @pos: the cpufreq_frequency_table * to use as a loop cursor. | 646 | * @pos: the cpufreq_frequency_table * to use as a loop cursor. |
| @@ -641,6 +653,21 @@ static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, | |||
| 641 | continue; \ | 653 | continue; \ |
| 642 | else | 654 | else |
| 643 | 655 | ||
| 656 | /* | ||
| 657 | * cpufreq_for_each_valid_entry_idx - iterate with index over a cpufreq | ||
| 658 | * frequency_table excluding CPUFREQ_ENTRY_INVALID frequencies. | ||
| 659 | * @pos: the cpufreq_frequency_table * to use as a loop cursor. | ||
| 660 | * @table: the cpufreq_frequency_table * to iterate over. | ||
| 661 | * @idx: the table entry currently being processed | ||
| 662 | */ | ||
| 663 | |||
| 664 | #define cpufreq_for_each_valid_entry_idx(pos, table, idx) \ | ||
| 665 | cpufreq_for_each_entry_idx(pos, table, idx) \ | ||
| 666 | if (pos->frequency == CPUFREQ_ENTRY_INVALID) \ | ||
| 667 | continue; \ | ||
| 668 | else | ||
| 669 | |||
| 670 | |||
| 644 | int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, | 671 | int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, |
| 645 | struct cpufreq_frequency_table *table); | 672 | struct cpufreq_frequency_table *table); |
| 646 | 673 | ||
| @@ -667,19 +694,20 @@ static inline int cpufreq_table_find_index_al(struct cpufreq_policy *policy, | |||
| 667 | unsigned int target_freq) | 694 | unsigned int target_freq) |
| 668 | { | 695 | { |
| 669 | struct cpufreq_frequency_table *table = policy->freq_table; | 696 | struct cpufreq_frequency_table *table = policy->freq_table; |
| 670 | struct cpufreq_frequency_table *pos, *best = table - 1; | 697 | struct cpufreq_frequency_table *pos; |
| 671 | unsigned int freq; | 698 | unsigned int freq; |
| 699 | int idx, best = -1; | ||
| 672 | 700 | ||
| 673 | cpufreq_for_each_valid_entry(pos, table) { | 701 | cpufreq_for_each_valid_entry_idx(pos, table, idx) { |
| 674 | freq = pos->frequency; | 702 | freq = pos->frequency; |
| 675 | 703 | ||
| 676 | if (freq >= target_freq) | 704 | if (freq >= target_freq) |
| 677 | return pos - table; | 705 | return idx; |
| 678 | 706 | ||
| 679 | best = pos; | 707 | best = idx; |
| 680 | } | 708 | } |
| 681 | 709 | ||
| 682 | return best - table; | 710 | return best; |
| 683 | } | 711 | } |
| 684 | 712 | ||
| 685 | /* Find lowest freq at or above target in a table in descending order */ | 713 | /* Find lowest freq at or above target in a table in descending order */ |
| @@ -687,28 +715,29 @@ static inline int cpufreq_table_find_index_dl(struct cpufreq_policy *policy, | |||
| 687 | unsigned int target_freq) | 715 | unsigned int target_freq) |
| 688 | { | 716 | { |
| 689 | struct cpufreq_frequency_table *table = policy->freq_table; | 717 | struct cpufreq_frequency_table *table = policy->freq_table; |
| 690 | struct cpufreq_frequency_table *pos, *best = table - 1; | 718 | struct cpufreq_frequency_table *pos; |
| 691 | unsigned int freq; | 719 | unsigned int freq; |
| 720 | int idx, best = -1; | ||
| 692 | 721 | ||
| 693 | cpufreq_for_each_valid_entry(pos, table) { | 722 | cpufreq_for_each_valid_entry_idx(pos, table, idx) { |
| 694 | freq = pos->frequency; | 723 | freq = pos->frequency; |
| 695 | 724 | ||
| 696 | if (freq == target_freq) | 725 | if (freq == target_freq) |
| 697 | return pos - table; | 726 | return idx; |
| 698 | 727 | ||
| 699 | if (freq > target_freq) { | 728 | if (freq > target_freq) { |
| 700 | best = pos; | 729 | best = idx; |
| 701 | continue; | 730 | continue; |
| 702 | } | 731 | } |
| 703 | 732 | ||
| 704 | /* No freq found above target_freq */ | 733 | /* No freq found above target_freq */ |
| 705 | if (best == table - 1) | 734 | if (best == -1) |
| 706 | return pos - table; | 735 | return idx; |
| 707 | 736 | ||
| 708 | return best - table; | 737 | return best; |
| 709 | } | 738 | } |
| 710 | 739 | ||
| 711 | return best - table; | 740 | return best; |
| 712 | } | 741 | } |
| 713 | 742 | ||
| 714 | /* Works only on sorted freq-tables */ | 743 | /* Works only on sorted freq-tables */ |
| @@ -728,28 +757,29 @@ static inline int cpufreq_table_find_index_ah(struct cpufreq_policy *policy, | |||
| 728 | unsigned int target_freq) | 757 | unsigned int target_freq) |
| 729 | { | 758 | { |
| 730 | struct cpufreq_frequency_table *table = policy->freq_table; | 759 | struct cpufreq_frequency_table *table = policy->freq_table; |
| 731 | struct cpufreq_frequency_table *pos, *best = table - 1; | 760 | struct cpufreq_frequency_table *pos; |
| 732 | unsigned int freq; | 761 | unsigned int freq; |
| 762 | int idx, best = -1; | ||
| 733 | 763 | ||
| 734 | cpufreq_for_each_valid_entry(pos, table) { | 764 | cpufreq_for_each_valid_entry_idx(pos, table, idx) { |
| 735 | freq = pos->frequency; | 765 | freq = pos->frequency; |
| 736 | 766 | ||
| 737 | if (freq == target_freq) | 767 | if (freq == target_freq) |
| 738 | return pos - table; | 768 | return idx; |
| 739 | 769 | ||
| 740 | if (freq < target_freq) { | 770 | if (freq < target_freq) { |
| 741 | best = pos; | 771 | best = idx; |
| 742 | continue; | 772 | continue; |
| 743 | } | 773 | } |
| 744 | 774 | ||
| 745 | /* No freq found below target_freq */ | 775 | /* No freq found below target_freq */ |
| 746 | if (best == table - 1) | 776 | if (best == -1) |
| 747 | return pos - table; | 777 | return idx; |
| 748 | 778 | ||
| 749 | return best - table; | 779 | return best; |
| 750 | } | 780 | } |
| 751 | 781 | ||
| 752 | return best - table; | 782 | return best; |
| 753 | } | 783 | } |
| 754 | 784 | ||
| 755 | /* Find highest freq at or below target in a table in descending order */ | 785 | /* Find highest freq at or below target in a table in descending order */ |
| @@ -757,19 +787,20 @@ static inline int cpufreq_table_find_index_dh(struct cpufreq_policy *policy, | |||
| 757 | unsigned int target_freq) | 787 | unsigned int target_freq) |
| 758 | { | 788 | { |
| 759 | struct cpufreq_frequency_table *table = policy->freq_table; | 789 | struct cpufreq_frequency_table *table = policy->freq_table; |
| 760 | struct cpufreq_frequency_table *pos, *best = table - 1; | 790 | struct cpufreq_frequency_table *pos; |
| 761 | unsigned int freq; | 791 | unsigned int freq; |
| 792 | int idx, best = -1; | ||
| 762 | 793 | ||
| 763 | cpufreq_for_each_valid_entry(pos, table) { | 794 | cpufreq_for_each_valid_entry_idx(pos, table, idx) { |
| 764 | freq = pos->frequency; | 795 | freq = pos->frequency; |
| 765 | 796 | ||
| 766 | if (freq <= target_freq) | 797 | if (freq <= target_freq) |
| 767 | return pos - table; | 798 | return idx; |
| 768 | 799 | ||
| 769 | best = pos; | 800 | best = idx; |
| 770 | } | 801 | } |
| 771 | 802 | ||
| 772 | return best - table; | 803 | return best; |
| 773 | } | 804 | } |
| 774 | 805 | ||
| 775 | /* Works only on sorted freq-tables */ | 806 | /* Works only on sorted freq-tables */ |
| @@ -789,32 +820,33 @@ static inline int cpufreq_table_find_index_ac(struct cpufreq_policy *policy, | |||
| 789 | unsigned int target_freq) | 820 | unsigned int target_freq) |
| 790 | { | 821 | { |
| 791 | struct cpufreq_frequency_table *table = policy->freq_table; | 822 | struct cpufreq_frequency_table *table = policy->freq_table; |
| 792 | struct cpufreq_frequency_table *pos, *best = table - 1; | 823 | struct cpufreq_frequency_table *pos; |
| 793 | unsigned int freq; | 824 | unsigned int freq; |
| 825 | int idx, best = -1; | ||
| 794 | 826 | ||
| 795 | cpufreq_for_each_valid_entry(pos, table) { | 827 | cpufreq_for_each_valid_entry_idx(pos, table, idx) { |
| 796 | freq = pos->frequency; | 828 | freq = pos->frequency; |
| 797 | 829 | ||
| 798 | if (freq == target_freq) | 830 | if (freq == target_freq) |
| 799 | return pos - table; | 831 | return idx; |
| 800 | 832 | ||
| 801 | if (freq < target_freq) { | 833 | if (freq < target_freq) { |
| 802 | best = pos; | 834 | best = idx; |
| 803 | continue; | 835 | continue; |
| 804 | } | 836 | } |
| 805 | 837 | ||
| 806 | /* No freq found below target_freq */ | 838 | /* No freq found below target_freq */ |
| 807 | if (best == table - 1) | 839 | if (best == -1) |
| 808 | return pos - table; | 840 | return idx; |
| 809 | 841 | ||
| 810 | /* Choose the closest freq */ | 842 | /* Choose the closest freq */ |
| 811 | if (target_freq - best->frequency > freq - target_freq) | 843 | if (target_freq - table[best].frequency > freq - target_freq) |
| 812 | return pos - table; | 844 | return idx; |
| 813 | 845 | ||
| 814 | return best - table; | 846 | return best; |
| 815 | } | 847 | } |
| 816 | 848 | ||
| 817 | return best - table; | 849 | return best; |
| 818 | } | 850 | } |
| 819 | 851 | ||
| 820 | /* Find closest freq to target in a table in descending order */ | 852 | /* Find closest freq to target in a table in descending order */ |
| @@ -822,32 +854,33 @@ static inline int cpufreq_table_find_index_dc(struct cpufreq_policy *policy, | |||
| 822 | unsigned int target_freq) | 854 | unsigned int target_freq) |
| 823 | { | 855 | { |
| 824 | struct cpufreq_frequency_table *table = policy->freq_table; | 856 | struct cpufreq_frequency_table *table = policy->freq_table; |
| 825 | struct cpufreq_frequency_table *pos, *best = table - 1; | 857 | struct cpufreq_frequency_table *pos; |
| 826 | unsigned int freq; | 858 | unsigned int freq; |
| 859 | int idx, best = -1; | ||
| 827 | 860 | ||
| 828 | cpufreq_for_each_valid_entry(pos, table) { | 861 | cpufreq_for_each_valid_entry_idx(pos, table, idx) { |
| 829 | freq = pos->frequency; | 862 | freq = pos->frequency; |
| 830 | 863 | ||
| 831 | if (freq == target_freq) | 864 | if (freq == target_freq) |
| 832 | return pos - table; | 865 | return idx; |
| 833 | 866 | ||
| 834 | if (freq > target_freq) { | 867 | if (freq > target_freq) { |
| 835 | best = pos; | 868 | best = idx; |
| 836 | continue; | 869 | continue; |
| 837 | } | 870 | } |
| 838 | 871 | ||
| 839 | /* No freq found above target_freq */ | 872 | /* No freq found above target_freq */ |
| 840 | if (best == table - 1) | 873 | if (best == -1) |
| 841 | return pos - table; | 874 | return idx; |
| 842 | 875 | ||
| 843 | /* Choose the closest freq */ | 876 | /* Choose the closest freq */ |
| 844 | if (best->frequency - target_freq > target_freq - freq) | 877 | if (table[best].frequency - target_freq > target_freq - freq) |
| 845 | return pos - table; | 878 | return idx; |
| 846 | 879 | ||
| 847 | return best - table; | 880 | return best; |
| 848 | } | 881 | } |
| 849 | 882 | ||
| 850 | return best - table; | 883 | return best; |
| 851 | } | 884 | } |
| 852 | 885 | ||
| 853 | /* Works only on sorted freq-tables */ | 886 | /* Works only on sorted freq-tables */ |
