|
@@ -426,10 +426,8 @@ static int device_resume_noirq(struct device *dev, pm_message_t state)
|
|
|
|
|
|
if (dev->pwr_domain) {
|
|
|
pm_dev_dbg(dev, state, "EARLY power domain ");
|
|
|
- pm_noirq_op(dev, &dev->pwr_domain->ops, state);
|
|
|
- }
|
|
|
-
|
|
|
- if (dev->type && dev->type->pm) {
|
|
|
+ error = pm_noirq_op(dev, &dev->pwr_domain->ops, state);
|
|
|
+ } else if (dev->type && dev->type->pm) {
|
|
|
pm_dev_dbg(dev, state, "EARLY type ");
|
|
|
error = pm_noirq_op(dev, dev->type->pm, state);
|
|
|
} else if (dev->class && dev->class->pm) {
|
|
@@ -517,7 +515,8 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
|
|
|
|
|
|
if (dev->pwr_domain) {
|
|
|
pm_dev_dbg(dev, state, "power domain ");
|
|
|
- pm_op(dev, &dev->pwr_domain->ops, state);
|
|
|
+ error = pm_op(dev, &dev->pwr_domain->ops, state);
|
|
|
+ goto End;
|
|
|
}
|
|
|
|
|
|
if (dev->type && dev->type->pm) {
|
|
@@ -629,12 +628,11 @@ static void device_complete(struct device *dev, pm_message_t state)
|
|
|
{
|
|
|
device_lock(dev);
|
|
|
|
|
|
- if (dev->pwr_domain && dev->pwr_domain->ops.complete) {
|
|
|
+ if (dev->pwr_domain) {
|
|
|
pm_dev_dbg(dev, state, "completing power domain ");
|
|
|
- dev->pwr_domain->ops.complete(dev);
|
|
|
- }
|
|
|
-
|
|
|
- if (dev->type && dev->type->pm) {
|
|
|
+ if (dev->pwr_domain->ops.complete)
|
|
|
+ dev->pwr_domain->ops.complete(dev);
|
|
|
+ } else if (dev->type && dev->type->pm) {
|
|
|
pm_dev_dbg(dev, state, "completing type ");
|
|
|
if (dev->type->pm->complete)
|
|
|
dev->type->pm->complete(dev);
|
|
@@ -732,7 +730,12 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state)
|
|
|
{
|
|
|
int error;
|
|
|
|
|
|
- if (dev->type && dev->type->pm) {
|
|
|
+ if (dev->pwr_domain) {
|
|
|
+ pm_dev_dbg(dev, state, "LATE power domain ");
|
|
|
+ error = pm_noirq_op(dev, &dev->pwr_domain->ops, state);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+ } else if (dev->type && dev->type->pm) {
|
|
|
pm_dev_dbg(dev, state, "LATE type ");
|
|
|
error = pm_noirq_op(dev, dev->type->pm, state);
|
|
|
if (error)
|
|
@@ -749,11 +752,6 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state)
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
- if (dev->pwr_domain) {
|
|
|
- pm_dev_dbg(dev, state, "LATE power domain ");
|
|
|
- pm_noirq_op(dev, &dev->pwr_domain->ops, state);
|
|
|
- }
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -841,21 +839,27 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
|
|
goto End;
|
|
|
}
|
|
|
|
|
|
+ if (dev->pwr_domain) {
|
|
|
+ pm_dev_dbg(dev, state, "power domain ");
|
|
|
+ error = pm_op(dev, &dev->pwr_domain->ops, state);
|
|
|
+ goto End;
|
|
|
+ }
|
|
|
+
|
|
|
if (dev->type && dev->type->pm) {
|
|
|
pm_dev_dbg(dev, state, "type ");
|
|
|
error = pm_op(dev, dev->type->pm, state);
|
|
|
- goto Domain;
|
|
|
+ goto End;
|
|
|
}
|
|
|
|
|
|
if (dev->class) {
|
|
|
if (dev->class->pm) {
|
|
|
pm_dev_dbg(dev, state, "class ");
|
|
|
error = pm_op(dev, dev->class->pm, state);
|
|
|
- goto Domain;
|
|
|
+ goto End;
|
|
|
} else if (dev->class->suspend) {
|
|
|
pm_dev_dbg(dev, state, "legacy class ");
|
|
|
error = legacy_suspend(dev, state, dev->class->suspend);
|
|
|
- goto Domain;
|
|
|
+ goto End;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -869,12 +873,6 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Domain:
|
|
|
- if (!error && dev->pwr_domain) {
|
|
|
- pm_dev_dbg(dev, state, "power domain ");
|
|
|
- pm_op(dev, &dev->pwr_domain->ops, state);
|
|
|
- }
|
|
|
-
|
|
|
End:
|
|
|
device_unlock(dev);
|
|
|
complete_all(&dev->power.completion);
|
|
@@ -965,7 +963,14 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|
|
|
|
|
device_lock(dev);
|
|
|
|
|
|
- if (dev->type && dev->type->pm) {
|
|
|
+ if (dev->pwr_domain) {
|
|
|
+ pm_dev_dbg(dev, state, "preparing power domain ");
|
|
|
+ if (dev->pwr_domain->ops.prepare)
|
|
|
+ error = dev->pwr_domain->ops.prepare(dev);
|
|
|
+ suspend_report_result(dev->pwr_domain->ops.prepare, error);
|
|
|
+ if (error)
|
|
|
+ goto End;
|
|
|
+ } else if (dev->type && dev->type->pm) {
|
|
|
pm_dev_dbg(dev, state, "preparing type ");
|
|
|
if (dev->type->pm->prepare)
|
|
|
error = dev->type->pm->prepare(dev);
|
|
@@ -984,13 +989,6 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|
|
if (dev->bus->pm->prepare)
|
|
|
error = dev->bus->pm->prepare(dev);
|
|
|
suspend_report_result(dev->bus->pm->prepare, error);
|
|
|
- if (error)
|
|
|
- goto End;
|
|
|
- }
|
|
|
-
|
|
|
- if (dev->pwr_domain && dev->pwr_domain->ops.prepare) {
|
|
|
- pm_dev_dbg(dev, state, "preparing power domain ");
|
|
|
- dev->pwr_domain->ops.prepare(dev);
|
|
|
}
|
|
|
|
|
|
End:
|