On 17-08-21, 04:27, Dmitry Osipenko wrote:
Add dev_pm_opp_sync() helper which syncs OPP table with hardware state and vice versa.
Signed-off-by: Dmitry Osipenko digetx@gmail.com
drivers/opp/core.c | 42 +++++++++++++++++++++++++++++++++++++++--- include/linux/pm_opp.h | 6 ++++++ 2 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 5543c54dacc5..18016e49605f 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -939,7 +939,8 @@ static int _set_required_opps(struct device *dev, return ret; }
-static void _find_current_opp(struct device *dev, struct opp_table *opp_table) +static struct dev_pm_opp * +_find_current_opp(struct device *dev, struct opp_table *opp_table) { struct dev_pm_opp *opp = ERR_PTR(-ENODEV); unsigned long freq; @@ -961,7 +962,7 @@ static void _find_current_opp(struct device *dev, struct opp_table *opp_table) mutex_unlock(&opp_table->lock); }
- opp_table->current_opp = opp;
- return opp;
}
static int _disable_opp_table(struct device *dev, struct opp_table *opp_table) @@ -1003,7 +1004,7 @@ static int _set_opp(struct device *dev, struct opp_table *opp_table,
/* Find the currently set OPP if we don't know already */ if (unlikely(!opp_table->current_opp))
_find_current_opp(dev, opp_table);
opp_table->current_opp = _find_current_opp(dev, opp_table);
old_opp = opp_table->current_opp;
@@ -2931,3 +2932,38 @@ int dev_pm_opp_sync_regulators(struct device *dev) return ret; } EXPORT_SYMBOL_GPL(dev_pm_opp_sync_regulators);
+/**
- dev_pm_opp_sync() - Sync OPP state
- @dev: device for which we do this operation
- Initialize OPP table accordingly to current clock rate or
- first available OPP if clock not available for this device.
- Return: 0 on success or a negative error value.
- */
+int dev_pm_opp_sync(struct device *dev) +{
- struct opp_table *opp_table;
- struct dev_pm_opp *opp;
- int ret = 0;
- /* Device may not have OPP table */
- opp_table = _find_opp_table(dev);
- if (IS_ERR(opp_table))
return 0;
- if (!_get_opp_count(opp_table))
goto put_table;
- opp = _find_current_opp(dev, opp_table);
- ret = _set_opp(dev, opp_table, opp, opp->rate);
And I am not sure how this will end up working, since new OPP will be equal to old one. Since I see you call this from resume() at many places.
what exactly are you trying to do here ? Those details would be good to have in commit log as well, I haven't really followed V7 of your series.