Message ID | 20210120222649.28149-3-digetx@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | viresh kumar |
Headers | show |
Series | OPP API fixes and improvements | expand |
21.01.2021 01:26, Dmitry Osipenko пишет: > Extend OPP API with dev_pm_opp_sync_regulators() function, which syncs > voltage state of regulators. > > Tested-by: Peter Geis <pgwipeout@gmail.com> > Tested-by: Nicolas Chauvet <kwizart@gmail.com> > Tested-by: Matt Merhar <mattmerhar@protonmail.com> > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > --- > drivers/opp/core.c | 41 +++++++++++++++++++++++++++++++++++++++++ > include/linux/pm_opp.h | 6 ++++++ > 2 files changed, 47 insertions(+) Hello Viresh, This is the last patch that is left unmerged from this series. We will need it for implementation of the PD driver for NVIDIA Tegra20/30 SoCs. Please consider applying it, thanks in advance!
On 26-01-21, 01:30, Dmitry Osipenko wrote: > 21.01.2021 01:26, Dmitry Osipenko пишет: > > Extend OPP API with dev_pm_opp_sync_regulators() function, which syncs > > voltage state of regulators. > > > > Tested-by: Peter Geis <pgwipeout@gmail.com> > > Tested-by: Nicolas Chauvet <kwizart@gmail.com> > > Tested-by: Matt Merhar <mattmerhar@protonmail.com> > > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > > --- > > drivers/opp/core.c | 41 +++++++++++++++++++++++++++++++++++++++++ > > include/linux/pm_opp.h | 6 ++++++ > > 2 files changed, 47 insertions(+) > > Hello Viresh, > > This is the last patch that is left unmerged from this series. We will > need it for implementation of the PD driver for NVIDIA Tegra20/30 SoCs. > Please consider applying it, thanks in advance! I have replied to 0/4 earlier giving the reason why I haven't applied this.
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 6049b17f99d6..43e62e0e3d5b 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -2659,3 +2659,44 @@ void dev_pm_opp_remove_table(struct device *dev) dev_pm_opp_put_opp_table(opp_table); } EXPORT_SYMBOL_GPL(dev_pm_opp_remove_table); + +/** + * dev_pm_opp_sync_regulators() - Sync state of voltage regulators + * @dev: device for which we do this operation + * + * Sync voltage state of the OPP table regulators. + * + * Return: 0 on success or a negative error value. + */ +int dev_pm_opp_sync_regulators(struct device *dev) +{ + struct opp_table *opp_table; + struct regulator *reg; + int i, ret = 0; + + /* Device may not have OPP table */ + opp_table = _find_opp_table(dev); + if (IS_ERR(opp_table)) + return 0; + + /* Regulator may not be required for the device */ + if (!opp_table->regulators) + goto put_table; + + /* Nothing to sync if voltage wasn't changed */ + if (!opp_table->enabled) + goto put_table; + + for (i = 0; i < opp_table->regulator_count; i++) { + reg = opp_table->regulators[i]; + ret = regulator_sync_voltage(reg); + if (ret) + break; + } +put_table: + /* Drop reference taken by _find_opp_table() */ + dev_pm_opp_put_opp_table(opp_table); + + return ret; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_sync_regulators); diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index f8e9a8e3eb59..80cdb9af8268 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -163,6 +163,7 @@ int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cp int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask); void dev_pm_opp_remove_table(struct device *dev); void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask); +int dev_pm_opp_sync_regulators(struct device *dev); #else static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev) { @@ -399,6 +400,11 @@ static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask { } +static inline int dev_pm_opp_sync_regulators(struct device *dev) +{ + return -ENOTSUPP; +} + #endif /* CONFIG_PM_OPP */ #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)