|
@@ -1340,8 +1340,8 @@ int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
|
|
|
if (!link)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- mutex_lock(&genpd->lock);
|
|
|
- mutex_lock_nested(&subdomain->lock, SINGLE_DEPTH_NESTING);
|
|
|
+ mutex_lock(&subdomain->lock);
|
|
|
+ mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING);
|
|
|
|
|
|
if (genpd->status == GPD_STATE_POWER_OFF
|
|
|
&& subdomain->status != GPD_STATE_POWER_OFF) {
|
|
@@ -1364,8 +1364,8 @@ int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
|
|
|
genpd_sd_counter_inc(genpd);
|
|
|
|
|
|
out:
|
|
|
- mutex_unlock(&subdomain->lock);
|
|
|
mutex_unlock(&genpd->lock);
|
|
|
+ mutex_unlock(&subdomain->lock);
|
|
|
if (ret)
|
|
|
kfree(link);
|
|
|
return ret;
|
|
@@ -1386,7 +1386,8 @@ int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
|
|
|
if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- mutex_lock(&genpd->lock);
|
|
|
+ mutex_lock(&subdomain->lock);
|
|
|
+ mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING);
|
|
|
|
|
|
if (!list_empty(&subdomain->slave_links) || subdomain->device_count) {
|
|
|
pr_warn("%s: unable to remove subdomain %s\n", genpd->name,
|
|
@@ -1399,22 +1400,19 @@ int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
|
|
|
if (link->slave != subdomain)
|
|
|
continue;
|
|
|
|
|
|
- mutex_lock_nested(&subdomain->lock, SINGLE_DEPTH_NESTING);
|
|
|
-
|
|
|
list_del(&link->master_node);
|
|
|
list_del(&link->slave_node);
|
|
|
kfree(link);
|
|
|
if (subdomain->status != GPD_STATE_POWER_OFF)
|
|
|
genpd_sd_counter_dec(genpd);
|
|
|
|
|
|
- mutex_unlock(&subdomain->lock);
|
|
|
-
|
|
|
ret = 0;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
mutex_unlock(&genpd->lock);
|
|
|
+ mutex_unlock(&subdomain->lock);
|
|
|
|
|
|
return ret;
|
|
|
}
|