From 25a18559b8ae4f6491e189483fb00f7de0a0d2d8 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Wed, 25 May 2022 17:00:51 +0530 Subject: [PATCH] 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: Dmitry Osipenko Signed-off-by: Viresh Kumar --- drivers/soc/tegra/common.c | 60 ++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/drivers/soc/tegra/common.c b/drivers/soc/tegra/common.c index 9f3fdeb1a11c..dff6d5ef4e46 100644 --- a/drivers/soc/tegra/common.c +++ b/drivers/soc/tegra/common.c @@ -107,36 +107,46 @@ int devm_tegra_core_dev_init_opp_table(struct device *dev, { u32 hw_version; int err; + /* + * The clk's connection id to set is NULL and this is a NULL terminated + * array, hence two NULL entries. + */ + 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")) { + hw_version = BIT(tegra_sku_info.soc_process_id); + 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_config(dev, &config); + if (err) { + dev_err(dev, "failed to set OPP config: %d\n", err); + return 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. + * Tegra114+ doesn't support OPP yet, return early for non tegra20/30 + * case. */ - 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")) + if (!config.supported_hw) return -ENODEV; - if (of_machine_is_compatible("nvidia,tegra20")) - hw_version = BIT(tegra_sku_info.soc_process_id); - else - hw_version = BIT(tegra_sku_info.soc_speedo_id); - - err = devm_pm_opp_set_supported_hw(dev, &hw_version, 1); - if (err) { - dev_err(dev, "failed to set OPP supported HW: %d\n", err); - return err; - } - /* * Older device-trees have an empty OPP table, we will get * -ENODEV from devm_pm_opp_of_add_table() in this case.