aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/opp/of.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2018-09-11 11:14:11 +0530
committerViresh Kumar <viresh.kumar@linaro.org>2018-09-19 14:56:43 -0700
commitd0e8ae6c26da7b9436775dfd9768d7a821ed47b7 (patch)
tree49c580488e3678d30de2adb474b2dcf0d0a13329 /drivers/opp/of.c
parentOPP: Don't take OPP table's kref for static OPPs (diff)
downloadlinux-dev-d0e8ae6c26da7b9436775dfd9768d7a821ed47b7.tar.xz
linux-dev-d0e8ae6c26da7b9436775dfd9768d7a821ed47b7.zip
OPP: Create separate kref for static OPPs list
The static OPPs don't always get freed with the OPP table, it can happen before that as well. For example, if the OPP table is first created using helpers like dev_pm_opp_set_supported_hw() and the OPPs are created at a later point. Now when the OPPs are removed, the OPP table stays until the time dev_pm_opp_put_supported_hw() is called. Later patches will streamline the freeing of OPP table and that requires the static OPPs to get freed with help of a separate kernel reference. This patch prepares for that by creating a separate kref for static OPPs list. Tested-by: Niklas Cassel <niklas.cassel@linaro.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Diffstat (limited to 'drivers/opp/of.c')
-rw-r--r--drivers/opp/of.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/opp/of.c b/drivers/opp/of.c
index 4a19f76880d3..aaa4bab69846 100644
--- a/drivers/opp/of.c
+++ b/drivers/opp/of.c
@@ -411,6 +411,8 @@ static int _of_add_opp_table_v2(struct device *dev, struct device_node *opp_np,
ret = -ENOMEM;
else if (!opp_table->parsed_static_opps)
goto initialize_static_opps;
+ else
+ kref_get(&opp_table->list_kref);
goto put_opp_table;
}
@@ -420,6 +422,8 @@ static int _of_add_opp_table_v2(struct device *dev, struct device_node *opp_np,
return -ENOMEM;
initialize_static_opps:
+ kref_init(&opp_table->list_kref);
+
/* We have opp-table node now, iterate over it and add OPPs */
for_each_available_child_of_node(opp_np, np) {
count++;
@@ -437,6 +441,7 @@ initialize_static_opps:
/* There should be one of more OPP defined */
if (WARN_ON(!count)) {
ret = -ENOENT;
+ _put_opp_list_kref(opp_table);
goto put_opp_table;
}
@@ -491,6 +496,8 @@ static int _of_add_opp_table_v1(struct device *dev)
if (!opp_table)
return -ENOMEM;
+ kref_init(&opp_table->list_kref);
+
val = prop->value;
while (nr) {
unsigned long freq = be32_to_cpup(val++) * 1000;