|
@@ -51,6 +51,8 @@ static pm_message_t pm_transition;
|
|
|
*/
|
|
|
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.
|
|
@@ -602,6 +604,7 @@ static void dpm_resume(pm_message_t state)
|
|
|
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)
|
|
@@ -831,8 +834,6 @@ static int legacy_suspend(struct device *dev, pm_message_t state,
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
-static int async_error;
|
|
|
-
|
|
|
/**
|
|
|
* device_suspend - Execute "suspend" callbacks for given device.
|
|
|
* @dev: Device to handle.
|
|
@@ -887,6 +888,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
|
|
device_unlock(dev);
|
|
|
complete_all(&dev->power.completion);
|
|
|
|
|
|
+ if (error)
|
|
|
+ async_error = error;
|
|
|
+
|
|
|
return error;
|
|
|
}
|
|
|
|
|
@@ -896,10 +900,8 @@ static void async_suspend(void *data, async_cookie_t cookie)
|
|
|
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);
|
|
|
}
|
|
@@ -1087,8 +1089,9 @@ EXPORT_SYMBOL_GPL(__suspend_report_result);
|
|
|
* @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);
|