@@ -433,6 +433,11 @@ static unsigned long _read_freq(struct dev_pm_opp *opp, int index)
433
433
return opp -> rate ;
434
434
}
435
435
436
+ static unsigned long _read_level (struct dev_pm_opp * opp , int index )
437
+ {
438
+ return opp -> level ;
439
+ }
440
+
436
441
/* Generic comparison helpers */
437
442
static bool _compare_exact (struct dev_pm_opp * * opp , struct dev_pm_opp * temp_opp ,
438
443
unsigned long opp_key , unsigned long key )
@@ -656,33 +661,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
656
661
struct dev_pm_opp * dev_pm_opp_find_level_exact (struct device * dev ,
657
662
unsigned int level )
658
663
{
659
- struct opp_table * opp_table ;
660
- struct dev_pm_opp * temp_opp , * opp = ERR_PTR (- ERANGE );
661
-
662
- opp_table = _find_opp_table (dev );
663
- if (IS_ERR (opp_table )) {
664
- int r = PTR_ERR (opp_table );
665
-
666
- dev_err (dev , "%s: OPP table not found (%d)\n" , __func__ , r );
667
- return ERR_PTR (r );
668
- }
669
-
670
- mutex_lock (& opp_table -> lock );
671
-
672
- list_for_each_entry (temp_opp , & opp_table -> opp_list , node ) {
673
- if (temp_opp -> level == level ) {
674
- opp = temp_opp ;
675
-
676
- /* Increment the reference count of OPP */
677
- dev_pm_opp_get (opp );
678
- break ;
679
- }
680
- }
681
-
682
- mutex_unlock (& opp_table -> lock );
683
- dev_pm_opp_put_opp_table (opp_table );
684
-
685
- return opp ;
664
+ return _find_key_exact (dev , level , 0 , true, _read_level );
686
665
}
687
666
EXPORT_SYMBOL_GPL (dev_pm_opp_find_level_exact );
688
667
@@ -704,33 +683,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_find_level_exact);
704
683
struct dev_pm_opp * dev_pm_opp_find_level_ceil (struct device * dev ,
705
684
unsigned int * level )
706
685
{
707
- struct opp_table * opp_table ;
708
- struct dev_pm_opp * temp_opp , * opp = ERR_PTR (- ERANGE );
709
-
710
- opp_table = _find_opp_table (dev );
711
- if (IS_ERR (opp_table )) {
712
- int r = PTR_ERR (opp_table );
713
-
714
- dev_err (dev , "%s: OPP table not found (%d)\n" , __func__ , r );
715
- return ERR_PTR (r );
716
- }
717
-
718
- mutex_lock (& opp_table -> lock );
719
-
720
- list_for_each_entry (temp_opp , & opp_table -> opp_list , node ) {
721
- if (temp_opp -> available && temp_opp -> level >= * level ) {
722
- opp = temp_opp ;
723
- * level = opp -> level ;
724
-
725
- /* Increment the reference count of OPP */
726
- dev_pm_opp_get (opp );
727
- break ;
728
- }
729
- }
730
-
731
- mutex_unlock (& opp_table -> lock );
732
- dev_pm_opp_put_opp_table (opp_table );
686
+ unsigned long temp = * level ;
687
+ struct dev_pm_opp * opp ;
733
688
689
+ opp = _find_key_ceil (dev , & temp , 0 , true, _read_level );
690
+ * level = temp ;
734
691
return opp ;
735
692
}
736
693
EXPORT_SYMBOL_GPL (dev_pm_opp_find_level_ceil );
0 commit comments