drivers.  Changing this attribute to "on" prevents the driver
                from power managing the device at run time.  Doing that while
                the device is suspended causes it to be woken up.
+
+What:          /sys/devices/.../power/async
+Date:          January 2009
+Contact:       Rafael J. Wysocki <rjw@sisk.pl>
+Description:
+               The /sys/devices/.../async attribute allows the user space to
+               enable or diasble the device's suspend and resume callbacks to
+               be executed asynchronously (ie. in separate threads, in parallel
+               with the main suspend/resume thread) during system-wide power
+               transitions (eg. suspend to RAM, hibernation).
+
+               All devices have one of the following two values for the
+               power/async file:
+
+               + "enabled\n" to permit the asynchronous suspend/resume;
+               + "disabled\n" to forbid it;
+
+               The value of this attribute may be changed by writing either
+               "enabled", or "disabled" to it.
+
+               It generally is unsafe to permit the asynchronous suspend/resume
+               of a device unless it is certain that all of the PM dependencies
+               of the device are known to the PM core.  However, for some
+               devices this attribute is set to "enabled" by bus type code or
+               device drivers and in that cases it should be safe to leave the
+               default value.
 
  *     wakeup events internally (unless they are disabled), keeping
  *     their hardware in low power modes whenever they're unused.  This
  *     saves runtime power, without requiring system-wide sleep states.
+ *
+ *     async - Report/change current async suspend setting for the device
+ *
+ *     Asynchronous suspend and resume of the device during system-wide power
+ *     state transitions can be enabled by writing "enabled" to this file.
+ *     Analogously, if "disabled" is written to this file, the device will be
+ *     suspended and resumed synchronously.
+ *
+ *     All devices have one of the following two values for power/async:
+ *
+ *      + "enabled\n" to permit the asynchronous suspend/resume of the device;
+ *      + "disabled\n" to forbid it;
+ *
+ *     NOTE: It generally is unsafe to permit the asynchronous suspend/resume
+ *     of a device unless it is certain that all of the PM dependencies of the
+ *     device are known to the PM core.  However, for some devices this
+ *     attribute is set to "enabled" by bus type code or device drivers and in
+ *     that cases it should be safe to leave the default value.
  */
 
 static const char enabled[] = "enabled";
 
 static DEVICE_ATTR(wakeup, 0644, wake_show, wake_store);
 
+#ifdef CONFIG_PM_SLEEP_ADVANCED_DEBUG
+static ssize_t async_show(struct device *dev, struct device_attribute *attr,
+                         char *buf)
+{
+       return sprintf(buf, "%s\n",
+                       device_async_suspend_enabled(dev) ? enabled : disabled);
+}
+
+static ssize_t async_store(struct device *dev, struct device_attribute *attr,
+                          const char *buf, size_t n)
+{
+       char *cp;
+       int len = n;
+
+       cp = memchr(buf, '\n', n);
+       if (cp)
+               len = cp - buf;
+       if (len == sizeof enabled - 1 && strncmp(buf, enabled, len) == 0)
+               device_enable_async_suspend(dev);
+       else if (len == sizeof disabled - 1 && strncmp(buf, disabled, len) == 0)
+               device_disable_async_suspend(dev);
+       else
+               return -EINVAL;
+       return n;
+}
+
+static DEVICE_ATTR(async, 0644, async_show, async_store);
+#endif /* CONFIG_PM_SLEEP_ADVANCED_DEBUG */
 
 static struct attribute * power_attrs[] = {
 #ifdef CONFIG_PM_RUNTIME
        &dev_attr_control.attr,
 #endif
        &dev_attr_wakeup.attr,
+#ifdef CONFIG_PM_SLEEP_ADVANCED_DEBUG
+       &dev_attr_async.attr,
+#endif
        NULL,
 };
 static struct attribute_group pm_attr_group = {
 
        code. This is helpful when debugging and reporting PM bugs, like
        suspend support.
 
+config PM_ADVANCED_DEBUG
+       bool "Extra PM attributes in sysfs for low-level debugging/testing"
+       depends on PM_DEBUG
+       default n
+       ---help---
+       Add extra sysfs attributes allowing one to access some Power Management
+       fields of device objects from user space.  If you are not a kernel
+       developer interested in debugging/testing Power Management, say "no".
+
 config PM_VERBOSE
        bool "Verbose Power Management debugging"
        depends on PM_DEBUG
        depends on SUSPEND || HIBERNATION || XEN_SAVE_RESTORE
        default y
 
+config PM_SLEEP_ADVANCED_DEBUG
+       bool
+       depends on PM_ADVANCED_DEBUG
+       default n
+
 config SUSPEND
        bool "Suspend to RAM and standby"
        depends on PM && ARCH_SUSPEND_POSSIBLE