PM / Sleep: Simplify device_suspend_noirq()
[firefly-linux-kernel-4.4.55.git] / drivers / base / power / main.c
index 59f8ab23548689768a45baa6d68c11c97ca75b50..406f82c344fad49478ee82f53f23d6844f0527bb 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <linux/device.h>
 #include <linux/kallsyms.h>
+#include <linux/export.h>
 #include <linux/mutex.h>
 #include <linux/pm.h>
 #include <linux/pm_runtime.h>
@@ -762,31 +763,23 @@ static pm_message_t resume_event(pm_message_t sleep_state)
  */
 static int device_suspend_noirq(struct device *dev, pm_message_t state)
 {
-       int error;
+       int error = 0;
 
        if (dev->pm_domain) {
                pm_dev_dbg(dev, state, "LATE power domain ");
                error = pm_noirq_op(dev, &dev->pm_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)
-                       return error;
        } else if (dev->class && dev->class->pm) {
                pm_dev_dbg(dev, state, "LATE class ");
                error = pm_noirq_op(dev, dev->class->pm, state);
-               if (error)
-                       return error;
        } else if (dev->bus && dev->bus->pm) {
                pm_dev_dbg(dev, state, "LATE ");
                error = pm_noirq_op(dev, dev->bus->pm, state);
-               if (error)
-                       return error;
        }
 
-       return 0;
+       return error;
 }
 
 /**
@@ -919,7 +912,8 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
  End:
        if (!error) {
                dev->power.is_suspended = true;
-               if (dev->power.wakeup_path && dev->parent)
+               if (dev->power.wakeup_path
+                   && dev->parent && !dev->parent->power.ignore_children)
                        dev->parent->power.wakeup_path = true;
        }
 
@@ -1031,22 +1025,16 @@ static int device_prepare(struct device *dev, pm_message_t state)
                if (dev->pm_domain->ops.prepare)
                        error = dev->pm_domain->ops.prepare(dev);
                suspend_report_result(dev->pm_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);
                suspend_report_result(dev->type->pm->prepare, error);
-               if (error)
-                       goto End;
        } else if (dev->class && dev->class->pm) {
                pm_dev_dbg(dev, state, "preparing class ");
                if (dev->class->pm->prepare)
                        error = dev->class->pm->prepare(dev);
                suspend_report_result(dev->class->pm->prepare, error);
-               if (error)
-                       goto End;
        } else if (dev->bus && dev->bus->pm) {
                pm_dev_dbg(dev, state, "preparing ");
                if (dev->bus->pm->prepare)
@@ -1054,7 +1042,6 @@ static int device_prepare(struct device *dev, pm_message_t state)
                suspend_report_result(dev->bus->pm->prepare, error);
        }
 
- End:
        device_unlock(dev);
 
        return error;