|
@@ -1048,8 +1048,9 @@ static int genpd_finish_suspend(struct device *dev, bool poweroff)
|
|
|
if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd))
|
|
|
return 0;
|
|
|
|
|
|
- if (genpd->dev_ops.stop && genpd->dev_ops.start) {
|
|
|
- ret = pm_runtime_force_suspend(dev);
|
|
|
+ if (genpd->dev_ops.stop && genpd->dev_ops.start &&
|
|
|
+ !pm_runtime_status_suspended(dev)) {
|
|
|
+ ret = genpd_stop_dev(genpd, dev);
|
|
|
if (ret) {
|
|
|
if (poweroff)
|
|
|
pm_generic_restore_noirq(dev);
|
|
@@ -1106,8 +1107,9 @@ static int genpd_resume_noirq(struct device *dev)
|
|
|
genpd->suspended_count--;
|
|
|
genpd_unlock(genpd);
|
|
|
|
|
|
- if (genpd->dev_ops.stop && genpd->dev_ops.start) {
|
|
|
- ret = pm_runtime_force_resume(dev);
|
|
|
+ if (genpd->dev_ops.stop && genpd->dev_ops.start &&
|
|
|
+ !pm_runtime_status_suspended(dev)) {
|
|
|
+ ret = genpd_start_dev(genpd, dev);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
}
|
|
@@ -1139,8 +1141,9 @@ static int genpd_freeze_noirq(struct device *dev)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- if (genpd->dev_ops.stop && genpd->dev_ops.start)
|
|
|
- ret = pm_runtime_force_suspend(dev);
|
|
|
+ if (genpd->dev_ops.stop && genpd->dev_ops.start &&
|
|
|
+ !pm_runtime_status_suspended(dev))
|
|
|
+ ret = genpd_stop_dev(genpd, dev);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -1163,8 +1166,9 @@ static int genpd_thaw_noirq(struct device *dev)
|
|
|
if (IS_ERR(genpd))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (genpd->dev_ops.stop && genpd->dev_ops.start) {
|
|
|
- ret = pm_runtime_force_resume(dev);
|
|
|
+ if (genpd->dev_ops.stop && genpd->dev_ops.start &&
|
|
|
+ !pm_runtime_status_suspended(dev)) {
|
|
|
+ ret = genpd_start_dev(genpd, dev);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
}
|
|
@@ -1221,8 +1225,9 @@ static int genpd_restore_noirq(struct device *dev)
|
|
|
genpd_sync_power_on(genpd, true, 0);
|
|
|
genpd_unlock(genpd);
|
|
|
|
|
|
- if (genpd->dev_ops.stop && genpd->dev_ops.start) {
|
|
|
- ret = pm_runtime_force_resume(dev);
|
|
|
+ if (genpd->dev_ops.stop && genpd->dev_ops.start &&
|
|
|
+ !pm_runtime_status_suspended(dev)) {
|
|
|
+ ret = genpd_start_dev(genpd, dev);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
}
|