|
@@ -929,6 +929,12 @@ static void _remove_opp_table(struct opp_table *opp_table)
|
|
_kfree_device_rcu);
|
|
_kfree_device_rcu);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void _opp_free(struct dev_pm_opp *opp, struct opp_table *opp_table)
|
|
|
|
+{
|
|
|
|
+ kfree(opp);
|
|
|
|
+ _remove_opp_table(opp_table);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* _kfree_opp_rcu() - Free OPP RCU handler
|
|
* _kfree_opp_rcu() - Free OPP RCU handler
|
|
* @head: RCU head
|
|
* @head: RCU head
|
|
@@ -944,7 +950,6 @@ static void _kfree_opp_rcu(struct rcu_head *head)
|
|
* _opp_remove() - Remove an OPP from a table definition
|
|
* _opp_remove() - Remove an OPP from a table definition
|
|
* @opp_table: points back to the opp_table struct this opp belongs to
|
|
* @opp_table: points back to the opp_table struct this opp belongs to
|
|
* @opp: pointer to the OPP to remove
|
|
* @opp: pointer to the OPP to remove
|
|
- * @notify: OPP_EVENT_REMOVE notification should be sent or not
|
|
|
|
*
|
|
*
|
|
* This function removes an opp definition from the opp table.
|
|
* This function removes an opp definition from the opp table.
|
|
*
|
|
*
|
|
@@ -952,16 +957,13 @@ static void _kfree_opp_rcu(struct rcu_head *head)
|
|
* It is assumed that the caller holds required mutex for an RCU updater
|
|
* It is assumed that the caller holds required mutex for an RCU updater
|
|
* strategy.
|
|
* strategy.
|
|
*/
|
|
*/
|
|
-void _opp_remove(struct opp_table *opp_table, struct dev_pm_opp *opp,
|
|
|
|
- bool notify)
|
|
|
|
|
|
+static void _opp_remove(struct opp_table *opp_table, struct dev_pm_opp *opp)
|
|
{
|
|
{
|
|
/*
|
|
/*
|
|
* Notify the changes in the availability of the operable
|
|
* Notify the changes in the availability of the operable
|
|
* frequency/voltage list.
|
|
* frequency/voltage list.
|
|
*/
|
|
*/
|
|
- if (notify)
|
|
|
|
- srcu_notifier_call_chain(&opp_table->srcu_head,
|
|
|
|
- OPP_EVENT_REMOVE, opp);
|
|
|
|
|
|
+ srcu_notifier_call_chain(&opp_table->srcu_head, OPP_EVENT_REMOVE, opp);
|
|
opp_debug_remove_one(opp);
|
|
opp_debug_remove_one(opp);
|
|
list_del_rcu(&opp->node);
|
|
list_del_rcu(&opp->node);
|
|
call_srcu(&opp_table->srcu_head.srcu, &opp->rcu_head, _kfree_opp_rcu);
|
|
call_srcu(&opp_table->srcu_head.srcu, &opp->rcu_head, _kfree_opp_rcu);
|
|
@@ -1008,7 +1010,7 @@ void dev_pm_opp_remove(struct device *dev, unsigned long freq)
|
|
goto unlock;
|
|
goto unlock;
|
|
}
|
|
}
|
|
|
|
|
|
- _opp_remove(opp_table, opp, true);
|
|
|
|
|
|
+ _opp_remove(opp_table, opp);
|
|
unlock:
|
|
unlock:
|
|
mutex_unlock(&opp_table_lock);
|
|
mutex_unlock(&opp_table_lock);
|
|
}
|
|
}
|
|
@@ -1200,7 +1202,7 @@ int _opp_add_v1(struct device *dev, unsigned long freq, long u_volt,
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
free_opp:
|
|
free_opp:
|
|
- _opp_remove(opp_table, new_opp, false);
|
|
|
|
|
|
+ _opp_free(new_opp, opp_table);
|
|
unlock:
|
|
unlock:
|
|
mutex_unlock(&opp_table_lock);
|
|
mutex_unlock(&opp_table_lock);
|
|
return ret;
|
|
return ret;
|
|
@@ -1912,7 +1914,7 @@ void _dev_pm_opp_remove_table(struct device *dev, bool remove_all)
|
|
/* Free static OPPs */
|
|
/* Free static OPPs */
|
|
list_for_each_entry_safe(opp, tmp, &opp_table->opp_list, node) {
|
|
list_for_each_entry_safe(opp, tmp, &opp_table->opp_list, node) {
|
|
if (remove_all || !opp->dynamic)
|
|
if (remove_all || !opp->dynamic)
|
|
- _opp_remove(opp_table, opp, true);
|
|
|
|
|
|
+ _opp_remove(opp_table, opp);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
_remove_opp_dev(_find_opp_dev(dev, opp_table), opp_table);
|
|
_remove_opp_dev(_find_opp_dev(dev, opp_table), opp_table);
|