Commit b6160e26 authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

PM / OPP: Split out part of _add_opp_table() and _remove_opp_table()

Split out parts of _add_opp_table() and _remove_opp_table() into
separate routines. This improves readability as well.

Should result in no functional changes.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: default avatarStephen Boyd <sboyd@codeaurora.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent dc2c9ad5
...@@ -819,26 +819,12 @@ struct opp_device *_add_opp_dev(const struct device *dev, ...@@ -819,26 +819,12 @@ struct opp_device *_add_opp_dev(const struct device *dev,
return opp_dev; return opp_dev;
} }
/** static struct opp_table *_allocate_opp_table(struct device *dev)
* _add_opp_table() - Find OPP table or allocate a new one
* @dev: device for which we do this operation
*
* It tries to find an existing table first, if it couldn't find one, it
* allocates a new OPP table and returns that.
*
* Return: valid opp_table pointer if success, else NULL.
*/
struct opp_table *_add_opp_table(struct device *dev)
{ {
struct opp_table *opp_table; struct opp_table *opp_table;
struct opp_device *opp_dev; struct opp_device *opp_dev;
int ret; int ret;
/* Check for existing table for 'dev' first */
opp_table = _find_opp_table(dev);
if (!IS_ERR(opp_table))
return opp_table;
/* /*
* Allocate a new OPP table. In the infrequent case where a new * Allocate a new OPP table. In the infrequent case where a new
* device is needed to be added, we pay this penalty. * device is needed to be added, we pay this penalty.
...@@ -874,6 +860,27 @@ struct opp_table *_add_opp_table(struct device *dev) ...@@ -874,6 +860,27 @@ struct opp_table *_add_opp_table(struct device *dev)
return opp_table; return opp_table;
} }
/**
* _add_opp_table() - Find OPP table or allocate a new one
* @dev: device for which we do this operation
*
* It tries to find an existing table first, if it couldn't find one, it
* allocates a new OPP table and returns that.
*
* Return: valid opp_table pointer if success, else NULL.
*/
struct opp_table *_add_opp_table(struct device *dev)
{
struct opp_table *opp_table;
/* Check for existing table for 'dev' first */
opp_table = _find_opp_table(dev);
if (!IS_ERR(opp_table))
return opp_table;
return _allocate_opp_table(dev);
}
/** /**
* _kfree_device_rcu() - Free opp_table RCU handler * _kfree_device_rcu() - Free opp_table RCU handler
* @head: RCU head * @head: RCU head
...@@ -886,6 +893,27 @@ static void _kfree_device_rcu(struct rcu_head *head) ...@@ -886,6 +893,27 @@ static void _kfree_device_rcu(struct rcu_head *head)
kfree_rcu(opp_table, rcu_head); kfree_rcu(opp_table, rcu_head);
} }
static void _free_opp_table(struct opp_table *opp_table)
{
struct opp_device *opp_dev;
/* Release clk */
if (!IS_ERR(opp_table->clk))
clk_put(opp_table->clk);
opp_dev = list_first_entry(&opp_table->dev_list, struct opp_device,
node);
_remove_opp_dev(opp_dev, opp_table);
/* dev_list must be empty now */
WARN_ON(!list_empty(&opp_table->dev_list));
list_del_rcu(&opp_table->node);
call_srcu(&opp_table->srcu_head.srcu, &opp_table->rcu_head,
_kfree_device_rcu);
}
/** /**
* _remove_opp_table() - Removes a OPP table * _remove_opp_table() - Removes a OPP table
* @opp_table: OPP table to be removed. * @opp_table: OPP table to be removed.
...@@ -894,8 +922,6 @@ static void _kfree_device_rcu(struct rcu_head *head) ...@@ -894,8 +922,6 @@ static void _kfree_device_rcu(struct rcu_head *head)
*/ */
static void _remove_opp_table(struct opp_table *opp_table) static void _remove_opp_table(struct opp_table *opp_table)
{ {
struct opp_device *opp_dev;
if (!list_empty(&opp_table->opp_list)) if (!list_empty(&opp_table->opp_list))
return; return;
...@@ -911,21 +937,7 @@ static void _remove_opp_table(struct opp_table *opp_table) ...@@ -911,21 +937,7 @@ static void _remove_opp_table(struct opp_table *opp_table)
if (opp_table->set_opp) if (opp_table->set_opp)
return; return;
/* Release clk */ _free_opp_table(opp_table);
if (!IS_ERR(opp_table->clk))
clk_put(opp_table->clk);
opp_dev = list_first_entry(&opp_table->dev_list, struct opp_device,
node);
_remove_opp_dev(opp_dev, opp_table);
/* dev_list must be empty now */
WARN_ON(!list_empty(&opp_table->dev_list));
list_del_rcu(&opp_table->node);
call_srcu(&opp_table->srcu_head.srcu, &opp_table->rcu_head,
_kfree_device_rcu);
} }
void _opp_free(struct dev_pm_opp *opp) void _opp_free(struct dev_pm_opp *opp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment