@@ -725,6 +725,34 @@ static int _generic_set_opp_regulator(struct opp_table *opp_table,
725
725
return ret ;
726
726
}
727
727
728
+ static int _set_opp_bw (const struct opp_table * opp_table ,
729
+ struct dev_pm_opp * opp , struct device * dev , bool remove )
730
+ {
731
+ u32 avg , peak ;
732
+ int i , ret ;
733
+
734
+ if (!opp_table -> paths )
735
+ return 0 ;
736
+
737
+ for (i = 0 ; i < opp_table -> path_count ; i ++ ) {
738
+ if (remove ) {
739
+ avg = 0 ;
740
+ peak = 0 ;
741
+ } else {
742
+ avg = opp -> bandwidth [i ].avg ;
743
+ peak = opp -> bandwidth [i ].peak ;
744
+ }
745
+ ret = icc_set_bw (opp_table -> paths [i ], avg , peak );
746
+ if (ret ) {
747
+ dev_err (dev , "Failed to %s bandwidth[%d]: %d\n" ,
748
+ remove ? "remove" : "set" , i , ret );
749
+ return ret ;
750
+ }
751
+ }
752
+
753
+ return 0 ;
754
+ }
755
+
728
756
static int _set_opp_custom (const struct opp_table * opp_table ,
729
757
struct device * dev , unsigned long old_freq ,
730
758
unsigned long freq ,
@@ -820,7 +848,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
820
848
unsigned long freq , old_freq , temp_freq ;
821
849
struct dev_pm_opp * old_opp , * opp ;
822
850
struct clk * clk ;
823
- int ret , i ;
851
+ int ret ;
824
852
825
853
opp_table = _find_opp_table (dev );
826
854
if (IS_ERR (opp_table )) {
@@ -837,12 +865,17 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
837
865
if (!_get_opp_count (opp_table ))
838
866
return 0 ;
839
867
840
- if (!opp_table -> required_opp_tables && !opp_table -> regulators ) {
868
+ if (!opp_table -> required_opp_tables && !opp_table -> regulators &&
869
+ !opp_table -> paths ) {
841
870
dev_err (dev , "target frequency can't be 0\n" );
842
871
ret = - EINVAL ;
843
872
goto put_opp_table ;
844
873
}
845
874
875
+ ret = _set_opp_bw (opp_table , NULL , dev , true);
876
+ if (ret )
877
+ return ret ;
878
+
846
879
if (opp_table -> regulator_enabled ) {
847
880
regulator_disable (opp_table -> regulators [0 ]);
848
881
opp_table -> regulator_enabled = false;
@@ -932,16 +965,8 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
932
965
dev_err (dev , "Failed to set required opps: %d\n" , ret );
933
966
}
934
967
935
- if (!ret && opp_table -> paths ) {
936
- for (i = 0 ; i < opp_table -> path_count ; i ++ ) {
937
- ret = icc_set_bw (opp_table -> paths [i ],
938
- opp -> bandwidth [i ].avg ,
939
- opp -> bandwidth [i ].peak );
940
- if (ret )
941
- dev_err (dev , "Failed to set bandwidth[%d]: %d\n" ,
942
- i , ret );
943
- }
944
- }
968
+ if (!ret )
969
+ ret = _set_opp_bw (opp_table , opp , dev , false);
945
970
946
971
put_opp :
947
972
dev_pm_opp_put (opp );
0 commit comments