Commit f3364e17 authored by Viresh Kumar's avatar Viresh Kumar
Browse files

opp: Split out _opp_set_rate_zero()



Create separate routine _opp_set_rate_zero() to handle !target_freq
case.

Tested-by: default avatarRajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 10b21736
Loading
Loading
Loading
Loading
+29 −23
Original line number Diff line number Diff line
@@ -860,6 +860,34 @@ int dev_pm_opp_set_bw(struct device *dev, struct dev_pm_opp *opp)
}
EXPORT_SYMBOL_GPL(dev_pm_opp_set_bw);

static int _opp_set_rate_zero(struct device *dev, struct opp_table *opp_table)
{
	int ret;

	if (!opp_table->enabled)
		return 0;

	/*
	 * Some drivers need to support cases where some platforms may
	 * have OPP table for the device, while others don't and
	 * opp_set_rate() just needs to behave like clk_set_rate().
	 */
	if (!_get_opp_count(opp_table))
		return 0;

	ret = _set_opp_bw(opp_table, NULL, dev, true);
	if (ret)
		return ret;

	if (opp_table->regulators)
		regulator_disable(opp_table->regulators[0]);

	ret = _set_required_opps(dev, opp_table, NULL);

	opp_table->enabled = false;
	return ret;
}

/**
 * dev_pm_opp_set_rate() - Configure new OPP based on frequency
 * @dev:	 device for which we do this operation
@@ -886,29 +914,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
	}

	if (unlikely(!target_freq)) {
		ret = 0;

		if (!opp_table->enabled)
			goto put_opp_table;

		/*
		 * Some drivers need to support cases where some platforms may
		 * have OPP table for the device, while others don't and
		 * opp_set_rate() just needs to behave like clk_set_rate().
		 */
		if (!_get_opp_count(opp_table))
			goto put_opp_table;

		ret = _set_opp_bw(opp_table, NULL, dev, true);
		if (ret)
			goto put_opp_table;

		if (opp_table->regulators)
			regulator_disable(opp_table->regulators[0]);

		ret = _set_required_opps(dev, opp_table, NULL);

		opp_table->enabled = false;
		ret = _opp_set_rate_zero(dev, opp_table);
		goto put_opp_table;
	}