PM / OPP: do error handling at the bottom of dev_pm_opp_add_dynamic()
This makes it less error prone and moves common resource deallocation at a single place. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
07cce74a7b
commit
6ce4184d03
|
@ -413,6 +413,7 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
|
|||
struct device_opp *dev_opp = NULL;
|
||||
struct dev_pm_opp *opp, *new_opp;
|
||||
struct list_head *head;
|
||||
int ret;
|
||||
|
||||
/* allocate new OPP node */
|
||||
new_opp = kzalloc(sizeof(*new_opp), GFP_KERNEL);
|
||||
|
@ -435,9 +436,8 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
|
|||
if (IS_ERR(dev_opp)) {
|
||||
dev_opp = add_device_opp(dev);
|
||||
if (!dev_opp) {
|
||||
mutex_unlock(&dev_opp_list_lock);
|
||||
kfree(new_opp);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto free_opp;
|
||||
}
|
||||
|
||||
head = &dev_opp->opp_list;
|
||||
|
@ -458,15 +458,13 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
|
|||
|
||||
/* Duplicate OPPs ? */
|
||||
if (new_opp->rate == opp->rate) {
|
||||
int ret = opp->available && new_opp->u_volt == opp->u_volt ?
|
||||
ret = opp->available && new_opp->u_volt == opp->u_volt ?
|
||||
0 : -EEXIST;
|
||||
|
||||
dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",
|
||||
__func__, opp->rate, opp->u_volt, opp->available,
|
||||
new_opp->rate, new_opp->u_volt, new_opp->available);
|
||||
mutex_unlock(&dev_opp_list_lock);
|
||||
kfree(new_opp);
|
||||
return ret;
|
||||
goto free_opp;
|
||||
}
|
||||
|
||||
list_add:
|
||||
|
@ -480,6 +478,11 @@ list_add:
|
|||
*/
|
||||
srcu_notifier_call_chain(&dev_opp->srcu_head, OPP_EVENT_ADD, new_opp);
|
||||
return 0;
|
||||
|
||||
free_opp:
|
||||
mutex_unlock(&dev_opp_list_lock);
|
||||
kfree(new_opp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue