Skip to content

Commit b00e667

Browse files
committed
opp: Remove bandwidth votes when target_freq is zero
We already drop several votes when target_freq is set to zero, drop bandwidth votes as well. Reported-by: Sibi Sankar <[email protected]> Reviewed-by: Georgi Djakov <[email protected]> Tested-by: Georgi Djakov <[email protected]> Reviewed-by: Sibi Sankar <[email protected]> Tested-by: Sibi Sankar <[email protected]> Signed-off-by: Viresh Kumar <[email protected]>
1 parent 8d45719 commit b00e667

File tree

1 file changed

+37
-12
lines changed

1 file changed

+37
-12
lines changed

drivers/opp/core.c

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,34 @@ static int _generic_set_opp_regulator(struct opp_table *opp_table,
725725
return ret;
726726
}
727727

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+
728756
static int _set_opp_custom(const struct opp_table *opp_table,
729757
struct device *dev, unsigned long old_freq,
730758
unsigned long freq,
@@ -820,7 +848,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
820848
unsigned long freq, old_freq, temp_freq;
821849
struct dev_pm_opp *old_opp, *opp;
822850
struct clk *clk;
823-
int ret, i;
851+
int ret;
824852

825853
opp_table = _find_opp_table(dev);
826854
if (IS_ERR(opp_table)) {
@@ -837,12 +865,17 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
837865
if (!_get_opp_count(opp_table))
838866
return 0;
839867

840-
if (!opp_table->required_opp_tables && !opp_table->regulators) {
868+
if (!opp_table->required_opp_tables && !opp_table->regulators &&
869+
!opp_table->paths) {
841870
dev_err(dev, "target frequency can't be 0\n");
842871
ret = -EINVAL;
843872
goto put_opp_table;
844873
}
845874

875+
ret = _set_opp_bw(opp_table, NULL, dev, true);
876+
if (ret)
877+
return ret;
878+
846879
if (opp_table->regulator_enabled) {
847880
regulator_disable(opp_table->regulators[0]);
848881
opp_table->regulator_enabled = false;
@@ -932,16 +965,8 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
932965
dev_err(dev, "Failed to set required opps: %d\n", ret);
933966
}
934967

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);
945970

946971
put_opp:
947972
dev_pm_opp_put(opp);

0 commit comments

Comments
 (0)