Commit 25a18559 authored by Viresh Kumar's avatar Viresh Kumar
Browse files

soc/tegra: Migrate to dev_pm_opp_set_config()



The OPP core now provides a unified API for setting all configuration
types, i.e. dev_pm_opp_set_config().

Lets start using it.

Tested-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent a6db3b92
Loading
Loading
Loading
Loading
+31 −21
Original line number Diff line number Diff line
@@ -107,36 +107,46 @@ int devm_tegra_core_dev_init_opp_table(struct device *dev,
{
	u32 hw_version;
	int err;

	/*
	 * For some devices we don't have any OPP table in the DT, and in order
	 * to use the same code path for all the devices, we create a dummy OPP
	 * table for them via this call. The dummy OPP table is only capable of
	 * doing clk_set_rate() on invocation of dev_pm_opp_set_rate() and
	 * doesn't provide any other functionality.
	 * The clk's connection id to set is NULL and this is a NULL terminated
	 * array, hence two NULL entries.
	 */
	err = devm_pm_opp_set_clkname(dev, NULL);
	if (err) {
		dev_err(dev, "failed to set OPP clk: %d\n", err);
		return err;
	}

	/* Tegra114+ doesn't support OPP yet */
	if (!of_machine_is_compatible("nvidia,tegra20") &&
	    !of_machine_is_compatible("nvidia,tegra30"))
		return -ENODEV;
	const char *clk_names[] = { NULL, NULL };
	struct dev_pm_opp_config config = {
		/*
		 * For some devices we don't have any OPP table in the DT, and
		 * in order to use the same code path for all the devices, we
		 * create a dummy OPP table for them via this. The dummy OPP
		 * table is only capable of doing clk_set_rate() on invocation
		 * of dev_pm_opp_set_rate() and doesn't provide any other
		 * functionality.
		 */
		.clk_names = clk_names,
	};

	if (of_machine_is_compatible("nvidia,tegra20"))
	if (of_machine_is_compatible("nvidia,tegra20")) {
		hw_version = BIT(tegra_sku_info.soc_process_id);
	else
		config.supported_hw = &hw_version;
		config.supported_hw_count = 1;
	} else if (of_machine_is_compatible("nvidia,tegra30")) {
		hw_version = BIT(tegra_sku_info.soc_speedo_id);
		config.supported_hw = &hw_version;
		config.supported_hw_count = 1;
	}

	err = devm_pm_opp_set_supported_hw(dev, &hw_version, 1);
	err = devm_pm_opp_set_config(dev, &config);
	if (err) {
		dev_err(dev, "failed to set OPP supported HW: %d\n", err);
		dev_err(dev, "failed to set OPP config: %d\n", err);
		return err;
	}

	/*
	 * Tegra114+ doesn't support OPP yet, return early for non tegra20/30
	 * case.
	 */
	if (!config.supported_hw)
		return -ENODEV;

	/*
	 * Older device-trees have an empty OPP table, we will get
	 * -ENODEV from devm_pm_opp_of_add_table() in this case.