diff options
Diffstat (limited to 'include/linux/cpufreq.h')
-rw-r--r-- | include/linux/cpufreq.h | 125 |
1 files changed, 79 insertions, 46 deletions
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 */ |