Loading drivers/soc/tegra/common.c +25 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #include <linux/export.h> #include <linux/of.h> #include <linux/pm_opp.h> #include <linux/pm_runtime.h> #include <soc/tegra/common.h> #include <soc/tegra/fuse.h> Loading Loading @@ -43,6 +44,7 @@ static int tegra_core_dev_init_opp_state(struct device *dev) { unsigned long rate; struct clk *clk; bool rpm_enabled; int err; clk = devm_clk_get(dev, NULL); Loading @@ -57,8 +59,31 @@ static int tegra_core_dev_init_opp_state(struct device *dev) return -EINVAL; } /* * Runtime PM of the device must be enabled in order to set up * GENPD's performance properly because GENPD core checks whether * device is suspended and this check doesn't work while RPM is * disabled. This makes sure the OPP vote below gets cached in * GENPD for the device. Instead, the vote is done the next time * the device gets runtime resumed. */ rpm_enabled = pm_runtime_enabled(dev); if (!rpm_enabled) pm_runtime_enable(dev); /* should never happen in practice */ if (!pm_runtime_enabled(dev)) { dev_WARN(dev, "failed to enable runtime PM\n"); pm_runtime_disable(dev); return -EINVAL; } /* first dummy rate-setting initializes voltage vote */ err = dev_pm_opp_set_rate(dev, rate); if (!rpm_enabled) pm_runtime_disable(dev); if (err) { dev_err(dev, "failed to initialize OPP clock: %d\n", err); return err; Loading include/soc/tegra/common.h +15 −0 Original line number Diff line number Diff line Loading @@ -39,4 +39,19 @@ devm_tegra_core_dev_init_opp_table(struct device *dev, } #endif static inline int devm_tegra_core_dev_init_opp_table_common(struct device *dev) { struct tegra_core_opp_params opp_params = {}; int err; opp_params.init_state = true; err = devm_tegra_core_dev_init_opp_table(dev, &opp_params); if (err != -ENODEV) return err; return 0; } #endif /* __SOC_TEGRA_COMMON_H__ */ Loading
drivers/soc/tegra/common.c +25 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #include <linux/export.h> #include <linux/of.h> #include <linux/pm_opp.h> #include <linux/pm_runtime.h> #include <soc/tegra/common.h> #include <soc/tegra/fuse.h> Loading Loading @@ -43,6 +44,7 @@ static int tegra_core_dev_init_opp_state(struct device *dev) { unsigned long rate; struct clk *clk; bool rpm_enabled; int err; clk = devm_clk_get(dev, NULL); Loading @@ -57,8 +59,31 @@ static int tegra_core_dev_init_opp_state(struct device *dev) return -EINVAL; } /* * Runtime PM of the device must be enabled in order to set up * GENPD's performance properly because GENPD core checks whether * device is suspended and this check doesn't work while RPM is * disabled. This makes sure the OPP vote below gets cached in * GENPD for the device. Instead, the vote is done the next time * the device gets runtime resumed. */ rpm_enabled = pm_runtime_enabled(dev); if (!rpm_enabled) pm_runtime_enable(dev); /* should never happen in practice */ if (!pm_runtime_enabled(dev)) { dev_WARN(dev, "failed to enable runtime PM\n"); pm_runtime_disable(dev); return -EINVAL; } /* first dummy rate-setting initializes voltage vote */ err = dev_pm_opp_set_rate(dev, rate); if (!rpm_enabled) pm_runtime_disable(dev); if (err) { dev_err(dev, "failed to initialize OPP clock: %d\n", err); return err; Loading
include/soc/tegra/common.h +15 −0 Original line number Diff line number Diff line Loading @@ -39,4 +39,19 @@ devm_tegra_core_dev_init_opp_table(struct device *dev, } #endif static inline int devm_tegra_core_dev_init_opp_table_common(struct device *dev) { struct tegra_core_opp_params opp_params = {}; int err; opp_params.init_state = true; err = devm_tegra_core_dev_init_opp_table(dev, &opp_params); if (err != -ENODEV) return err; return 0; } #endif /* __SOC_TEGRA_COMMON_H__ */