*/
 static bool transition_started;
 
+static int async_error;
+
 /**
  * device_pm_init - Initialize the PM-related part of a device object.
  * @dev: Device object being initialized.
        INIT_LIST_HEAD(&list);
        mutex_lock(&dpm_list_mtx);
        pm_transition = state;
+       async_error = 0;
 
        list_for_each_entry(dev, &dpm_list, power.entry) {
                if (dev->power.status < DPM_OFF)
        return error;
 }
 
-static int async_error;
-
 /**
  * device_suspend - Execute "suspend" callbacks for given device.
  * @dev: Device to handle.
        device_unlock(dev);
        complete_all(&dev->power.completion);
 
+       if (error)
+               async_error = error;
+
        return error;
 }
 
        int error;
 
        error = __device_suspend(dev, pm_transition, true);
-       if (error) {
+       if (error)
                pm_dev_err(dev, pm_transition, " async", error);
-               async_error = error;
-       }
 
        put_device(dev);
 }
  * @dev: Device to wait for.
  * @subordinate: Device that needs to wait for @dev.
  */
-void device_pm_wait_for_dev(struct device *subordinate, struct device *dev)
+int device_pm_wait_for_dev(struct device *subordinate, struct device *dev)
 {
        dpm_wait(dev, subordinate->power.async_suspend);
+       return async_error;
 }
 EXPORT_SYMBOL_GPL(device_pm_wait_for_dev);
 
                __suspend_report_result(__func__, fn, ret);             \
        } while (0)
 
-extern void device_pm_wait_for_dev(struct device *sub, struct device *dev);
+extern int device_pm_wait_for_dev(struct device *sub, struct device *dev);
 #else /* !CONFIG_PM_SLEEP */
 
 #define device_pm_lock() do {} while (0)
 
 #define suspend_report_result(fn, ret)         do {} while (0)
 
-static inline void device_pm_wait_for_dev(struct device *a, struct device *b) {}
+static inline int device_pm_wait_for_dev(struct device *a, struct device *b)
+{
+       return 0;
+}
 #endif /* !CONFIG_PM_SLEEP */
 
 /* How to reorder dpm_list after device_move() */